PHP/MySQL 动态创建准备查询

标签 php jquery mysql prepared-statement bindparam

我正在尝试传递已修改的输入字段 ID 列表,以便我可以在 MySQL 中仅为修改后的数据创建更新查询。

这是我目前所拥有的..

在 jQuery 中,我有以下代码生成所有已更改输入数据的 ID 的 JSON 列表。数据被添加到一个隐藏的输入字段。

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']) 使每个字段名称成为它自己的变量。 (是的,我知道对 POST 数据使用 extract() 是不安全的,只是为了测试目的)

鉴于我想修改 field1 和 field2 的值,动态创建 UPDATE 查询的最佳方法是什么。

这是我想要创建的:

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

此解决方案的问题是我不知道如何动态创建 prepare 和 bind_param 查询。

编辑:我知道这是一个解决方案的集群****。这是我能想出的几乎可行的方法。

最佳答案

如果您使用的是 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();

关于PHP/MySQL 动态创建准备查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51528380/

相关文章:

php - 将数据保存到Mysql后在PHP中使用AJAX显示DIV

javascript - CSS居中图像

php - 自动按计划打印 pdf

php - MySQL变量的正确使用

PHP memcached 对包含特殊字符的值发出警告 'could not compress value'

php - 使用php连接mongodb的字段

php - 当我尝试在 phpMyAdmin 中执行 load.sql 时,它给了我一个错误

javascript - 在 phonegap 应用程序中检测慢速互联网连接

mysql - sql sum 和 group 通过给多行

c++ - MySQL 连接器 c++ 1.1.3 不包含 libmysql.lib