PDO更新准备好的声明不起作用

时间:2015-01-23 07:30:06

标签: php mysql pdo

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时,它工作.. 你能告诉我这是什么问题吗?

2 个答案:

答案 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)给出的,所以您在其余代码中引入了副作用。