首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDOStatement->制备和PDOStatement->bindParam()组合无效

PDOStatement->制备和PDOStatement->bindParam()组合无效
EN

Stack Overflow用户
提问于 2014-07-20 17:29:48
回答 1查看 113关注 0票数 0

我有一些代码应该循环遍历值和更改表中的条目。变量$change_val、$column和$id的5个值都是正确的,因此我假设使用bindParam有问题(但我不知道它是什么)。

代码语言:javascript
复制
$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,但这也不起作用。我看不出任何错误和事情至少顺利编译-只是他们不应该。表中的任何内容都没有改变。

这里怎么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-20 19:40:53

您不能在表名或列名中使用位置持有者,如果该语句的结构发生变化,则无法提前准备语句的目的。

您需要预先构建具有正确列名的准备语句,无论是手工命名、字符串替换,还是内爆列名列表。

我现在没有一个环境可以测试,但如下所示:

代码语言:javascript
复制
//Some random values and DB column names
$arrLocation = array ('Victoria','Washington','Toronto','Halifax','Vancouver');
$arrName     = array ('Sue', 'Bob', 'Marley', 'Tim', 'Fae');
$arrColumn   = array (1 => 'name', 2 => 'age', 3 => 'location');


/* Build column & named placeholders
 * $strSet = '`name` = :name, `age` = :age, `location` = :location';
 */

$strSet = '';
foreach ($arrColumn as $column) {
    $strSet .= "`$column` = :$column, ";
}
$strSet = rtrim($strSet, ', ');

$connection = new PDO($dsn, $user, $pass);

/*
 * Prepared statement then evaluates to:
 * UPDATE `table` SET `name` = :name, `age` = :age, `location` = :location
 *   WHERE `id` = :id;
 */
$stmt = $connection->prepare("UPDATE `table` SET $strSet WHERE `id` = :id;");

$arrChange = array (
  1 => $arrName[(rand(0, count($arrName)-1))],
  2 => rand(0, 30),
  3 => $arrLocation[(rand(0, count($arrLocation)-1))]
);

$idToUpdate = 1;
$stmt->bindParam(':id', $idToUpdate, PDO::PARAM_INT);
foreach($arrChange as $key=>$value) {
    $stmt->bindValue(":$arrColumn[$key]", $value);
}
$stmt->execute();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24853075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档