【问题标题】:Updating multiple rows in mysql database with serialized form data使用序列化的表单数据更新 mysql 数据库中的多行
【发布时间】:2016-03-24 14:08:20
【问题描述】:

我正在尝试使用来自通过 AJAX 的 html 表单数据的数据来更新我的数据库中的多行。我更新数据库没有任何问题,但我使用了几个查询来更新每一行。使用 AJAX 更新来自大型表单的多行的正确方法是什么?一个 foreach 循环?

if ( isset($_POST['updateData']) ) {
    parse_str($_POST['fields']);

    $update1 = $db->execute("UPDATE content SET content_text=? WHERE page_id = '".$page_id."' AND lang_code = '".$lang_code."' AND content_id =1", array($field1));
    $update2 = $db->execute("UPDATE content SET title=?, content_text=? WHERE page_id = '".$page_id."' AND lang_code = '".$lang_code."' AND content_id =2", array($field2_title, $field2));
    $update3 = $db->execute("UPDATE content SET title=? WHERE page_id = '".$page_id."' AND lang_code = '".$lang_code."' AND content_id =3", array($field3_title));

}

我的数据库

ID | content_id | page_id | lang_code | title      | content_text |
---------------------------------------------------------------------
1  | 1          | 2       | en        |            | text1        |
2  | 2          | 2       | en        | title2     | text2        |
3  | 3          | 2       | en        | title3     |              |

我的表格是这样的:

<input name="field1">
<input name="field2_title">
<input name="field2">
<input name="field3_title">

我的脚本:

var form_data = $(this).serialize();
$.ajax({
    type : 'POST',
    url  : '#',
    data : {
        updateData : 1,
        fields : form_data
    }
});

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    好吧,那就换

    <input name="field1">
    <input name="field2_title">
    <input name="field2">
    

    使用这个

    <input name="field[1][content]">
    <input name="field[2][title]">
    <input name="field[2][content]">
    

    所以你可以在php中使用foreach

    foreach($_POST['field'] AS $id => $elem){
        $content = (isset($elem['content'])) ? $elem['content'] : '';
        $title = (isset($elem['title'])) ? $elem['title'] : '';
    
        $update = $db->execute("UPDATE content SET title=?, content_text=? WHERE page_id = '".$page_id."' AND lang_code = '".$lang_code."' AND content_id =?", array($title, $content, $id));
    }
    

    我认为这是最简单的方法。

    【讨论】:

    • 我想这就是我需要的!我会标记您的答案,但您的更新查询有问题。 array($title, $content, $id) 必须是 array($title, $content) 并且你应该添加: content_id = '".$id."到查询。谢谢!
    • 因为 HTML 可以被客户端编辑,并且 id 是字段的键,所以至少转义字符串更安全。
    【解决方案2】:

    正确的方法是使用数组类型输入名称:

    <input name="contents[1][title]">
    <input name="contents[1][content_text]">
    <input name="contents[2][title]">
    <input name="contents[2][content_text]">
    

    然后你可以foreach这个数组:

    foreach($_POST['contents'] as $key => $content){
      $sets = array();
      $exec = array();
      if(!empty($content['title'])){
        $sets[] = "title = ?";
        $exec[] = $content['title'];
      }
      if(!empty($content['content_text'])){
        $sets[] = "content_text = ?";
        $exec[] = $content['content_text'];
      }
      if(!empty($sets)){
        $exec[] = $key;
        $set = implode(',', $sets);
        $smt = $db->prepare("UPDATE content SET $set WHERE page_id = ?");
        $smt->execute($exec);
      }
    }
    

    【讨论】:

    • 谢谢!如果我的表单中不存在 怎么办?如果我不将它添加到表单中,它会给我未定义的错误。我的意思是有些行不需要标题或有些不需要 content_text
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多