Can';t通过AJAX将多维数组从JavaScript发送到PHP
我看到了很多关于同一件事的问题。但我尝试了很多东西,我真的不确定我所做的是否还能用 所以,我有一个多维数组,我通过一个html表循环创建它,我想把它发送到PHP,这样我就可以循环它,并创建我需要的对象来将它存储在数据库中 但当我尝试通过for each循环PHP时,我从PHP得到的只是“警告:为foreach()提供的参数无效” 先谢谢你。我想我在这里真的被绊倒了,因为我不熟悉PHP、JS和AJAX,一切似乎都奇迹般地发生了。(我真的说不出我的做法是否正确。) 我希望我说得够清楚,如果我能澄清什么,请告诉我 --------------------------------------****-------------------------------------- 编辑:我很抱歉迟了回复,谢谢你的回答。我将更新代码,这样你就可以看到我到目前为止做了什么。(基本上我改变了Ajax部分,就像你们说的那样成为后期动作)。 我想我没有很好地解释整个事情,这个数组必须通过提交表单发送,这个函数是在“onSubmit”上调用的(很抱歉没有解释)。我意识到我在php的$u POST数组中没有一个名为“Family”的成员,因为我得到了一个错误“Index not found”,所以我在表单中隐藏了一个输入,并在NAME属性中以这种方式调用它。 尽管如此,我还是在php端不断地接收到一个类似于数组的值(实际上,当我回显它时,它会打印一(1))。 我开始考虑传递数组的另一种方式,但这就是我首先使用JS和ajax的原因。 我怀疑这一点 “xhttp.send('Family='+Array);”部分。。。我想知道,它是否真的将数组发布在$\u POST数组的索引['Family']上。 可能作为值传递的数组被表单的输入覆盖(实际上,表单提交时没有值) *************************再次编辑***************************************** 更改了代码,工作正常。(将强制转换添加到数组对象)Can';t通过AJAX将多维数组从JavaScript发送到PHP,javascript,php,arrays,ajax,Javascript,Php,Arrays,Ajax,我看到了很多关于同一件事的问题。但我尝试了很多东西,我真的不确定我所做的是否还能用 所以,我有一个多维数组,我通过一个html表循环创建它,我想把它发送到PHP,这样我就可以循环它,并创建我需要的对象来将它存储在数据库中 但当我尝试通过for each循环PHP时,我从PHP得到的只是“警告:为foreach()提供的参数无效” 先谢谢你。我想我在这里真的被绊倒了,因为我不熟悉PHP、JS和AJAX,一切似乎都奇迹般地发生了。(我真的说不出我的做法是否正确。) 我希望我说得够清楚,如果我能澄清什
我不是一个本地JavaScript专家(在AJAX方面我更喜欢jQuery之类的东西),但从我在您的代码中所读到的内容来看,您不会在PHP端收到预期的POST数据。看着你的ajax调用,我看到了一些奇怪的东西:
xhttp.open("POST", "Worker.php&Family= " +
encodeURIComponent(JSON.stringify(Family)), true);
xhttp.send();
我看到您在GET请求中使用的是&
而不是?
。如果我看这张照片,它会告诉我一些不同的东西:
xhttp.open("POST", "ajax_test.asp", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fname=Henry&lname=Ford");
尝试更改JavaScript代码以通过POST而不是GET发送数据。昨晚我在发布初始注释时没有注意到您原始函数中的一些小错误,尽管其他人已经了解了它们并在上面传递了注释-该函数应该是通过
POST
发送的,但是send()
方法中没有发送参数,只是像处理GET
请求那样附加到url。另外,尽管我认为这不是很关键,但您没有为请求设置任何头,也没有回调函数
下面更改的代码确实按预期通过POST
<script type='text/javascript'>
/* callback function to handle response data */
function cbReturnFamilyMembers( response ){
alert( response )
}
function ReturnFamilyMembers() {
var Family = [];
var Table= document.getElementById('FamilyTable');
var RowQuantity= Table.rows.length;
for ( var i = 0; i < RowQuantity; i++ ){
var Columns= Table.rows.item(i).cells;
var ColumnQuantity= Columns.length;
Family[i] = [];
for( var j = 0; j < ColumnQuantity; j++ ) Family[i][j] = Columns.item(j).innerHTML;
}
/* XHR headers to be set */
var headers={
'Content-type': 'application/x-www-form-urlencoded',
'X-Requested-With': 'XMLHttpRequest'
};
var payload=encodeURIComponent( JSON.stringify( Family ) );
/*console.info( payload );*/
var xhttp=window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
/* Add a callback function to process any response from target url ( Worker.php )*/
xhttp.onreadystatechange=function(){
if( xhttp.readyState==4 && xhttp.status==200 ){
cbReturnFamilyMembers.call( this, xhttp.response );
}
};
xhttp.open( 'POST', 'Worker.php', true );
for( header in headers ) xhttp.setRequestHeader( header, headers[ header ] );
xhttp.send( 'Family='+payload );
}
</script>
/*处理响应数据的回调函数*/
函数cbReturnFamilyMembers(响应){
警报(响应)
}
函数ReturnFamilyMembers(){
var家族=[];
var Table=document.getElementById('FamilyTable');
var RowQuantity=Table.rows.length;
对于(变量i=0;i
我试图看到我错过的东西,并在$\u POST上添加了一些铸造(以防万一,你知道)以成为一个实际的数组,猜猜看。它就像一个符咒。这些都是我非常讨厌php的地方,但我能做到
PHP端的代码如下所示
$Family = (Array)json_decode( $_POST['Family']);
它不再抱怨为每个数组传递了一个不正确的参数,实际上它似乎也将数组的内部铸造到父数组中,因为每个内部的嵌套都按预期工作
嗯,我对我在这件事上浪费的时间感到有点惭愧,但我感谢你们的帮助,我非常感激,事实上是你们的回答让我开始工作,(并通过$u POST发送数据).在循环之前,如果要打印$Family的内容,您会得到什么?即:
print\r($Family)
如果将true
添加到json_decode
中,它将生成一个数组作为输出,而不是stdClass
object@RamRaider我尝试打印变量$Family,但它似乎根本没有显示任何内容。我在jason decode中添加了true作为参数,但是$Family似乎也没有任何价值。你正在寻找你的da
xhttp.open("POST", "ajax_test.asp", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fname=Henry&lname=Ford");
<script type='text/javascript'>
/* callback function to handle response data */
function cbReturnFamilyMembers( response ){
alert( response )
}
function ReturnFamilyMembers() {
var Family = [];
var Table= document.getElementById('FamilyTable');
var RowQuantity= Table.rows.length;
for ( var i = 0; i < RowQuantity; i++ ){
var Columns= Table.rows.item(i).cells;
var ColumnQuantity= Columns.length;
Family[i] = [];
for( var j = 0; j < ColumnQuantity; j++ ) Family[i][j] = Columns.item(j).innerHTML;
}
/* XHR headers to be set */
var headers={
'Content-type': 'application/x-www-form-urlencoded',
'X-Requested-With': 'XMLHttpRequest'
};
var payload=encodeURIComponent( JSON.stringify( Family ) );
/*console.info( payload );*/
var xhttp=window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
/* Add a callback function to process any response from target url ( Worker.php )*/
xhttp.onreadystatechange=function(){
if( xhttp.readyState==4 && xhttp.status==200 ){
cbReturnFamilyMembers.call( this, xhttp.response );
}
};
xhttp.open( 'POST', 'Worker.php', true );
for( header in headers ) xhttp.setRequestHeader( header, headers[ header ] );
xhttp.send( 'Family='+payload );
}
</script>
$Family = (Array)json_decode( $_POST['Family']);