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

    +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
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    <?php
        echo count($arr);
        $i = count($arr) - 1;
        for ($i; $i >= 0; $i--) {
        ?>
        <div class="post" id="p<?php echo $arr[$i]->_id; ?>">
          <div class="p_title"><?php echo $arr[$i]->title; ?></div>
          <div class="p_content"><?php echo $arr[$i]->content; ?></div>
          <div class="p_date"><?php echo $arr[$i]->date; ?></div>
          <form id="<?php echo $arr[$i]->_id; ?>" action="index.php" method="get">
            <!--<textarea rows="4" cols="50" name="removid" style="display: none;" ><?php echo $arr[$i]->_id; ?></textarea>-->
              <input type="text" name="removid"  form="<?php echo $arr[$i]->_id; ?>" value="<?php echo $arr[$i]->_id; ?>"/>
            <input type="submit" class="p_remove" onclick="dele('<?php echo $arr[$i]->_id; ?>');" form="<?php echo $arr[$i]->_id; ?>" value="Удалить"/>
          </form><!--</div>-->
          <?php echo $arr[$i]->_id; ?>
        </div>
        <?php
        }
        ?>
    
    <script>
          function dele(param){
            var jsVar = "<?php
            $removid = $_GET['removid'];
            $bulk = new MongoDB\Driver\BulkWrite;
            //$bulk->delete(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
            $query = new MongoDB\Driver\Query(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
            $bulk->delete(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
            $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
            try {
              $result = $manager->executeBulkWrite('forum.posts', $bulk, $writeConcern);
              //header('Location: https://benar.wtf/index.php');
    
            }
            catch (MongoDB\Driver\Exception\BulkWriteException $e) {
              $result = $e->getWriteResult();
            }
    
            ?>";
    
    
          }
    
        </script>

    Сделал вещь

    Запостил: bodix, 27 Мая 2020

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

    • показать все, что скрытоvanished
      Ответить
    • Идеальный говнокод.

      Начнём с того, что т со второй строки. Куда выведется это echo count($arr);? В каком блоке оно окажется?

      Далее: закомментированный HTML-код (<!--) в шаблоне лучше не оставлять. Это приводит к трудноуловимым ошибкам в вёрстке. Сам на такое

      onclick="dele... тоже не рекомендуют. Лучше в HTML оставить разметку, а обработчики событий навесить отдельным скриптом после загрузки страницы (google: «ненавязчивый js», «unobtrusive js»). Хотя в принципе пойдёт.

      Всё выше — это мои придирки. А теперь о серьёзном. Кошмар начинается на 24-й строке. Код для обращения к СУБД прямо в шаблоне да ещё и в том месте, где должна быть константа для js. Не надо так. Что в итоге сохранится в jsVar?

      Ну и наконец, значение $removid, полученное как $_GET['removid'], никак не проверяется, да?

      В общем, классика: «just stringing random characters together until it compiles».

      Годно.
      Ответить
      • >Что в итоге сохранится в jsVar?
        Notice
        Ответить
      • показать все, что скрытоvanished
        Ответить
        • >А по делу есть что сказать?

          Это хороший аргумент.
          Вот тебе еще немного

          1.Код может и не идеальный, зато понятный в отличие от других языков
          2. Ой, можно подумать на ваших С++ было бы лучше
          Ответить
          • Это правда, переведи этот код на плюсы и поймешь, что они не нужны
            Ответить
          • Давно не брал я в руки PHP, поэтому для меня кажется тупизной генерить JS из PHP (ну кроме тривиальных примеров и отладки всякой).
            Либо по-старинке генеришь html на PHP с обычными формами, либо html, js-скрипты и RestAPI отдельно.
            Ответить
            • На «PHP» можно генерировать «JSON» или «JSONP», которые будут потребляться «JS». А вот генерировать произвольный код на «JS» из «PHP» обычно и вправду не нужно.
              Ответить
        • Напишу по делу. В коде для вычисления начального значения jsVar есть строка:
          $bulk->delete(['_id'=> new MongoDB\BSON\ObjectId($removid)]);

          Судя по названию функции, автор ожидает, что этот пыхокод будет выполняться по вызову js-функции dele, т. е. по клику пользователя.

          На самом же деле этот код будет выполняться при каждой загрузке страницы, ещё до того, как пользователь куда-нибудь кликнет.

          Однако, это может работать, если атрибут action у формы указывает на эту же страницу. Просто когда никаких GET-параметров не передавали, на 24-й строке (где $removid = $_GET['removid'];) вылезет нотис, а в «MongoDB» передастся null, поэтому ничего не удалится. А когда пользователь нажмёт кнопку отправки формы, произойдёт отправка GET-запроса (поскольку функция dele НЕ возвращает false), и код, размещённый с 23-й строки получит нужный GET-параметр.

          Итак, обезьяна, написавшая этот код, не думает о том, что исполняется у клиента, а что на сервере, и течёт, а код оказался рабочим (хотя и с пачкой нотисов) по счастливой случайности. Именно поэтому я за «PHP».

          Чуть не забыл: использовать метод GET для удаления данных не рекомендуется. Метод POST тут был бы более уместен.
          Ответить
          • Чтоб было совсем наглядно: оригинальный код функционально эквивалентен такому:
            <?php
                echo count($arr);
                $i = count($arr) - 1;
                for ($i; $i >= 0; $i--) {
                ?>
                <div class="post" id="p<?php echo $arr[$i]->_id; ?>">
                  <div class="p_title"><?php echo $arr[$i]->title; ?></div>
                  <div class="p_content"><?php echo $arr[$i]->content; ?></div>
                  <div class="p_date"><?php echo $arr[$i]->date; ?></div>
                  <form id="<?php echo $arr[$i]->_id; ?>" action="index.php" method="get">
                    <!--<textarea rows="4" cols="50" name="removid" style="display: none;" ><?php echo $arr[$i]->_id; ?></textarea>-->
                      <input type="text" name="removid"  form="<?php echo $arr[$i]->_id; ?>" value="<?php echo $arr[$i]->_id; ?>"/>
                    <input type="submit" class="p_remove" form="<?php echo $arr[$i]->_id; ?>" value="Удалить"/>
                  </form><!--</div>-->
                  <?php echo $arr[$i]->_id; ?>
                </div>
                <?php
                }
            
                    $removid = $_GET['removid'];
                    $bulk = new MongoDB\Driver\BulkWrite;
                    //$bulk->delete(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
                    $query = new MongoDB\Driver\Query(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
                    $bulk->delete(['_id'=> new MongoDB\BSON\ObjectId($removid)]);
                    $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
                    try {
                      $result = $manager->executeBulkWrite('forum.posts', $bulk, $writeConcern);
                      //header('Location: https://benar.wtf/index.php');
            
                    }
                    catch (MongoDB\Driver\Exception\BulkWriteException $e) {
                      $result = $e->getWriteResult();
                    }
            
                    ?>


            Удаляем атрибут onclick и теги <script>, </script> (оставив то, что было в кавычках), в итоге код работает точно так же.
            Ответить
          • Какой багор )))

            Кстати, полезно было бы иметь какую-то РПЦ для того, чтобы такое работало. Только синтаксис поудобнее - чтобы меньше вопросушни.

            Либо вложенные блоки <client> и <server>, либо вообще полная неявнушня:
            <html>
              <body>
                <h1>Pituxes</h1>
                <?
                  var d = loadData();
                  for (var i=0; i<d.length; i++) ?>
                  <p><? i + ' ' + d[i].name + ' ' + d[i].pitux ?></p>
                <?
                  const mysql = require('mysql');
                  const fs = require('fs');
                  
                  function loadData() {
                    return mysql.exec('select name, pitux from pituxes');
                  }
                  
                  function readFile(user) {
                    assert(/^[a-z0-9]+$/.test(user));
                    return fs.readFileSync('/etc/pituxes/' + user)
                  }
                  
                  function $(s) {
                    return document.querySelector(s);
                  }
                  
                  $('input.pituzz').addEventListener('click', event => {
                    $('textarea').value = readFile($('input.name').value);
                  });
                ?>
                
                <h1>Me</h1>
                <input type="text" class="name" value="perdolia" />
                <input type="button" class="pituzz" value="PITUZZ" />
                <textarea></textarea>
              </body>
            </html>


            Приложение понимает, какой список функций есть у клиента или сервера, и вызывает их при наличии. Рефлексия и эквивалентность [] и . убраны по максимуму. Компилятор старается объединить или переставить блоки так, чтобы управиться минимумов запросов. Никаких явных запросов нет, только вызовы функций. Асинхрушня спрятана под капотом. Есть стратегии компиляции - "больше на сервере", "больше на клиенте", "минимум передачи данных" и хинты "server function() {}", "client function() {}".
            Ответить
            • Ничего не понял. Именно поэтому я за «PHP».

              Кстати, в ASP.NET есть атрибуты runat="server" и runat="client". Как они работают? Какой в итоге HTML- и JS-код получает клиент и что отправляется от клиента серверу?
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • Допустим. А какой смысл в <button runat="server"> ?
                  Ответить
                  • Эта кнопка сохраняет свой стейт на сервере и там же обрабатываается

                    По сути нажатие её это сабмит формы и вызов обраточика на сервере
                    Ответить
                    • Т. е. пользователь получает просто <button> (возможно, в форму что-то втыкается, чтобы можно было отличить эту кнопку от других), а на сервере запрос, который отправляет форма, перехватывается, и вне очереди вызывается назначенный нами обработчик. Так?
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • Да, могут ведь напутать. Скажут, что никакой он не «ASP.NET», а «ASP».

                                Спасибо. Теперь ясно, откуда берутся «ctl» с цифрами на сайтах.

                                Я подозревал, что через input type="hidden" должно что-то добавляться, чтобы опознать нажатую кнопку. Значит, ещё добавляется скрипт на стороне клиента, чтобы корректировать это скрытое значение, если кнопок в форме много.
                                Ответить
                                • Да, примерно так.

                                  Общий смысл в том, что ты пишешь так, словно бы у тебя обычная винформа, а не веб.

                                  Нажал кнопк -- вызвался код на C#. Можно переиспользовать веб-форм макак в задачах для веба
                                  Ответить
                                  • А случайно не привычка к runat="server" приводит к деформации, когда вебмакака не знает, где исполняется код на других платформах: на сервере или на клиенте?

                                    Кстати, есть ли аналоги runat в каких-нибудь фреймворках на других языках?
                                    Ответить
                            • Кстати, document.forms['ctl01'] вместо document.getElementById('ctl01') — это же DOM1 или вообще DOM0. Какой антиквариат )))
                              Ответить
              • Я предлагаю всю логику писать в одном месте, а решение о том, что пойдёт на клиент и сервер и как между ними пойдут данные - отдать компилятору.

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

                Например,
                var x = readFile('xxx');
                var y = $('y').attr('pituz');
                var z = loadDB('z');
                $('x').text(x+y+z);

                можно решить за один запрос. Поскольку x, y, z ортогональны, можно переставить их получение и собрать получение x, z в один запрос к серверу.
                Ответить
                • По-моему ты сейчас DCOM заново изобретаешь. Там тоже было похуй на какой стороне находится объект, ты просто вызываешь его методы и течёшь. А система сама проксирует эти вызовы на другую сторону если надо.
                  Ответить
                  • Странно, что такую питушню не завезли в веб. От смузихлёбов слышно только про пердолинг с асинками, реактивнушню и 1001й инструмент для решения проблем, которые создал 1000й, созданный для решения проблем 999го, ... А самое главное, что нужно для написания кода, не используется.
                    Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Какой багор )))

                      Но, думаю, с современными достижениями компитуляции эту питушню можно сгустить до одного запроса, если во время итереции побочные эффекты имеются только на одной стороне. Либо выставить жирное предупреждение на каком-то этапе.
                      Ответить

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