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

    +168

    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
    function xss_clean($str, $is_image = FALSE)//
    	{	
    		/*
    		* Is the string an array?
    		*
    		*/
    		if (is_array($str))
    		{
    			while (list($key) = each($str))
    			{
    				$str[$key] = $this->xss_clean($str[$key]);
    			}
    		}
    		return $str;
    	}

    Нашёл в одном из самописных двигов. я так и не понял где тут хсс клин:)))

    Запостил: Impossible, 22 Апреля 2010

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

    • Это часом не из кодигнайтера? Там ниже, если присмотреться, есть
      $str = $this->_remove_invisible_characters($str);
      $str = preg_replace('|\&([a-z\_0-9]+)\=([a-z\_0-9]+)|i', $this->xss_hash()."\\1=\\2", $str);
      и так далее, а конкретно приведеный тобой кусок — всего лишь коллбэк для очистки всех элементов массива.

      Впрочем, не из кодигнайтера, потому что там ещё одна открывающая, одна закрывающая и куча кода перед закрывающей пропущены. Больше похоже на то, что кто-то скопировал код CI, не понимая сути.
      Ответить
      • нет там именно эта функция и ей проверяется все POST/GET запросы xD
        Ответить
        • Тогда вопросов не имею. Интереса ради, что за движок?
          Ответить
          • хз...друг кинул, сказал посмотреть что можно сделать из "Этога"xD
            Ответить
    • 
      Ответить
    • Один лишь цикл чего стоит while (list($key) = each($str))
      Никто не знает про foreach
      Ответить
      • эт точно...
        Ответить
      • Кстати, а вот здесь спрошу: чем форич лучше этой конструкции? Не считая того, что специально для массивов создан.
        Ответить
        • работает быстрее) "и создан специально для массивов"
          Ответить
          • А вот и не специально для массивов
            Ответить
            • Ну, после слов Impossible я надыбал на бенчмарки, показывающие, что вот этот while работает в несколько раз медленней, чем если переписать его на foreach. Так что это единственное, имеющее значение.

              И если не специально для массивов, то для чего? Объекты им перебирать можно только с пятёрки.
              Ответить
              • для итераторов
                Ответить
                • Если говорить по умному, то да, для итераторов. Но даже в мануале к пыху сказано
                  PHP 4 introduced a foreach construct, much like Perl and some other languages. This simply gives an easy way to iterate over arrays...
                  ...
                  As of PHP 5, it is possible to iterate objects too...
                  Ответить
          • Бред
            Ответить
          • После того, как мне указали на то, что в бенчмарках результат выводится так:
            return substr($res, 0, 6);
            я повторил эти же марки с таким выводом:
            number_format (timer(), 8);
            и выяснил, что на самом деле вариант с while гораздо быстрей и на много порядков.
            Вариант с foreach: 0.29952500 сек
            Вариант с while each: 0.00002400 сек

            <?php
            set_time_limit(0);
            function timer()
            {
                static $mark = null;
                if ($mark === null)
                {
                    $mark = microtime(0);
                }
                else
                {
                    $res = microtime(0) - $mark;
                    $mark = null;
                    return $res;
                }
            }
            
            /**
             * Сравнение скорости перебора массива двумя способами способами:
             * циклом foreach и циклом while с функцией each.
             */
            
            // Создаем массив с весом элементов 1Мб
            $array = array();
            for ($i=0; $i<1000000; $i++)
            {
                $array[$i] = 1;
            }
            
            //Вариант первый
            timer();
            foreach ($array as $k => $v)
            {
                $var = $v;
            }
            echo 'Вариант с foreach: ' . number_format (timer(), 10) . ' сек<br>';
            
            //Вариант второй:
            timer();
            while (list($k, $v) = each($array))
            {
                $var = $v;
            }
            echo 'Вариант с while each: ' . number_format (timer(), 10) . ' сек<br>';
            ?>
            Ответить
            • Что-то у Вас с замерами не то. У меня выпадали такие варианты

              Вариант с foreach: -0.0396820000 сек
              Вариант с while each: 0.0000690000 сек
              Ответить
              • Честно говоря, не понимаю, что означает этот минус (а он не есть гуд), но в те моменты, когда без него, результаты на форич показывают на четыре порядка большее время. А варианты с вайл всегда стабильные.
                P.s. У меня минус выскакивает в одном-двух случаях из десяти.
                Ответить
            • И еще
              <?php
              
              // Создаем массив с весом элементов 1Мб
              $array = array();
              for ($i=0; $i<100000; $i++)
              {
                  $array[$i] = 1;
              }
              
              
              //Вариант c  foreach
              $time = microtime(1);
              foreach ($array as $k => $v)
              {
                  $var = $v;
              }
              echo 'Вариант с foreach: ' . number_format (microtime(1) - $time, 10) . ' сек<br>';
              
              //Вариант с while:
              $time = microtime(1);
              while (list($k, $v) = each($array))
              {
                  $var = $v;
              }
              echo 'Вариант с while each: ' . number_format (microtime(1) - $time, 10) . ' сек<br>';
              
              ?>

              Вариант с foreach: 1.0866749287 сек
              Вариант с while each: 0.0000641346 сек

              А (переставлены проверки местами)
              <?php
              
              // Создаем массив с весом элементов 1Мб
              $array = array();
              for ($i=0; $i<100000; $i++)
              {
                  $array[$i] = 1;
              }
              
              //Вариант с while:
              $time = microtime(1);
              while (list($k, $v) = each($array))
              {
                  $var = $v;
              }
              echo 'Вариант с while each: ' . number_format (microtime(1) - $time, 10) . ' сек<br>';
              
              //Вариант c  foreach
              $time = microtime(1);
              foreach ($array as $k => $v)
              {
                  $var = $v;
              }
              echo 'Вариант с foreach: ' . number_format (microtime(1) - $time, 10) . ' сек<br>';
              
              
              ?>

              Вариант с while each: 1.0137848854 сек
              Вариант с foreach: 0.8903930187 сек
              Ответить
              • Бенчмарки такие бенчмарки.
                Какой будет вывод? Кстати, в одном случае разница огромная, а в другом минимальная (по сравнению с).
                А если несколько раз позапускать?
                А если классически, отдельно один случай, отдельно другой? Причём, перед запуском делать выключение компа, чтоб обнулить все буферы.

                В любом случае, я не буду утверждать однозначно, что быстрей один или другой способ.
                Ответить
                • Вывод такой, что while как-то использует кеш или еще что-то при повторном прогоне. Поэтому если нужно два раза прогонять значения, то первый раз через foreach, а второй через while
                  Ответить
              • Бенчмарк выполняется некорректно... надо делать отдельные вызовы.
                Ответить
                • Вариант с foreach: 0.752277135849 сек
                  Вариант с while each: 0.193212032318 сек

                  Вариант с while each: 0.216768980026 сек
                  Вариант с foreach: 0.827805042267 сек

                  замерено 20 раз по 100000 элементов
                  Ответить
                  • Ребята, перестаньте уже экономить на спичках! Если вам действительно нужна скорость - пишите критичные по скорости участки на C++

                    По теме: считаю, что foreach визуально лучше воспринимается чем whlie, list и each
                    Ответить
      • См. чуть выше бенчмарк )
        Ответить
    • показать все, что скрытоПочитайте меня, любите меня, поклоняйтесь меня.
      Ответить

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