Каков правильный способ проверить, возвратили ли mysql_query() какие-либо результаты?

Я пробовал то, что казалось самым интуитивным подходом

$query = "SELECT * FROM members WHERE username = '$_CLEAN[username]'
                                  AND password = '$_CLEAN[password]'";
$result = mysql_query($query);

if ($result)
{ ... 

но это не сработало, потому что mysql_query возвращает истинное значение, даже если возвращается 0 строк. Я в основном хочу выполнить логику в этом условии, только если строка возвращается.

Ответ 1

Используйте mysql_num_rows:

 if (mysql_num_rows($result)) {
    //do stuff
 }

Ответ 2

Если вы проверяете ровно одну строку:

if ($Row = mysql_fetch_object($result)) {
    // do stuff
}

Вместо этого вы можете использовать mysql_fetch_array() или что-то еще, но принцип тот же. Если вы ожидаете 1 или более строк:

while ($Row = mysql_fetch_object($result)) {
    // do stuff
}

Это будет зацикливаться до тех пор, пока не закончится строка, после чего она будет продолжена.

Ответ 3

mysql_num_rows

Извлекает количество строк из набора результатов. Эта команда действительна только для таких операторов, как SELECT или SHOW, которые возвращают фактический набор результатов.

Если ни одна из них не соответствует, то нуль будет возвратным значением и эффективно FALSE.

$result = mysql_query($query);

if(mysql_num_rows($result))
{ //-- non-empty rows found fitting your SQL query

  while($row = mysql_fetch_array($result))
  {//-- loop through the rows, 
   //--   each time resetting an array, $row, with the values

  }
}

Что все хорошо и хорошо, если вы только выходите из базы данных. Если вы измените или удалите строки из базы данных и хотите узнать, сколько из них было затронуто...

Чтобы получить количество строк, на которые влияет запрос INSERT, UPDATE, REPLACE или DELETE, используйте mysql_affected_rows().

$result = mysql_query($query);

if(mysql_affected_rows())
{ //-- database has been changed 

}

//-- if you want to know how many rows were affected:
echo 'Rows affected by last SQL query: ' .mysql_affected_rows();

mysql_query() возвращает только FALSE, если запрос завершился неудачно. Он вернет TRUE, даже если у вас нет строк, но успешно запросил базу данных.

Ответ 4

$sql = "SELECT columns FROM table";
$results = mysql_query($sql, $conn);
$nResults = mysql_num_rows($results);
if ($nResults > 0) {
   //Hurray
} else {
   //Nah
}

Это должно работать.

Ответ 5

Я использовал следующее:

if ($ result!= 0 && mysql_num_rows ($ result)) {

Если запрос ничего не возвращает, он будет логическим результатом и будет равен 0.

Итак, вы проверяете, равен ли он нулю или нет, а если нет, мы знаем там что-то там.

ОДНАКО, иногда он возвращает 1, даже если там ничего нет, поэтому вы ТОГДА проверяете, есть ли какие-либо строки и есть ли там полная строка, вы точно знаете, что результат был возвращен.

Ответ 6

Как насчет этого пути:

$query = "SELECT * FROM members WHERE username = '$_CLEAN[username]'
                                  AND password = '$_CLEAN[password]'";
$result = mysql_query($query);
$result = mysql_fetch_array($result);

//you could then define your variables like:
$username = $result['username'];
$password = $result['password'];

if ($result)
{ ...

Мне это нравится, потому что я получаю очень специфические результаты, полученные из mysql_query.

-Иван Новак

Ответ 7

ну...

Определить mysql_query:

mysql_query() возвращает ресурс в успех или FALSE при ошибке.

но то, что вам нужно понять, - это если эта функция возвращает значение, отличное от FALSE, запрос был запущен без проблем (правильный синтаксис, подключение еще живое и т.д.), но это не означает, что запрос возвращает некоторую строку.

например

<?php

$result = mysql_query("SELECT * FROM a WHERE 1 = 0");

print_r($result); // => true

?>

поэтому, если вы получите FALSE, вы можете использовать

mysql_errorno() и mysql_error(), чтобы узнать, что произошло.

после этого:

вы можете использовать mysql_fetch_array() для получения строки за строкой из запроса

Ответ 8

$result = mysql_query(...);

if(false !== $result)
{
    //...
}