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

    +156

    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
    while(true)
    {
        $i++; if ($i == 10) { $res = array(); break;}
        $site = dq("
        SELECT a.username, a.id, a.url, a.title 
        FROM ylike a 
        LEFT JOIN amp_a_users b ON b.username = a.username 
        LEFT JOIN view_log c ON c.username = '".$user_n."' AND c.video_id = a.id 
        WHERE a.active = '1' AND b.video_credits >0 AND (c.video_id IS NULL AND a.username !='".$user_n."') 
        ORDER BY RAND() 
        LIMIT 1");
    
        $res = mysqli_fetch_array($site);
    	if ($chkd[$res[url]] == 1)
        {continue;}
    	else{
    	  $chkd[$res[url]] = 1;
    	}
    	if (get_likes($res[url])>=0){break;}
    	$res = array();
    }

    Суть функционала в том что пользователи добавляют видео с youtube и покупают так называемые кредиты. И когда кто-то смотрит твое видео он получает 1 кредит, при этом у тебя снимается. Блок кода направлен на то чтобы найти видео, которое ты еще не смотрел, активное и не личное.
    $user_n = логин текущего пользователя. Кода наглядно показывает как правильно, оптимизировано это все реализовать.
    Мало того того что запросы в цикле, так еще и и join происходит по varchar. Кстати чувак вобще вместо id юзеров использует логины пользователей для зависимостей пользователя и его различных данных.
    get_likes() по логике не понятно для чего, потому что функция запрашивает с youtube количество лайков, и по сути оно может быть либо 0 либо больше.

    Запостил: reddevil, 22 Июля 2014

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

    • Да PHP вообще было бы правильнее назвать BIW (..., But It Works)
      Ответить
    • А в ПХП так сложно прикручиваются ORMы?
      Или в мануалах по ПХП предпочитают не нагружать обучаемого лишними абстракциями?
      Ответить
      • умный раб плохо работает
        Ответить
      • Чаще всего они не нужны.
        Ответить
        • SQL инъекции нужнее? ;)
          Ответить
          • Как будто ОРМы всегда защищают от инъекций... и как будто нельзя защититься без ОРМов.

            Нужно числовое значение => делаем intval, все невалидные значения сами обрубятся.

            Нужно значение из списка => ищем его в этом списке перед отправкой запроса.

            Нужно произвольное строковое => таки да, апострофы придётся экранировать.
            Ответить
            • Когда в системе нужно написать тридцать intval'ов, тридцать первый обязательно забудется. А учитывая вольности типизации PHP - это может быть фатально.
              Вот здесь-то ORM и спасает.
              Ответить
              • > Вот здесь-то ORM и спасает.
                Или подготовленные запросы хотя бы.
                Ответить
              • Пища для размышлений: http://habrahabr.ru/post/140145/

                Не про ОРМ, конечно, но изобретательная макака найдёт способ протащить инъекцию даже через фреймворки. От необходимости думать дополнительные инструменты не спасают.
                Ответить
            • Ну ладно ОРМ. Хотя-бы параметризованные запросы.
              По крайней мере, ничего экранировать не придётся. Да и ОРМ можно как маппер использовать, если писать лень.
              Ответить
              • PDO не ОРМ но параметризованные запросы может. По опыту скажу, в системах где используется ОРМ, рано или поздно приходится искать способ вставить костыль, что бы его не использовать.
                Ответить
                • Хранимки?
                  Как там, оракел, после 10g научился без головной боли отдавать датасеты из хранимок?
                  Ответить
                  • а что, какие-то проблемы с возвратом курсора из функции?
                    Ответить
                    • Вот так что-ли?
                      http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php

                      Как-то хардкорненько...
                      Ответить
                      • зачем такие сложности
                        в оракле (желательно в пакете) - function foobar(...) return my_cursor_type;
                        даже тупой jdbc сгенерит ResultSet и при "select ...", и при "{? = call foobar(...)}" (с RegisterOutParameter)
                        тем более хибернейт (со своим хинтом callable)

                        кому особо печёт, и его любимая IDE плохо выводит
                        select foobar(...) from dual;
                        тот может написать отдельную pipelined функцию-обертку, которая на входе примет курсор, а на выходе будет гадить прочитанными из этого курсора записями
                        тогда можно будет делать
                        select * from table(my_foobar_wrapper(foobar(...));
                        но так мало кто делает, т.к. обычно незачем
                        Ответить
                        • > в оракле

                          Давно у нас не было срачей по СУБД, поэтому на правах офтопика оставлю этот багор здесь: http://chabapok.livejournal.com/34730.html
                          Ответить
                          • да, битовые операции на pl/sql - это настоящий ынтерпрайз
                            чем ему не угодил системный пакет utl_raw, где есть всё - я не знаю
                            но я точно знаю, что субд - последнее место, где нормальный человек будет ксорить биты
                            Ответить
                            • Ну вдруг настолько нехуй делать, что захочется запилить Передовой Стандарт Шифрования прямо на хранимках ;)
                              Ответить
                          • <Срач>
                            Мускуль - говносубд, кладущая хуй на стандарты. Причем не только на стандарты де-факто, но, порой, даже на де-юре...
                            Ответить
                            • А мускуль не должен ли подохнуть? У ораклов своя субд с таблицами и строками.

                              >>Мускуль - говносубд, кладущая хуй на стандарты

                              Sun - контора, кладущая хуй на стандарты

                              fixed
                              Ответить
                              • > Sun - контора, кладущая хуй на стандарты
                                А Sun то че. Мускуль и до них таким же говнищем был, если не хуже.
                                Ответить
                              • >Sun - контора
                                Sun dead baby, Sun dead.
                                Ответить
                            • >Мускуль - говносубд
                              Срача не вышло, потому что попал в точку.
                              Ответить
                              • Если Мускуль — говно, то почему тогда им все пользуются?
                                Ответить
                                • > Все
                                  Потому что кроме него ничего нет на бесплатных (да и не только) хостингах. Очередной порочный круг, блеать.

                                  P.S. А за пределами веба его разве часто юзают?
                                  Ответить
                                  • Статистику не собирал, но, к сожалению, иногда юзают.
                                    Ответить
                                  • Даже аксес юзают, че уж о мускуле говорить.
                                    Ответить
                                    • Ну акцесс (а вернее его mdb) в свое время был отличным выбором для локальной базы - один файл, дрова во всех виндах изкоробки, даже если офис не стоит, ну и какая-никакая морда есть.
                                      Ответить
                                      • в свое время и ишак нетскейп уделал
                                        Ответить
                                      • Если я не ошибаюсь, то в базе на Win200 Home, ни аксесса, ни екселя из коробки не лежало.
                                        Ответить
                                        • > ни аксесса, ни екселя из коробки не лежало
                                          Ну да, морды акцесса не будет. Но драйвер microsoft jet работал из коробки как бы не начиная с 98й винды. Поэтому проги с mdb в качестве локальной базы отлично работали на всём подряд...
                                          Ответить
      • Для скрипта, который живёт тридцать секунд и постоянно перекомпилирует запросы, кмк, это непозволительная роскошь.
        Ответить
        • Да ладно, у пхп ведь должна быть предкомпиляция.
          Ответить
          • Предкомпиляция есть (через костыли типа APC или XCache). Но зачем каждый раз собирать запрос, если известно, что он будет одинаковым (с точностью до одного-двух параметров)?
            Ответить
        • а подготовленные запросы тоже непозволительно?
          Ответить
          • Вполне нормально. Я же не призываю клеить строки руками. Просто мне всегда казалось, что ОРМ - слегка для других целей.
            Ответить

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