2010-10-06 2 views
0

У меня есть это:PHP: Еогеасп и массив вопрос

foreach($_POST as $key => $value) { 
    $data[$key] = filter($value); 
} 

filter(); полоски Если какие-либо теги, а реальные избежать их.

Теперь у меня есть массив в форме POST, поэтому я получаю ошибки в strip_tags() и mysql_real_escape_string. Как я могу позволить только $_POST["Searching"] не фильтроваться по filter();?

ответ

0

Использование is_array():

foreach($_POST as $key => $value) { 
    if (!is_array($value)) 
     $data[$key] = filter($value); 
} 
+0

Где в foreach? – Johnson

+0

Да, в foreach, но измените $ _POST ['Searching'] на значение $. Я изменил ответ. – CristiC

3

Вы можете использовать array_walk_recursive.

array_walk_recursive($_POST,'filter'); 

и сделать вашу функцию filter принимает значение по ссылке, как:

function filter(&$value) { 
    // apply strip_tags and real escape to $value. 
    $value = mysql_real_escape(strip_tags($value)); 
} 
+0

Minor синтаксис - не должен 'array_walk_recursive (& $ _ POST, фильтр);' быть 'array_walk_recursive (& $ _ POST, 'фильтр');' ? Кроме того, как вопрос для моего собственного назидания - не эта функция не пытается и не изменяет исходный массив на месте, а не расшифровывает его на новый массив, например '$ data', как в вопросе? Я вижу из php.net, что эта функция возвращает true или false. –

+0

Также время вызова по ссылке устарело и будет вызывать предупреждения. Должно просто быть 'array_walk_recursive ($ _ POST, 'filter');' – meagar

+0

@ Lucanos, @ meagar: Спасибо. – codaddict

0
<?php 
foreach($_POST as $key => $value){ 
    if(!is_array($_POST[$key])){ 
     $data[$key] = filter($value); 
    }else{ 
     $data[$key] = $value; 
    } 
} 
?> 
+0

Это решение является неполным - оно ничего не делает, если оно попадает в массив. Хотя это предотвращает проблему с 'filter()' бросанием ошибки, когда она пытается обработать массив, это также означает, что массив потеряет данные (в том, что любые подмассивы будут отброшены). –

+0

Вы правы. Я набрал свое оригинальное решение слишком быстро. – FallenRayne

1

Во-первых, вы можете использовать array_map() ускорить этот, и все, что вам нужно, это позволить функции идентифицировать массивы и называть себя рекурсивно.

function filter($inVar){ 
    if(is_array($inVar)) 
    return array_map('filter' , $inVar); 
    return mysql_real_escape(strip_tags($inVar)); 
} 

Затем вызовите его следующим образом:

$data = array_map('filter' , $_POST); 
Смежные вопросы