2012-05-25 4 views
0

В следующей функции сценария clean ($ data) вызывает его внутри него, что я понимаю, но как он очищает данные в операторе $ data [clean ($ key)] = clean ($ value); ??? Любая помощь приветствуется. Я пытаюсь понять это, поскольку я новичок в PHP. С уважением.Вызов функции PHP сам по себе

if (ini_get('magic_quotes_gpc')) { 
function clean($data) { 
    if (is_array($data)) { 
     foreach ($data as $key => $value) { 
      $data[clean($key)] = clean($value); 
     } 
    } else { 
     $data = stripslashes($data); 
    } 

    return $data; 
}   

$_GET = clean($_GET); 
$_POST = clean($_POST); 
$_REQUEST = clean($_REQUEST); 
$_COOKIE = clean($_COOKIE); 

}

+0

Вы должны заменить свой вызов 'ini_get'' get_magic_quotes_gpc() '. И я уверен, что ключи не экранированы - так что вы можете протестировать это и удалить «clean ($ key)», если они фактически не экранированы. – ThiefMaster

+1

Я не понимаю вопроса ... Что вы хотите знать? – DonCallisto

ответ

1

Ваш вопрос:

Так что, если я правильно undertsand вы хотите знать, что функция делает в строке

$data[clean($key)] = clean($value); 

Ответ:

См. Главное назначение функции - удалить косые черты из строки с помощью метода php stripslashes.

Если элемент ввода представляет собой массив, он пытается очистить ключи массива, а также значения массива, вызвав себя на ключ и значение.

В PHP массивы, как HashMaps и вы можете перебрать ключ и значение как с foreach цикла, как следующий

foreach ($data as $key => $value) {....} 

Так что, если вы хотите, чтобы суммировать алгоритм в вашем фрагменте кода он будет, как при

  1. Проверьте, является ли вход массивом. Если нет, то перейти к шагу 4
  2. Для каждого элемента массива очистить ключ и значение, вызвав чистый метод на нем (Рекурсивно)
  3. Возвращения массива
  4. чистые входная строка, используя метод stripslashes -возвращение очищенный вход
+0

Спасибо Hasan, я знаю, что делает функция, но см. Ваш шаг 2. Как функция clean очистит данные, когда данные будут массивом, поскольку stripslashes будут запускаться только в другой части ??????????Итак, как, если часть дает желаемый результат, если данные являются массивом, который является моим вопросом или проблемой. – user1416732

+0

OK Я видел ответ, данный @Cranio, и он достаточно хорошо объяснил, что на самом деле является скриптом и его логикой. BTW благодарит всех вас ................ – user1416732

0

По моему пониманию, он не очищает ключ, а создает новый элемент с чистым ключом, пока остается неочищенный ключ.

$ а [ 'Foo \ бар']: Вал \ уе

становится

$ а [ 'Foo \ бар']: Вал \ уе

$ а [ 'Foobar'] : значение

Кто-то исправит меня, если я ошибаюсь.

0

Может быть, вы поймете код лучше, если это поставить так:

foreach ($data as $key => $value) { 
      $key = clean($key); // Clean the key, the 
      $value = clean($value); // Clean the value 
      $data[$key] = $value; // Put it in the array that will be returned 
     } 

Если у вас есть массив как это: $ _POST = массив (0 => 'Foo', 1 => массив ('bar' => 'baz')); произойдет следующее:

Call clean($_POST); 
call clean 0 
call clean 'foo' 
$return[0] = 'foo' 
call clean 1 
call clean 'bar' 
call clean 'baz' 
$return[1] = array('bar' => 'baz'); 

Вы, вероятно, следует прочитать: http://www.codewalkers.com/c/a/Miscellaneous/Recursion-in-PHP/

0

Основная цель функции заключается в чистой ассоциативный массив или одной переменной. Ассоциативный массив - это массив, в котором вы определяете ключи и значения для этих ключей; поэтому специальные массивы, используемые в PHP, такие как $_GET$_POST и так далее.

Смысл «очистки» заключается в том, чтобы проверить, являются ли магические кавычки активными - это приводит к тому, что некоторые символы в этих массивах экранируются обратными косами при отправке динамических данных на страницу PHP. $_GET["Scarlett"] = "O' Hara" становится волшебными кавычками $_GET["Scarlett"] = "O\' Hara"

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

Алгоритм проверяет, являются ли данные, переданные функции, массивом, если он не очищает непосредственно значение.

$string = "Escapes\'in\'a string"; 
clean($string); 
  • это массив? Нет. Затем возвращаем stripslashes (мои данные)

    $ array = array ("key \ 'with \' escapes" => "value \ 'with \' escapes", "another \ 'key" => "другое значение «); clean ($ array)

  • это массив? Да. Итак, проведите через каждую пару ключ/значение с foreach, возьмите ключ и очистите его, как первый пример; затем возьмите значение и сделайте то же самое и поместите очищенные версии в массив.

Как вы видите, функция имеет два разных поведения, дифференцированных этим утверждением «если». Если вы передаете массив, вы активируете второе поведение, которое по очереди проходит пары из строк, а не массивов, вызывая первое поведение.

Я думал, что эта функция работает неправильно. У кого-то такое же ощущение? Я его еще не тестировал, но, похоже, это не «чистка» ключа/значений в смысле их замены, но добавляет очищенные версии по неочищенным.

+0

Ваш ответ - хорошая проработка и улавливает сценарий, но этот скрипт является частью opencart scource и может работать неплохо иначе opencart потерпит неудачу, поскольку функция определена в ее ядре. – user1416732

Смежные вопросы