У меня есть следующий скрипт jQuery для отправки данных формы в php. Я тестирую данные формы с помощью простого php-файла, чтобы отобразить поле имени входного сообщения: строка данных в качестве теста (я новичок в использовании php, поэтому я его тестирую).
<script type = "text/javascript">
$("#btn_submit").on("click", function (event) {
event.preventDefault();
form_data = $('form').serialize()
var datastring = JSON.stringify({form_data});
console.info("Okay, I'm starting");
console.info(form_data);
console.info(datastring);
return $.ajax({
type: "POST",
url: "echo_test.php",
data: {post: datastring},
success: function (responseText) {
console.info(responseText);
},
error: function (error) {
console.info("Okay, I failed" + error);
}
});
});
Простой php-файл:
<?php
echo 'Hello ' . htmlspecialchars($_POST["firstname"]) . '!';
?>
Вот что повторяет консоль разработчика Firefox:
Okay, I'm starting
email_field=mj%40abc.com&firstname=mary&lastname=jones&comments=no+comment%0D%0A
{"form_data":"email_field=mj%40abc.com&firstname=mary&lastname=jones&comments=no+comment%0D%0A"}
и, наконец, отзывается эхом:
Hello !
Таким образом, часть приветствия и восклицательный знак возвращаются обратно, но не поле имени. Я вижу, что строка данных, которую он отправляет в php-файл, содержит имя=мэри, поэтому в этом поле есть значение.
Почему поле имени не возвращается?
Вы имеете в виду изменить «данные: {post: datastring}» на «data: {$_POST['post']['firstname'] }" - потому что полей больше, чем просто имя.
В этом примере показано, как вы можете опубликовать имя... данные: { firstname: 'name' } затем в php $_POST["firstname"]






Вы не правильно размещаете свои данные, попробуйте это:
$("#btn_submit").on("click", function (event) {
event.preventDefault();
form_data = $('form').serialize()
console.info("Okay, I'm starting");
console.info(form_data);
return $.ajax({
type: "POST",
url: "echo_test.php",
data: form_data,
success: function (responseText) {
console.info(responseText);
},
error: function (error) {
console.info("Okay, I failed" + error);
}
});
});
Хорошо, я попробую это и отпишусь.
Поскольку вы используете
data: {post: datastring},
значение datastring будет в $_POST['post']. Он будет закодирован как JSON, поэтому вам нужно будет вызвать json_decode() для его декодирования.
Но вы также используете form_data = $('form').serialize(). form_data поэтому будет в формате URL-кодирования. Вам нужно будет использовать parse_str(), чтобы расшифровать это.
А синтаксис {form_data} является сокращением для {form_data: form_data}, поэтому вам нужно будет получить доступ к свойству form_data декодированного JSON.
Итак, PHP должен быть:
<?php
$datastring = $_POST['post'];
$datastring_decoded = json_decode($datastring);
$form_data = datastring_decoded->form_data;
$params = parse_str($form_data);
$firstname = $params['firstname'];
echo "Hello $firstname";
Было бы намного проще, если бы вы просто использовали
data: form_data,
в звонке $.ajax(). Тогда параметр будет в $_POST['firstname']. Редко когда нужно использовать JSON при публикации с $.ajax(), если только вы не вызываете API, который специально требует этого вместо формата application/x-www-form-urlencoded или multipart/form-data.
Спасибо за Ваш ответ. Сейчас я работаю над примером Уго Т.. Его необходимо повторно отправить в облако, поэтому это займет несколько минут. Я отправлю обратно с моими результатами. Я ценю помощь.
как вы сказали, данные: form_data - правильный выбор, как сказал Уго Т. в своем ответе.
Я знаю. Я хотел подробно объяснить, что на самом деле происходит в вашем коде.
Вы спросили Почему поле имени не возвращается? Его ответ не отвечает на этот вопрос, мой отвечает.
Я скопировал его код, и он сработал, поэтому я выбрал его как лучший ответ. Мне жаль, что SO не позволяет мне выбрать два лучших ответа, потому что ваш такой же хороший. Я проголосовал за ваш ответ.
похоже, что вы вложили
datastringвнутрьpost, так что вы можете попробовать$_POST['post']['firstname']