php pdo: prepare () не выполняется, но query () выполняет [цикл foreach] - PullRequest
0 голосов
/ 17 ноября 2011

Я не уверен, связана ли проблема с самим оператором 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… s и $record_data->execute() на

$dbh->query("UPDATE `$db`.`$dbt` SET `$question`='$answer' WHERE `key`='$key';");

это работает.

Для устранения неполадок я добавил оператор echo, и напечатанные значения - это просто буквы и цифры, без кавычек; также имена баз данных и таблиц не заключаются в кавычки / tick'd.

Я прочитал в другом вопросе, что зацикливание вызывает проблемы с prepare и bind_. Я переключился с bindParam на bindValue, но это, похоже, не помогло ...

РЕДАКТИРОВАТЬ : результаты var_dump($key,$question,$answer):
string(17) "m3dc78db1e8368428" string(3) "age" string(2) "23" age 23

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

Нельзя связать имя поля таблицы.Столько, сколько вы не можете связать имя таблицы.Вместо этого вам придется использовать этот код:

$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();

Ссылка:

0 голосов
/ 17 ноября 2011

окончательный код:

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;
    }
}
0 голосов
/ 17 ноября 2011

Вы изменили режим ошибок на «исключение» и использовали 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(), потому что значения переменных меняются на каждой итерации.

...