pdo-bindparam-into-one-statement
我是PDO的新手,我想我已经迷路了。
我想要的是对插入和更新都使用相同的变量。
function pdoSet($fields, &$values, $source = array()){
$set = '';
$values = array();
if(!$source) $source = &$_POST;
foreach($fields as $field){
if(isset($source[$field])){
$set .= " $field =:$field, ";
$values[$field] = $source[$field];
}
}
return substr($set, 0, -2);
}
$fields = array(
'name'
, 'part'
, 'tel'
, 'email'
, 'title'
, 'contents'
);
if(!$idx){
$fields[] = 'reg_date';
$values[] = 'now()';
$st = $pdo -> prepare("insert into qna_board set ".pdoSet($fields, $values));
}else{
$st = $pdo -> prepare("update qna_board set ".pdoSet($fields, $values)." where idx = :idx");
$st ->bindParam(':idx', $idx);
}
$st->execute($values);
插入成功,但未成功更新。
当我使用$ idx代替:idx时,它起作用了。
你能告诉我问题是什么吗?
最佳答案
您可以bind
参数,也可以将其传递给execute
。您不能一次执行全部操作,当您将任何绑定参数传递给execute
时,PDO都会丢弃任何绑定参数。因此,您的idx
在执行查询时不受约束。最简单的解决方法:
$st->execute($values + compact('idx'));
通过接受来自
$_POST
BTW的原始字段名称,您可以进行良好的旧SQL注入。另外,顺便说一句:
join(', ', array_map(
function ($field) { return "`$field` = :$field"; },
$fields
))
比
.= '.., '
和substr
聪明一点。关于php - PDO更新准备好的语句不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28104986/