在我的代码中,我执行了几个有效的SQL语句。但其中一个语句无效($ mysqli-> prepare返回false),但没有返回错误代码($ mysqli->错误返回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);
为什么不返回错误消息?
答案 0 :(得分:3)
我花了一段时间才发现错误。我在这里找不到任何东西,所以我发布了这个Q& A-Answer:
$ mysqli->错误返回一个空字符串,因为重用变量$ 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);
使用此解决方案,错误文本有效并可以抛出。
答案 1 :(得分:2)
感谢您的分享,这确实是一个非常有趣的行为。
然而,为了清楚起见,有一种更好的方法:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('host', 'user', 'password', 'database');
// First query (valid)
$oStatement = $mysqli->prepare('SELECT column FROM table;');
// ...
// Second query (invalid)
$oStatement = $mysqli->prepare('SELECT column_which_doesnt_exist FROM table;');
这里的第一行告诉mysqli自己抛出异常,所以你得到一个异常和一个更清洁的代码