代码之家  ›  专栏  ›  技术社区  ›  Bijan

php/mysql动态创建准备查询

  •  1
  • Bijan  · 技术社区  · 6 年前

    我试图传递一个已经修改的输入字段ID列表,这样我就可以在MySQL中只为修改过的数据创建一个更新查询。

    这是我到目前为止所拥有的……

    在jquery中,我有下面的代码,它列出了所有已更改输入数据的ID。数据将添加到隐藏的输入字段中。

    updatedFields = [];
    $('form :input').change(function(){
        attr_name = $(this).attr('id');
        updatedFields.push({attr_name})
        $("#update_fields").val(JSON.stringify(updatedFields))
    });
    

    发布后,我有一个类似于

    Array
    (
        [myform] => Array
            (
                [update_fields] => [{"attr_name":"field1"},{"attr_name":"field2"}]
                [field1] => field1val
                [field2] => myfield2val
                [id] => 5
                .....other irrelevant/nonmodified fields.......
            )
    )
    

    然后我做 extract($_POST['myform']) 使每个字段名成为自己的变量。(是的,我知道用 extract() 因为post数据不安全,只是为了测试而这样做)

    如果要修改field1和field2的值,动态创建更新查询的最佳方法是什么?

    以下是我想要创建的内容:

    $query = $db->prepare("UPDATE `table_name` SET `field1` = ?, `field2` = ? WHERE `id` = ?");
    $query->bind_param('ssi', $field1, $field2, $id)
    $query->execute();
    

    这个解决方案的问题是,我不知道如何动态创建准备和绑定_-param查询。

    编辑:我知道这是一个解决方案的集群。这是我能想到的几乎奏效的方法。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Bijan    6 年前

    如果您使用的是php5.6或更高版本,则可以使用 argument unpacking 处理绑定参数,这是问题最困难的部分。尝试如下操作:

    $update_fields = json_decode($_POST['myform']['update_fields'], true);
    $sql_fields = array();
    $bindtypes = "";
    $bindings = array();
    foreach (array_column($update_fields, 'attr_name') as $field) {
        $sql_fields[] .= "`$field` = ?";
        $bindtypes .= "s";
        $bindings[] = $_POST['myform'][$field];
    }
    $sql = "UPDATE `table_name` SET " . implode(',', $sql_fields) . " WHERE `id` = ?";
    $bindtypes .= "i";
    array_unshift($bindings, $bindtypes);
    $bindings[] = $_POST['myform']['id'];
    $query = $db->prepare($sql);
    $query->bind_param(...$bindings);
    $query->execute();
    
        2
  •  0
  •   whitelined    6 年前

    在字段上运行foreach,并用递增的数字对每个字段进行concat,然后concat这些字段

    $i=1;$par='';
    Foreach($fields as $k=>$v)
    {
    $par.="$k=:param$i";
        $i++;
    }
    

    将此连接到查询字符串中。然后再次循环调用bind参数

    $i=1;$par='';
    Foreach($fields as $k=>$v)
    {
    $stn->bindParam (":param$i", $fields[v]) ;
    $i++;
    }
    
        3
  •  -1
  •   oalexandru    6 年前

    在更新_字段上运行array_values,然后构建查询dynamical,访问从array_values获得的键以获取字段值。