使用动态预处理语句更新表

时间:2017-02-11 12:28:41

标签: php mysql arrays pdo prepared-statement

我正在尝试使用填充了UPDATE数据的自定义数组来完成动态PDO准备的$_POST语句。
数组结构如下所示:

$data = array();
$data[00001] = array("description"=>"item1", "stock"=>"100");
$data[00002] = array("description"=>"item2", "thr_alert"=>"20");

mysql列与数组键名称相同。 'id'是主数组键(00001,00002等)。

我的第一种方法是这里描述的方法:php.net pdo execute()

foreach($data as $itemId=>$value) {
    $keys = array_keys($value);
    $fields = '`'.implode('`, `',$keys).'`';
    $placeholder = substr(str_repeat('?,',count($keys)),0,-1);
    echo "INSERT INTO `baz`($fields) VALUES($placeholder)";
    print_r(array_values($value)); //values to fill up execute() later on
    echo "<br>";
}
unset($keys, $fields, $placeholder, $itemId, $value);

很好的方法但不起作用,因为它是为INSERT预处理语句设计的,不能用于UPDATE,因为语法应该是UPDATE foo SET bar = :bar/? WHERE id = :id/?

第二种方法:

$out = "UPDATE `baz` SET ";
foreach($data as $itemId=>$value) {
    foreach($value as $column=>$foo) {
    }
    $out1 .= $column." = :$column, ";
    $out2 = "WHERE id = :id";

}
$output = $out.rtrim($out1, ", ")." ".$out2."<br>";

echo $output;

输出:

  

UPDATE baz SET stock =:stock,description =:description WHERE id =:id

请注意,仅显示第一个数组。

关于如何实现目标的任何想法?

2 个答案:

答案 0 :(得分:1)

在第二个foreach循环中移动此行

$out1 .= $column." = :$column, ";

但结果对于当前数据来说很尴尬,因为它会产生类似

的内容
...SET description = :description,description = :description....

答案 1 :(得分:1)

解决了!

编写unset($out1);后我必须$output并在第二个foreach循环中执行$out1行(参见下面的代码)。

$out = "UPDATE `foo` SET ";
foreach($data as $itemId=>$value) {
    foreach($value as $column=>$foo) {
        $out1 .= $column." = :$column, ";
    }
    $out2 = "WHERE id = :id";

    $output .= $out.rtrim($out1, ", ")." ".$out2."<br>";
    unset($out1);
}

echo $output;

下一步是使用$db->prepare($output);准备语句并将数据传递给$db->execute($data);
所以回答我自己的问题 - 是的,动态准备的陈述使用一个&#34;全球&#34;阵列是可能的! : - )