在我的php页面中,我包括以下db连接代码
<?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";而不是回音成功,我得到了
Success... Localhost via UNIX socket有人能告诉我为什么我总是收到这种虚假的成功信息吗?编辑:最后,我要寻找的并不是用于开发的所有php错误消息(例如,ini_set(‘display_ connection_error’,1)),而是我在If connection_error语句中放置的单个"fail“消息。
Edit2: 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())的结果;
NULLVar_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正如您所看到的,这两个var_dumps的结果是相同的(除了正常运行时间),而不管我是否有正确的路径键入到parse_ini_file,或者我已经将它指向不存在文件的假位置。
编辑3:问题已经回答了,看看评论,直到我有足够的时间来回答我自己的问题。
发布于 2013-09-20 12:09:04
感谢用户“您的常识”为我指出了正确的方向。
根据mysqli构造的文档,当主机为空或未定义时,它默认为localhost,当密码为空或未定义时。
“MySQL服务器将尝试根据那些没有密码的用户记录对用户进行身份验证。”
因此,每当我指向一个伪造的文件位置时,它就试图用任何不接受密码的用户名连接到本地主机。不幸的是,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);
}https://stackoverflow.com/questions/18898282
复制相似问题