序列化表单 - 具有相同名称的输入

时间:2015-03-09 14:53:07

标签: javascript php jquery mysql

我有以下代码:

<form id="sendObj">
        <table class="no-border hover list">
          <tbody class="no-border-y">';
            while($pendingTransfers = mysql_fetch_assoc($getPending)){
                $id = $pendingTransfers['id'];
                echo '
            <tr class="items">
              <td style="width: 10%;"><span class="label label-primary">'.$counter++.'</span></td>
              <td class="text-left"><p>'.$pendingTransfers['NumarInventar'].'</p></td>
              <td class="text-left"><p><strong>'.$pendingTransfers['DenumireArticol'].'</strong></p></td>
                <input type="hidden" name="id" value="'.$pendingTransfers['id'].'" />
                <td class="text-center"><input type="hidden" name="depID" class="getDep" data-placeholder="Selecteaza destinatie" />  <i style="color:red" title="Sterge din lista" onclick="deleteLista('.$pendingTransfers['id'].');" class="text-right fa fa-times-circle fa-lg"></i></td>
            </tr>';}
                echo '
           </tbody>
        </table>
            </form>     
<div class="text-center"><button id="BtnSendObj" type="submit" class="btn btn-primary btn-success"><i class="fa fa-check color-inverse fa-lg"></i> Finish transfers</button></div>

上面的代码为每个记录和上表中的每一行带来了一个select id选项,用户可以从中选择一些值。当用户完成时,他将按下按钮&#34;完成转移&#34;并且所有输入都必须序列化。问题是我有多个具有相同名称的输入,我无法将它们全部分组,因为我稍后可以在PHP中使用它们。例如,我可以在每个输入的每一行上有5行。因此结果将 id = 1 DepId = 3456,id = 2 DepId = 5432 等等。

$('#BtnSendObj').on('click', function(event) {
    event.preventDefault();
    var data;
    var a = $('#sendObj').serializeArray();

    $.each(a, function () {
    var depID = $('input[name=depDestinatie]').serializeArray();
    var id = $('input[name=id]').serializeArray();

     data =[{"id":id, "depID":depID}];  
    }); 

    //The above will output something like :
    // [Object]0: Object
    //depId: Array[4]0: Object1: Object2: Object3: Object...
    // id: Array[4]0: Object1: Object2: Object3: Object

    // Like this i cannot handle them togerther in PHP.
    // I think it should look like an array of objects so like this i would   //be able to acces them easly , i think that both id's should be in same object //, but this is were i dont know how to proceed.
    $.ajax({
        url: 'subpages/data/transferObjects.php',
        data: {data: data},
        type: 'POST',
        success:function(data, textStatus, jqXHR){
            console.log('AJAX SUCCESS');
            console.log(data);
        }, 
        complete : function(data, textStatus, jqXHR){

        }
});
});

我在这里处理ajax帖子。

我想要实现的目的是将数据发送到php文件,我将使用表单中的值更新数据库。

php文件如下所示:

//some connection 
        if(isset($_POST['data']))
    {
    $updateObjects = mysql_query("UPDATE transactions SET IDDepartamentDestinatie = '$_POST['depID'] WHERE id = '{$_POST['id']}'");

    }

但是这样它只会更新表单中的最后一条记录,因为我不会遍历所有输入。

如果某人有某种想法我怎么能这样做,我已经尝试了所有关于serializeArray或序列化的例子,但对我没有用。

3 个答案:

答案 0 :(得分:4)

对于这样的情况,还有另一种可能性 - 将名称附加[]的输入命名为:

<input type="hidden" name="id[]" value="'.$pendingTransfers['id'].'" />
<input type="hidden" name="depID[]" class="getDep" data-placeholder="Selecteaza destinatie" />

然后在$_POST['id']$_POST['depId']中,您将自动拥有数组。所以没有额外的喧嚣,你只需将它作为数据放在你的ajax函数中:

data: $.param($('#sendObj').serializeArray())

在PHP中,您可以利用两个数组中的键对应的值对相同的事实:

if(isset($_POST['depID'])){
    foreach($_POST['depID']) as $k => $v){
        mysql_query("UPDATE transactions SET IDDepartamentDestinatie = '$v' WHERE id = '{$_POST['id'][$k]}'");
    }
}

另外请记住,$ _POST值应该使用mysql_real_escape_string进行清理,更好的是,使用PDO进行mysql处理。

答案 1 :(得分:0)

$(..).serializeArray()将返回类似

的内容
[
  {
    "name": "..",
    "value": "..",
  },{
    "name": "..",
    "value": "..",
  },{
    "name": "..",
    "value": "..",
  },...
]

但是你想把两个输入分组在一起。为此,您可以使用每个步骤后递增2的for循环。

    var data = [],
        serialized = $('#sendObj').serializeArray(),
        i;
    for (i=0; i<serialized.length; i+=2) {
        var tmpObj = {};
        tmpObj[ serialized[i].name ] = serialized[i].value;
        tmpObj[ serialized[i+1].name ] = serialized[i+1].value;
        data.push(tmpObj);
    }

这应该向您的PHP发送一个数组,您需要循环

if (isSet($_POST['data'])) {
    foreach ($_POST['data'] as $obj) {
        //use $obj['id'] and $obj['depID']
    }
}

虽然这应该有用,n-dru's answer提供了一种更清洁的方式来做你想做的事。

答案 2 :(得分:0)

$(..)。serializeArray()将返回类似

的内容
[
  {
    "name": "..",
    "value": "..",
  },{
    "name": "..",
    "value": "..",
  },{
    "name": "..",
    "value": "..",
  },...
]

因此在PHP端使用此功能,将其格式化为正常 $ _POST结构。

    $aPostRequest = serializedFormDatajQuery2Array(unserialize($_POST)); 

 function serializedFormDatajQuery2Array($serializedArr){
                      $aFormData = array();
                      foreach($serializedArr as $aRow){

                         if(isset($aFormData[$aRow['name']]) && !is_array($aFormData[$aRow['name']])){
                            $sValue = $aFormData[$aRow['name']];
                            $aFormData[$aRow['name']] = array();
                            $aFormData[$aRow['name']][] = $sValue;
                            $aFormData[$aRow['name']][] = $aRow['value'];
                            continue;
                         }

                                    if(is_array($aFormData[$aRow['name']])){
                                                $aFormData[$aRow['name']][] = $sValue;
                                                continue;
                                    }

                      $aFormData[$aRow['name']] = $aRow['value'];
                      }
                                 return $aFormData;
                }