Если 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";
Какой из них использовать, зависит от того, нужен ли вам ряд строк или вам просто нужно знать, существует строка или нет. Если есть уникальный индекс, они в любом случае должны быть очень похожи в вычислительном отношении.