我正在通过包含表单变量的帖子执行ajax请求。
ajax请求的数据类似于
data : {
somevar1: 'someval1',
somevar2: 'someval2',
somevar3: 'someval3',
somevar4: 'someval4',
form: FORMDATA
}
正如您所看到的,以及基本的表单数据,我也传递了一些其他数据。
这意味着我无法使用jquery .serialize()
我想最终得到一些我可以发送的东西,所以另一方面我可以做到
$_POST['form']['fieldname']
是否有内置功能可以做到这一点?
或者我需要做些什么来创建一个?
在表单上运行函数的可能性
function postArray(form){
var data = {};
var name, value = null;
$(form).children('textarea, input, select'){
name = this.name;
data.name = $(this).val();
}
return data;
}
表格可以正常工作。
并且
data : {
somevar1: 'someval1',
somevar2: 'someval2',
somevar3: 'someval3',
somevar4: 'someval4',
form: postArray(form)
}
会起作用吗?
<小时/> 我可以使用
.serializeArray();
但另一方面我得到
Array
(
[0] => Array
(
[name] => name1
[value] => val1
),
[1] => Array
(
[name] => name2
[value] => val2
)
...
[8] => Array
(
[name] => name8
[value] => val8
)
)
哪个很接近,但这要求我要么 a:遍历数组并将其转换为我想要的内容 b:每次我使用它循环它以找到正确的密钥
答案 0 :(得分:2)
您可以使用serializeArray
和JSON.stringify
将表单数据编码为JSON。
serializeArray
为您提供了如下数组:
[
{
name: a
value: 1
},
{
name: b
value: 2
}
]
因此您不能够使用$data['fieldname']
访问服务器端的数据。要将数组转换为对象(以便您可以按照自己的意愿访问数据),请查看Convert form data to JavaScript object with jQuery。
当然你也可以使用你自己的函数(如果你修复了错误‡,它似乎做了类似的事情),但你仍然需要使用JSON.stringify
:
data : {
somevar1: 'someval1',
somevar2: 'someval2',
somevar3: 'someval3',
somevar4: 'someval4',
form: JSON.stringify(postArray(form))
}
在PHP脚本中,您可以使用json_decode
获取表单数据:
$form_data = json_decode($_POST['form']);
‡这是一个固定版本(从您的评论更新,不要使用for...in
循环数组):
function postArray(form){
var data = {};
form = $(form).serializeArray();
for(var i = form.length; i--; ) {
data[form[i].name] = form[i].value;
}
return data;
}
如果要为名称中包含[]
的元素修复它,则必须手动处理这些元素并将它们放在数组中:
for(var i = form.length; i--; )
var name = form[i].name;
var value = form[i].value;
var index = name.indexOf(`[]`);
if( index > -1) {
name = name.substring(0,index);
if(!(name in data) {
data[name] = [];
}
data[name].push(value);
}
else {
data[name] = value;
}
}
但这假设您没有field
和 field[]
等字段名称。
答案 1 :(得分:0)
Try This:
<?php
/*
* As a Class File your-class-file.php
* Decode jQuery Serialize Post String For PHP
*/
class PHP_Serialize {
function Decode_Serialize($QUERY_STRING) {
/*
* Decode form.serelize() jQuery Post String
* Return like $_POST['Form_Input_Name or ID']
*/
$a = explode('&', $QUERY_STRING);
$i = 0;
$store = array();
while ($i < count($a)) {
$b = explode('=', $a[$i]);
$array_name = htmlspecialchars(urldecode($b[0]));
$array_value = htmlspecialchars(urldecode($b[1]));
$store[$array_name] = $array_value;
$i++;
}
/*
* Convert Array as an Object
* return(object)$store;
* Use ........Object->Form_Input_Name or ID
* or
* Use as An Array .........$var["Form_Input_Name or ID"]
*/
return $store;
}
}
?>
<?php
/*
* How to USE:
* In Your PHP File (your-file.php)
* Include Class File like include('your-class-file.php');
* $Decode = new PHP_Serialize();
* Use Function Like This $_POST = $Decode->Decode_Serialize($_POST['Query_String']);
*/
/*
* Demo HERE
* you-file.php
*/
include('your-class-file.php');
$Decode = new PHP_Serialize();
$_POST = $Decode->Decode_Serialize($_POST['Query_String']);
/* Decode jQuery Serlize String AS a PHP Function if you not making Class file */
$_POST = Decode_Serialize($_POST['Query_String']);
/* Use POST String in your mySQL Statement Like This*/
mysql_query("SELECT * FROM Table WHERE COMPANY_NAME = '".$_POST['COMPANY_NAME']."'");
/*
* Here is Your form PHP File
*/
?>
<form action="" method="post" id="your-form-id" name="your-form-id">
<label for="COMPANY_NAME">Company Name:</label>
<input type="text" name="COMPANY_NAME" id="COMPANY_NAME"/>
<label for="COMPANY_EMAIL">Company Email:</label>
<input type="text" name="COMPANY_EMAIL" id="COMPANY_EMAIL"/>
<input type="button" name="submit" id="submit" value="submit"/>
</form>
<script>
$(document).ready(function() {
$('#submit').click(function(){
var Post_String = $('#your-form-id').serialize();
$.ajax({
type : 'POST',
url : 'your-file.php',
data : {Query_String:Post_String},
success : function(return_value){/* On Success you jQuery Code Here*/}
});
});
});
</script>