Mysql ошибка при подсчете строк - PullRequest
0 голосов
/ 14 октября 2011

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

Переменная $ 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 ]

3 голосов
/ 14 октября 2011

Если 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";

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

1 голос
/ 14 октября 2011

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");
0 голосов
/ 14 октября 2011

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

...