$ mysqli-> prepare返回false,但是$ mysqli->错误是一个空字符串

时间:2016-11-21 12:15:11

标签: php mysqli

在我的代码中,我执行了几个有效的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);

为什么不返回错误消息?

2 个答案:

答案 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自己抛出异常,所以你得到一个异常和一个更清洁的代码