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

    +1

    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
    $probabilities=array();
    $get_items=mysql_query("SELECT * FROM `items` WHERE `iid` IN(".mysql_real_escape_string($case['items']).") AND `status`='1' AND `count`>'0' ORDER BY `probability` DESC;");
    while($item=mysql_fetch_assoc($get_items)){
    $probabilities[$item['probability']]=0;
    }
    $dices=$probabilities;
    for($pi=100;$pi>=0;$pi--){
    foreach($probabilities as $probability=>$pstate){
    if(rand(1, 2)==2){
    if($pi<=$probability){
    $dices[$probability]=$dices[$probability]+1;
    }
    }	
    }
    }
    arsort($dices, SORT_NUMERIC);
    $probability=reset(array_keys($dices));
    $get_prize=mysql_query("SELECT * FROM `items` WHERE `iid` IN(".mysql_real_escape_string($case['items']).") AND `status`='1' AND `count`>'0' AND `probability`='".$probability."' ORDER BY RAND() LIMIT 1;");

    Написал с нуля на заказ движок для очередного детского говноказино (розыгрыш пикселей для игр в "Steam").
    Заказчик умолял сделать возможность управления вероятностью выпадения того или иного предмета (в процентах), что я и сделал. Вышеприведённый алгоритм как раз отвечает за выбор приза в соответствии с прописанными в настройках вероятностями. Сейчас кажется, что решение не самое "изящное".
    Есть, что заметить по поводу алгоритма?

    Запостил: AnalPerOral, 02 Ноября 2017

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

    • Бля, нельзя было с отступами?

      А вообще, слишком толсто
      Ответить
      • >>>"Бля, нельзя было с отступами?"

        Мне этот мусор неприятен. Я и между скобками, операторами и переменными-то пробелы не расставляю...

        >>>"А вообще, слишком толсто"

        Уже ищу свой тюбик с лубрикантом. Терпение, птенчик...
        Ответить
        • так и строки переносить тогда тоже не надо, тоже ведь мусор. а по теме...не вникая в алгоритм (из-за мусора) нужно начать с использования PDO хотя бы
          Ответить
          • >>>"нужно начать с использования PDO хотя бы"

            Чем он хорош? Зачем одни буквы в коде менять на другие?
            Ответить
            • как минимум потому что prepared statements
              Ответить
              • Prepared statements можно использовать и без PDO.

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

                  Однородность 95% кода, которую вы почему-то записываете в хуйню. На это обычно отвечают классическим "часто ли ты менял базу данных в проекте после его начала, зачем тебе вообще совместимость с кучей движков баз данных?", поэтому я сразу задам контр-вопрос: мало ли на свете фреймворков, которые точатся сразу под кучу движков, и авторы которых в гробу видали писать одно и тоже для каждого движка и получают за счет этого 95% совместимости кода сразу со всем?

                  > при построении сложных систем всё равно приходится писать код, зависящий от СУБД.

                  в нормальных сложных системах существует разделение read/write model, в базе данных специально проектируются вьюхи/таблицы под чтение, и все запросы опять сводятся к простой четверке CRUD. Только иногда требуется какая-то сложная хуйня, которую придумал модный UX-специалист - типа геопоиска по полигону или нечеткого поиска - и в этом случае это все вообще надо снимать с базы данных, потому что база данных для человеческого поиска не предназначена (как бы туда не стримились побольше специальных индексов для нечеткого поиска).
                  Ответить
                  • Кстати, пих -- единственный яп (ну кроме сишечки), в котором изначально не было универсального API для БД.

                    В Perl есть DBI::DBD
                    В Python есть PEP 249
                    В Java есть JDBC
                    В .NET есть ADO.NET

                    и только пых кушает mysqli_query и радуется

                    >> в базе данных специально проектируются вьюхи/таблицы под чтение
                    К сожалению, это не всегда так. Мне тоже нравится работать с БД через вьюхи, но например Django ORM или Hibernate могут с этим поспорить.

                    Тем не менее, 80% кода можно унифицировать, и писать raw sql только для особых случаев
                    Ответить
                    • >и только пых кушает mysqli_query и радуется
                      уже нет
                      Ответить
                      • Уже зафорсили PDO везде?

                        Яху!!! Всего 20 лет понадобил0сь!


                        http://php.net/manual/ru/mysqli.query.php

                        // Объектно-ориентированный стиль
                        mixed mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
                        
                        //Процедурный стиль
                        mixed mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )


                        Из этого примера сразу видно что ООП лучше процедурного подхода.
                        Ответить
                        • видимо решили что для говнокодеров mysql_ небезопасно. 20 не 20, но это не помешало ему стать самым популярным языком для веба. а самое главное, когда на нем пишешь не испытываешь батхёрта, в отличие от ныне трендового JS. но это тоже имхо канешн
                          Ответить
                          • а, так ты о том что вместо mysql_ теперь mysqli_ ?

                            >>не испытываешь батхёрта, в отличие от ныне трендового JS. но
                            Если конечно ты не знаешь больше никаких языков кроме JS и PHP :)

                            >>это не помешало ему стать самым популярным языком для веба.
                            в те времена, когда выбор был между perl и Php:) выбор был понятен

                            Как только повылазили руби, груви, питон итд: так сразу и закочнилось
                            Ответить
                            • пока что не было необходимости использовать для веба что-то еще
                              Ответить
                              • разумеется, потому что кроме php и js ты ничего не пробовал и потому используешь то, что знаешь
                                это логично
                                Ответить
                                • не совсем так. использую то, за что платят и делаю на том, на чем говорят. но попробовать конечно нужно, хотя бы для расширения кругозора
                                  пробовал много чего не вебовского C/C++, Basic, Dephi/Pascal, Fox Pro, Assembler etc.
                                  Ответить
                          • > в отличие от ныне трендового JS
                            Сравнивать "PHP" и "JS" — это как выбирать между говном и говном.
                            Ответить
                            • Вот не надо тут! В JS нет такой неконсистентности имён как в PHP, а оператор сравнения строк никогда не кастил их в число (неявные касты начинаются только когда операнды разных типов).
                              Ответить
                              • ну это прямо срочно исправляет ситуацию
                                Ответить
            • Да хотя бы тем, что этот говнокод заработает на php 7
              Ответить
              • А без PDO не заработает что ли?
                Ответить
                • На самом деле даже так: PDO гарантирует работу в PHP7? Т. е. точно больше ничего не понадобится?
                  Ответить
                  • mysql_ не поддерживается, PDO поддерживается, что тут обсуждать то? я ебу, как его остальной код написан? глупо использовать то, что давным давно deprecated в 5.5 и выпилено из 7
                    Ответить
                    • mysql_ не надо было использовать ещё... 9 лет назад, когда вышло mysqli_. Единственным обоснованием использования mysql_ были отсталые шаред-хостинги.

                      Подождите, посмотрю обсуждаемый код... AnalPerOral недавно вышел из криокамеры.
                      Ответить
                      • у mysqli_ какое-то кривое API (имхо). в любом случае, подход работы с СУБД автора уже давно устарел и вошел в аналы. надеюсь, он это уяснит рано или поздно
                        Ответить
                      • По-моему он нас просто затроллировал. Тот самый знаменитый хакер AnalPerOral, которым пестрели все украинские СМИ -- и вдруг говномамонтно говнокодирует на говнопыхе без отступов?
                        Ответить
                        • А хакеру и не требуется умение писать с отступами!
                          Ответить
                        • https://pastebin.com/2FfEGKBR

                          Эту простыню я наваял, полагаешь, также лишь для того, чтобы кого-то затроллить?
                          Ответить
                          • Люди целые манускрипты ваяют, чтобы затроллить:
                            https://ru.wikipedia.org/wiki/Рукопись_Войнича
                            Ответить
                            • Ну, в случае с данным гримуаром никак нельзя уверенно склоняться как в сторону полезности изложенных в нём сведений, так и в сторону бессмысленности всех этих строк. По моему же коду видно, что он выполняет определённые функции.
                              Ответить
                            • Ващето анализ Ципфа показал что это естественный язык, так что это наврядли тролль, рзве что тролль-матлингвист
                              Ответить
                              • >>>"Ващето"

                                У неподготовленного читателя очко может сжаться от каменно-холодной авторитетности голоса, коим ты излагаешь спизженные минуту назад из Интернета сведения.
                                Ответить
                                • На твое очко подготовлено основательно, и так просто не сожмется, правда?
                                  Ответить
                                  • Моё очко способно сжаться лишь от пищевого отравления, непреодолимого желания испражниться и осознания того, что вокруг толпа, а туалетов нет.
                                    Ответить
                              • Я проверял тексты, сгенерированные на ГК бредогенератором. Отклонение от закона Ципфа было в рамках допустимого для естественных текстов.
                                Ответить
                              • Анализ Ципфа не даёт никаких данных о естественности языка. Закон Ципфа даже для случайной каши (не вореций) обычно выполняется.
                                Ответить
                                • Даже предлагаю эксперимент: заменим в обсуждении какого-нибудь говнокода слово «запрос» на слово «собака», слово «транзакция» на слово «кошка», слово «алгоритм» на слово «холодильник», слово «вероятность» на слово «автобус» и так далее. Полученный текст не будет иметь никакого смысла (оригинальный текст даже невозможно будет восстановить частотным анализом, в отличие от шифра простой подстановки для букв, который частотным анализом легко ломается), но закон Ципфа будет соблюдён.
                                  Ответить
                                  • Суженная версия закона Ципфа выполняется вообще для всякой фигни. Для натуральных чисел конечной длины, например.
                                    Ответить
                                    • Пост, блядь, вообще на другую тематику. Нахуй мне ваш закон Ципфа?
                                      Ответить
                                      • Да иди ты нахуй со своей тематикой, мы тут про лингвистический анализ трём. Никого не ебут посты.
                                        Ответить
                                        • >>>"Да иди ты нахуй"

                                          Ты и вся твоя родня не оставили там ни пяди поверхности, на которую я мог бы ступить.
                                          Ответить
                                      • > Пост, блядь, вообще на другую тематику.

                                        А что нам обсуждать-то ещё? То, как ты не можешь в тервер, prepared statements и нормальное форматирование кода?
                                        Ответить
                                        • Можно ещё поиграть в игру «Угадай, где здесь алгоритм, %USERNAME%».

                                          Например, в этих строках алгоритма точно нет:
                                          $probabilities=array();
                                          $get_items=mysql_query("SELECT * FROM `items` WHERE `iid` IN(".mysql_real_escape_string($case['items']).") AND `status`='1' AND `count`>'0' ORDER BY `probability` DESC;");
                                          while($item=mysql_fetch_assoc($get_items)){
                                          $probabilities[$item['probability']]=0;
                                          }

                                          Вместо этого сразу можно было написать комментарий, чем заполнен массив $probabilities.

                                          Если автор показал нам эти строки, значит, хочет, чтобы мы их обсудили.
                                          Ответить
                                  • Это все же будет зашифрованный текст на естественном языке, со смыслом.
                                    Ответить
    • Схема с процентами слишком сложная, и абсолютно кривая. Если я правильно понял, у всего одного предмета с "вероятностью выпадения 1%" есть шанс 3/4 попасть в выдачу. Если есть 3 предмета с "вероятностями" 1%, 2% и 3%, шанс выпадения хотя бы одного предмета 1 - (1/2)^9, т.е. почти единица.

      > $pi>=0;
      Даже у предмета с "вероятностью" выпадения 0% есть шансы выпасть. Если он единственный, то этот шанс 1/2.

      Если массив $dices будет пустой, то reset() вернёт FALSE, не приведёт ли это к кривому запросу в последней строке? Число со строкой же сравниваться будет. Впрочем, я не удивлюсь, если говномускуль съест это и не почешется.

      Последний запрос (`count`>'0') не в транзакции, два конкурентных запроса могут получить по одному предмету с count = 1
      https://habrahabr.ru/post/258449/
      В итоге: ты пишешь такие же дырявые сайты, как и те обезьяны, чьё творчество ты ломаешь
      Ответить
    • # ORDER BY RAND() LIMIT 1

      Мне однажды умный человек сказал, что это - плохо
      Ответить
      • Не знаю, как в других СУБД, но в MySQL "ORDER BY RAND() LIMIT 1" сначала тасует ВСЮ таблицу, а потом уже выбирает одну строку.

        Уж лучше "LIMIT FLOOR(RAND() * @COUNT), 1".

        Хотя самый быстрый вариант — "WHERE `id` >= FLOOR(RAND() * @COUNT) LIMIT 1".

        Здесь @COUNT — заранее посчитанное к-во строк.
        Ответить
        • > Хотя самый быстрый вариант — "WHERE `id` >= FLOOR(RAND() * @COUNT) LIMIT 1".

          эт если в айдишниках нет дыр
          Ответить
          • Это да...

            С дырами работать будет, если использовать неравенство вместо точного равенства, но распределение будет неравномерным: элемент, расположенный после большой дыры, будет выпадать чаще, чем нужно. Как вариант можно использовать точное равенство и повторять запрос, если выпало ноль элементов, но это уже некрасиво.
            Ответить
            • > распределение будет неравномерным: элемент, расположенный после большой дыры, будет выпадать чаще

              Прям как в Что? Где? Когда?
              Ответить

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