如何跳过PHP mysqli中的非对象错误


How to skip non-object error in PHP mysqli?

当经典PHP mysql中的SQL语法出现错误时,查询将不会发生,而不会产生任何其他影响。但在mysqli中,它会杀死带有致命错误的PHP脚本

mysql_query("SELECT title, misspelled_column FROM posts");
$mysqli->query("SELECT title, misspelled_column FROM posts");

在第一种情况下,它将显示其他查询和php输出;但是第二种情况通过杀死了脚本

Fatal error: Call to a member function fetch_assoc() on a non-object

该问题与错误查询返回的non-object有关。我可以通过跳过这个错误

if($result){$row = $result->fetch_assoc();}

但我的问题是,为什么我不需要在经典mysql中进行此检查?有了更先进的系统,人们期望新的功能不会错过我们所拥有的。

MySQL生成的错误不应该停止执行。事实上,您可以使用$mysqli->error让脚本显示任何SQL错误(假设$mysqli是您的数据库连接,就像您的示例中一样)。然而,可能发生的情况是,您的mysqli错误导致无法创建特定的对象,然后对该对象调用方法将创建致命的PHP错误。例如:

$dbconn = new mysqli("localhost", $username, $password, $dbname);
$stmt = $dbconn->prepare("bluh"); // not a valid statement. fails to create a mysqli statement object in $stmt.
echo($dbconn->error); // your script is still running, and this will show your MySQL syntax error.
$stmt->execute();

这并不是因为您犯了SQL错误,而是因为$stmt为null并且没有预期的execute()方法。所以,就像其他人所说的,检查你的日志,看看实际的错误是什么

使用@忽略错误将是偶然的,直到您弄清楚是哪个特定命令造成了错误。

更新:如果您知道查询中有错误,那么在尝试执行任何操作之前,您可以检查查询是否成功。一种方法是检查error参数;另一种方法是检查以确保它确实返回了您想要的对象类型。

以下是两者的示例:

$result = $db->query("select firstname, lastname from people where firstname = 'egbert';");
if($db->error == '') {
     // the query worked, so fetch results from $result and do stuff with them.
}
else {
     // the query didn't work, so don't try to do anything with $result
}
// alternately:
if(gettype($result) == "object") {
     // the query worked.
}
else {
     // it didn't.
}
根据我的经验,SQL错误不会杀死mysqli。我怀疑您在相关语句中确实存在PHP错误。请检查您的错误日志。

在PHP中,可以使用@来抑制错误。在这里使用它是个坏主意。但如果这是你真正想要的,它记录在http://php.net/manual/en/language.operators.errorcontrol.php.