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

Тема в разделе "PHP", создана пользователем Krik, 14 дек 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Krik

    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. Jameson

    Jameson Читатель

    Заблокирован
    Регистр.:
    25 июн 2007
    Сообщения:
    406
    Симпатии:
    92
    Самое первое, что я бы сделал в такой ситуации - var_dump ($num_rows);

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

    P.S. Надеюсь, в самом деле так не делаешь:
    PHP:
     $username $_POST['username']; 
     
    $sql="SELECT * FROM `users` WHERE `username` = '$username' LIMIT 1";
     
  3. brazer

    brazer Постоялец

    Регистр.:
    16 май 2006
    Сообщения:
    87
    Симпатии:
    10
    а может быть переменную надо через ".$username." вставлять в строку? magic_quotes типа отключены
     
  4. chewie

    chewie Создатель

    Регистр.:
    17 ноя 2007
    Сообщения:
    41
    Симпатии:
    1
    Сделай var_dump($result); и посмотри есть ли результат вообще, если будет resource, то все окей с запросом, дампи mysql_num_rows(), если нет - правь запрос/проверяй на упало ли соединение с БД.
     
  5. Krik

    Krik Постоялец

    Регистр.:
    10 авг 2007
    Сообщения:
    55
    Симпатии:
    15
    я разобрался.

    результат есть и запрос верный.
    выводит же:
    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 минут

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

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

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


    Код:
    SELECT * FROM `users` WHERE `username`='/*d*/ \' OR `username`> \'0' LIMIT 1
    
    слеши mysql добавляет, вроде всё нормально. или я сильно ошибаюсь ?
    если не сложно, прошу меня поправить и привести примеры атак.
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Не надо - строка в двойных кавычках, да и magic_quotes - это совсем другое.
    PHP здесь не при чём, виноват быдлокодинг - почитай ман по require_once().
     
  7. Krik

    Krik Постоялец

    Регистр.:
    10 авг 2007
    Сообщения:
    55
    Симпатии:
    15
    подумаешь ошибся, все ошибаются :)
    для этого и написал сюда, чтобы спросить совета.

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

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

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

    сразу обзываться, а я между прочим каждую букву в скрипте вручную пишу :D
     
  8. PHP_Master

    PHP_Master

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

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

    да хоть вножную и вносную одновременно :D (кстати, интересно чем другие пишут, коль такой акцент на этом)
    Твоя ошибка - это основы PHP. Лучше не пиши а маны почитай - тогда бы ни этого топика, ни твоих домыслов (про интересные факты) в нём не было бы.
     
  9. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    PHP:
    if ( $num_rows ) {
              echo 
    "OK"
       }
    И не париться.
     
  10. pizd

    pizd Создатель

    Регистр.:
    10 ноя 2007
    Сообщения:
    43
    Симпатии:
    10
    это фантом

    все верно делаешь, если не срабатывает перед использованием выведи на экран значение var_dump($num_rows);
     
Статус темы:
Закрыта.