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时,它工作.. 你能告诉我这是什么问题吗?
答案 0 :(得分:0)
您可以将bind
参数或传递给execute
。您不能同时执行这两项操作,当您将任何绑定参数传递给execute
时,PDO将丢弃任何绑定参数。因此,在执行查询时,idx
不受约束。最容易修复:
$st->execute($values + compact('idx'));
通过接受来自$_POST
BTW的原始字段名称,您可以通过良好的旧SQL注入打开自己。
另外,BTW:
join(', ', array_map(
function ($field) { return "`$field` = :$field"; },
$fields
))
比.= '.., '
和substr
更安全。
答案 1 :(得分:0)
您现在获得的当前查询是什么?然后我们可以更好地看出出了什么问题。
在准备好的语句中使用$ _POST作为$ source时应该小心。有人可以在您的查询中注入SQL。始终清理查询的输入。
在pdoSet中,您正在清除函数参数$ values,因为这是由引用(& $ values)给出的,所以您在其余代码中引入了副作用。