我不确定问题是针对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}}
答案 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;
}
}