PHP/MySQL 动态创建准备查询
PHP/MySQL Dynamically create prepare query
我正在尝试传递已修改的输入字段 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))
});
一旦POSTed,我就有了一个类似于
的数组
Array
(
[myform] => Array
(
[update_fields] => [{"attr_name":"field1"},{"attr_name":"field2"}]
[field1] => field1val
[field2] => myfield2val
[id] => 5
.....other irrelevant/nonmodified fields.......
)
)
然后我 extract($_POST['myform'])
使每个字段名称成为它自己的变量。 (是的,我知道对 POST 数据使用 extract()
是不安全的,只是为了测试目的)
鉴于我想修改 field1 和 field2 的值,动态创建更新查询的最佳方法是什么。
这是我想要创建的内容:
$query = $db->prepare("UPDATE `table_name` SET `field1` = ?, `field2` = ? WHERE `id` = ?");
$query->bind_param('ssi', $field1, $field2, $id)
$query->execute();
此解决方案的问题是我不知道如何动态创建准备和 bind_param 查询。
编辑:我知道这是一个解决方案的集群****。这是我想出的几乎可行的方法。
运行 array_values 在 update_fields 上,然后构建查询动态访问从 array_values 获得的键以获取字段值。
运行 Foreach 字段并用递增的数字连接每个字段,然后连接这些
$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++;
}
如果您使用 PHP5.6 或更高版本,您可以使用 argument unpacking 来处理 bind_param,这是问题中最难的部分。尝试这样的事情:
$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();
我正在尝试传递已修改的输入字段 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))
});
一旦POSTed,我就有了一个类似于
的数组Array
(
[myform] => Array
(
[update_fields] => [{"attr_name":"field1"},{"attr_name":"field2"}]
[field1] => field1val
[field2] => myfield2val
[id] => 5
.....other irrelevant/nonmodified fields.......
)
)
然后我 extract($_POST['myform'])
使每个字段名称成为它自己的变量。 (是的,我知道对 POST 数据使用 extract()
是不安全的,只是为了测试目的)
鉴于我想修改 field1 和 field2 的值,动态创建更新查询的最佳方法是什么。
这是我想要创建的内容:
$query = $db->prepare("UPDATE `table_name` SET `field1` = ?, `field2` = ? WHERE `id` = ?");
$query->bind_param('ssi', $field1, $field2, $id)
$query->execute();
此解决方案的问题是我不知道如何动态创建准备和 bind_param 查询。
编辑:我知道这是一个解决方案的集群****。这是我想出的几乎可行的方法。
运行 array_values 在 update_fields 上,然后构建查询动态访问从 array_values 获得的键以获取字段值。
运行 Foreach 字段并用递增的数字连接每个字段,然后连接这些
$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++;
}
如果您使用 PHP5.6 或更高版本,您可以使用 argument unpacking 来处理 bind_param,这是问题中最难的部分。尝试这样的事情:
$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();