【问题标题】:Catching mysql_query error捕获 mysql_query 错误
【发布时间】:2011-02-16 16:30:55
【问题描述】:

我试图阻止 mysql_query 错误输出到我的表单中。目前如果没有找到位置,我会收到错误

“警告:mysql_result() [function.mysql-result]:无法跳转到 MySQL 结果索引 11 上的第 0 行”

我试图捕捉这个错误,而是将 $location 变量分配给未找到。我尝试这样做的代码如下,我做错了什么?

谢谢!

$query3 = "SELECT `location` FROM location WHERE vin = '$vin' LIMIT 1";
$result3 = mysql_query($query3);

if (!mysql_result($result3,0)) {
    $location = "Not found";
} else $location = mysql_result($result3,0,0);

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    mysql_result() 通常不应使用。您最好使用以下内容:

    $result3 = mysql_query($query3) or die(mysql_error());
    
    if (mysql_numrows($result3) == 0) then
       $location = "not found";
    } else {
       $row = mysql_fetch_array($result3);
       $location = $row[0];
    }
    

    您的错误是由于查询未返回任何行导致的 - 例如没有匹配的。然后,您尝试检索该结果集第一行中的第一个字段,该行不存在。使用mysql_numrows() 检查返回的行数更安全,因为无论查询什么都没有找到或找到数十亿行,这都有效。

    【讨论】:

    • 这应该是解决这个问题的正确方法。不要隐藏你的问题,而是解决它们;)
    • @Marc 您能否在 php 文档中提供指向 mysql_numrows 的链接?
    【解决方案2】:

    您应该研究如何在 php ini 中设置错误和警告级别 - 通常您希望 prod 上的输出尽可能少。

    http://www.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

    但是,在这里,会产生该错误的代码是:

    $result3 = mysql_query($query3);
    

    这就是你应该写你的 if 或“or die”语句的那一行:

    $result3 = mysql_query($query3)or die($location = "not found");
    

    【讨论】:

    • mysql_query() 在查询失败时返回 FALSE,而不是在返回零行时返回。
    【解决方案3】:

    您应该考虑使用 OOP;使用数据库类来处理与数据库的交互。

    但是,基本上你想在尝试返回结果之前检查是否有任何行。

    尝试在“if”语句中检查“mysql_num_rows”:

    if (!mysql_num_rows($result3)) {
    

    【讨论】:

      【解决方案4】:

      首先,你可以添加@:

      if (!@mysql_result($result3,0)) {
          $location = "Not found";
      } else $location = mysql_result($result3,0,0);
      

      其次,您可以在mysql_result调用之前检查mysql_num_rows(result3)

      【讨论】:

      • @Álvaro G. Vicario - 是的。但是编码员应该知道他正在编码的语言的所有特征。我认为第二种变体也更可取。
      • 请不要推荐运营商@。它会立即给代码带来难闻的气味。
      【解决方案5】:

      如果什么都没找到,Mysql_query 返回 false 这么简单:

      $result3 = mysql_query($query3);
      
      if (mysql_affected_rows($result3) == 0) {
          $location = "Not found";
      } else  $location = mysql_result($result3,0,0);
      

      应该这样做。

      【讨论】:

      • 在这种情况下,mysql_query() 应该在 MySQL 服务器崩溃、连接断开或类似情况时返回 FALSE。不返回任何行的查询不是错误。
      • OP报错是mysql_result命令导致的,因为上面的mysql_query没有返回结果。我的回答是针对原因而不是针对症状。
      • 过失,我不明白你的评论。 mysql_query 仅在 sql 语句导致错误时才返回 false。如果行数为 0,则不会。我正在根据此更正我的答案。
      • 来自 php 文档:“通过与 link_identifier 关联的最后一个 INSERT、UPDATE、REPLACE 或 DELETE 查询获取受影响的行数。
      猜你喜欢
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2012-08-24
      • 2023-03-28
      • 2017-03-26
      相关资源
      最近更新 更多