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'];} ?>">
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
840
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
    }

И тогда он должен работать нормально.

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)
Ответ принят как подходящий

Вы можете использовать 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()

Другие вопросы по теме