【问题标题】:Best way to check if mysql_query returned any results?检查 mysql_query 是否返回任何结果的最佳方法?
【发布时间】:2011-05-16 06:06:36
【问题描述】:

我正在寻找检查查询中是否返回任何结果的最佳方法。我感觉这部分代码我写了很多,有时会出错,有时不会。

例如,我在将新用户名插入数据库之前运行此查询以检查用户名是否存在。

$result = mysql_query("SELECT * FROM ...");

然后我想检查一下是否返回了任何结果。这是我这样做的一种方法:

if (!$result) { PERFORM ACTION }

如果第一种方法不起作用,那么有时会这样:

if (mysql_num_rows($result)==0) { PERFORM ACTION }

然后我什至看到前几天我可以这样做:

list($total) = mysql_fetch_row($result);
if ($total==0) { PERFORM ACTION }

最好的方法是什么?

【问题讨论】:

  • 对于这个例子,我们假设查询没有产生错误。
  • 如果查询没有错误,那么第一次测试是没有意义的。如果它是“SELECT *”,则第二种方法是最好的方法,最后一种方法仅在您有 SELECT COUNT(*) 或其他聚合函数时才有用。但是为了理智,请使用 PDO :-)

标签: php mysql


【解决方案1】:

一种方法是检查mysql_num_rows 返回的内容。一个最小的完整示例如下:

if ($result = mysql_query($sql) && mysql_num_rows($result) > 0) {
    // there are results in $result
} else {
    // no results
}

但是建议你检查mysql_query的返回值,如果是false的情况下正确处理(可能是错误引起的);可能还调用mysql_error 并在某处记录错误。

【讨论】:

  • [赞成内容,但想提一下。] 小风格 nit:我讨厌在 if 中看到“=”。与“==”太相似了。如果在if 之前 进行分配,则更易于阅读。 (我在职业生涯中花了很多时间调试其他人的代码......)
【解决方案2】:
if (mysql_num_rows($result)==0) { PERFORM ACTION }

对于 PHP 5 和 7 及更高版本,请使用 mysqli:

if (mysqli_num_rows($result)==0) { PERFORM ACTION }

【讨论】:

  • @benhowdle89 - 如果 sql 失败,$result 不是有效的 mysql 结果资源,mysql_num_rows 可以做什么?
  • 是的,但不值得一票否决!?它仍然是检查 O/P 问题的有效方法:我正在寻找检查查询中是否返回任何结果的最佳方法。
  • Racertim 询问如何检查行数 - 如果 SQL 失败则不检查,所以这是一个合法的答案。为此投票。
  • mysql_num_rows 如果 $result 无效php.net/manual/en/function.mysql-num-rows.php 将返回 false
  • 更新: 使用mysqli_num_rows($result) == 0 mysql_num_rows($result) 不适用于 php 版本 > 7 (我检查过)跨度>
【解决方案3】:

使用带有mysql_fetch_row 的那个,因为“对于 SELECT、SHOW、DESCRIBE、EXPLAIN 和其他返回结果集的语句,mysql_query() 成功时返回资源,错误时返回 FALSE。

对于其他类型的 SQL 语句,INSERT、UPDATE、DELETE、DROP 等,mysql_query() 在成功时返回 TRUE,在错误时返回 FALSE。 "

【讨论】:

  • 没办法,mysql_fetch_row 会获取结果。考虑到 SELECT,他要求知道是否返回结果。
【解决方案4】:

在上面的所有选项中,我会使用

if (mysql_num_rows($result)==0) { PERFORM ACTION }

检查如下结果

if (!$result) { PERFORM ACTION }

如果 mysql_error 如此有效地发生,那么这将是正确的,如果发生错误,您可以输入重复的用户名...

【讨论】:

    【解决方案5】:

    通常我使用=== (triple equals) 和__LINE__, __CLASS__ 来定位我的代码中的错误:

    $query=mysql_query('SELECT champ FROM table')
    or die("SQL Error line  ".__LINE__ ." class ".__CLASS__." : ".mysql_error());
    
    mysql_close();
    
    if(mysql_num_rows($query)===0)
    {
        PERFORM ACTION;
    }
    else
    {
        while($r=mysql_fetch_row($query))
        {
              PERFORM ACTION;
        }
    }
    

    【讨论】:

      【解决方案6】:

      每当我们进行查询以获取一些数据时,它都会作为对象返回。然后我们大多数人将其转换为数组,以便轻松地遍历行。在 php 中,“empty()”函数用于检查数组是否为空,即其中是否没有数据。所以我们可以像这样检查返回的查询数组表示是否不为空

      if(!empty($result)){
                 //DO STUFF
      }
      

      【讨论】:

      • 不,不要使用empty。许多其他 stackoverflow 帖子都谈到这样做会导致错误,当一个值可能是 0'0'在 php 中这些等于 false。您需要测试 $result 是否(不是)具体地,同样地,false。重要提示:出于同样的原因,if (result != false) 也是错误的。正确的代码是if ($result !== false)
      【解决方案7】:

      在处理之前测试结果变量的 TYPE 更符合逻辑吗? 它的类型为“布尔”或“资源”。当您将布尔值用于 mysqli_num_rows 参数时,将生成警告,因为该函数需要资源。

      $result = mysqli_query($dbs, $sql);
      
      if(gettype($result)=='boolean'){ // test for boolean
          if($result){  // returned TRUE, e.g. in case of a DELETE sql  
              echo "SQL succeeded"; 
          } else { // returned FALSE
              echo "Error: " . mysqli_error($dbs);
          } 
      } else { // must be a resource
          if(mysqli_num_rows($result)){
      
             // process the data    
      
          }
          mysqli_free_result($result);  
       }
      

      【讨论】:

      • 被赞成为有效、明确的选项。然而在实践中,通过更简单的代码可以实现相同的结果:if ($result === false)。注意:这必须是 === 而不是 ==。这保证您只测试“布尔假”。相反的测试是if ($result !== false)
      【解决方案8】:
      $result = $mysqli->query($query);
      if($result){
          perform action
      }
      

      我就是这样做的,你也可以用骰子把 else 扔在那里......

      【讨论】:

      • if-case 将始终为真,除非出现 documentation 中提到的失败(例如数据库连接)。
      • 我知道我的回答不受欢迎。取自手册返回值¶失败时返回 false。对于产生结果集的成功查询,例如 SELECT、SHOW、DESCRIBE 或 EXPLAIN,mysqli_query() 将返回一个 mysqli_result 对象。对于其他成功的查询,mysqli_query() 将返回 true。它会在成功时返回 true,可能有 0 行,但你可以数数..
      【解决方案9】:

      如果$result 无效,您仍想执行该操作:

      if(!mysql_num_rows($result))
          // Do stuff
      

      这将说明0mysql_num_rows() 在失败时返回的false

      【讨论】:

        【解决方案10】:

        如果没有行,mysqli_fetch_array() 返回NULL

        程序风格:

        if ( ! $row = mysqli_fetch_array( $result ) ) {
            ... no result ...
        }
        else {
            ... get the first result in $row ...
        }
        

        面向对象的风格:

        if ( ! $row = $result->fetch_array() ) {
            ...
        }
        else {
            ... get the first result in $row ...
        }
        

        【讨论】:

          【解决方案11】:
          $connect = new mysqli('localhost', 'user', 'password', 'db');
          $result = $connect->query("select * from ...");
          $count=$result->num_rows;
          if(empty($count)){
          echo"Query returned nothing";
          }
          else{
          echo"query returned results";
          } 
          

          【讨论】:

            猜你喜欢
            • 2010-09-17
            • 2019-01-21
            • 2011-11-26
            • 1970-01-01
            • 1970-01-01
            • 2011-03-13
            • 2015-06-19
            • 1970-01-01
            • 2023-04-10
            相关资源
            最近更新 更多