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

    +166

    1. 1
    2. 2
    3. 3
    <?php
    $q=mysql_num_rows(mysql_query("SELECT * FROM `users`"));
    >

    Печально, но так поступают 85% кодеров..

    Запостил: QarezZ, 01 Октября 2011

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

    • Извиняюсь за ?>
      Ответить
    • *злорадно* может, оно еще и в цикле?
      Ответить
    • "85% кодеров"
      ой да ладно...какие там 85... ну может 15%
      Ответить
    • А как правильно? Что тут не так?
      (или имеется ввиду, что вместо * нужно юзать id? или прикол в другом?)

      upd: COUNT(*) - правильно? o shi~
      Ответить
      • Прикол в переменной $q
        Ответить
        • Разве это играет такую большую роль?
          Я понимаю, что правильно называть это $num_rows или $num или $count, но...
          Ответить
        • Прикол скорее в том, что по любому чиху дёргается ВСЯ таблица :)

          В данном случае надо было:
          SELECT COUNT(*) FROM `users`
          Ответить
          • Тьфу, блин...
            Наряду с *, в данной строчке используется "получение" конечного результата минуя все остальные (включая возможные исключения) пользуясь лояльностью php к тем кто так пишет. Такую хрень - хреново отлаживать.
            --
            Ошибка компиляции комментария:
            csrf verification error
            Ответить
            • Я ничерта не понял, попробуй расставить запятые и чуть яснее выразить мысль. К тому же твой пример говнокод принял за что-то страшное :D
              Ответить
              • Не буду объяснять.
                Ответить
              • @istem негодует, что никто не проверяет, был ли mysql_query успешен, или нет, сразу обращаясь к mysql_num_rows - что не является корректным поведением
                Ответить
                • истем не собака
                  он кошка с автоматом
                  Ответить
                  • он не собака, но из-за собаки никто не увидел его негодований
                    Istem's Resentment: unchecked subquery in subject, line: 1
                    Ответить
                    • Ни чё се... а я-то думаю, что это - икаю да икаю....
                      Ответить
            • Няня, я у них поел.
              Ответить
    • В общем ошибки отрывка:
      1.Нет лимита запросу,в случае 100000 записей вернёт их все.
      2.Делается SELECT сразу всех полей(SELECT 'id','date') должно быть.
      3.Нет проверки на ошибку(if ($mysql_query){}).
      4.Если добавить переменную в sql запрос,то sql инъекция будет проходить на ура (mysql_escape_string()).
      Ответить
      • КО: в общем ошибка одна - select count(*) from users

        притом, что в разных БД еще есть возможность взять размер напрямую из системных таблиц и это еще быстрей чем count(*).
        Ответить
    • http://php.net/manual/ru/function.mysql-num-rows.php
      Мануал намекает, что так и надо писать. Так что, похоже в данном случае код вполне правильный.
      Ответить
      • КО намекает, что мануалы не всегда правильно намекают
        Ответить
        • А что, точно известно что выборка данных происходит сразу же? Или может только когда итерирование идет?
          Ответить
          • можно я посчитаю этот комментарий троллингом?
            Ответить
            • ну это как хотите, хотя я задал вопрос потому что не в теме, для расширения кругозора. Скажем в Django можно строить любые запросы, но пока не будут явно запрошены данные обращения к базе не будет. Вот я и подумал, а вдруг в PHP так же. Трудно поверить что в основном мануале такие явные антипаттерны.
              Ответить
            • все комменты на гк следует воспринимать, как троллинг
              Ответить
      • Там написано как работает данная функция, но не сказано, что надо дергать всю таблицу и юзать данную функцию только для того, чтобы узнать количество записей в таблице.
        Ответить

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