php/mysql动态创建prepare查询

dkqlctbz  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(368)

我试图传递一个已经修改的输入字段id列表,这样我就可以在mysql中只为修改后的数据创建一个更新查询。
这是我目前掌握的情况。。
在jquery中,我有下面的代码,它生成了一个json列表,列出了所有已更改输入数据的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();

这个解决方案的问题是我不知道如何动态地创建prepare和bind参数查询。
编辑:我知道这是一个集群的解决方案。这是我能想出的几乎奏效的办法。

b5buobof

b5buobof1#

如果您使用的是php5.6或更高版本,那么可以使用参数解包来处理bind_参数,这是问题中最困难的部分。尝试以下操作:

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

klsxnrf12#

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

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

将其转换为查询字符串。然后再次通过调用bind param循环字段

$i=1;$par='';
Foreach($fields as $k=>$v)
{
$stn->bindParam (":param$i", $fields[v]) ;
$i++;
}
ttvkxqim

ttvkxqim3#

对update\u字段运行array\u values,然后构建查询动态访问从array\u values获取的键以获取字段值。

相关问题