【问题标题】:Serialize form - input's with same name序列化表单 - 输入具有相同的名称
【发布时间】:2015-03-09 14:53:06
【问题描述】:

我有以下代码:

<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>

上面的代码为每条记录带来了插入的 DB id,并且在上表中的每一行上都有一个选择选项,用户可以从中选择一些值。当用户完成时,他将按下“完成传输”按钮,所有输入都必须序列化。问题是我有多个具有相同名称的输入,我无法将它们全部分组,因为我可以稍后在 PHP 中使用它们。例如,我可以在每个输入的每一行 1 上有 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 文件,在该文件中我将使用表单中的值更新 DB。

php 文件如下所示:

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

    }

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

如果有人知道我该怎么做,我已经尝试了所有关于 serializeArray 或 serialize 的示例,但对我没有用。

【问题讨论】:

    标签: javascript php jquery mysql


    【解决方案1】:

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

    <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。

    【讨论】:

    • 这似乎没问题,但我不知道如何将 id 与 depID 相关联,我的查询将类似于 SET DepartmentId = '$depId' where id = '$id'
    • 成功了。非常感谢。你是对的,我应该切换到 PDO。我会搜索一些文档。关于 PDO。
    • 请使用准备好的语句。 php.net/manual/en/pdo.prepared-statements.php
    【解决方案2】:

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

    [
      {
        "name": "..",
        "value": "..",
      },{
        "name": "..",
        "value": "..",
      },{
        "name": "..",
        "value": "..",
      },...
    ]
    

    但您想将两个输入组合在一起。为此,您可以使用 for 循环,在每一步之后将其递增 2。

        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 提供了一种更简洁的方式来做您想做的事情。

    【讨论】:

    • 我试过这样,但 depId 和 id 在所有对象中只有一个值,最后一个值。它为每个输入生成 1 个对象,因此对于 4 行,我有 8 个对象而不是 4 个。
    • @AndreiKap 我有点误读了你的代码。现在它应该可以工作了,但正如我编辑的那样,n-dru 的答案可能是要走的路。
    • 也非常感谢您的回答。我将尝试为您保存代码以供将来开发。
    【解决方案3】:

    $(..).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;
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-30
      • 2014-11-28
      • 2021-12-19
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多