测试php / mysqli连接

10

我正在寻找一种测试php / mysqli连接的方法。我正在从一个在Vista上构建的LAMP服务器迁移到Ubuntu上,但无法使mysqli正常工作。我知道所有正确的模块都已安装,并且PhpMyAdmin完美地工作。我已经迁移了一个站点,但是其中没有任何mysqli连接起作用。我得到的错误是“在非对象上调用成员函数xxx()”,通常出现在查询本身有问题或者查询准备工作中的连接出了问题的情况下。我知道查询本身很好因为它在具有相同数据库结构和数据的其他服务器上运行良好。这使我怀疑是连接的问题。我尝试编写一个非常简单的测试连接并将其放入循环中,例如...

if(***connection here ***) {
    echo "connected";
}
else { 
    echo "not connected"; 
}

它回显“已连接”,这很好。但为了检查,我更改了连接中的密码,以便知道它无法连接,但它仍然回显“已连接”。因此,if/else测试显然不是正确的方法...


1
请问您能演示一下如何进行连接吗?(您可以省略用户名和密码) - 2ndkauboy
1
“调用非对象上的成员函数xxx()”错误与数据库连接无关。 - Your Common Sense
3个回答

18

mysqli_connect()始终返回一个MySQLi对象。要检查连接错误,请使用:

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db');
if ($mysqli_connection->connect_error) {
   echo "Not connected, error: " . $mysqli_connection->connect_error;
}
else {
   echo "Connected.";
}

1
这个管用了。谢谢,Lek。当然,这只是加深了谜团。我现在知道数据库实际上已经连接,这意味着我的脚本在查询本身时会出错。这更没有意义,因为查询本身在其他服务器上运行正常。我甚至编写了一个简单的测试查询,可惜它仍然返回非对象错误。 - Blind Fish
否则{ echo "已连接。"; } 添加; - Sven van den Boogaart

4

在终端中测试PHP连接,请执行以下命令:

$ php -r 'var_dump(mysqli_connect("localhost:/tmp/mysql.sock", "MYSQL_USER", "MYSQL_PASS",
     "DBNAME));'

-1

你需要在各种数据库调用中增加更多的错误处理。快速/简单的方法是直接执行以下操作:

 $whatever = mysqli_somefunction(...) or die("MySQL error: ". mysqli_error());

所有函数如果发生错误都会返回布尔值FALSE,或者带有结果的适当mysqli对象。如果没有错误检查,你将会执行以下操作:
 $result = $mysqli->query("blah blah will cause a syntax error");
 $data = $result->fetchRow();  // $result is "FALSE", not a mysqli_object, hence the "call to member on non-object"

死亡总是不好的。至少发送503状态码,永远不要透露任何敏感信息,例如mysql错误消息。最好使用trigger_error()。虽然在这里它相当无用,因为PHP错误消息已经相当详细了,但如果有的话,可以使用它。 - Your Common Sense
其实我尝试使用类似的东西,只不过是使用mysqli_connect_error()。但它并没有抛出错误。 - Blind Fish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接