我正在尝试使用默认值mysqli constructor连接到数据库,该默认值记录为:
> host = ini_get(“ mysqli.default_host”)
>用户名= ini_get(“ mysqli.default_user”)
> passwd = 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();
}
输出:
Query failed:
这意味着连接成功,但是任何查询都会失败并显示错误. (其他操作,例如select_db,以相同的方式失败.)
有趣的是,我可以将第一行更改为:
$db = new mysqli(ini_get("mysqli.default_host"),
ini_get("mysqli.default_user"),
ini_get("mysqli.default_pw"));
…但是我希望不必在需要数据库连接的地方都键入默认值.我究竟做错了什么?有没有办法使用不带参数的mysqli构造函数?
解决方法:
在写这个问题时,我碰巧向下滚动文档页面并注意到以下内容:
Note: Calling the constructor with no parameters is the same as calling
mysqli_init()
.
查找mysqli_init documentation,它说:
Note: Any subsequent calls to any mysqli function (except
mysqli_options()
) will fail untilmysqli_real_connect()
was called.
因此,解决方法是将第一行从以下位置更改:
$db = new mysqli();
至:
$db = new mysqli();
$db->real_connect();
我希望在那种情况下mysqli_error会返回类似“未连接”的内容,而不是空字符串.这有点违反直觉,但至少有一些记录在案.