【问题标题】:How to skip non-object error in PHP mysqli?如何跳过 PHP mysqli 中的非对象错误?
【发布时间】:2012-03-22 13:52:15
【问题描述】:

当经典 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 使用起来不如 mysql 方便,这似乎很奇怪。另一方面,mysqli 禁止你做的大部分事情都是我们一开始就不应该做的事情。两个大示例是编写非参数化查询或尝试使用查询结果而不确保它们存在。能够做到这一点可能很方便,但这也是一个巨大的安全漏洞或等待发生的应用程序崩溃。

标签: php mysql mysqli syntax-error fatal-error


【解决方案1】:

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.
}

【讨论】:

  • 我遵循了我的错误,它们正是由于您引用的原因;但我不知道如何避免由于 mysqli 无对象输出而导致的致命错误。
  • 在这种情况下,发布实际上给您错误的代码可能会对您有所帮助——您在问题中提供的示例代码是不够的。
  • 您可以只测试查询是否成功,如果失败则跳过任何进一步的操作。我已经用一个例子更新了我的答案。
  • 另外,我认为您的问题仍然是错误的:在查询中拼写错误的列不会导致脚本死亡。它只会在您尝试使用错误查询的结果做某事时死掉。
【解决方案2】:

根据我的经验,SQL 错误不会杀死 mysqli。我怀疑您在相关声明中实际上存在 PHP 错误。检查您的错误日志。

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

【讨论】:

  • 这不是“通常”,但总是一个坏主意。这显然不是 OP 需要的。
  • 一个常见的“我只阅读问题标题并且不会因阅读正文而困扰自己”的答案。 “如何忽略错误”关键字触发自动回答。不涉及任何思想。我想知道为什么 SO 还没有编写这样的功能,让发烧友过时了。
  • @Col.Shrapnel 这个故事和你说的不一样。由于语法错误,我的 PHP 设置中应该存在导致致命错误的内容。因为我最近从 mysql 搬到了 mysqli;我问是否有人可以提示我如何设置 PHP 以避免这种情况。
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多