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/

10-16 15:01