2

我有几个称为工人的元素,它们都有一个 id、左侧位置和顶部位置。我已经把它变成了一个数组,然后把它变成了一个 json 对象,它想发送到我的数据库。但是当我在控制器和模型中测试它时,它说该值为空。该怎么办?

第一个功能:

function GetUnitInfo(){

          for(i=0 ; i < $('.Worker').length ; i++){
          $('.Worker').each(function(){

                aUnitsInfo = [{'unitid':$(this).attr("id"),
                              'unitposleft':$(this).position().left,
                              'unitpostop':$(this).position().top
                            }];

                 jUnitsInfo.push(aUnitsInfo[i]);
                 aUnitsInfo = JSON.stringify(jUnitsInfo);    

               console.log(i);

          });
          console.log("unitinfo: "+jUnitsInfo[i].unitid);
         console.log("uniposleft: "+jUnitsInfo[i].unitposleft);
         console.log("unitpostop: "+jUnitsInfo[i].unitpostop);
         console.dir(jUnitsInfo[i]);
        }

          }

在我的日志中,我看到 3 个具有正确值的对象。

然后我想将它发送到数据库:

setInterval(function(){    
                SaveUnits();
                function SaveUnits()
                {   

                   GetUnitInfo();


                    $sLoginEmail = $('#TxtLoginEmail').val();
                    // TODO: Check that the email is valid
                    // console.log("The email is:"+$sLoginEmail); 
                    $.ajax({
                        type: 'post',
                        url: 'bridge.php',
                        data: {"sFunction":"SaveUnits", "unitsInfo":jUnitsInfo[i]},
                        success: function(data){
                            console.log(data);
                            $oXml = $(data);

                        }
                    });
                }
        },5000);

这就是它变得棘手的地方。我从第一个函数中知道我的 jUnitsInfo[i] 包含正确的对象,但在这部分之后它似乎为空。

这是我的桥梁:

     if($_POST['sFunction'] == "SaveUnits")
{
    require_once 'Controllers/UserController.php';
    $oUnitsInfo = new USerController();
    echo $oUnitsInfo->SaveUnits($_POST['unitsInfo']); 
}

控制器:

    public function SaveUnits($unitsInfo)
{require_once 'Models/UserModel.php';
    $oUserModel = new UserModel();
    $unitsInfo = json_decode($unitsInfo);
    $saveUnits = $oUserModel->SaveUnits($unitsInfo);}

和模型:

    public function SaveUnits($unitsInfo){        
    // Create connection
    $con = mysqli_connect("localhost","root","","awesomegame");
    // Check connection
     if (mysqli_connect_errno($con))
    {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }


    $unitsInfo = array(); 
    foreach( $unitsInfo as $row ) {
    $sql[] = '("'.mysql_real_escape_string($row['unitId']).'", '.$row['unitPosTop'].','.$row['unitPosLeft'].')';
    }
    mysql_query('INSERT INTO units (unitid, unitpostop, unitposleft) VALUES '.implode(',', $sql));}}

当我将它转储到控制器中时 var_dump(json_decode($unitsInfo)); 它只是返回一个空值。

我如何正确发送数组?- 并在不同的行(每个工人一个)上获取写入数据库的值。

4

1 回答 1

0

这好像是

 jUnitsInfo[i]

是合理的,因为您不在 for 循环中。

拿代码

function GetUnitInfoAndSave(){
        var jUnitsInfo=[];
      $('.Worker').each(function(){

            var aUnitsInfo ={'unitid':$(this).attr("id"),
                          'unitposleft':$(this).position().left,
                          'unitpostop':$(this).position().top
                        };

             jUnitsInfo.push(aUnitsInfo); 
      });

      for(var i=0 ; i < jUnitsInfo.length ; i++){

       var $sLoginEmail = $('#TxtLoginEmail').val();
                // TODO: Check that the email is valid
                // console.log("The email is:"+$sLoginEmail); 
        var data=$.extend({},{sFunction:"SaveUnits"},jUnitsInfo[i]);
                $.ajax({
                    type: 'post',
                    url: 'bridge.php',
                    data: data,
                    success: function(data){
                        console.log(data);
                        $oXml = $(data);

                    }
                });

      //console.log("unitinfo: "+jUnitsInfo[i].unitid);
     //console.log("uniposleft: "+jUnitsInfo[i].unitposleft);
     //console.log("unitpostop: "+jUnitsInfo[i].unitpostop);
     //console.dir(jUnitsInfo[i]);
    }
}
setInterval(GetUnitInfoAndSave,5000);

PS:$.Ajax 和 setInterval 函数是异步的,所以你不知道数据何时真正发送到服务器。(此代码一个接一个地发送数组项)

于 2013-11-13T01:10:05.513 回答