проблема при проверке mysql_num_rows();

Статус
В этой теме нельзя размещать новые ответы.

Krik

Постоялец
Регистрация
10 Авг 2007
Сообщения
55
Реакции
15
Здравствуйте, проблема следующая.
После mysql запроса выполняется функция mysql_num_rows
и возвращает она значение 1.
далее идёт проверка этого самого значения , но почему то не выполняется..

Код:
<?
   $username=$_POST['username']; 
   $sql="SELECT * FROM `users` WHERE `username`='$username' LIMIT 1";
   $result=mysql_query($sql);
				     
   $num_rows=mysql_num_rows($result);
				 
   echo "Найдено: ".$num_rows." записей";
   		
   if ( $num_rows  == 1 ) {
          echo "OK"; 
   }
?>

Подскажите пожалуйста в чём дело.
Скрипт выводит на экран Найдено: 1 записей и ничего не происходит.

Код if ($num_rows == 1) не выполняется.


Пробовал разные варианты:

if ($num_rows == 1)
if ($num_rows == '1')
if ($num_rows != 0)
if ($num_rows > 0)

даже intval($num_rows) делал чтобы быть точно уверенным что это целое число. до такого извращенства дошёл даже :D

то что $num_rows имеет значение 1 это точно. потому что сразу перед if я вывожу его на экран.

Может быть что то в настройках пыха ?

Конечно есть вариант сделать sql запрос через COUNT(*)
но хотелось бы разобраться, найти причину.
2 года на php пишу, никогда такой фигни не встречал ещё :)
всегда $num_rows == 1 работало)
а тут цикл не хочет проверять почему то.
бред какойто:mad:
 
  • Заблокирован
  • #2
Самое первое, что я бы сделал в такой ситуации - var_dump ($num_rows);

А когда бы там не оказалось единички, стал бы искать, что эту переменную на пути к проверке условия перезаписывает (я так понимаю, здесь лишь часть скрипта).

P.S. Надеюсь, в самом деле так не делаешь:
PHP:
 $username = $_POST['username']; 
 $sql="SELECT * FROM `users` WHERE `username` = '$username' LIMIT 1";
 
Сделай var_dump($result); и посмотри есть ли результат вообще, если будет resource, то все окей с запросом, дампи mysql_num_rows(), если нет - правь запрос/проверяй на упало ли соединение с БД.
 
я разобрался.

результат есть и запрос верный.
выводит же:
echo "Найдено: ".$num_rows." записей";

вывод скрипта: Найдено: 1 записей

переменная $num_rows имеет значение 1

но этот код который сразу после echo не выполняется.

Код:
if ( $num_rows  == 1 ) {
          echo "OK"; 
   }

и я нашёл почему.
отключив в скрипте error_reporting(0);
я увидел там ошибку связанную с require_once
т.е. файла который надо было включить, просто не было.
и у меня даже страница не отобразилась. а сразу эта ошибка.
но если сообщения об ошибках выключить, как было у меня, то при выполнении if ( $num_rows == 1 ) {
видимо опять срабатывает проверка на require_once и далее ничего не происходит. просто exit скрипта. без каких либо ошибок на экране.

в конструкции if ( $num_rows == 1 ) {
вызывается функция из того файла который необходимо было включить через require_once , т.е. когда php проверяет конструкцию if ( $num_rows == 1 ) { он не может найти функцию в этой конструкции, которая находится во внешнем файле и `срывается`.

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

но такая вот особенность php :)
всем спасибо, прошу это учесть при написании вашего кода :)

и никогда не забывайте про error_reporting :D

Добавлено через 20 минут
P.S. Надеюсь, в самом деле так не делаешь:
PHP:
 $username = $_POST['username']; 
 $sql="SELECT * FROM `users` WHERE `username` = '$username' LIMIT 1";


у меня сайт на своём сервере. php я сам настраивал.

есть какаято опасность так не делать при magic_quotes_gpc On ?

'$username' всегда в кавычках.
можно ли реализовать какую-то атаку в данном случае ?


Код:
SELECT * FROM `users` WHERE `username`='/*d*/ \' OR `username`> \'0' LIMIT 1

слеши mysql добавляет, вроде всё нормально. или я сильно ошибаюсь ?
если не сложно, прошу меня поправить и привести примеры атак.
 
а может быть переменную надо через ".$username." вставлять в строку? magic_quotes типа отключены
Не надо - строка в двойных кавычках, да и magic_quotes - это совсем другое.
но такая вот особенность php
всем спасибо, прошу это учесть при написании вашего кода

и никогда не забывайте про error_reporting
PHP здесь не при чём, виноват быдлокодинг - почитай ман по require_once().
 
подумаешь ошибся, все ошибаются :)
для этого и написал сюда, чтобы спросить совета.

я просто файл забыл на сервак залить который в require_once ))

но интересный факт, что при error_reporting (0) if () не выполняется , если вызывать в нём неизвестную функцию. а до этого код выполняется, сразу до if () который.
вот почему этот if и не срабатывал хотя результат проверки был верный.

а если просто выключить error_reporting (0) , то тогда да, покажет ошибку и скрипт перестанет сразу выполняться.

сразу обзываться, а я между прочим каждую букву в скрипте вручную пишу :D
 
1. в коде в 1-ом посте нет require вообще.
2. вызов неопределённой функции или require без необходимого файла приводит к критической ошибке и прекращению работы, в независимости от error_reporting (которая на выполнение скриптв вообще не влияет).

сразу обзываться
Это не обзывание - это констатация факта.

а я между прочим каждую букву в скрипте вручную пишу
да хоть вножную и вносную одновременно :D (кстати, интересно чем другие пишут, коль такой акцент на этом)
Твоя ошибка - это основы PHP. Лучше не пиши а маны почитай - тогда бы ни этого топика, ни твоих домыслов (про интересные факты) в нём не было бы.
 
PHP:
if ( $num_rows ) {
          echo "OK"; 
   }

И не париться.
 
это фантом

все верно делаешь, если не срабатывает перед использованием выведи на экран значение var_dump($num_rows);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху