【问题标题】:PHP/MySQL Dynamically create prepare queryPHP/MySQL 动态创建准备查询
【发布时间】:2019-01-02 19:59:06
【问题描述】:

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

这是我目前所拥有的......

在 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 的值,动态创建 UPDATE 查询的最佳方法是什么。

这是我想要创建的:

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

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

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

【问题讨论】:

  • 如果我没记错的话,你有一个用于列 name 的变量和另一个用于列 value 的变量吗?您面临的问题是如何在语句中粘贴名称和值?
  • @N.B.是的。我传入的一个值是所有修改变量的列表,其他值是所有变量。我只想更新修改后的

标签: php jquery mysql prepared-statement bindparam


【解决方案1】:

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

【讨论】:

  • 漂亮的解决方案!不知道...
【解决方案2】:

在字段上运行 Foreach 并用递增的数字连接每个字段,然后连接这些

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

将其连接到查询字符串中。然后循环遍历字段再次调用绑定参数

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

【讨论】:

    【解决方案3】:

    在 update_fields 上运行 array_values,然后构建您的查询,动态访问从 array_values 获得的键以获取字段值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 2017-01-22
      • 2012-07-14
      • 2021-01-06
      • 2014-10-04
      • 2010-12-19
      相关资源
      最近更新 更多