gpt4 book ai didi

php - Mysqli 总是返回连接成功

转载 作者:可可西里 更新时间:2023-11-01 07:35:21 28 4
gpt4 key购买 nike

在我所有的 php 页面上,我都包含了以下数据库连接代码

<?php
$dbInfo = parse_ini_file('path/to/ini/file');
define ("HOST", $dbInfo["HOST"]); // The host you want to connect to.
define("USER", $dbInfo["USER"]); // The database username.
define("PASSWORD", $dbInfo["PASSWORD"]); // The database password.
define("DATABASE", $dbInfo["DATABASE"]); // The database name.

$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
// If you are connecting via TCP/IP rather than a UNIX socket remember to add the port number as a parameter.
if (mysqli_connect_error()) {
die('fail');
} else {
echo 'success';
}


If ((USER == "USERNAME HERE") || (PASSWORD == "PASSWORD HERE")){
print 'ERROR - Please set up the script first';
exit();
}
?>

无论我做什么(例如输入错误的密码或输入错误的文件路径),它总是回显“成功”。我已经尝试使用 try/catch 来处理错误,在新的 mysqli 前面放置一个 @,使用面向对象的 If($mysqli->connect_error)。我做什么都不会返回失败

当我放

echo 'Success... ' . $mysqli->host_info . "\n";

我得到的不是 echo success

Success... Localhost via UNIX socket

谁能告诉我为什么我总是收到这个虚假的成功消息?编辑:我最终要寻找的不是我用于开发的每条 php 错误消息(即 ini_set('display_errors',1);),而是我放在如果connection_error语句。

编辑 2:var_dump($mysqli) 的结果;使用错误的文件路径(parse_ini_file 指向没有文件的位置)

object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(6) "5.5.32" ["client_version"]=> int(50532) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(23) "5.5.32-0ubuntu0.12.10.1" ["server_version"]=> int(50532) ["stat"]=> string(135) "Uptime: 8944 Threads: 1 Questions: 2445 Slow queries: 0 Opens: 275 Flush tables: 1 Open tables: 67 Queries per second avg: 0.273" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(468) ["warning_count"]=> int(0) } 

以及 var_dump(mysqli_connect_error()) 的结果;

NULL

var_dump($mysqli) 的结果;使用正确的文件路径(经过测试和验证)

object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(6) "5.5.32" ["client_version"]=> int(50532) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(23) "5.5.32-0ubuntu0.12.10.1" ["server_version"]=> int(50532) ["stat"]=> string(136) "Uptime: 15306 Threads: 1 Questions: 2446 Slow queries: 0 Opens: 275 Flush tables: 1 Open tables: 67 Queries per second avg: 0.159" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(471) ["warning_count"]=> int(0) }

NULL

如您所见,无论我是否在 parse_ini_file 中输入了正确的路径,或者我是否将其指向不存在文件的虚假位置,两个 var_dump 的结果都是相同的(正常运行时间除外)。

编辑 3:问题已得到解答,请查看评论,直到我有足够的时间来回答我自己的问题。

最佳答案

感谢用户“你的常识”为我指明了正确的方向。

根据 mysqli 构造的文档 http://php.net/manual/en/mysqli.construct.php当主机为 NULL 或未定义时默认为本地主机,当密码为 NULL 或未定义时

"the MySQL server will attempt to authenticate the user against those user records which have no password only."

因此,每当我指向一个虚假文件位置时,它都会尝试使用任何不接受密码的用户名连接到本地主机。不幸的是,Mysql 默认安装三个具有全局访问权限且没有密码(仅使用权限)的用户。导致我的虚假文件位置获得成功连接。

解决方案是删除这三个用户(和测试数据库)。我现在使用任何数量的前面提到的方法都失败了,包括

if (NULL !== mysqli_connect_error()) { 
die('fail');
} else {
echo 'success';
}

if (mysqli_connect_error()) {
die('fail');
} else {
echo 'success';
}

if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '. $mysqli->connect_error);
}

关于php - Mysqli 总是返回连接成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18898282/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com