检查MySQL结果是否以PHP返回的最佳方法?


68

我正在寻找检查并查看查询是否返回任何结果的最佳方法。我觉得我经常写这部分代码,有时会出错,有时却没有。

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

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

做这个的最好方式是什么?


对于此示例,我们假设查询没有产生错误。
timroman 2010年

如果查询中没有错误,则第一个测试没有意义。第二种是最好的方式,如果它带有“ SELECT *”,则最后一种只有在您具有SELECT COUNT(*)或其他聚合函数时才有用。但是请出于
谨慎考虑

Answers:


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

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

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

这获得了我的投票。

OP假设查询未返回任何错误,因此这应该是一种方法


5
@ benhowdle89-如果sql失败,则$ result不是有效的mysql结果资源,mysql_num_rows可以做什么?
ajreal 2010年

3
是的,但几乎不值得一票!!仍然是检查O / P问题的有效方法:我正在寻找检查并查看查询是否返回任何结果的最佳方法。
benhowdle89

6
Racertim询问如何检查行数-而不是SQL是否失败,因此这是一个合法的答案。为此投票。
acme 2010年

6
如果$ result无效,mysql_num_rows将返回false php.net/manual/en/function.mysql-num-rows.php
苗条

1
更新:使用mysqli_num_rows($result) == 0如mysql_num_rows($结果)不工作与PHP版本> 7 (即我检查)
穆罕默德Mahroz

14

一种方法是检查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在某个地方调用并记录错误来解决。


2
[内容推荐,但想提一下。]次要风格:我讨厌在if中看到“ =”。太类似于“ ==”。更容易阅读,如果做作业之前if。(我在职业生涯中花了大量时间调试其他人的代码...)
ToolmakerSteve

6

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

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

不,不要使用empty。许多其他stackoverflow帖子都谈到这样做会导致错误,当值可能为0or时'0'在php中这些等于false。您需要测试$ result是(不是)明确相同false。重要提示:if (result != false)同样的原因,也是错误的。正确的代码是if ($result !== false)
ToolmakerSteve

2

在处理之前测试结果变量的TYPE更具逻辑性吗?它可以是'boolean'或'resource'类型。当对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);  
 }

3
推荐为有效,明确的选项。但是,实际上,可以通过以下简单代码实现相同的结果:if ($result === false)。注意:===不能为==。这样可以保证您仅测试“布尔假”。相反的测试是if ($result !== false)
ToolmakerSteve

2
$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";
} 

1

在以上所有选项中,我将使用

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

检查如下结果

if (!$result) { PERFORM ACTION }

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


1

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

0

将其与mysql_fetch_row“”一起使用是因为“对于SELECT,SHOW,DESCRIBE,EXPLAIN和其他返回结果集的语句,mysql_query()成功返回资源,错误返回FALSE。

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


1
没办法,mysql_fetch_row将获取结果。他在考虑选择,要求知道是否返回结果。
Shoe 2010年

-1

通常,我使用===三重等于)和__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;
    }
}


-1

如果您仍然要执行$result无效的操作:

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

这将说明一个0,失败时false返回mysql_num_rows()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.