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

Dav*_*ann 5 php mysqli

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

为什么不返回错误信息?

Dav*_*ann 7

我花了一段时间才找到错误。我在这里没有找到任何东西,所以我发布了这个问答:

$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);
Run Code Online (Sandbox Code Playgroud)

使用此解决方案,错误文本有效并且可以抛出。