在我的代码中,我执行了几个有效的 SQL 语句。但是其中一条语句无效($mysqli->prepare 返回false),但没有返回错误代码($mysqli->error 返回false)。
这是代码的示例:
$mysqli = new mysqli('host', 'user', 'password', 'database');
// First query (valid)
if(($oStatement = $mysqli->prepare('SELECT column FROM table;')) === false)
throw new Exception('Error in statement: ' . $mysqli->error);
// ...
// Second query (invalid)
if(($oStatement = $mysqli->prepare('SELECT column_which_doesnt_exist FROM table;')) === false)
throw new Exception('Error in statement: ' . $mysqli->error);
为什么不返回错误信息?
最佳答案
我花了一段时间才找到错误。我在这里没有找到任何东西,所以我发布了这个问答:
$mysqli->error 返回一个空字符串,因为重用变量 $oStatement 的析构函数已经重置了错误文本。
在错误情况下,第二个 $mysqli->prepare 返回 false 并设置了错误文本。然后将返回值 (false) 分配给 $oStatement。 $oStatement 包含一个 mysqli 语句对象,其析构函数将作为赋值的一部分被调用。调用析构函数没有任何错误并重置错误文本。
正确的解决方案是为每个语句使用不同的变量,或者在每次赋值之前重置语句变量:
$mysqli = new mysqli('host', 'user', 'password', 'database');
// First query (valid)
$oStatement = false;
if(($oStatement = $mysqli->prepare('SELECT column FROM table;')) === false)
throw new Exception('Error in statement: ' . $mysqli->error);
// ...
// Second query (invalid)
$oStatement = false;
if(($oStatement = $mysqli->prepare('SELECT column_which_doesnt_exist FROM table;')) === false)
throw new Exception('Error in statement: ' . $mysqli->error);
使用此解决方案,错误文本有效并且可以抛出。
关于php - $mysqli->prepare 返回 false,但 $mysqli->error 是一个空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40719953/