1. PHP / Говнокод #2393

    +168.5

    1. 1
    2. 2
    3. 3
    while ($char_list = mysql_fetch_array($char_list_query,MYSQL_ASSOC) or die(mysql_error())) {
        echo "<option>{$char_list['name']}</option>";
    }

    Запостил: POPSuL, 10 Января 2010

    Комментарии (28) RSS

    • и в чём воняет? ( "<option>{$char_list['name']}</option>" - ?)
      Ответить
      • while ($char_list = mysql_fetch_array($char_list_query,MYSQL _ASSOC) or die(mysql_error()))
        Ответить
    • Попсул такой попсул
      Ответить
    • Книги Российских афтаров учат студентов. :-D
      Ответить
    • вообще забавно, автор интересно представляет, что будет с сайтом, когда сработает его die, или "срать на пользователей, у меня ТУТ ОШИБКА!" =)
      Ответить
      • Вообще-то die будет всегда, есть там ошибка или нет
        Ответить
        • вообще-то я этого не опровергал.. между строк прочли? 0-о
          Ответить
          • > "срать на пользователей, у меня ТУТ ОШИБКА!"
            Других вариантов я у Вас не увидел
            Ответить
        • Дай будет только если будет ошибка. Читай как работает or
          Ответить
          • Проверь. И посоветую почитать как выполняются логические операторы.

            Подсказка: die сработает, когда больше не будет записей, т.е. левая половина будет false. PHP ничего не останется как проверить правую часть, т.е. выполнить die
            Ответить
            • А по моему вы ошибаетесь, or die() сработает в том случае если mysql_fetch_array() не сможет нормально выполнить запрос. А не в том случае если в базе закончатся строки.
              Ответить
              • Проверь.

                Заодно почитайте, что возвращает mysql_fetch_array когда записи заканчиваются

                По вашему, цикл while никогда не может быть завершен (не в данном случае, а без die), так как в условии всегда будет логическое true
                Ответить
                • По вашему я сказал что die() нужен? Я говорил что по логике там die не нужно!
                  по поводу mysql_fetch_array():
                  Смотрим что она возвращает из мануала по рнр и радуемся!
                  ---------------------------------------------
                  Описание
                  array mysql_fetch_array ( resource $result [, int $result_type ] )
                  Возвращает массив с обработанным рядом результата запроса, или FALSE, если рядов больше нет.

                  mysql_fetch_array() расширенная
                  Ответить
                  • Вы сказали, что die сработает в том случае если mysql_fetch_array() не сможет нормально выполнить запрос. А не в том случае если в базе закончатся строки.

                    Я что-то не вижу в этих строках, где вы говорите что die не нужен. Исходя из последнего предложения, die сработает только тогда когда будет не правильный запрос, а когда строки закончатся, он не сработает
                    Ответить
                  • Ладно, вернемся к истокам. В чем я ошибся?

                    Я, скорее, не точно выразился, так как die сработает только тогда, когда выберет все записи или их не будет. Но в данном цикле die сработает всегда
                    Ответить
                  • Сначала пишите
                    > die() сработает в том случае если mysql_fetch_array() не сможет нормально выполнить запрос

                    А потом меня же тыкаете в мануал и показываете когда же mysql_fetch_array вернет false. Я и до Вас это прекрасно знал
                    Ответить
              • Кстати, запрос уже выполнен с помощью mysql_query (предположительно удачно), а тут уже выбираются результаты
                Ответить
                • Я имел ввиду выборку данных из результата mysql_query() в данном случае с $char_list_query
                  Ответить
      • А что лучше, чтоб перед пользователем был косой вариант сайта? Если чел не умеет работать с обработчиком ошибок, то ему и делать ни чего не остается как кроме работать с die
        Ответить
        • по крайней мере это нельзя оставлять на волю случая, а предусмотреть.. В случае с генерацией options для select ничего супер-страшного не произойдёт. А ошибку логировать.
          Ответить
          • Возможно ничего страшного и не произойдет. Но если эти селекты выводились вверху страницы? Ну что в конце то концов получится? Косячный сайт? Не думаю что это наилучшее решение
            Ответить
            • я думаю мы одинаковы во мнении, что ошибку нужно ловить и что-то с ней делать. Что именно делать - это уже делали реализации, которые обсуждаются, в том числе и исходя из конкретной задачи. =)
              Ответить
              • Возможно) ^_^ Я к примеру часто, редиректю на страницу с ошибкой, и извинениями пользователю. При этом в базу заношу $_SELF; и причину ошибки если она одна из тех что я мог предусмотреть, если нет то по $_SELF очь легко потом найти ошибку) И залатать ее
                Ответить
                • ага.. ещё бы был вариант отловить fatal error, с продолжением работы :(
                  Ответить
                  • ГЫыыы...
                    Ответить
                  • В принципе можно некоторые фаталы выловить
                    <?
                    function ob_complete($str){
                    	$str .= "\n<br><b>my fatal error</b>";
                    	return $str;
                    }
                    
                    ob_start('ob_complete');
                    $c = new NotExistClass;
                    print 'test';
                    
                    ?>

                    Но при условии, что в функция отработает без ошибок
                    Ответить
                    • Я соглашаюсь с тем что вы правы по поводу того что когда mysql_fetch_array() выдаст false в то время когда все записи будут извлечены. Функция die() получит false, то есть верное для нее решение, поскольку именно в этом случае в данном примере она сработает.
                      Я решил на всякий случай проверить на локалке. в первый раз вроде все норм получилось)
                      <?php
                      /* Connecting, selecting database */
                      $host = 'localhost';
                      $user = 'root';
                      $pswd = '';
                      $db_name = 'pdo';
                      $db_link = mysql_connect($host, $user, $pswd);
                      if (!$db_link) {
                         die("Could not connect: " . mysql_error());
                      }
                      mysql_select_db($db_name) or die("Could not select database");
                      $sql = 'SELECT * FROM first';
                      $result =  mysql_query($sql);
                      while($row = mysql_fetch_array($result) or die('111')){
                      	echo<<<FOO
                      	 первое значение {$row['name']} <br />
                      	 &nbsp &nbsp &nbspвторое значение {$row['value']}<br />
                      	
                      FOO;
                      } 
                      /* Performing SQL query */
                      mysql_close($db_link);
                      ?>

                      Не понял юмора и сделал проверку, все дело в том что функция die при заканчивание сценария выдавала белый экран, при этом до этого все записи выводились)
                      <?php
                      /* Connecting, selecting database */
                      $host = 'localhost';
                      $user = 'root';
                      $pswd = '';
                      $db_name = 'pdo';
                      $db_link = mysql_connect($host, $user, $pswd);
                      if (!$db_link) {
                         die("Could not connect: " . mysql_error());
                      }
                      mysql_select_db($db_name) or die("Could not select database");
                      $sql = 'SELECT * FROM first';
                      $result =  mysql_query($sql);
                      while($row = mysql_fetch_array($result) or die('111')){
                      	echo<<<FOO
                      	 первое значение {$row['name']} <br />
                      	 &nbsp &nbsp &nbspвторое значение {$row['value']}<br />
                      	
                      FOO;
                      } 
                      // Этот echo(); не сработает из-за die();
                      echo "<br />тест на валидность";
                      /* Performing SQL query */
                      mysql_close($db_link);
                      ?>
                      Ответить

    Добавить комментарий