我正在尝试使用mysqli constructor的默认值连接到数据库,该默认值记录为:
ini_get("mysqli.default_host")
ini_get("mysqli.default_user")
ini_get("mysqli.default_pw")
我想使用默认值的原因是我可以在配置文件中使用凭据而不是通过我的代码分散。但是,当我没有传递任何值时,连接成功,但后续查询失败,没有错误。
$db = new mysqli();
if ($db->connect_errno) die("Connect failed: " . $db->connect_error);
if ($rs = $db->query("select user();") or die("Query failed: " . $db->error)) {
$row = $rs->fetch_row();
echo $row[0];
$rs->close();
}
输出:
查询失败:
这意味着连接成功,但任何查询都会失败并显示错误。 (其他操作,例如select_db
,也会失败。)
有趣的是,我可以通过将第一行更改为:
来解决此问题$db = new mysqli(ini_get("mysqli.default_host"),
ini_get("mysqli.default_user"),
ini_get("mysqli.default_pw"));
...但我不想在需要数据库连接的地方输入默认值。我究竟做错了什么?有没有办法使用没有参数的mysqli
构造函数?
答案 0 :(得分:3)
在撰写此问题时,我碰巧向下滚动文档页面并注意到以下内容:
注意:调用不带参数的构造函数与调用
mysqli_init()
相同。
查看mysqli_init documentation,它说:
注意:在调用
mysqli_options()
之前,对任何mysqli函数的任何后续调用(mysqli_real_connect()
除外)都将失败。
因此,修复方法是更改第一行:
$db = new mysqli();
要:
$db = new mysqli();
$db->real_connect();
我希望在那种情况下,mysqli_error
会返回类似"未连接的内容"而不是一个空字符串。这有点违反直觉,但至少它有点记录。