繁体   English   中英

无法将关联数组从javascript传递到php,并通过准备好的语句将其插入到mysql数据库中

[英]Trouble passing associative array from javascript to php and insert it into mysql database through prepared statements

http://jsfiddle.net/kqd7m5nb/

只需单击插入数据按钮,就会注意到一个警告框。 这是一个关联数组。 这些是我想传递到我的php文件中的值。

在php文件中,我得到一个Post值,其中包含我从Ajax数据传递来的所有数据。 我使用json_decode对其进行了解码。 现在将数据提取为stdClass类型的php数组。 现在,我正在使用准备好的语句通过for循环语句插入所有php数组。

使用Xdebug,箭头停止在php文件的for循环内。 之后,什么都不会插入到我的数据库中。 我还注意到在xdebug上的php上评估'count($ value)'时,它返回1而不是3。在XDEBUG中评估$ value [0]-> fname也会返回错误。

sample.js

$('#ajax').click(function() {
        var values = $('#mytable tbody tr').map(function() {
            return {
                fname : $('td:eq(0)',this).text(),
                lname : $('td:eq(1)',this).text(),
                point : parseInt($('td:eq(2)',this).text())
            }
        }); 
        var valuesDebug = "";
        for (var i = 0; i < values.length; i++)
        {
            valuesDebug += " " + values[i]["fname"] + " " + values[i]["lname"] + " " + values[i]["point"] + "\n";
        }
        alert(valuesDebug);
        var valueStringed = JSON.stringify(values);
        $.ajax({
            "type":"POST",
            "url":"insertData.php",
            "data":{value : valueStringed},
            "success":function(data){
                alert('Done inserting the current table values');
            }
        });
    });

insertData.php

<?php

    if (isset($_POST['value']))
    {
        $value = json_decode(stripslashes($_POST['value']));
    }
    $mysqli = new mysqli("localhost","root","password","test");
    if($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") "     . $mysqli->connect_error;  
    }

    $stmt = $mysqli->prepare("INSERT INTO team VALUES (NULL,?, ?, ?)"); //NULL is auto increment primary key id
    $stmt->bind_param('ssi', $fname, $lname, $point);

    if (count($value) > 0)
    {
        for( $i = 0 ;$i < count($value);$i++){
            $fname = $value[$i]->fname;
            $lname = $value[$i]->lname;
            $point = $value[$i]->point;
            $stmt->execute();
        }
    }
    $stmt->close();
    $mysqli->close();
?> 

一目了然,您需要执行以下操作:

$stmt->bind_param('ssi', $fname, $lname, $point);

for循环中定义循环中的变量,如果您按上面的方法进行操作-变量未定义。

因此,请尝试:

$stmt = $mysqli->prepare("INSERT INTO team VALUES (NULL,?, ?, ?)");

if (count($value) > 0)
{
    for( $i = 0 ;$i < count($value);$i++){

        $fname = $value[$i]->fname;
        $lname = $value[$i]->lname;
        $point = $value[$i]->point;

        $stmt->bind_param('ssi', $fname, $lname, $point);
        $stmt->execute();

    }
}

该代码现在有效。

请参阅我的原始JavaScript代码。 似乎在这一部分上,我添加了一个数组valuesDebug,并通过push方法从values数组中复制了内容。 我不知道为什么会这样。 有什么办法可以缩短时间?

顺便说一句,第一行是表中的行单元格内容,这些内容将转换为values数组。

    var values = $('#mytable tbody tr').map(function() {
        return {
            fname : $('td:eq(0)',this).text(),
            lname : $('td:eq(1)',this).text(),
            point : parseInt($('td:eq(2)',this).text())
        }
    });         
   var valuesDebug = [];
    for (var i = 0; i < values.length; i++)
    {
        valuesDebug.push({fname: values[i]["fname"],lname: values[i]["lname"],point: values[i]["point"]});
    }

    var valueStringed = JSON.stringify(valuesDebug);
    // passes valueStringed into ajax ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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