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

检查MySQL结果是否以PHP返回的最佳方法?,php,mysql,Php,Mysql,我正在寻找检查和查看查询中是否返回任何结果的最佳方法。我觉得我经常写这部分代码,有时会出错,有时不会 例如,在将新用户名插入数据库之前,我运行此查询检查用户名是否存在 $result = mysql_query("SELECT * FROM ..."); 然后我想检查一下是否返回了任何结果。我有一种方法: if (!$result) { PERFORM ACTION } 如果第一种方法不起作用,那么有时会: if (mysql_num_rows($result)==0) { PERFORM

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

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

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

最好的方法是什么?

一种方法是检查返回的内容。下面是一个最简单完整的示例:

if ($result = mysql_query($sql) && mysql_num_rows($result) > 0) {
    // there are results in $result
} else {
    // no results
}
但建议您检查的返回值,如果返回值为
false
(这可能是由错误引起的),请正确处理该值;可能还需要调用并记录某个地方的错误

if (mysql_num_rows($result)==0) { PERFORM ACTION }
对于PHP5和PHP7及以上版本,请使用mysqli:

if (mysqli_num_rows($result)==0) { PERFORM ACTION }
这是我的选票


OP假设查询没有返回任何错误,因此这应该是使用带有
mysql\u fetch\u row
的方法之一,因为“对于返回resultset的SELECT、SHOW、description、EXPLAIN和其他语句,mysql\u query()在成功时返回资源,在错误时返回FALSE


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

以上所有选项中我都会使用

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

对照下面的结果进行检查

if (!$result) { PERFORM ACTION }

如果mysql\u错误发生得非常有效,则会出现这种情况。如果发生错误,则可以输入重复的用户名

通常我使用
==
()和
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

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

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

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

还有什么比在处理前测试结果变量的类型更符合逻辑? 它属于“布尔”或“资源”类型。当您对mysqli_num_行使用boolean for参数时,将生成一条警告,因为函数需要一个资源

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

我就是这样做的,如果
$result
无效,如果您仍想执行操作,您还可以在那里用骰子扔一个else…

if(!mysql_num_rows($result))
    // Do stuff
这将解释失败时由
mysql\u num\u rows()
返回的
0
false

mysqli\u fetch\u 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 ...
}

@如果sql失败,$result不是有效的mysql结果资源,mysql_num_rows可以做什么?是的,但它几乎不值得投票否决!?这仍然是检查O/P问题的有效方法:我正在寻找检查并查看查询中是否返回任何结果的最佳方法。Racertim询问如何检查行数,而不是SQL是否失败,因此这是一个合法的答案。如果$result是无效的更新,mysql\u num\u rows将返回false:使用
mysqli\u num\u rows($result)==0
因为mysql\u num\u rows($result)不适用于php版本>7(我选中了该版本)。不可能,mysql\u fetch\u row将获取结果。考虑到SELECT,他要求知道是否返回了结果。在本例中,假设查询没有产生错误。如果查询中没有错误,那么第一个测试就没有意义。如果是“SELECT*”,则第二种方法是最好的方法。只有在使用SELECT COUNT(*)或其他聚合函数时,最后一种方法才有用。但出于理智的考虑,请使用PDO:-)[对内容进行投票,但想提及这一点。]次要风格nit:我讨厌在if中看到“=”。与“==”太相似。如果在
if
之前完成作业,则更容易阅读。(在我的职业生涯中,我花了很多时间调试别人的代码…)不,不要使用
empty
。许多其他stackoverflow帖子都提到这样做会导致错误,在php中,当值可能是
0
'0'
,这些值等于false。您需要测试$result是否(不是)具体地、相同地,
false
。重要提示:如果(result!=false)
,出于同样的原因,
也是错误的。如果($result!==false)
,则正确的代码为
。作为有效的、清除的选项进行升级表决。然而在实践中,同样的结果是通过更简单的代码实现的:
if($result==false)
。注意:这必须是
==
而不是
=
。这保证您只测试“boolean false”。相反的测试是
如果($result!==false)
if ( ! $row = $result->fetch_array() ) {
    ...
}
else {
    ... get the first result in $row ...
}
$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";
}