从关联数组动态构造更新语句

时间:2018-06-19 14:42:00

标签: php string associative-array implode

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

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

dynamicUpdate函数:

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():传入的参数无效   第21行的UPDATE表中的EditProduct.php   SET()ID = 10的

2 个答案:

答案 0 :(得分:0)

您只能内嵌单个数组,而不能像尝试同时操作那样操作内容。 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放入用于绑定参数的数组中,以防万一,并为其包含一些虚拟名称。

答案 1 :(得分:0)

内爆的第二个参数必须是数组

实现查询的解决方案有什么

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