PHP $ _POST с массивом и ключом [] - PullRequest
0 голосов
/ 09 ноября 2018

У меня проблема при загрузке списка имен файлов в php. Если имя файла содержит], это нарушит декодирование массива в PHP.

Его также можно воспроизвести с помощью $ _GET, как показано здесь.

Что я хочу, чтобы это было декодировано как:

Array
(
    [a] => Array
        (
            [b[]] => c
        )

)

Цель - получить ключ в массиве, также содержащий символ]

index.php? А [Ь []] = с

Дает мне это:

Array
(
    [a] => Array
        (
            [b[] => c
        )

)

Кодирование их дает ту же проблему

index.php? A [B% 5B% 5D] = C

Дает мне это:

Array
(
    [a] => Array
        (
            [b[] => c
        )

)

Двойное кодирование тоже не работает index.php? а [Ь% 255b% 255D] = C

Дает мне это:

Array
(
    [a] => Array
        (
            [b%5B%5D] => c
        )

)

Возможно ли это закодировать, чтобы PHP декодировал его в массив с ключами со строкой, содержащей

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Если вы пишете небольшой скрипт, вы можете спросить PHP, что он предпочитает:

<code><?php
$c = 0;
$data = array(
    "a" => array(
        "b[]" => $c
    )
);
echo "<pre>";
var_export($data);
echo "\r\na[b[]]=c Encoded: " . urlencode("a[b[]]=c");
echo "
"; ?>

Результаты

array (
  'a' => 
  array (
    'b[]' => 0,
  ),
)
a[b[]]=c Encoded: a%5Bb%5B%5D%5D%3Dc

Обновление

Я написал следующий код, чтобы посмотреть, как его кодирует браузер:

<html>
    <head>
        <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
        <script>
            $(function(){
                $("form").submit(function(e){
                    e.preventDefault();
                    var data = $(this).serialize();
                    console.log(data);
                });
            });
        </script>
    </head>
    <body>
        <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
            <label for "a">a[b[]] = </label>
            <input type="text" name="a[b[]]" id="a" value="c" />
            <br />
            <button type="submit">
                Go
            </button>
        </form>
    </body>
</html>

Когда я нажимаю Go, я вижу в консоли следующее:

a%5Bb%5B%5D%5D=c

Когда я запускаю его через urldecode():

<?php
echo urldecode("a%5Bb%5B%5D%5D=c");
?>

Я вижу следующие результаты:

a[b[]]=c

Похоже, вам не нужно кодировать символ =, но вы хотите правильно кодировать [ и ]: %5B и %5D соответственно.

Итак, если вы хотите использовать:

index.php?a[b[]]=c

Я бы посоветовал:

index.php?a%5Bb%5B%5D%5D=c

Надеюсь, это поможет.

0 голосов
/ 09 ноября 2018

Ссылка на мой комментарий. Вы сфокусировались на неправильной стороне стола. Проблема не в обработке входящей информации, а в том, что ваша клиентская сторона передает данные, которые неправильно передаются через данные. Квадратные скобки представляют собой UNSAFE символов для отправки на конечную точку, и клиент, отправляющий эту информацию, - это то место, где вам нужно внести изменения, а не серверная часть, обрабатывающая данные.

Читайте о безопасных и небезопасных символах в URL здесь:

Прекратить использование небезопасных символов в URL

Скобки используются для определения данных вложенного списка, и то, как вы пытаетесь его использовать, нарушает эту логику, вам придется изменить способ, которым ваш веб-интерфейс (или все, что делает HTTP-запрос) кодирует эти данные.

enter image description here

0 голосов
/ 09 ноября 2018

Я не знаю, как вы загружаете файл, и вам нужно [- символ в имени файла или нет, но проблема с массивом $ _GET, которую я могу изобразить так:

<? dump($_GET['a']); // Array([b[] => c)
$arr = [];
foreach ($_GET['a'] as $key => &$value) {
    $vl = str_replace('[', '', $key);
    dump($key); // b[
    dump($vl); // b
    $arr[$vl] = $value;
}
dump($arr); // Array([b] => c)
?>

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...