我正在尝试使用填充了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
请注意,仅显示第一个数组。
关于如何实现目标的任何想法?
答案 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;阵列是可能的! : - )