79

I'm looking for the best way to check and see if any results were returned in a query. I feel like I write this part of code a lot and sometimes I get errors, and sometimes I don't.

For example, I run this query to check if a username exists before inserting a new one into the database.

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

Then I want to check and see if any results were returned. Here is one way I do it:

if (!$result) { PERFORM ACTION }

If the first way doesn't work, then sometimes this will:

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

Then I even saw that I could do it this way the other day:

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

What is the best way to do this?


Moderator note:

This question is about the old mysql_* API. For answers related to the mysqli API visit Checking if mysqli_query returned any values?

Dharman
  • 30,962
  • 25
  • 85
  • 135
timroman
  • 1,384
  • 1
  • 10
  • 18
  • For this example, let's assume that the query is not producing an error. – timroman Nov 26 '10 at 15:55
  • If there is no error in the query, the first test is meaningless then. The second is the best way if its a "SELECT \*" the last is only useful if you have a SELECT COUNT(\*) or other aggregated function. But please for sanity sakes, use PDO :-) – Rahly Nov 26 '10 at 16:50

7 Answers7

167

Assuming that the query did not produce any errors and $result points to a valid resource:

if (mysql_num_rows($result)==0) { PERFORM ACTION }
Dharman
  • 30,962
  • 25
  • 85
  • 135
benhowdle89
  • 36,900
  • 69
  • 202
  • 331
15

One way to do it is to check what mysql_num_rows returns. A minimal complete example would be the following:

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

But it's recommended that you check the return value of mysql_query and handle it properly in the case it's false (which would be caused by an error); probably by also calling mysql_error and logging the error somewhere.

Shoe
  • 74,840
  • 36
  • 166
  • 272
7

Whenever we do queries to get some data, it is returned as an object. Then most of us convert it to array for looping through the rows easily. In php "empty()" function is used to check if an array is empty i.e. if it has no data in it. So we can check if returned array representation of query isn't empty by doing like this

if(!empty($result)){
           //DO STUFF
}
  • No, don't use `empty`. Lots of other stackoverflow posts talk about doing so causing mistakes, when a value could be `0` or `'0'`, *in php these are equal to false*. You need to test that $result is (not) specifically, identically, `false`. IMPORTANT: also wrong would be `if (result != false)`, for the same reason. Correct code is `if ($result !== false)`. – ToolmakerSteve Jan 09 '17 at 20:15
1

Of all the options above I would use

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

checking against the result like below

if (!$result) { PERFORM ACTION }

This will be true if a mysql_error occurs so effectively if an error occurred you could then enter a duplicate user-name...

martynthewolf
  • 1,718
  • 2
  • 11
  • 22
0

Use the one with mysql_fetch_row because "For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.

For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error. "

cristian
  • 8,676
  • 3
  • 38
  • 44
  • 1
    No way, mysql_fetch_row will fetch the results. He is asking for knowing if a result is returned or not, considering a SELECT. – Shoe Nov 26 '10 at 15:46
-2

If you would still like to perform the action if the $result is invalid:

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

This will account for a 0 and the false that is returned by mysql_num_rows() on failure.

D. Mariano
  • 27
  • 5
-2

Usually I use the === (triple equals) and __LINE__ , __CLASS__ to locate the error in my code:

$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;
    }
}
Community
  • 1
  • 1
Amirouche Douda
  • 1,564
  • 1
  • 21
  • 30