Mysql ошибка при подсчете строк

У меня проблема при попытке подсчета строк в таблице.

Переменная $username_me равна имени пользователя сеанса. Ни один из них не включен в оператор if или else.

Я получаю ошибку:

Предупреждение: mysql_num_rows() ожидает, что параметр 1 будет ресурсом, логическое значение указано в / home /*/ public_html /**/sidebar.php в строке 21

Строка 21 - последняя строка в коде, который я вставил.

//Count unread oneliners
$oneliners_sql = "SELECT * FROM oneliners WHERE to_user='$username_me' AND read=0";
$oneliners_query = mysql_query($oneliners_sql);
$oneliners_num = mysql_num_rows($oneliners_query);

3 ответа

Решение

0,1. read является зарезервированным словом mysql и должно быть заключено в кавычки:

$sql = "SELECT * FROM oneliners WHERE to_user='$username_me' AND `read`=0";

0,2. никогда не используйте SELECT * для подсчета строк. Вместо этого используйте SELECT count(*).

0,3. всегда выполняйте все ваши запросы таким образом, чтобы увидеть, что произошла ошибка.

//Count unread oneliners
$sql = "SELECT count(*) FROM oneliners WHERE to_user='$username_me' AND `read`=0";
$result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
$row = mysql_fetch_row($result);
$oneliners_num = $row[0];

никогда не использовать die() для этого, несмотря на все эти глупые предложения.

+0,4. Создать функцию для такой обычной задачи.

function getOne($sql) {
  $result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
  if ($row = mysql_fetch_row($result)) {
    return $row[0];
  }
}

Таким образом, вы сможете получить свой номер с одной строкой

$oneliners_num = getOne("SELECT count(*) FROM oneliners WHERE to_user='$username_me' AND `read`=0");

Если magic_quotes_gpc не включены (и не должны, магические кавычки были одной из многих ошибок проектирования PHP, и теперь они устарели), хакер (или, скорее всего, бот!) Мог свободно изменять ваши запросы, вызывая всевозможные проблемы на ваш сайт.

Надлежащим способом решения этой серьезной проблемы является использование подготовленных отчетов, например, с PDO. В качестве альтернативы вы можете использовать mysql_real_escape_string:

$sql = "SELECT COUNT(*) FROM oneliners WHERE to_user='" . 
    mysql_real_escape_string($username_me) . "' AND `read`=0";

Беда с mysql_real_escape_string это то, что вы должны помнить, чтобы всегда использовать его, в то время как с подготовленными заявлениями эти вопросы заботятся о вас. Также, если вы не используете подготовленные заявления, вы можете использовать intvalочистить ваши целочисленные входы.

Позвольте мне еще раз подчеркнуть: ОЧЕНЬ ВАЖНО САНИТИЗИРОВАНИЕ ВАШИХ ВХОДОВ. Вы не должны доверять ничему, что исходит от пользователя.

  • Ваша проблема вызвана тем, что mysql_query возвращает FALSE в случае сбоя запроса. Если запрос терпит неудачу, mysql_query возвращает FALSE вместо ресурса. Вы можете вызвать mysql_num_rows на ресурсе, а не на FALSE. (Из руководства: mysql_query() возвращает ресурс в случае успеха или FALSE в случае ошибки).

  • Ошибка вызванаreadимя поля, так как является зарезервированным словом. Попробуйте заключить его в кавычки (`) или, что еще лучше, переименовать.

  • Чтобы узнать, существует ли строка или нет, вы можете использоватьCOUNT(*)или жеSELECT 1

С COUNT запрос всегда будет возвращать значение 0 или 1 (я полагаю, что у вас есть уникальный индекс на to_user), за исключением случаев, когда запрос не удается, конечно.

$sql = "SELECT COUNT(*) FROM oneliners WHERE to_user='" . 
    mysql_real_escape_string($username_me) . "' AND `read`=0";

С SELECT 1 запрос вернет 1, если строка существует, иначе он не вернет ни одной строки.

$sql = "SELECT 1 FROM oneliners WHERE to_user='" . 
    mysql_real_escape_string($username_me) . "' AND `read`=0 LIMIT 1";

Какой из них использовать, зависит от того, нужен ли вам ряд строк или вам просто нужно знать, существует строка или нет. Если есть уникальный индекс, они в любом случае должны быть очень похожи в вычислительном отношении.

mysql_query возвратил ложный инстакред результата mysql. Итак, в вашем запросе или соединении есть некоторые ошибки. Вы можете прочитать ошибку с mysql_error

Другие вопросы по тегам