htmlspecialchars на массиве массивов не работает

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

Было бы здорово, если бы кто-нибудь мог мне помочь в этом.

Спасибо.

Вот часть кода htmlspecialchars.

$clean = array();

if( !empty($_POST) ) {

foreach( $_POST as $key => $value ) {

if( is_array($key)){

foreach($key as $key2 => $value2)

$clean[$key2] = htmlspecialchars( $value2, ENT_QUOTES);

} else {

$clean[$key] = htmlspecialchars( $value, ENT_QUOTES);
}

}
}

Это часть HTML

 <div class="seconf-h-form">
<label>Multiple</label>
<input type="radio" id="r2" name="team_select"onchange="toggleFunc('ex_t_button');" value="Multiple"/>
</div>

<div class="element_wrap" id="box_2">
<input type="submit" name="add" id="add" value="add more">
<label>The name of your team</label>
<input type="text" name="ex_team_n[]" id="ex_team_n"/>
<select name="ex_amount[]">
<option value="">Select</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
<div id="add_section"></div>

и это та часть, где я их повторяю

<div class="element_wrap">
<label>The name of your team</label>
<p><?php echo $clean['ex_team_n']; ?></p>
</div>


<div class="element_wrap">
<label>The number of your team</label>
<p><?php echo $clean['ex_amount']; ?></p>
</div>

<input type="hidden" name="amount" value="<?php if(
$clean['team_select'] === "Multiple"){echo $clean['ex_team_n'];} ?>">
<input type="hidden" name="amount" value="<?php if(
$clean['team_select'] === "Multiple"){echo $clean['ex_amount'];} ?>">

0

Решение

Ты можешь использовать array_walk_recursive() экранировать все данные внутри массива:

// Sample data, you can use $_POST instead or any other array
$array = array(
[
'a_key' => '<b>html</b>',
'b_key' => '<a href="http://example.com/">another code</a>',
'c_key' => array('<script>alert(\'Hello\');</script>', 'No code, no change'),
],
[
'd_key' => '<small>ssup</small>',
'e_key' => 'stack',
'f_key' => 'overflow',
],
);

// Function to escape the value, you must pass the item by reference using the & operator
function html_escape(&$item){
$item = htmlspecialchars($item, ENT_QUOTES);
}

// Dump data before escaping
var_dump($array);

// Walk recursively through the array and call our function
array_walk_recursive($array, 'html_escape');

// Dump data after escaping
var_dump($array);

Данные сбрасываются перед выходом

array (size=2)
0 =>
array (size=3)
'a_key' => string '<b>html</b>' (length=11)
'b_key' => string '<a href="http://example.com/">another code</a>' (length=46)
'c_key' =>
array (size=2)
0 => string '<script>alert('Hello');</script>' (length=32)
1 => string 'No code, no change' (length=18)
1 =>
array (size=3)
'd_key' => string '<small>ssup</small>' (length=19)
'e_key' => string 'stack' (length=5)
'f_key' => string 'overflow' (length=8)

Данные сбрасываются после экранирования

array (size=2)
0 =>
array (size=3)
'a_key' => string '&lt;b&gt;html&lt;/b&gt;' (length=23)
'b_key' => string '&lt;a href=&quot;http://example.com/&quot;&gt;another code&lt;/a&gt;' (length=68)
'c_key' =>
array (size=2)
0 => string '&lt;script&gt;alert(&#039;Hello&#039;);&lt;/script&gt;' (length=54)
1 => string 'No code, no change' (length=18)
1 =>
array (size=3)
'd_key' => string '&lt;small&gt;ssup&lt;/small&gt;' (length=31)
'e_key' => string 'stack' (length=5)
'f_key' => string 'overflow' (length=8)

Документация за array_walk_recursive()

3

Другие решения

Вы не перебираете нужный объект и не создаете внутренний массив.

Заменить строки:

if( is_array($key)){
foreach($key as $key2 => $value2)
$clean[$key2] = htmlspecialchars( $value2, ENT_QUOTES);

с

if( is_array($value)){
foreach($value as $key2 => $value2) {
if (!isset($clean[$key])) $clean[$key] = array();
$clean[$key][$key2] = htmlspecialchars( $value2, ENT_QUOTES);
}

И тогда все должно работать правильно.

0

function sanitizeMyArray($array) {

array_walk_recursive($array, 'standard');

return $array;

}

function standard(&$item, $key) {

//You must return this to $item for it to work.
$item =  htmlspecialchars($item, ENT_QUOTES);

return $item;

}

$results = sanitizeMyArray($array);
print_r($results)
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector