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

    +159

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    Сколько говна уже придумано было...:
    
    $lasthour = date("Y-m-d H:i:s", mktime(date("H")-1, date("i"), date("s"), date("m"), date("d"), date("Y")));
    $query = "
    	UPDATE user_sid
    	SET online = 0
    	WHERE date_action < '{$lasthour}'
    ";
    $sql->query($query);
    
    Вместо простого и понятного:
    $query = "
    	UPDATE user_sid
    	SET online = 0
    	WHERE date_action < DATE_FORMAT( NOW( ) - INTERVAL 1 HOUR , '%Y-%m-%d %H:%i:%s' )
    ";
    $sql->query($query);

    Печаль... :'(

    Запостил: 1_and_0, 25 Ноября 2010

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

    • Даже можно было ещё сильнее сократить, так как стандарт вывода дефолтный:
      $query = "
      UPDATE user_sid
      SET online = 0
      WHERE date_action < NOW( ) - INTERVAL 1 HOUR";
      $sql->query($query);
      Ответить
      • В общем случае часы на сервере БД и на веб-сервере могут идти по-разному, из-за чего можно напороться на тайм-парадоксы, если в одном случае использовать время БД, а в другом брать его в PHP. Имхо, это надо бы иметь в виду при проектировании - благо, несложно.
        Ответить
        • Ну, можно определиться для себя и использовать только время БД
          Ответить
          • > можно определиться для себя
            Да.
            > только время БД
            Я бы, наоборот, предпочёл время PHP. В БД оно только хранится, управляющая-то логика вся в PHP.
            Ответить
            • >>В БД оно только хранится, управляющая-то логика вся в PHP.
              Где участвует время в логике проекта, если не трудно, 1 пример приведите пожалуйста.
              Ответить
              • Неверно выразился. Я имел в виду, что время может использоваться не только в тех данных, которые хранятся в БД. Такой бредовый пример: имиджхостинг, у которого имена файлов картинок - это UNIX timestamp'ы момента их добавления на сервер. Говнопроектирование, да, но для примера предположим, что так написали в ТЗ. Модель хранения сведений о картинках и их заливалку дали писать разным людям. У одного время берётся из time() и на основании этого именуется файл, а у другого в БД добавляется запись с использованием NOW(). И типа все знают, как файл именуется, и все думают, что покатит. А потом файл-сервер и БД разнесли на две машины, и привет.
                Ну так вот, по уму следовало бы либо занести имя файла в базу с помощью NOW(), а потом сделать лишний селект, чтобы его вытащить и поименовать файл, либо поименовать файл time()'ом и потом уже занести его имя в базу. Выбор очевиден, имхо.
                Ответить
          • ага. и когда надо будет вывести время на страничке - делать запрос к БД. архитектурка - зашибись.
            Ответить
    • я использую время utc клиенту показываю с учетом его место положения.
      Ответить
    • Когда в топике еще и разъясняется для медленных, в чем говно, я автоматически минусую. Не унижайте себя до этого.
      Если говно, это сразу видно. Поверьте мне.
      Ответить
      • да ты абсолютно прав.

        >Не унижайте себя до этого.
        отлично сказано
        Ответить
      • Ок, учту.
        Ответить
      • То есть тонкое говно ты тоже автоматом минусуешь. Плюсуешь только то, что сразу понятно. Ты, наверное, Билана с Тимати слушаешь?
        Ответить
        • Блюээээ... (((

          Вот как раз для фанатов Билана и Тимати приходится разъяснять. Но разве их голоса для нас авторитет?
          Ответить
          • Мне показалось слово "блюз"? Тогда почему тебе не нравятся говнокоды, не понятные с первого раза, наоборот, должен особо ценить такие.
            Ответить
    • а никто не задумывался, что первый вариант будет работать быстрее?
      на большом кол-во записей в БД - намного быстрее.
      Ответить
      • с чего бы это?)
        Ответить
        • Видимо он имел в виду, что первый вариант запроса попадет в кэш. Но нужно учитывать, что через секунду запрос примет уже другой вид, и кэш засрется однотипными бесполезными запросами.
          Ответить
      • Не будет. План выполнения обоих запросов будет абсолютно одинаков.
        Ответить
    • Если уж говнооптимизировать то
      $lasthour=date("Y-m-d H:i:s", time()-3600);

      а в запросе DATE_FORMAT ни к чему
      Ответить
      • вот с этим спорить не буду

        а DATE_FORMAT и NOW внутри WHERE ни к чему хорошему не приведут
        Ответить
      • Я в первом комменте исправил
        Ответить
    • Почему так уверенны, что там не sqlite, к примеру?
      Ответить
    • Кстати никто не заметил, что при стечении обстоятельств можно получить неконсистентную дату.

      mktime(date("H")-1, date("i"), date("s"), date("m"), date("d"), date("Y"))

      Что, если первый вызов пришёлся на 21:59:59.999. Тогда первая date("H") - вернёт 21, а второй вызов date("i") - вернёт 00. Итого дата сформируется совсем неправильная.
      Ответить
      • в PHP получить компонент времение занимает целую миллисекунду?
        Ответить
        • *времени
          Ответить
        • Почему вы отрицаете вариант, когда было формально уже не 21:59:59.999, а 21:59:59.999999999 и следующая секунда наступит уже на следующем вычислительном такте?
          Ответить
          • Не отрицаю, но по утру неохота задачку по терверу решать :)
            Ответить
      • За шесть вызовов date() надо просто об стенку головой.
        Ответить
        • Да то что надо - это понятно.

          Я просто указал на сложноотлаживаемую ошибку.

          Подобные ошибки консистентности и написение non-threadsafe кода в мультипоточных системах - самые геморные для отладки. Потому я и привёл пример, обучающий момент, так сказать.
          Ответить

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