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

    +151

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    // пример 1
    a) $query = "SELECT id,text_name,textarea_desc,img_photo,date_reg FROM {$prefix2}_{$module} WHERE id='$id' AND check_active=1 ORDER BY $order LIMIT $limit";
    или же
    b) $query = "SELECT id,text_name,textarea_desc,img_photo,date_reg FROM ".$prefix2."_".$module." WHERE id='".$id."' AND check_active=1 ORDER BY ".$order." LIMIT ".$limit;
    
    // пример 2
    c) $query = "INSERT INTO {$prefix2}_{$module} SET text_name='$name',date_add=NOW(),text_fio='$fio' WHERE id='$id'";
    или же
    d) $query = "INSERT INTO ".$prefix2."_".$module." SET text_name='".$name."',date_add=NOW(),text_fio='".$fio."' WHERE id='".$id."'";

    Как-то некий посетитель этого сайта назвал a и с -- говнокодом. Интересно узнать Ваше мнение по этому поводу.
    Желательно услышать хоть какую-то аргументацию, вместо пресловутых трольских комментов ))
    Все переменные перед использованием естественно приведены к безопастному виду.
    Ни о каких инъекций речь просьба не поднимать...

    Запостил: Death, 07 Мая 2010

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

    • Зачем селект ид, если мы уже его знаем ?
      Ответить
      • Наверное затем чтобы получить в конечном массиве, мало ли куда потом этот массив передается. Не добавлять же ид потом отдельно.
        Ответить
    • С начало происходит лимит, а потом ордербай, надеюсь это было учтено.
      Ответить
      • Народ, забейте на сами запросы... я их от балды писат... Вопрос только про синтаксис!!!!
        Ответить
    • То, что сразу бросается в глаза: в первых двух запросах не нужен лимит.
      Ответить
    • заминусуйте меня)
      Doctrine_Query::create()
        ->select('text_name,textarea_desc,img_photo,date_reg')
        ->from('MyModule')
        ->where('id = :id AND check_active = :status')
        ->orderBy('date_reg DESC')
        ->execute(array('id' => $id, 'status' => 1))
      Ответить
      • Представляю как Вы выполняете всякие JOIN ))
        Ответить
        • Как, как.. просто и логично.
          PS. Яхуею с отдельных личностей из аудитории говнокода, ты ни одного фреймворка не осилил?
          Ответить
    • показать все, что скрытоНарод, забейте на сами запросы... я их от балды писат... Вопрос только про синтаксис!!!!
      Ответить
      • >>>>Вопрос только про синтаксис!!!!
        Говно!!!
        Ответить
    • Переменные в двойных кавычках не комильфо...

      Это я так понимаю тег который заменяется {$prefics}? Почему что то тегами, а что то нет? Неудобно все это, но не смертельно конечно
      Ответить
      • Пожалуйста обоснованный ответ... т.к. ответы типа, так мне сказали -- не зачет. ))
        Ответить
        • Большие строки в двойных кавычках тормозят выполнение так как там ищутся переменные, лучше одинарные и конкатенация.

          Что то из переменных, а что то из тегов, ну тут вопрос удобства - я не знаю где эти теги могут быть зарыты.
          Ответить
          • Сколько милисекунд Вы выиграете на этом???
            Ответить
            • Все зависит от объемов таких строк. При высоких нагрузках все имеет значение, а писать с использованием одинарных кавычек не сложно )
              Ответить
              • Вопрос не в том что сложне / не сложно...
                А в том можно / нельзя / говнокод.
                Ответить
                • Писать можно все. лишь бы синтаксис был верен. все 4 варианта имеют право на существование. Тут даже вопрос не в производительности. Вопрос в привычке и наличии в используемом редакторе подсветки синтаксиса. Я считаю что выбор кавычек дело каждого. другой вопрос о том что сам текст запросов трудно читаем выб их хоть не в 1 строчку писали б. :-)
                  Ответить
                  • В одну строчку писал, т.к. было влом просто.
                    Ответить
      • Ну имена таблиц имеют вид xxx_ru_new или же xxx_en_news и т.д.
        $prefix2 - это как-бы префикс с учётом языка
        $module - имя текущего модуля.
        а {} нужны из-за того, что-бы переменные считались разными, т.к.
        $prefix2_$module -- не прокатывает ((
        Ответить
        • Да я понял какие имена примерно имеют таблицы )
          Ответить
    • Я вообще всегда следую правилу. Имена табл. в переменных не передавать опасно это. И меня смущает вот это WHERE id='".$id."'"; ну вот как то исторически сложилось что id он же индекс, а индекс в большенстве случаев целое число а Вы его в кавычки. А если не учитывать вопросы безопасности то 2 вариант мною более предпочтителен. и за того что в первом интерпретатор вставляет в строку вместо переменных значения а это какая никакая а работа. но и сходя из этого во втором случае надо поменять кавычки все двойные на одинарные а одинарные на двойные.
      Ответить
      • Все переменные $prefix2, $module, $order, $limit генерятся внутри скрипта... и они всегда корректны... пользователь их менять не может/не будет...

        >> втором случае надо поменять кавычки все двойные на одинарные а одинарные на двойные.
        Вот про это как-бы и вопрос был... ради чего это??? Типа для Выигрыша 1 миллиардной секунды???
        Ответить
    • показать все, что скрытоВопрос ведь вот в чём...
      Почему использование переменных в " является неприемлемым???
      т.е. "... $name ..." недопустимо, а ' ... '.$name.' ...' - это уже признак хрошего тона...
      Лично для меня первый вариант в 100 раз читабельнее, чем вариант к разорванными кавычками и конкатенацией
      Ответить
      • Дело привычки, читается конкатенация легко если привык. А сколько выигрывается, тестируйте.
        Ответить
        • Вопросы производительности тут вообще никак не влияют...
          В Drupale вообще используются замены консткукций на переменные...
          И вообще даже не чистый SQL, а надстройка над ним (для универсальности)...
          Так что теперь считать что Drupal говнокод, т.к. можно быстрее это сделать???
          Ответить
          • В любой CMS есть говнокод, чтобы утверждать что CMS говнокод я уже слишком опытен.

            Пишите как хотите, на самом деле, я пользуюсь одинарными кавычками за исключением тех случаев когда правлю чужой код или пишу для CMS. Если чужой код или CMS я пишу так как там уже написано чтобы не выбивалось из общего стиля.
            Ответить
      • Это дело привычки. при использовании " и переменных я переменые теряю. и кстати если исплользовать 1 подобную строку то не страшно а если в циклах. Как говорится одна бабушка 20 коп. , а пять вот уже и рубль.
        Ответить
        • Я тоже могу читать и так, и так... Но тут дело привычки.
          Лично мне удобно использовать варианты a/c
          Ответить
          • И смысл был выкладывать это? Чтоб тебе сказали, что это говно, но ты потом гордо заявил бы "Лично мне удобно использовать варианты a/c"?
            Ответить
            • показать все, что скрытоБлин, мозкотрах, потеряйся, пока что я не увидел кроме тебя другого говна.
              Так что говно здеть пока только ТЫ.
              Ответить
              • Что-то ты быстро баттхерт отхватил.
                Ответить
              • Я не вижу сути проблемы. Если не учитывать проблемы безопасности, адекватность запросов. То это не говно. если расматривать код в практическом смысле предположить что используемые переменные могут быть изменены то это говнище аж тут воняет.
                Ответить
                • Изменены могут только переменные, используемые в полях...
                  Все технические переменные проверяются и в них всегда попадает только корректная информация.
                  Ответить
                • Это такой прием у быдлокодеров, постишь свое продакшн говно с пометкой это только для примера, в надежде, что кто-нибудь сжалится и напишет ему решение его же задачи за которую он бабло получает.
                  Ответить
                  • показать все, что скрытоИнтересно, ты кроме своих тупых комментов вообще что-то умное сказать можешь?
                    И где ты тут видишь просьбы о "сжалится и напишет ему решение его же задачи за которую он бабло получает"...
                    Короче потеряйся...
                    Ответить
                    • Неужели планы сорвал? Обидно?
                      Ответить
                      • показать все, что скрытоЗавёл-бы себе имя какое-то, а то непонятно с одним дурачком переписываюсь или же Вас много таких.
                        Ответить
                        • Оооо как тебя задело-то. Умничек ты наш.
                          Ответить
                      • Ув. Товарищ я не понимаю. что Вас лично грызет в этом коде. Никакой конструктивной критики я от Вас я не вижу. А оскорблять чела. находясь от него в недостигаемости это скажу я вам пидарасеной попахивает. Если нечего сказать по существу. то хотябы не мусорте на каждый ваш пост мне на мыло письмо приходит я ужо устал чистить ящик. И кстати не кто не зхнает как энту хрень отключить. А то у меня уже мысли появилсиь не настоить ли мене спам фильтр и на говнокод. Извините что не втему.
                        Ответить
                        • Он просто кроме троллинга и "где здесь си++" ничего не умеет делать.
                          Ответить
    • Вопрос лишь в умении читать код.
      Когда пользователь не может его читать, часто такой код называет говном.
      Принципиальной разницы в запросах никакой!
      Рассусоливать вопрос скорости обработки интерпретатора смысла нет, ибо наносекунды в разнице обработки - это уже чистой воды аутизм.
      Из моего опыта: очень редко, кто пишет в стиле a) и c), и часто в b) и d).
      Связано это с суровостью кодеров, которые пользуются простыми редактарами или вовсе текстовыми редакторами, которые переменные a) и c) не подсвечивают. Заставить использовать современные средства разработки таких товарищей невозможно. Вот они и негодуют, что им ничего не понятно.

      Заключение: это не говнокод!

      PS: подсветка кода в данном случае (ваш пример) не выполнена для переменных типа {$prefix} ...
      Ответить
      • Первый обоснованный ответ.
        Notepad++ вроде подсвечивает у меня все переменные и в {} тоже.
        Ответить
      • Кхм, у меня расстройство мозга судя по тому, что использование одинарных кавычек в целях повышения общей скорости работы - аутизм. Сурово.
        Ответить
        • Ну это стандартное объяснение почему " лучше '
          т.к. других причин у людей нету. им так сказали и поэтому всё остальное для них - говнокод.
          Ответить
    • Я бы так отформатировал...
      $sql="
      SELECT 
        text_name,
        textarea_desc,
        img_photo,
        date_reg 
      FROM ".$prefix."_".$tablename."
      WHERE 1
        AND id='".$id."' 
        AND check_active='1'
      ";
      
      $sql2="
      INSERT INTO ".$prefix."_".$tablename." 
      SET 
        text_name='".$name."',
        date_add=NOW(),
        text_fio='".$fio."'
      WHERE id='".$id."'
      ";
      Ответить
    • Я обычно переменные в строку вставляю, обрамляя их все фигурными скобками. Это просто визуально (для меня) проще воспринимается. А вообще — да, дело привычки.
      А если в проекте на производительность начинает критически влиять использование одинарных или двойных кавычек, значит, что с проектом уже давно что-то не то.
      Ответить
    • Получился мем:

      — А, вот эти двое.
      — Не-не-не-не-не, в рот мне ноги.


      — Вопрос только про синтаксис.
      — ГОВНО!!!111
      Ответить
    • $max = 5000;
      $sum = 0;
      $time = microtime(1);
      for ($i=0; $i<$max; $i++)
      {
      	$query = "SELECT id,text_name FROM ".$prefix2."_".$module." WHERE id='".$id."' ORDER BY ".$order." LIMIT ".$limit;
      }
      $sum = microtime(1) - $time;
      echo 'Вариант с одинарными: ' . $sum . ' сек<br>';
      
      
      $sum = 0;
      $time = microtime(1);
      for ($i=0; $i<$max; $i++)
      {
      	$query = "SELECT id,text_name FROM {$prefix2}_{$module} WHERE id='$id' ORDER BY $order LIMIT $limit";
      }
      $sum = microtime(1) - $time;
      echo 'Вариант с двойными: ' . $sum . ' сек<br>';


      В итоге оказалось, что одинарные кавычки на самом-то деле более тормознутее ))
      Вариант с одинарными: 0.0143549442291 сек
      Вариант с двойными: 0.0130221843719 сек
      Ответить
      • У вас мания к наноскопическим оптимизациям? Будующий С++ник.
        Ответить
        • Клоун, я и так знаю и умею писать на СИ++ (VS)
          Но в данный момент пишу в основном сайты на PHP
          Ответить
      • Феерический Далбаеб!
        В обоих случаях написал двойные кавычки:
        "SELECT id,text_name FROM ".$prefix2."_".$module." WHERE id='".$id."' ORDER BY ".$order." LIMIT ".$limit;
        Ответить
        • Похоже я погорячился насчет твоего IQ - он вообще отрицательный.
          Ответить
        • Ещё один ursus.
          Ответить
        • Не важно... Даже если так:
          $query = 'SELECT id,text_name FROM '.$prefix2.'_'.$module.' WHERE id='.$id.' ORDER BY '.$order.' LIMIT '.$limit;

          Вариант с одинарными: 0.0105130672455 сек
          Вариант с двойными: 0.0089418888092 сек
          Ответить
          • Да хватит уже оправдываться. И так пять тонн фейлов в день выдаешь.
            Ответить
          • просто долбоёб
            делай замеры чтобы шли хотя бы минуту,и тестируй с разными длинами строк
            Ответить
      • Вы долбаеб
        Ответить
      • Моё мнение, что для достоверного теста надо 1. Изменять значения переменных. 2. Увеличить время выполнения цикла хотябы дл минуты. 3 использовать различные длины строк. Причем длинные символов за 1000. И все станет ясно.
        Ответить
    • Почему нет варианта со sprintf?
      Ответить
      • А при чём тут метод вывода к методам формарования строк ???
        Каким образом выводить строку - не важно.
        Ответить
    • кажется, это урсус под другим ником. Epic fail two times in a row!
      Ответить

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