2016-11-21 66 views
2

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

为什么它不返回错误信息?

回答

2

我花了一段时间找到错误。我没有在这里找到东西,所以我发布这个Q &答案:

$ 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); 

这种解决方案的错误文本是有效的,可以被抛出。

+0

有趣的发现,谢谢你的分享。 JFYI http://stackoverflow.com/questions/18457821/how-to-make-mysqli-throw-exceptions-using-mysqli-report-strict –

1

感谢您的分享,这确实是一个非常有趣的行为。

然而,为了清晰起见,有一个更好的办法:

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的本身抛出异常,所以你得到两个例外,那就是多,更清洁的代码

相关问题