Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO声明->;编制并提交报表->;bindParam()组合不起作用_Php_Sql_Pdo - Fatal编程技术网

Php PDO声明->;编制并提交报表->;bindParam()组合不起作用

Php PDO声明->;编制并提交报表->;bindParam()组合不起作用,php,sql,pdo,Php,Sql,Pdo,我有一些代码可以循环遍历值并更改表中的条目。变量$change\u val、$column和$id的5个值都正确地回显了,因此我假设bindParam的使用有问题(但我不确定它是什么) $connection=newpdo(“mysql:host=localhost;dbname=logbook”,$username,$password); $perform\u edit=$connection->prepare(“更新联系人集:列=:value,其中name\u id=:name\u id”)

我有一些代码可以循环遍历值并更改表中的条目。变量$change\u val、$column和$id的5个值都正确地回显了,因此我假设bindParam的使用有问题(但我不确定它是什么)

$connection=newpdo(“mysql:host=localhost;dbname=logbook”,$username,$password);
$perform\u edit=$connection->prepare(“更新联系人集:列=:value,其中name\u id=:name\u id”);
[阵列的定义]
对于($i=1;$i 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();
}
}
$\u POST语句之所以存在,是因为我想要的值实际上是从另一个文件传递的。不过,当我在循环中放置适当的echo语句时,它们都会打印出正确的值

我也试过bindValue,但也不起作用。我看不到任何错误,至少编译得很顺利,只是不应该这样。表中的任何内容都没有更改


这里出了什么问题?

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

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

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


column
一方面,它是一个保留字-但是,您不能执行
SET:column
,因此您需要为它设置一个变量,或者选择实际的列名。添加
$connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)
在连接打开后立即出现错误。您随时可以看到错误弹出。@Fred ii-啊!太好了。我将在所有连接后开始输入错误。问题是有五列将被编辑,而这些列在循环中会发生变化。我可以在循环中输入prepare语句,但这不是无效的吗nt?TBH,当我不得不做你想做的事情时,我在循环方面做得很糟糕。你可以试试看,看看性能如何;值得一试。看看这些问答,找到那些谷歌“使用pdo更新多个列”,如果您希望进一步研究。另外,希望它能有所帮助。也许我的意思很模糊,但我不确定您在这里到底做了什么。您将列名设置为变量而不是占位符,但在准备语句之前,您滚动了$strSet的所有值?(我确实通过将prepare语句放在一个循环中使代码工作,不幸的是,这没有那么有效,但这没关系;我只是好奇您到底做了什么)添加了两个代码注释--由于占位符不能用于预处理语句中的表或列,因此在所用示例中,生成了要在预处理字符串中求值的集合字符串,该字符串具有4个命名占位符。然后循环要设置的值以绑定要执行的值。bindParam是一个引用并计算该值执行时变量的s;绑定值绑定绑定时的值。啊,太好了。非常感谢。:)
$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();
        }
}
//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();