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

标签 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);

为什么不返回错误信息?

最佳答案

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

$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/

相关文章:

javascript - Python获取post数据调用远程python脚本显示在页面上

javascript - 当没有上传视频时,html5 video 标签会显示一个空的视频框。我怎样才能隐藏这个空盒子?

php - $this->load->library ('form_helper' ) 等同于 C++?

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

javascript - Ajax数据库选择值返回 '0'而不是字符串

php - exec() 什么都不做

c# - 在 php 或 JS 中解压缩 SharpZipLib 字符串?

php - PHP更优雅的方式处理mysqli错误

php - 为什么死于 connect_error() 不起作用?

php - 正在迁移已弃用的应用程序(mysql_* 到 mysqli): Object of class mysqli could not be converted to string