php pdo:prepare()不执行但query()执行[foreach循环]

时间:2011-11-17 17:59:51

标签: php pdo bind prepared-statement

我不确定问题是针对prepare()语句本身还是bindValue s,但我无法弄清楚为什么这个问题可以用作query()而不是$dbh = new PDO("mysql:host=$dbhost", $dbuser, $dbpass, $options); $dbh->beginTransaction(); $record_data = $dbh->prepare("UPDATE $db.$dbt SET :column = :value WHERE `key` = :key;"); foreach ( $qaPairs as $pair ) { list($question , $answer) = explode('=', $pair); echo "$key : $question $answer"; $record_data->bindValue(':column', $question); $record_data->bindValue(':value', $answer); $record_data->bindValue(':key', $key); $record_data->execute(); } $dbh->commit(); 准备好的声明。

$record_data->bindValue…

如果我将$record_data->execute()$dbh->query("UPDATE `$db`.`$dbt` SET `$question`='$answer' WHERE `key`='$key';"); 替换为

prepare

它有效。

为了排除故障,我添加了echo语句,打印的值只是字母和数字,没有引用;此外,数据库和表名称未引用/勾选。

我在另一个问题中读到循环会导致bind_bindParam出现问题。我从bindValue切换到var_dump($key,$question,$answer),但这似乎没有帮助......

编辑string(17) "m3dc78db1e8368428" string(3) "age" string(2) "23" age 23的结果:
{{1}}

3 个答案:

答案 0 :(得分:3)

您无法绑定表字段名称。尽可能无法绑定表名。您将不得不使用此代码:

$dbh = new PDO("mysql:host=$dbhost", $dbuser, $dbpass, $options);
$dbh->beginTransaction();

foreach ( $qaPairs as $pair ) {
    list($question , $answer) = explode('=', $pair);
    // Initialize $column here… remember to sanitize it!!!
    $record_data = $dbh->prepare("UPDATE $db.$dbt SET $question = :value WHERE `key` = :key;");
    echo "$key : $question $answer";
    $record_data->bindValue(':value', $answer);
    $record_data->bindValue(':key', $key);
    $record_data->execute();
}
$dbh->commit();

参考:

答案 1 :(得分:0)

您是否将错误模式更改为“exception”并使用try / catch显示可能的错误? 这是你如何做到的:

<?php
    $dbh = new PDO("mysql:host=$dbhost", $dbuser, $dbpass, $options);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    try {
        $dbh->beginTransaction();
        $record_data = $dbh->prepare("UPDATE $db.$dbt SET :column = :value WHERE `key` = :key;");
        foreach ( $qaPairs as $pair ) {
            list($question , $answer) = explode('=', $pair);

            echo "$key : $question $answer";
            $record_data->bindParam(':column', $question);
            $record_data->bindParam(':value', $answer);
            $record_data->bindParam(':key', $key);
            $record_data->execute();
        }
        $dbh->commit();
    } catch(PDOException $e) {
        echo $e;
    }
?>

我希望这一步能为您提供更多见解。 此外,您需要使用bindParam(),因为变量的值在每次迭代时都会发生变化。

答案 2 :(得分:0)

最终代码:

error_reporting(-1);

$dbh = new PDO("mysql:host=$dbhost", $dbuser, $dbpass, $options);
$dbh->beginTransaction();

foreach ( $qaPairs as $pair ) {
    list($question , $answer) = explode('=', $pair);
    //var_dump($key,$question,$answer);

    try {
    $record_data = $dbh->prepare("UPDATE $db.$dbt SET $question = :value WHERE `key` = :key;");
    //$record_data->bindParam(':column', $question);
    $record_data->bindParam(':value', $answer);
    $record_data->bindParam(':key', $key);
    //$dbh->query("UPDATE `$db`.`$dbt` SET `$question`='$answer' WHERE `key`='$key';");
    //$record_data->execute(array(1=>$question,2=>$answer,3=>$key));
    //$record_data->execute(array(':column'=>$question,':value'=>$answer,':key'=>$key));
    $record_data->execute();
    }
    catch(PDOException $e) {
        echo $e;
    }
}