【问题标题】:PDO update prepared statement not workingPDO 更新准备好的语句不起作用
【发布时间】:2015-01-23 07:30:05
【问题描述】:

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

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您可以bind 参数将它们传递给execute。您不能同时执行这两项操作,当您将 any 传递给 execute 时,PDO 将丢弃任何绑定参数。所以你的idx 在执行查询时没有被绑定。最简单的解决方法:

    $st->execute($values + compact('idx'));
    

    通过接受来自$_POST BTW 的原始字段名称,您正在向旧的 SQL 注入敞开大门。

    另外,顺便说一句:

    join(', ', array_map(
        function ($field) { return "`$field` = :$field"; },
        $fields
    ))
    

    .= '.., 'substr 更理智一点。

    【讨论】:

    • 成功了!谢谢!!!!我应该考虑更多地接受原始字段名称部分
    【解决方案2】:

    您现在收到的当前查询是什么?然后我们可以更好地了解问题所在。

    你应该小心在准备好的语句中只使用 $_POST 作为 $source。有人可以将 SQL 注入到您的查询中。始终清理查询的输入。

    在 pdoSet 中,您正在清除函数参数 $values,因为这是通过引用 (&$values) 给出的,所以您在其余代码中引入了副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 2012-03-01
      • 2018-01-24
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多