【问题标题】:Changing from mysql to mysqli code error从 mysql 更改为 mysqli 代码错误
【发布时间】:2013-06-30 02:29:13
【问题描述】:

我正在将很多文件从 mysql 更改为 mysqli。我正在使用它来做到这一点:https://wikis.oracle.com/display/mysql/Converting+to+MySQLi

我的连接文件(为了简单起见,我删除了我认为不必要的代码,例如错误处理)会产生我不知道如何修复的错误。 原始代码:

$conn=mysql_connect ("$localhost", "$dbusername", "$dbpass");

mysql_select_db("$db", $conn);

新代码:

$conn=($GLOBALS["___mysqli_ston"] = mysqli_connect("$localhost",  "$dbusername",  "$dbpass")); 

((bool)mysqli_query( $conn, "USE $db"));

上面的代码只是我连接到每个文件中使用的数据库文件

include_once("includes/connnect.php");

之前连接数据库和表的代码必须与下面的代码一起使用,因为我有很多类似下面的查询,并且更改 connect.php 文件比更改许多文件更容易:

$con1 = mysqli_query($GLOBALS["___mysqli_ston"], "SELECT * FROM table1 WHERE id='$id'"); 

编辑 - 更新为包含我在复制和粘贴时遗漏的分号。

编辑 2 - 包括来自转换工具的错误/警告消息

14  [Line 14] Please check your code for parse errors, we failed to parse " ". Conversion will be incomplete!".
14  [Line 14] Cannot analyze server parameter to extract host, socket and port! Conversion cannot be performed automatically. You must manually check the result of the conversion.
16  [Line 16] mysql_select_db(string database_name [...]) is emulated using mysqli_query() and USE database_name. This is a possible SQL injection security bug as no tests are performed what value database_name has. Check your script!

第 14 行在哪里

$conn=mysql_connect ("$localhost", "$dbusername", "$dbpass"); 

第 16 行是

mysql_select_db("$db", $conn);

编辑 - 工作答案如下。转换工具适用于我所有其他文件。只需在我的连接文件中更改它连接到数据库的方式

$conn=($GLOBALS["___mysqli_ston"] = mysqli_connect("$localhost",  "$dbusername",  "$dbpass", "$db", "3306")) or die ('Cannot connect to the database because: ' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)));

3306 是端口。要查找端口,请使用以下命令:

$port = ini_get("mysql.default_port");
echo "the port ". $port;

【问题讨论】:

  • 请列出您遇到的错误。另外,您的mysqli_connect() 行末尾是否有分号(如果有,您可以输入吗)?
  • 我不确定你为什么将它存储在 globals 变量中,但我会删除这部分 $conn = mysqli_connect("$localhost", "$dbusername", "$dbpass"))。而且我不想建议这样做,因为它会更加努力,但考虑切换到 PDO 而不是 mysqli
  • @Kris 看起来他使用了 mysqli 转换工具。它使用该全局变量来实现 mysql 支持的默认连接参数。
  • Barmar 是正确的转换工具。

标签: php mysql mysqli


【解决方案1】:

14 [第 14 行] 请检查您的代码是否存在解析错误,我们无法解析“”。转换将不完整!”。

此错误是由mysql_connect() 调用中( 之前的空格引起的。将其替换为 $conn=mysql_connect("$localhost", "$dbusername", "$dbpass"); 将删除 MySQLConverterTool 的此警告输出。

剩下的两个错误是您应该通过实际查看mysql_connect()mysqli_connect() 之间的差异来处理的问题。 mysql_connect() 的第一个参数 $server 可以像 hostname:port 一样格式化,而对于 mysqli_connect(),您只需将 hostname 传递给它的第一个参数,并将 port 作为可选的第五个参数传递。此外,mysqli 会让您在 mysqli_connect() 调用中指定数据库,而不是使用类似于 mysql_select_db() 的单独函数。

我建议,如果您需要,您可以使用转换器工具将您的所有源代码从 mysql 转换为 mysqli except,因为这些行带有警告。只有你知道"$localhost"进来的格式是什么:如果它可能包含端口信息,你必须将端口信息分离出来。您可能应该将数据库设置为在mysqli_connect() 中使用,而不是使用转换器的自动USE $db shim。这正是转换器试图告诉您的内容:-)。

请注意,我不会说:

我的连接文件(为了简单起见,我删除了我认为不必要的代码,例如错误处理)产生了我不知道如何修复的错误。

以上表明转换器生成的 PHP 代码本身会在运行时引发 PHP 警告和错误(并不是说转换器抱怨您的原始代码或通知您实际上需要像我一样进行一些手动转换上面讨论过)。这就是为什么我们要查找错误,例如您更正的曾经丢失的分号。

【讨论】:

  • 是的,只需要正确连接即可。谢谢你的帮助。最后使用转换工具是一个非常简单的解决方案。
【解决方案2】:

你忘了分号:

$conn=($GLOBALS["___mysqli_ston"] = mysqli_connect("$localhost",  "$dbusername",  "$dbpass")); //<--- 

【讨论】:

  • 编辑 - 更新为包含我在复制和粘贴时遗漏的分号。
  • 是复制和粘贴问题,因为我删除了错误处理并删除了分号
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多