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

    +161.1

    1. 1
    2. 2
    3. 3
    4. 4
    $w="";
    foreach(array("id_page","id_point","id") as $i)
    $w.=$$i?(($w?" and ":"")."$i=".$$i):"";
    $sql="select * from ".$this->_name." where $w order by ordr,ts desc";

    и без комментов, ага.

    Запостил: voblasoul, 18 Августа 2009

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

    • а шо нормально вроде.. ну не сразу очевидно... а так прикольный ход....
      человек продемонстрировал знание переменных имён переменных...
      Ответить
      • ...а также тернарного оператора, двух способов конкатенации строк, цикла foreach - и все это в двух строках кода :)) И кстати, я так понимаю, ЭТО вычитывает GET/POST переменные? Иайца откручивал бы тем, кто юзает register_globals! 21й век на дворе!
        Ответить
      • Ах, да, чуть не забыл. Еще там еррор-левел ~E_NOTICE, иначе бы $$i при необъявленной переменной выбивала бы ошибку. имхо намного изящнее сделать так:

        $w = array();
        foreach(array("id_page","id_point","id") as $i)
        if(isset($_GET[$i]))$w[] = $i.'=\''.$_GET[$i].'\'';

        $sql="select * from ".$this->_name." where ".implode(' AND ',$w)." order by ordr,ts desc";
        Ответить
        • нээээ $$i там в параметрах метода
          то ест ь метод там нечто вроде
          public function get_page($id_page = false, $id_point = false, $id = false)
          никакого гета ) и регистр глобал
          Ответить
        • намного изящнее будет взять твой код и переписать его с соблюдением code guide и проверкой входящих данных, раз уж речь идет об sql-запросе. а ~E_NOTICE там необязателен, скорее всего, переменные $id_page, $id_point и $id определяются выше по коду.
          и вобще, конструировать имена переменных в процессе программы неправильно, их потом не отловишь в идешках, рефакторинг проводить неудобно, код становится трудночитаем. и компилятор не может такой код оптимизировать, потому что имена переменных вычисляются на этапе выполнения и не видны на этапе компиляции
          Ответить
          • ЭТО НЕ МОЙ КОДДД!!!! но ты абсолютно прав
            Ответить
          • Я даже знаю с какого это проекта -- toyota ;)
            Собирать sql таким образом намного удобней, нежели развертывать в 10 строк. Все изящно и красиво!
            Вылавливать ошибки здесь нечего, вывел сгенерированный $sql и все, дальше нигде этих переменных нет. Да и при взгляде на $w внутри $sql="select * from ".$this->_name." where $w order by ordr,ts desc"; сразу можно догадаться что делает предыдущая строчка $w.=$$i?(($w?" and ":"")."$i=".$$i):"";
            Да выдрано это с контекста.
            Ответить
            • а переменным говорящие имена давать вас не учили?
              хотя код конечно явный. немного призадуматься и всё явно,
              другой момент что форматирование кода ужасно,
              советую вам внимательно прочитать главу 31 товарища Макконела

              мне такой подход сбора sql понравился при большом количестве
              полей и переменных.

              Кстати, а почему вы не используете Zend_Db ?

              и ЗЫ книжки умные мы тоже читаем. посему и порой берёмся за голову.
              к сожалению перегруженные контроллеры и убитую архитектуру зф здесь
              не выложиш, да и не надо думаю. Хотя в целом основной косяк системы
              это перегруженный индекс контроллер, который мне лично напоминает антипатерн звёздный класс, мультиметоды в моделях и УЖАААСНОЕ форматирование кода и названия имён переменных .

              ах да! смарти . для интеграции которого стоило бы скопипастить класс
              с официальной доки зф ....
              Ответить
    • код выдран из контекста.
      во-первых, это метод где передаются переменные по роуту, кто кодил используя Zend Framework тот в курсе, то есть переменные заранее определены и никаких нотисов тут не будет.
      во-вторых, значения передаются и обрабатываются как тип integer, то есть sql-иньекции тут быть не может.
      тот кто продолжает делать toyot'у - читай лучше книжки умные, а не фигнёй занимайся.

      автор кода
      Ответить
      • Собственно, претензии не по инъекциям.
        Код может быть и вправду красивый и изящный, но читать его удовольствие ниже среднего, плюс отсутствие комментов, поясняющий этот полёт мысли.
        И не понятно, почему ж он из контекста вырван. В цикле формируется запрос, дальше сам запрос. Какой контекст?
        Ответить
      • Кстати, а почему в других языках программирования принято использовать подготовленные выражения, а в PHP до сих пор принято клеить строку запроса вручную?
        Ответить
        • рнр не язык программирования, очевидно же.
          Ответить

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