【发布时间】:2014-09-11 05:58:10
【问题描述】:
我有一些代码应该循环遍历值并更改表中的条目。变量 $change_val、$column 和 $id 的 5 个值都正确回显,所以我认为我对 bindParam 的使用有问题(但我不确定它是什么)。
$connection = new PDO("mysql:host=localhost;dbname=logbook", $username, $password);
$perform_edit = $connection->prepare("UPDATE contacts SET :column = :value WHERE name_id = :name_id");
[Definition of Arrays]
for ($i = 1; $i <= 5; $i++) {
if (!empty($_POST[ $change_array[$i]])) {
$change_val = $_POST[$change_array[$i]];
$column = $column_array[$i];
$id = $_POST["name_id_ref"];
$perform_edit->bindParam(":column", $column, PDO::PARAM_STR);
$perform_edit->bindParam(":value", $_POST[$change_array[$i]], PDO::PARAM_STR);
$perform_edit->bindParam(":name_id", $_POST["name_id_ref"], PDO::PARAM_INT);
$perform_edit->execute();
}
}
$_POST 语句在那里是因为我想要的值实际上是从另一个文件传递的。但是,当我在循环中放置适当的 echo 语句时,它们都会打印出正确的值。
我也尝试过 bindValue,但也没有用。我没有看到任何错误,而且至少可以顺利编译——只是不像它们应该的那样。表中没有任何变化。
这里有什么问题?
【问题讨论】:
-
column一方面是保留字 dev.mysql.com/doc/refman/5.5/en/reserved-words.html - 然而,你不能这样做SET :column所以你'您需要为其设置一个变量,或者选择实际的列名。 -
连接打开后立即添加
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);。你站在让错误弹出。 -
@Fred-ii- 啊!优秀。在我所有的连接之后,我将开始放置它。问题是有五列将被编辑,并且这些列在整个循环中都会发生变化。我可以将prepare语句放在循环中,但这不是效率低下吗?
-
TBH,当我不得不做你想做的事情时,我很喜欢循环。您可以尝试一下,看看性能如何;值得一试。
-
查看这些问答的stackoverflow.com/q/20531613 和stackoverflow.com/q/12043967 和stackoverflow.com/q/16429736 - 发现那些谷歌搜索“使用 pdo 更新多个列”,如果您想进一步研究。再加上另一个coderexception.com/C1Nm1BHHPWxXUSUX/… - 希望对您有所帮助。