【问题标题】:Dynamically constructed update statement from associative array从关联数组动态构造更新语句
【发布时间】:2018-06-19 14:41:59
【问题描述】:

我正在尝试基于如下所示的关联数组创建动态构造的 UPDATE 语句:

$lastid = $app['database']->dynamicUpdate('table', [
    'name' => $name,
    'ticket' => $ticket,
], $id);

动态更新函数:

public function dynamicUpdate($table, $parameters, $id)
{
    $query = sprintf('UPDATE %s SET (%s) WHERE id = %s', $table, implode(', ', array_keys($parameters).'= :'.array_keys($parameters)), $id);
    $statement = $this->pdo->prepare($query);
    $statement->execute($parameters);
    return $this->pdo->lastInsertId();
}

但是,当我简单地回显 $query 变量时它会返回以下错误(删除了 dynamicUpdate 中的所有其他代码):

警告:implode():传入的参数无效 EditProduct.php 在第 21 行更新表 SET () WHERE id = 10

【问题讨论】:

  • Implode 需要一个数组作为第二个参数,你传递字符串。数组键返回数组你强制数组到字符串转换。
  • 您对 implode 的第二个参数应该是一个数组。你有array_keys($parameters).'= :'.array_keys($parameters)。你不能连接一个数组。

标签: php string associative-array implode


【解决方案1】:

implode 的第二个参数必须是一个数组

这个实现查询的解决方案怎么样

$query = sprintf('UPDATE %s SET ', $table);
foreach($parameters as $key=>$value)
    $query .= "$key=:$key, ";
$query = rtrim($query,", ");
$query .= sprintf('WHERE id = %s', $id);

【讨论】:

    【解决方案2】:

    您只能内爆单个数组,而不能同时像您尝试的那样操作内容。 foreach 可以轻松构建您需要的部分...

    $set = "";
    foreach ( $parameters as $name=>$param) {
        $set .= $name."= :".$name.",";
    }
    $set=rtrim($set,",");
    $parameters["keyID"] = $id;
    $query = "UPDATE $table SET $set WHERE id = :keyID";
    

    为了以防万一,还值得将 ID 放入绑定参数的数组中,并为其添加一些虚拟名称。

    【讨论】:

    • 这不会在 WHERE 子句之前导致keyID= :keyID 吗?
    • 我在构建要设置的值列表后添加它。
    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多