![](/img/trans.png)
[英]Send Javascript array to PHP using Ajax (can't echo out the array from PHP)
[英]Can't send a Multidimensional Array from JavaScript trough AJAX to PHP
关于完全相同的事情,我看到了很多问题。 但是我尝试了很多事情,所以我真的不确定我正在做的事情是否还能正常工作。
因此,我有一个多维度数组,该数组是通过循环通过html表创建的。我想将其发送到PHP,这样就可以循环它,并创建需要将其存储在数据库中的对象。
但是,当我尝试遍历每条通过a的PHP时,我从PHP中得到的只是“警告:为foreach()提供的无效参数”
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;
}
}
var headers =
{
'Content-type': 'application/x-www-form-urlencoded',
'X-Requested-With': 'XMLHttpRequest'
};
var FamilyArray = 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=' + FamilyArray );
}
function cbReturnFamilyMembers($resp,$response)
{
alert($resp + $response);
}
}
和PHP方面...
$Family = json_decode( $_POST['Family'],true);
foreach($Family as $Array) ---> This line launches the error.
{
foreach($Array as $Value)
{
///object creation
}
}
先感谢您。 我认为Im确实停留在这里,因为Im是PHP,JS和AJAX的新手,所以一切似乎都是神奇的。 (不能真的说我做事是否正确。)我希望我足够清楚,或者请告诉我是否可以澄清任何事情。
-------------------------------------- **** -------- ------------------------------
编辑:很抱歉您的答复很晚,谢谢您的回答。 我将更新代码,因此您可以看到我到目前为止所做的事情。 (基本上,我将Ajax Part更改为像你们所说的POST动作)。 我想我没有很好地解释整个事情,该数组必须通过提交表格的形式发送,此函数在“ onSubmit”上被调用(对不起缺少解释)。 我开始意识到我在$ _POST数组中没有名为“ Family”的成员,因为我得到了“找不到索引”的错误,因此,我隐藏了表单中的输入并以这种方式调用它NAME属性。 尽管如此,我仍然在php端收到一个非数组式的值,(实际上,当我回显它时,它会显示一(1))。 我开始考虑传递数组的其他方式,但这就是为什么我首先使用JS和ajax的原因。 我怀疑“ xhttp.send('Family ='+ Array);” 部分...它是否真的在$ _POST数组的索引['Family']上发布了数组?我想知道。 也许作为值传递的数组被表单的输入覆盖(实际上,提交时没有任何值)
*************************编辑,再次********************** *******************
更改了代码,并使其完美工作。(将Cast添加到Array对象)
$Family = (Array)json_decode( $_POST['Family']);
我不是本地JavaScript专家(在AJAX等方面,我更喜欢jQuery之类的东西),但是从您在代码中读取的内容来看,您没有在PHP端收到预期的POST数据。 看着你的ajax电话,我看到了一些奇怪的东西:
xhttp.open("POST", "Worker.php&Family= " +
encodeURIComponent(JSON.stringify(Family)), true);
xhttp.send();
我看到您正在使用&
而不是?
在GET请求中。
如果我看一下w3schools上的示例代码,它会告诉我一些不同的东西:
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>
我试图查看丢失的低谷内容,并在$ _POST上添加了一些强制转换(以防万一,您知道)是一个实际的数组,然后猜测是什么。 它像魅力一样运作。 这些是我真正讨厌php的东西,但是我设法做到了。
因此,PHP方面的代码如下所示:
$Family = (Array)json_decode( $_POST['Family']);
而且,它不再抱怨为每个参数传递不正确的参数。实际上,它似乎也将Array的内部对象也转换为父Array的内部,因为嵌套在其内部的每个对象均按预期工作。
好吧,我更为我为此花掉的时间感到羞耻,但是我感谢大家的帮助,对此我深表感谢,而实际上,正是您的回答使我不寒而栗。获取通过$ _POST发送的数据)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.