"PHP" / Говнокод #16402 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 reddevil, (Updated )

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

  • А в ПХП так сложно прикручиваются ORMы?
    Или в мануалах по ПХП предпочитают не нагружать обучаемого лишними абстракциями?
    Ответить
        • Как будто ОРМы всегда защищают от инъекций... и как будто нельзя защититься без ОРМов.

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

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

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

              Не про ОРМ, конечно, но изобретательная макака найдёт способ протащить инъекцию даже через фреймворки. От необходимости думать дополнительные инструменты не спасают.
              Ответить
          • Ну ладно ОРМ. Хотя-бы параметризованные запросы.
            По крайней мере, ничего экранировать не придётся. Да и ОРМ можно как маппер использовать, если писать лень.
            Ответить
            • PDO не ОРМ но параметризованные запросы может. По опыту скажу, в системах где используется ОРМ, рано или поздно приходится искать способ вставить костыль, что бы его не использовать.
              Ответить
              • Хранимки?
                Как там, оракел, после 10g научился без головной боли отдавать датасеты из хранимок?
                Ответить
                    • зачем такие сложности
                      в оракле (желательно в пакете) - 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(...));
                      но так мало кто делает, т.к. обычно незачем
                      Ответить
                        • да, битовые операции на pl/sql - это настоящий ынтерпрайз
                          чем ему не угодил системный пакет utl_raw, где есть всё - я не знаю
                          но я точно знаю, что субд - последнее место, где нормальный человек будет ксорить биты
                          Ответить
                          • Ну вдруг настолько нехуй делать, что захочется запилить Передовой Стандарт Шифрования прямо на хранимках 😉
                            Ответить
                        • <Срач>
                          Мускуль - говносубд, кладущая хуй на стандарты. Причем не только на стандарты де-факто, но, порой, даже на де-юре...
                          Ответить
                          • А мускуль не должен ли подохнуть? У ораклов своя субд с таблицами и строками.

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

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

                            fixed
                            Ответить
                          • >Мускуль - говносубд
                            Срача не вышло, потому что попал в точку.
                            Ответить
                              • > Все
                                Потому что кроме него ничего нет на бесплатных (да и не только) хостингах. Очередной порочный круг, блеать.

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8