当前位置: 首页 > 知识库问答 >
问题:

PDOStatement->准备和PDOStatement->bindParam()组合不工作[重复]

关冠宇
2023-03-14

我有一些代码可以循环遍历值并更改表中的条目。变量$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,但也没用。我看不到任何错误,至少编译得很顺利,只是没有达到应有的效果。表中的内容没有改变。

这里怎么了?

共有1个答案

计胤
2023-03-14

不能在表名或列名中使用占位符。如果语句的结构发生变化,则无法提前准备语句。

您需要使用正确的列名预构建prepare语句,无论是手动命名、字符串替换还是内爆列名列表。

我现在没有测试环境,但类似于:

//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();
 类似资料:
  • 问题内容: 如何将a转换为json?是否有图书馆可以这样做? 编辑:我需要对一个jsonify 。抱歉,感谢您的所有答复。 无法将jsonjson化。 谢谢。 问题答案: 您可以使用内置的php函数json_encode()http://php.net/manual/zh/function.json- encode.php 要对结果进行编码,请使用类似

  • 问题内容: 如何将a转换为json?是否有图书馆可以这样做? 编辑:我需要对一个jsonify 。抱歉,感谢您的所有答复。 无法对进行json解码。 谢谢。 问题答案: 您可以使用内置的php函数json_encode() 要对结果进行编码,请使用类似

  • 我用语句编写了这段代码,它运行良好: 但当我试图用PreparedStatement转换它时,它却不能处理SQL语法错误。

  • 问题内容: 将表单的命名参数传递给时,无论是否使用前导冒号都似乎有效。 即这: 或这个: 似乎有效。 这是有关的文档 参数 参数标识符。对于使用命名占位符的预备语句,这将是 :name 形式的参数 名称。 对于使用问号占位符的准备好的语句,这将是参数的1索引位置。 这是否意味着可以不使用结肠? 问题答案: 不可以,因为文档中没有提到这一点,所以我认为可以肯定地认为这种行为不受官方支持,因此不应该被

  • 前言 到最后一节来写“开篇”,确实有点古怪。不过,在第一篇(数值操作)的开头实际上也算是一个小的开篇,那里提到整个系列的前提是需要有一定的 Shell 编程基础,因此,为了能够让没有 Shell 编程基础的读者也可以阅读这个系列,我到最后来重写这个开篇。开篇主要介绍什么是 Shell,Shell 运行环境,Shell 基本语法和调试技巧。 什么是 Shell 首先让我们从下图看看 Shell 在整

  • 现在你知道使用Kotlin实现的小例子了,我确信你会希望尽可能快地把它用在你的实践当中去。不要担心,在第一章中会帮助你去搭建你的开发环境,这样你才能立即编写代码。