Как получить многомерный массив после отправки моей формы из javascript в PHP? - PullRequest
0 голосов
/ 12 апреля 2020

Один php файл с php и javascript внутри. У меня есть многомерный массив, определенный в javascript части. Я вижу правильные выходные данные «ключа» и «значения» в консоли, но я не получаю массив в php после отправки моей формы. Что я делаю не так?

<?php
echo "Postcmd: ".$_POST["postcmd"];
print_r($_POST["postcmd"]);
?>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<script type="text/javascript">
var postcmd =[];
var key;
function formsubmitplus(ele) {
    postcmd.push({"key": ele.id, "value": ele.value});
    for (key in postcmd) {
      if (postcmd.hasOwnProperty(key)) {
        console.log(postcmd[key])
      } 
    }

    request = $.ajax({
        url: "/index.php",
        type: "post",
        data: postcmd
    });

} 
</script>

Даже этот простой и часто встречающийся пример сценария не работает для меня - что еще может быть проблемой? Есть ли еще что-то, что нужно знать о js -> PHP?

    <?php
// index.php
?>

<html>
<head>
<title>Pass JS array to PHP.</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
var arrayfromjs = "123";
$.ajax({ 
       type: "POST", 
       url: "index.php", 
       data: { testArray : arrayfromjs}, 
       success: function() { 
              alert("Success"); 
        } 
}); 
</script>

</head>
<body>

<?php
echo "<br>Pass JS array to PHP.<br>";
$myArray = $_POST['testArray'];
print_r($myArray);

?>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 12 апреля 2020

Вы создаете следующую структуру, используя метод push:

[
  {
     "key":"first_name",
     "value": "Bob"
  }
]

Используя ваш код, все, что вам нужно сделать, это индексировать переменную postcmd для объекта. У вас также были некоторые проблемы с индексированием вашего l oop. Переменная key будет просто индексом 0. Поэтому вам нужно установить его на postcmd[key], чтобы проверить ключ с именем "key".

function formsubmitplus(ele) {
    postcmd.push({"key": ele.id, "value": ele.value});
     for (key in postcmd) {
      if (postcmd[key].hasOwnProperty("key")) {
        console.log(postcmd[key].key)
      } 
    }

    request = $.ajax({
        url: "/index.php",
        type: "post",
        data: postcmd[0]
    });

} 

Используя приведенный выше фрагмент, jQuery затем проанализирует данные в правильных парах значений ключа. Без указания индекса данные будут опубликованы как undefined=Bob

На стороне PHP вы сможете получить такие значения следующим образом:

<?php

echo $_POST['key'].PHP_EOL;
echo $_POST['value'];

?>

Альтернатива Метод - JSON Отправка

Вы можете сделать следующую модификацию, чтобы разместить данные как JSON:

function formsubmitplus(ele) {
    for (key in postcmd) {
      if (postcmd[key].hasOwnProperty("key")) {
        console.log(postcmd[key].key)
      } 
    }

    request = $.ajax({
        url: "/index.php",
        type: "post",
        contentType: 'application/json',
        data: JSON.stringify(postcmd)
    });

} 

Затем на стороне PHP вы можете получить тело POST, используя следующее:

<?php
    echo "<pre>";
    $json_data = json_decode(file_get_contents('php://input'), true);
    print_r($json_data);
?>

Если вы предпочитаете работать с PHP объектом против ассоциативного массива. Просто измените true на false.

0 голосов
/ 28 апреля 2020

До конца я нашел решение без jquery, которое работает для меня лучше всего. Он «играет» со скрытыми полями формы. Может быть, кто-то найдет это полезным:

function submitform() {
    Object.getOwnPropertyNames(postcmd).forEach(function(val, idx, array) {
    var outarrayoutput = val + ' ==== ' + postcmd[val];
    console.log(outarrayoutput);
    var newHidInp = document.createElement('input');
    newHidInp.type  = 'hidden';
    newHidInp.name  = 'outArray[]';
    newHidInp.value = outarrayoutput;
    maintable.appendChild(newHidInp);
}); 
    document.maintable.submit();
}
0 голосов
/ 12 апреля 2020

Согласно документации jQuery,

Данные для отправки на сервер. Он преобразуется в строку запроса, если это еще не строка. Он добавляется в URL для GET-запросов. См. Параметр processData, чтобы предотвратить автоматическую обработку c. Объект должен быть парой ключ / значение. Если значение является массивом, jQuery сериализует несколько значений с одним и тем же ключом на основе значения традиционной настройки (описанной ниже).

Таким образом, ваше поле data должно содержать объект (например, как {foo: bar, foo_again: bar_again}; в PHP это будет читаться как $_POST['foo'] == "bar"). Тем не менее, ваш код представляет массив с одним элементом: указанным объектом. Кроме того, PHP волшебным образом не превращает ваш массив / объект JS в массив PHP. Вы должны проанализировать строку, переданную в PHP, и превратить ее в нужный вам массив.

Если вы напечатаете $_POST, вы сможете увидеть, что именно передается в ваш PHP. Это может помочь вам увидеть, что происходит.

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