繁体   English   中英

无法从JavaScript槽AJAX向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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM