无法从 jQuery POST 数据到 PHP
Can't POST data to PHP from jQuery
我正在尝试 post 使用 jQuery 将表单中的一些数据发送到控制器中。
但是我在这里遇到了困难。
我有一个带有一些输入的表单和一个调用我的脚本的按钮。
按钮
<button onclick="save('layoutstyle');">save</button>
和脚本
function save(action) {
jQuery("#formTest").submit(function(e) {
e.preventDefault();
var $form = jQuery(this);
var $inputs = $form.find("input, select, button, textarea");
var serializedData = $form.serialize();
$inputs.prop("disabled", true);
jQuery.ajax({
type: 'POST',
// TO DO
url: '/template/templates/nwmadm/controller.php',
data: 'save='+ action+'&data='+ serializedData,
dataType: 'html',
success: function(data) {
jQuery('#content').html(data);
}
});
})
}
php 中的控制器看起来像这样
if (isset($_POST["save"])) {
switch ($_POST["save"]) {
case "layoutstyle":
$return = $_POST["data"];
echo $return;
break;
case "surveys":
echo "This is the Surveys site";
break;
default:
echo "Return 404 page not found";
}
}
但我只是将第一个输入传递给控制器。它是一个字符串而不是数组。
我该怎么办?如何将表单中的所有输入作为数组输入到我的控制器中?
在 JQuery.ajax()
中您正在使用代码:
data: 'save='+ action+'&data='+ serializedData,
serializedData
是一个字符串,看起来像这样field1=val1&field2=val2
。这意味着,生成的数据字符串将如下所示:
save=layoutstyle&data=field1=val1&field2=val2
它似乎格式不正确。相反,请尝试使用此代码
data: 'save=' + action + '&' + serializedData
在您的 PHP 控制器中,您必须能够访问请求的参数:
$action = $_POST["save"];
$field1 = $_POST["field1"];
$field2 = $_POST["field2"];
我无法尝试您的代码,但我认为您需要在表单提交事件后为回调函数控件设置禁用模式
您需要在表单中设置此控件:
<input type="hidden" id="action" />
这是我在某些项目中使用的自定义 ajax 处理程序示例。
在您的表单标签中,使用处理程序设置 onsubmit 事件:
提交时="javascript:ajaxHandlerForm(this, 'your_action' );"
/**
* Custom ajax form handler.
* @param {object} obj Reference to form
* @param {String} action Name of Action
* @returns {Void}
*/
function ajaxHandlerForm(obj, action){
// Prevent submit
event.preventDefault();
// Set the action. #action is an input hidden in the form
$( "#action" ).val(action);
// Set jQuery Ajax post : http://api.jquery.com/jquery.post/
$.post($(obj).prop( "action" ), $(obj).serialize(),
function(data){
// Set disabled mode
$(obj).find("input, select, button, textarea")
.prop("disabled", true);
//
$( "#content" ).html(data);
});
}
我正在尝试 post 使用 jQuery 将表单中的一些数据发送到控制器中。 但是我在这里遇到了困难。
我有一个带有一些输入的表单和一个调用我的脚本的按钮。
按钮
<button onclick="save('layoutstyle');">save</button>
和脚本
function save(action) {
jQuery("#formTest").submit(function(e) {
e.preventDefault();
var $form = jQuery(this);
var $inputs = $form.find("input, select, button, textarea");
var serializedData = $form.serialize();
$inputs.prop("disabled", true);
jQuery.ajax({
type: 'POST',
// TO DO
url: '/template/templates/nwmadm/controller.php',
data: 'save='+ action+'&data='+ serializedData,
dataType: 'html',
success: function(data) {
jQuery('#content').html(data);
}
});
})
}
php 中的控制器看起来像这样
if (isset($_POST["save"])) {
switch ($_POST["save"]) {
case "layoutstyle":
$return = $_POST["data"];
echo $return;
break;
case "surveys":
echo "This is the Surveys site";
break;
default:
echo "Return 404 page not found";
}
}
但我只是将第一个输入传递给控制器。它是一个字符串而不是数组。
我该怎么办?如何将表单中的所有输入作为数组输入到我的控制器中?
在 JQuery.ajax()
中您正在使用代码:
data: 'save='+ action+'&data='+ serializedData,
serializedData
是一个字符串,看起来像这样field1=val1&field2=val2
。这意味着,生成的数据字符串将如下所示:
save=layoutstyle&data=field1=val1&field2=val2
它似乎格式不正确。相反,请尝试使用此代码
data: 'save=' + action + '&' + serializedData
在您的 PHP 控制器中,您必须能够访问请求的参数:
$action = $_POST["save"];
$field1 = $_POST["field1"];
$field2 = $_POST["field2"];
我无法尝试您的代码,但我认为您需要在表单提交事件后为回调函数控件设置禁用模式
您需要在表单中设置此控件:
<input type="hidden" id="action" />
这是我在某些项目中使用的自定义 ajax 处理程序示例。 在您的表单标签中,使用处理程序设置 onsubmit 事件:
提交时="javascript:ajaxHandlerForm(this, 'your_action' );"
/**
* Custom ajax form handler.
* @param {object} obj Reference to form
* @param {String} action Name of Action
* @returns {Void}
*/
function ajaxHandlerForm(obj, action){
// Prevent submit
event.preventDefault();
// Set the action. #action is an input hidden in the form
$( "#action" ).val(action);
// Set jQuery Ajax post : http://api.jquery.com/jquery.post/
$.post($(obj).prop( "action" ), $(obj).serialize(),
function(data){
// Set disabled mode
$(obj).find("input, select, button, textarea")
.prop("disabled", true);
//
$( "#content" ).html(data);
});
}