Как получить значения POST из serializeArray в PHP?
-
19-09-2019 - |
Вопрос
Я пробую этот новый метод, который я видел serializeArray()
.
//with ajax
var data = $("#form :input").serializeArray();
post_var = {'action': 'process', 'data': data };
$.ajax({.....etc
Итак, я получаю эти пары ключ-значение, но как мне получить к ним доступ с помощью PHP?
Я думал, что мне нужно это сделать, но это не сработает:
// in PHP script
$data = json_decode($_POST['data'], true);
var_dump($data);// will return NULL?
Спасибо, Ричард
Решение
Как предположил Гумбо, вы, скорее всего, не обрабатываете возвращаемое значение json_decode - код в формате json.
Попробуй
$data = json_decode($_POST['data'], true);
var_dump($data);
Если $data
не содержит ожидаемых данных, тогда var_dump($_POST);
чтобы увидеть, что вызов Ajax опубликовал в вашем скрипте.Возможно, вы пытаетесь получить доступ к JSON не с того ключа.
Редактировать
На самом деле, вы должны убедиться, что вы действительно отправляете JSON в первую очередь :)
Документы jQuery для сериализации состояния Метод .serializeArray() создает JavaScript-файл массив объектов, готов к кодированию в виде строки JSON. Готовый к кодированию файл - это не JSON.По-видимому, в jQuery нет функции Object2JSON, поэтому либо используйте https://github.com/douglascrockford/JSON-js/blob/master/json2.js в качестве сторонней библиотеки или использования http://api.jquery.com/serialize/ вместо этого.
Другие советы
Возвращаемая структура JSON не является строкой.Вы должны использовать плагин или стороннюю библиотеку, чтобы "упорядочить" его.Смотрите это для получения дополнительной информации:
http://www.tutorialspoint.com/jquery/ajax-serializearray.htm
OP мог бы фактически по-прежнему использовать serializeArray() вместо просто serialize(), внеся следующие изменения:
//JS
var data = $("#form :input").serializeArray();
data = JSON.stringify(data);
post_var = {'action': 'process', 'data': data };
$.ajax({.....etc
// PHP
$data = json_decode(stripslashes($_POST['data']),true);
print_r($data); // this will print out the post data as an associative array
это возможно с помощью массива сериализации и json_decode()
// js
var dats = JSON.stringify($(this).serializeArray());
data: { values : dats } // ajax call
//PHP
$value = (json_decode(stripslashes($_REQUEST['values']), true));
значения принимаются в виде массива
каждое значение может быть получено с помощью $value[0]['значение'] имя каждого html-компонента задается как $value[0]['имя']
print_r($value) //gives the following result
Array ( [0] => Array ( [name] => name [value] => Test ) [1] => Array ( [name] => exhibitor_id [value] => 36 ) [2] => Array ( [name] => email [value] => test@gmail.com ) [3] => Array ( [name] => phone [value] => 048028 ) [4] => Array ( [name] => titles [value] => Enquiry ) [5] => Array ( [name] => text [value] => test ) )
У меня очень похожая ситуация на эту, и я считаю, что у Ty W есть правильный ответ.Я включу пример своего кода, на всякий случай, если различий будет достаточно, чтобы изменить результат, но, похоже, вы можете просто использовать опубликованные значения, как обычно в php.
// Javascript
$('#form-name').submit(function(evt){
var data = $(this).serializeArray();
$.ajax({ ...etc...
// PHP
echo $_POST['fieldName'];
Это действительно упрощенный пример, но я думаю, что ключевым моментом является то, что вы не хотите использовать json_decode()
метод, поскольку он, вероятно, выдает нежелательный результат.
javascript не меняет способ публикации значений, не так ли?Разве вы не должны иметь возможность доступа к значениям через PHP, как обычно, через $_POST['name_of_input_goes_here']
Редактировать:вы всегда можете вывести содержимое $_POST, чтобы увидеть, что вы получаете от отправки формы javascript, используя print_r($_POST)
.Это дало бы вам некоторое представление о том, что вам нужно было бы сделать в PHP, чтобы получить доступ к нужным вам данным.
Вы можете использовать эту функцию в php для обратного преобразования serializeArray().
<?php
function serializeToArray($data){
foreach ($data as $d) {
if( substr($d["name"], -1) == "]" ){
$d["name"] = explode("[", str_replace("]", "", $d["name"]));
switch (sizeof($d["name"])) {
case 2:
$a[$d["name"][0]][$d["name"][1]] = $d["value"];
break;
case 3:
$a[$d["name"][0]][$d["name"][1]][$d["name"][2]] = $d["value"];
break;
case 4:
$a[$d["name"][0]][$d["name"][1]][$d["name"][2]][$d["name"][3]] = $d["value"];
break;
}
}else{
$a[$d["name"]] = $d["value"];
} // if
} // foreach
return $a;
}
?>