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");
- Ваш код уязвим для SQL-инъекций. На аргументе есть также полоса xkcd:-)
Если 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