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

    +54

    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
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    foreach($Articles as $art){
    			$id = $art['id'];
    			$count++;	
    			if(isset($_GET['str'])){
    				$str = (int)$_GET['str']; 
    				$mn = $number*($str-1)+1;
    				}else{
    					$str = 1;
    					$_GET['str'] = 1;
    				}	
    			if($count == $mn){
    				$flag = true;
    				$k=5;
    			}		
    			if($flag && $k!=0){
    				$k--;
    				$title = $art['title'];
    				$content = $art['content'];
    				$author = $art['author'];
    				$date = $art['date'];
    				printf("<h1>%s</h1><br /><h3 align='left'>%s</h3>%s  <a href='index.php?id=articles&str=%s&nomer=%s'>Далее</a><hr /><br />",$title,$date, substr($content, 0,800),$nav, $id);
    					}
    		}

    Постраничная навигация

    Запостил: BrdNLSrg, 10 Июня 2012

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

    • показать все, что скрытоПервый нах, пинок в пах, минус в жопу, хуй в грызло.
      Ответить
    • показать все, что скрытоЯ вас всех покараю анально.
      Ответить
    • Замечательный код... загружаем [из базы?] все статьи, чтобы показать 5.
      Ответить
    • Это вырвано из контекста, или k действительно присваивается только тут, а стало быть лишнее в условии и декрементится впустую?
      UPD. А нет, форыч же...
      Ответить
    • показать все, что скрытоИ меня вылечат!
      Ответить
    • да из базы по 5. первый раз писал навигацию, хотел послушать отзывы...
      Ответить
      • показать все, что скрытоСУКА, я тебе минус поставил, мразь.
        Ответить
      • Имхо вам стоит ограничить число загружаемых строк прямо в запросе. Если mysql - почитайте доку про limit.
        Ответить
      • Хочу добавить, что количество записей лучше брать опять же из мускуля отдельным запросом.
        $countRows=mysql_result(mysql_query('SEL ECT count(`id`) FROM `table`', $db), 0);
        Но хочу предостеречь, что mysql_result штука быстренькая, но хрупенькая. Обработки ошибок не предусматривает изначально.
        Ответить
        • Если почему-то не пользуемся готовым фреймворком, проще всего будет запилить модуль с четырьмя примитивными функциями:

          - запрос одного поля (select count(*) from table)
          - запрос одной записи (select f,i,o from table where id=100500)
          - запрос массива записей (select id,name from table)
          - исполнение запроса без результатов (delete from table)

          В каждой из них должны быть все необходимые проверки, и при ошибке они или вбросят исключение или тупо завалят скрипт, записав ошибку (и, возможно, текст запроса) в лог.

          Крайне желательно, при этом, оформить функции так, чтобы они принимали не тупо строку, а еще и переменное число параметров, которые функция будет передавать в bind_param.
          (Т.к. конструирование запроса с подстановкой параметров прямо в строку неудобно и, при бездумном использовании, опасно).
          Ответить
          • показать все, что скрытоДостали прикладники. Время выполнения скрипта включает в себя время компиляции. Учитесь писать руками, а не голландским кодом.
            Ответить
            • Достали пхпшники.

              Время выполнения скрипта включает в себя время компиляции...
              Хорошо, давайте откажемся от модульности (это ж лишний файл читать!), от функций (о боже, парсить определение!), уберем все проверки (они же тормозят исполнение!). Может быть еще переменные называть однобуквенными именами, их же парсер быстрее разберет? Или давайте писать без пробелов и отступов. Парсеру ведь пробелы не нужны...
              Ответить
              • Вы плохо знаете работу интерпритатора. Модуль не читается, если его не запрашивает уже скомпилированный бинарник. Так что модульность оставляем. Функции сокращают объём кода, что тоже работает на скорость парсинга.

                А вот, твою мать, лепить фреймворк для решения элементарной задачи, которая в одну строчку решается - такой бред только сишнику в голову придти мог.
                Ответить
                • > Вы плохо знаете работу интерпритатора.
                  Как работает интерпретатор, и, в частности PHPшный, я знаю. И кстати - "интерпретатора".

                  Сделать 4 функции, которые будут использоваться в 99% случаев, когда нужно сделать запрос к БД, твою мать, уже фреймворк?

                  Причем эти функции сократят, блять, объем кода. Улучшат его ебучую понятность. И, ахуеть, даже позволят перейти на другую СУБД, если запросы не слишком привязаны к текущей.

                  Писать при каждом запросе (а их в проекте всяко будет не менее 10) говнокод в духе mysql_result(mysql_query(...), 0) - такой бред только пхпшнику мог придти в голову.
                  Ответить
                  • - запрос одного поля (select count(*) from table)
                    //одна строчка кода
                    - запрос одной записи (select f,i,o from table where id=100500)
                    //одна строчка кода
                    - запрос массива записей (select id,name from table)
                    //две строчки кода и забивание памяти хернёй.
                    - исполнение запроса без результатов (delete from table)
                    //одна строчка кода

                    Не, я понимаю, конечно, что ООП - это ппц как круто, но до откровенного маразма не надо доходить. Вот BB код реплейсить - там да, функция, а, извините, инклюдить файл, грузить класс и инициировать здоровенный объект, чтобы использовать один его метод, состоящий из одной встроенной функции пхп - да колись оно копьём!
                    Ответить
                    • > четырьмя примитивными функциями
                      Где вы тут выкопали ООП?

                      > состоящий из одной встроенной функции пхп
                      Параметры запроса экранируете? Вот уже и не одна...

                      > //две строчки кода и забивание памяти хернёй.
                      А вот с этим согласен, но для мелких запросов это удобнее чем портянка из query/fetch/close.
                      Ответить
                      • 1) Где ООП? Здесь нет, но я много раз наблюдал, как вот такие "четыре примитивных функции" обрастали подробностями, как покойник ногтями. Особенно в больших проектах, где разрабов несколько. Один написал, второй заюзал, третьему понравилось, но мало и в результате модуль, для которого предназначалось это "четыре примитивных функции" уже грузит полуметровую библиотеку. Быстро и незаметно. Человеческий фактор, чтоб его. Так что тут я знаю о чём говорю. Выстрадано.

                        2) Параметры запроса в запросе не экранируются. Все прилетающие снаружи данные обрабатываются ещё в индексе во первых строках. Ибо нех, но всё-равно надо. Ну а если вам внутренние данные экранировать приходится, то ёлы-палы, я хочу другой глобус.

                        3) А так у вы заменяете портянку while($res_list=mysql_fetch_assoc($res)) на портянку foreach($array_query as $res_list)
                        Нихрена не вижу разницы в читабельности, а вот память очень жалко.
                        Ответить
                        • > Все прилетающие снаружи данные обрабатываются ещё в индексе во первых строках.
                          А если эту строку надо как-то обработать (ну, к примеру, порезать из нее теги), то снимаем экраны и ставим заново?

                          > Ну а если вам внутренние данные экранировать приходится
                          Не приходится, есть bind_param.
                          Ответить
                          • Не припомню, чтобы экранирование мешало обработке. Если, конечно, вы самописные функции не используете. А то встречал я как-то процедуру str__replace(array, array), автору которой невдомёк было, что оригинал и без него массивы жуёт неплохо. Исключение только одно: работа с кавычками непосредственно, но это редко нужно и тоже от экранирования не страдает. Просто надо помнить, что кавычка - это не ", а \" и всё.
                            Ответить
                            • Ну так то да. Мешает оно только при работе с кавычками и слешами, ну и во всяких json_decode. Еще мешает при выводе (но параметры выводятся редко, так что не страшно).

                              Если соблюдать этот стиль везде, не забывать заэкранировать строку при получении данных из каких-то источников кроме параметров, и в sql запросах всегда заключать строки в двойные кавычки - ну согласен, работает и безопасно.
                              Ответить
                            • P.S. А с bind_param можно считать sql иньекции просто страшной сказкой. Да и работает он не медленнее, чем экранирования+интерполяция строк.
                              Ответить
                              • Их можно считать страшной сказкой с включенным экранированием в php.ini
                                Оно, кстати, точно уж в разы быстрее.
                                Ответить
                                • magic_quotes_*? Оно кривое и deprecated.
                                  Ответить
                                  • Чем?
                                    Ответить
                                    • > Чем?
                                      1) Magic quotes also use the generic functionality provided by PHP's addslashes() function, which is not Unicode aware and still subject to SQL injection vulnerabilities in some multi-byte character encodings.
                                      2) Это опция, включение которой не всегда возможно.

                                      Мне этого достаточно. А вам?
                                      Ответить
                                      • 1) Поковыряю. Впаривать кавычки в многобайтовые кодировки я ещё не пробовал.
                                        2) А её не надо включать. Её надо отслеживать. Представьте во что у Вас данные превратятся если она включена, а вы сверху экранирование повесите.
                                        Ответить
                                        • > Её надо отслеживать.
                                          Вот придумают спорных и, зачастую, неуправляемых со скрипта, опций на свою голову. А потом ПРЕВОЗМОГАЮТ их, тратя время, которое можно было бы потратить на что-то более полезное. Пхпшники как дети честное слово.
                                          Ответить
                                  • Магические кавычки были специально изобретены для пхпобезьян, которым "так удобнее". Аналогично регистрация глобалсов, короткие теги. Приятно видеть, что пхп от этого всё больше и больше уходит.
                                    Ответить
            • > Достали прикладники
              So much pathos
              Ответить
            • >SEL ECT count(`id`) FROM `table`
              SELECT count(1) FROM `table`
              Это, во-первых.

              >Время выполнения скрипта включает в себя время компиляции.
              Тут непонятно. Ты о абстрактном плане выполнения запроса, хотя сомневаюсь.

              Наверное речь о времени конкатенации строки? Оно ничтожно.
              Люблю пехепешников, которые c видом знатоков говорят о подобного рода оптимизациях.

              >Вы плохо знаете работу интерпритатора
              Дальше не читал.
              Ответить
              • показать все, что скрыто>Дальше не читал.
                И нефиг.
                >SELECT count(1) FROM `table`
                Закопайся сам, пока я лопату не нашёл, а то по частям закапываться будешь. Любое изменение структуры базы...
                Урод, короче. Наверное и инсёрты у тебя без полей идут.
                Ответить
                • >Любое изменение структуры базы...
                  Давай, продолжай свою мысль.
                  >Урод, короче
                  Обосновывай.
                  Ответить
                • > Любое изменение структуры базы...
                  ... при переименовании поля id приведет к крашу вашего кода, и не затронет кода 3.14159265.

                  P.S. В другой теме разбирали, что count(1) count(id) и count(*) идентичны, если поле not null.
                  Ответить
                  • Надо ж было так публично обосраться.
                    Это только уметь надо - так не каждый сможет
                    >В другой теме разбирали, что count(1) count(id) и count(*) идентичны, если поле not null.
                    А можно мне сцылочку. Пропустил.
                    Ответить
              • > Тут непонятно. Ты о абстрактном плане выполнения запроса, хотя сомневаюсь.
                Видимо о времени исполнения PHP скрипта в целом.
                Ответить
                • Если бы это сказал не пехепешник-мускулсит, то оно могло иметь смысл.
                  Тут дело вот в чем.
                  В хранимой процедуре запрос при первом вызове компилируется (разбирается SQL-сервером и создается план запроса).
                  А в некоторых БД (Огакл) даже императивный код процедуры, а не только запросы, может компилится в исполняемый код, который сохраняется в кеш и при вызове процедуры она сразу исполняется.

                  Сомневаюсь, что гражданин копал так глубоко.
                  Ответить
                  • Все таки мне кажется он не об этом, а именно о влиянии большого модульного кода на скорость исполнения PHP скриптов. Что он и поясняет в следующем комменте:
                    http://govnokod.ru/10871#comment142244
                    Ответить
                    • Типичная история: "Экономный пыхапешник со спичками"

                      А вчера в инете, прочетал чудную инфу - сейчас компилируется всё java, python, vb, haskell, javaScript компилируется даже php, даже SQL!
                      Ответить
                      • Основой и наиважнейшей чертой оптимизации является заключение строковых констант в ординарные кавычки, потому что их компиинтерпретатор PHP не анализирует.
                        Ответить
                        • О да, сокращают объем работы конечному автомату ;) Пойти затестить что-ли для приколу.

                          Кстати все эти интерполяции в виде "$key = $value" скорее всего в p-code превращаются в какой-нибудь concat($key, " = ", $value). А все что стоит за тегами <?php ?> превращается в echo.

                          Ну по крайней мере я бы так сделал ;)
                          Ответить
                        • Создал 2 файла. В одном 10000 строк с одинарными кавычками, во втором столько же с двойными (файлы весят 1.2 мегабайта).
                          $ time for ((i=0; i<20; i++)); do php 1.php 2>/dev/null; done
                          real	0m0.783s
                          user	0m0.508s
                          sys	0m0.220s
                          $ time for ((i=0; i<20; i++)); do php 2.php 2>/dev/null; done
                          real	0m0.782s
                          user	0m0.552s
                          sys	0m0.176s


                          Тест повторял несколько раз - результаты те же, с отклонением +-1мс.

                          Вывод - тип кавычек не влияет на производительность.

                          P.S. Сейчас придут пхпшники и начнут доказывать, что эксперимент проведен некорректно.
                          Ответить
                          • В похапе появился p-код?

                            А результат несколько странный, ибо интерпритатар обязан просматривать содержимое литералов в двойных кавычках
                            Ответить
                            • > В похапе появился p-код?
                              The parser parses the stream of tokens passed to it from the lexer and generates an instruction set (or intermediate code) that runs on the Zend Engine. The Zend Engine is a virtual machine that takes assembly-style, three-address instruction code and executes it.

                              Да разница то, скорее всего есть, но она настолько ничтожна, по сравнению со временем старта интерпритатора, что мы ее не замечаем :)

                              P.S. А он и одинарные просматривает. Куда ж ему деться, надо же найти закрывающую кавычку.
                              Ответить
                              • В одном случае автомат ожидает апостроф, а в другом - кавычку и еще ряд символов. Следовательно, разница обязана иметь место даже на литералах без подстановок. Это, конечно, предполагает, что токенизатор не через жопу сделан.

                                > Да разница то, скорее всего есть, но она настолько ничтожна
                                Дык надо разрешающую способность бенчмарка увеличить

                                > Zend Engine
                                Ух ты ж, я не знал, что оно в core, а не extension.
                                Ответить
                                • > Дык надо разрешающую способность бенчмарка увеличить
                                  Окай...

                                  > В одном случае автомат ожидает апостроф, а в другом - кавычку и еще ряд символов.
                                  Дело в том, что в одинарных кавычках он ожидает кавычку, бекслеш и конец строки (итого 3), а в двойных - кавычку, бекслеш, конец строки и доллар (итого 4). При любой реализации (ну кроме тупо трех ифов) разница должна быть невелика (или ее вообще не будет, как например при реализации через таблицы или switch).

                                  По просьбам трудящихся был поставлен второй эксперимент. Использовалось PHP 5.3.10. Размер файла был увеличен до 150мегабайт. Файл состоит из миллиона строк следующего вида:
                                  $name = "aaaaaaaaaaaaaaaa...aaaaa". Этого должно хватить, чтобы время парсинга превысило время загрузки и исполнения (которые нам не нужны).

                                  Результаты 30 тестовых запусков: http://pastebin.com/0pYYpfF8 и график http://rghost.ru/38713458.view

                                  P.S. Результат очень странный, пробовал заново - результат не поменялся. Порядок запуска влиять не должен - сначала запускал 30 раз сингл, потом 30 раз дабл.
                                  Ответить
          • Мне кажется, с этим товарищем спорить бесполезно, php-быдлокодеры обычно страшно упрямы и упороты.
            Да и функции велосипедные, скорее всего, никакие писать не надо: PDO вроде как идёт в комплекте.
            Ответить
            • Ну да в PDO есть все что надо, и с достаточной отвязкой от СУБД.
              Ответить
            • Хотел бы я на тебя посмотреть, когда ты на шашлыках, тебе звонят по телефону в слезах и соплях "помоги, всё упало, ничего не работает", ты с телефона открываешь модуль, а там:
              include();//это база, но мы её десять раз переписали
              include();//на хабре утром сказали, что это модный фреймворк
              include();//А это чуваки с пятого этажа писали, комменты в черепахе
              $framework->$shabra($to->$chto->$pisali->$chuvaki->$s->$pyatogo->$etaja('Семнадцать'), true) or die 'Всё пропало, гипс снимают, клиент уезжает';
              //Конец модуля
              Ответить
              • "Только велосипеды, только хардкор" (tm)
                Ответить
              • Алё, это прачечная?
                Ответить
              • идеальное приложение состоит из одной красной кнопки "сделать заебись", вообще-то
                поэтому идеальный main модуль должен всегда состоять из
                включить всё, что нужно для заебись;
                try { 
                   инициализировать заебись; 
                   запустить заебись; 
                } catch(error) {
                   log("не заеблось - случилось страшное: ", error.message());
                }
                Ответить
                • Из одной хорошей статьи:

                  Хуже индусского кода может быть только код европейский, особенно голландцев или датчан. Это тоже объяснимо, у них источники вдохновения легализованы. Из точки А в точку Б никто никуда не едет, зато есть framework. В котором можно задать plug-in, который конфигурирует другой plug-in, который читает третий plug-in и посылает event четвертому, а тот уже знает, что делать. Через Inversion of Control, так интереснее. Я как-то цитировал одно европейское творчество, и, по-моему, это достойно повторения:

                  Before describing the configuration aspects of components (...), component types and implementations are described, since it is aspects of the component type that are configured by components – and the configurable aspects are defined by the component type.
                  И это только документация, а исполнение, поверьте моему горькому опыту, еще затейливее.

                  А от себя могу только в жаву послать. Это там однострочные методы крутяк неимоверный.
                  Ответить
                  • Есть абстрактные фабрики фабрик и волшебные опердени в вакууме, и ими мало кто пользуется. А годных инструментов, упрощающих жизнь, довольно много.
                    Я стараюсь не использовать библиотеку, если не знаю, как её реализовать собственными силами, т.е. если не понимаю, что и как она делает. Только если все существующие инструменты мне не подходят, я пишу вариант, удовлетворяющий лично мои потребности, и оформляю его в виде модуля с простым и понятным API. Недавно как раз обсуждали мой велик http://govnokod.ru/10175
                    Ответить
                  • Ну такой код уже попахивает маразмом, равно как и абсолютно линейный код без функций.

                    Идеальный код находится где-то между этими двумя крайностями. Небольшие проекты ближе к линейным. Более сложные - ближе к тому что вы процитировали.
                    Ответить
                    • Золотые слова. Вот только грань эта размыта, и чем больше людей работают над проектом, тем веселее эта грань кактится к однострочным методам и полусотне инклюдов самых разнообразных библиотек. Откройте исходник ipboard`а и поймёте что я имею ввиду.
                      Ответить
                      • Тут дело в том, что если проект будет расти, и катиться не в сторону однострочных методов и полусотен инклудов, то он постепенно превратится в еще более ужасное и неподдерживамое монолитное говно.

                        > Откройте исходник ipboard`а
                        Он же вроде платный?
                        Ответить
                        • За это фуфло ещё и платить надо?!
                          Знаю я, что он платный, поспрашайте по знакомым. Наверняка кому-нибудь в наследство достался. Мне, например, достался. Тут где-то я выкладывал выдержки из этого продукта жизнедеятельности. Я его неделю ковырял, потом плюнул и за два дня написал новый.
                          Ответить
                  • > Хуже индусского кода может быть только код европейский [...]
                    В той статье есть здравое зерно. Не буду спорить.
                    >А от себя могу только в жаву послать.
                    Там кстати есть Spring JDBC где сделали то о чём говорил bormand:
                    >запрос одного поля (select count(*) from table)
                    queryForInt. если кол-во записей!=1 бросается православный эксепшон
                    >запрос массива записей (select id,name from table) - queryForList и объект маппера строки ResulSeta в сущность.
                    >запрос одной записи (select f,i,o from table where id=100500)
                    queryForObject. по сути то же что и первое, но получаем объект

                    >исполнение запроса без результатов (delete from table)
                    update. возвращается int - rows affected.
                    Ответить
              • Плохой фреймворк хуже его отсутствия, тут вы правы :)
                Ответить
              • > ты с телефона открываешь модуль
                Какой-то супергерой. Который просто приходит и чинит всё. И ничего его не останавливает, будет писать с утюга.
                Себя надо как-то уважать, например.
                Ответить
                • показать все, что скрытоЭто точно. Себя уважать надо. Может ли себя уважать человек, который без здоровенной махины редактора кода ничего не может? На машине ездить комфорто и быстро. С первого взгляда. А на практике я из пригорода на электричке добираюсь до работы в два раза быстрее, чем люди на машинах по городу. И у некоторых, боюсь, скоро ножки-то поатрофируются. Не кажется ли это похожим на ООП в вебе?
                  Ответить
                  • Это скорее про CMS.
                    Ответить
                    • Про ЦМС это будет, если мы вспомним, что там ещё и потроха ремонтировать как-то надо. А вот когда речь идёт о том, что человек в соседний дом на машине едет - это про фреймворки. А вот пример разучившихся ходить:
                      $h = $db->GetField( "COUNT(*)", $db_lots_archive, "WHERE uid='$p[from]'" );
                      $u = $db->GetField( "COUNT(*)", $db_lots_archive, "WHERE winner='$p[from]'" );
                      $y = $db->GetField( "COUNT(*)", $db_lots_archive, "WHERE uid='$p[to]'" );
                      $a = $db->GetField( "COUNT(*)", $db_lots_archive, "WHERE winner='$p[to]'" );
                      $s = $db->GetField( "COUNT(*)", $db_bn_bets, "WHERE uid='$p[from]'" );
                      $e = $db->GetField( "COUNT(*)", $db_bn_bets, "WHERE muid='$p[from]'" );
                      $b = $db->GetField( "COUNT(*)", $db_bn_bets, "WHERE uid='$p[to]'" );
                      $e1 = $db->GetField( "COUNT(*)", $db_bn_bets, "WHERE muid='$p[to]'" );
                      Это из одного уважЯемого интернет-аукциона.
                      Ответить
                      • Ок, говно в коде, в принципе, вижу. А как бы вы решили эту задачу? Напишите, пожалуйста, свой вариант кода.
                        Ответить
                        • Не напишу, к сожалению. Проект уже лет семь как отдан заказчику и забыт. И только этот кусочек я таскаю, как напоминание про то, что пешком тоже иногда ходить надо. Вообще моя задача была дебаг, а не рефакторинг. Где-то что-то я подправлял по мере возможностей, но в целом дух проекта остался прежним. Нам не до мелочей, у нас сроки. :( Стыдно и печально, но тогда очень хотелось кушать. Сейчас бы я такой проект не сдал бы.
                          Ответить
                  • Ок. Другой пример. Вы и Вася работаете монтажником. У вас есть отвертка и шуруповерт.

                    Если нужно закрутить пяток шурупов - это быстрее сделать отверткой, что вы и делаете за несколько минут. Вася в это время раскуривает, как пользоваться шуруповертом, и уходит с работы намного позже вас.

                    На следующий день вам надо ввернуть 50 шурупов. Вы игнорируете шуруповерт, и продолжаете крутить их отверткой, руки устают, шурупы не дотягиваются до конца, но ведь шуруповерт надо заряжать, да еще и разбираться с ним... Ну его нахрен говорите вы, и продолжаете крутить...
                    Вася в это время качественно и быстро выполнил свою работу и ушел читать книжки и пить пиво...

                    На следующий день вы снова продолжаете крутить шурупы руками, на ходу объясняя Васе, что он дурак, и что шуруповерты не нужны, и от них только проблемы...
                    Ответить
                    • Замечательный пример. Его и продолжим. Вам надо открутить один шуруп между плинтусом и шкафом. У вас есть отвёртка и шуруповёрт. И вы отодвигаете шкаф, потому что шуруповёрт не пролезает. Нормальный пример? :)
                      Ответить
                      • За что люблю жизненные примеры - так это за то, что их всегда можно вывернуть в любую сторону ;)

                        Пример отличный :) Продолжим его. Вы выкручиваете шуруп отверткой, радуетесь, что не нужно отодвигать шкаф, и ВНЕЗАПНО обнаруживаете, что плинтус все равно не снимается, т.к. мешает шкаф :) С матами вы отодвигаете шкаф и задумываетесь, почему бы не научиться проектировать...
                        Ответить
                        • А когда отодвигаете шкаф, то обнаруживаете, что это не шкаф мешал, а плинтус нахрен приклеен. И нафиг тут тот саморез был совершенно непонятно. Тогда вы достигаете дзена, выливаете на пол канистру бензина, сжигаете все плинтуса вместе со шкафом, обоями и тем строителем, который это делал, и делаете всё заново.
                          P.S. И на всю жизнь клянётесь, что никогда не будете прикручивать саморезами приклеенные плинтуса.
                          Ответить
                          • > P.S. И на всю жизнь клянётесь, что никогда не будете прикручивать саморезами приклеенные плинтуса.
                            Единообразие в проекте? Здравая мысль ;)
                            Ответить
                            • Ага. И невыполнимая. Что-то меня попёрло с плинтусов. А дальше вы обнаруживаете, что стены кривые, а клей хреновый и чтобы плинтуса приклеились, надо кое-где прихватить их саморезами. Вы кроете матом того урода, который не пишет комменты в коде и идёте за шуруповёртом. А когда приходите, то обнаруживаете, что какой-то судак уже поставил в угол шкаф и подлезть туда можно только отвёрткой.
                              Ех, тяжела и неказиста жизнь простого программиста. Ажно пива захотелось.
                              Ответить
                    • Могу ещё круче. Вы не отодвигаете шкаф, а идёте покупать электроотвёртку.

                      В этих комментах Вы предложили оба варианта, потому что обычная отвёртка - это велосипед и говнокод. :)
                      Ответить
                      • Отвечу так - перед тем как двигать шкафы и выкручивать шурупы надо подумать над тем, что же нужно сделать, и как этого добиться ;)
                        Ответить
                  • Мы, коммунисты, трудности презираем. И, в самом деле, трахаться вверх ногами, на потолке, в лыжах и противогазе - самое то.

                    P.S. Возможности (и сложность) современных фреймворков чаще всего избыточны, но эпоха велосипедиков неотвратимо проходит. Никто не говорит, что нужно ставить %название продукта сюда%, если нужна маленькая гостевая или брать фреймворк для одноразовой странички, нет.
                    Ответить
                    • Спасибо за пример. Я бы лучше не придумал. :)

                      include(противогаз);
                      include(лыжи);
                      include(камасутра);
                      include(антиграв);
                      Новый объект противогаз;
                      Новый объект лыжи;
                      Новый объект камасутра;
                      Новый объект антиграв;
                      антиграв->векторГравитации->инвертировать;
                      камасутра->позы->вверхНогами;
                      лыжи->одеть;
                      противогаз->одеть;
                      трахаться();
                      Ответить
                      • лыжи->надеть
                        противогаз->надеть

                        fix
                        Ответить
                        • $this->надеть($одежду);
                          $this->одеть($Надежду);
                          Ответить
                          • Так. Т.е. встроенную функцию трахаться() заменяем на $this->надеть($Надежду);
                            Ответить
                        • Метод не найден. Теперь придётся классы лыжи и противогаз переписывать. :(
                          Ответить
                          • А во что планировалось одевать лыжи и противогаз?
                            Ответить
                            • В голову и вноги. :( Два метода переписывать. :(
                              Ответить
                      • Отнюдь. Пользователей фреймворков победителями чудовищ назвать нельзя. Они делают то, что лучше всего получается у человечества - реиспользование результатов чужого труда.
                        Заметь, из нас всех только ты считаешь, что "мы пойдём своим путём" во всём. Спички для слабаков, для тех, кто не может без здоровенного мешка ништяков, с компасом, тушёнкой и навигатором. Фу таким быть! Мы, гриллсы, голыми руками убьём тюленя и сожрём сырым. Только программирование в машинных кодах, только хардкор. Это ли не стремление к ненужным самовозводимым проблемам?
                        P.S. Говорят, что неандертальцы по этой причине и вымерли.
                        Ответить
                        • Опять крайности. Я не пользуюсь чужими фреймворками не потому, что это в принципе нельзя. Я ими не пользуюсь, потому что у меня своих уже за десять-то лет набралось. Просто я не вижу смысла дёргать здоровенный фреймворк, ради пустяковой задачи. А сейчас с мамкиной сиськи веберам вдалбливают: не нужно писать руками, нужно знать фреймворки. И опять человеческий фактор. Это приводит к тому, что функционал, который у меня на стандартном хостинге летает, у других почему-то на выделенном сервере валится. И начинается костелирование костылей. К серверу покупается память, винты и прочее. Последний изъёб, которому я был свидетелем - это попытка компилять папаху из-за того, то 4к онлайна роняли сервер.
                          Ответить
                          • Команда писателей за доширак писала бы в три раза дольше, плюс, набор несовместимых меж собой костылей.

                            > ради пустяковой задачи
                            > 4к онлайна
                            Не вяжутся как-то. При таком онлайне (вполне средний, вроде как) нужен нормальный архитектор, который знает, куда растить систему дальше, какой функционал потребуется и сколько это будет всё стоить. Плюс, вменяемые специалисты. И не факт, что написать эту систему с нуля будет быстрее (главное) и она будет надёжнее. У фреймворка же выносливость известна или сравнительно легко вычисляется.
                            Ответить
                            • Ну $db_site=mysql_open(); $res=mysql_query('', $db_server); тоже не вяжутся, если не обращать внимание, что надёргано из кода, в котором четыре коннекта подключаются. Читаем всё, внимательно, как компилятор.
                              Ответить
                        • If I have seen further it is by standing on ye sholders of Giants.
                          (c) Исаак Ньютон
                          Ответить
                          • If I have seen further it is by standing on the shoulders of Giants.
                            Ответить
                • ...РАСПИДОРАСИЛО, ПРАВЛЮ МОДУЛЬ С ТЕЛЕФОНА...
                  Ответить
            • > с этим товарищем спорить бесполезно
              Ну почему, в споре часто выясняется что-то интересное.
              Ответить
              • Чаще всего принадлежность одной из спорящих сторон к сексуальным меньшинствам.
                Ответить
    • показать все, что скрытоКакой багор )))
      Ответить

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