gpt4 book ai didi

PHP - bindValue() 的 PDO 问题

转载 作者:行者123 更新时间:2023-11-29 12:34:02 27 4
gpt4 key购买 nike

我正在编写一个类,它以编程方式创建一个给定特定列名的表。我正在使用 PDO 准备好的语句,这似乎导致了一些问题。

基本流程如下:

// create a query string to be sent to $pdo->prepare
$sql =
'CREATE TEMP TABLE :tmp_table_name (
:person_id bigint,
:encntr_id bigint,
:prsnl_id bigint,
:program_detail text,
:program_name text
);';
$stmt = $pdo->prepare($sql);

// Bind table name
$stmt->bindValue(':tmp_table_name', 'tmp_patients', PDO::PARAM_STR);

// Bind column names
$columnNames = [
'person_id',
'encnt_id',
'prsnl_id',
'program_detail',
'program_name',
];
foreach($columnNames as $name) {
$stmt->bindValue(':'.$name, $name, PDO::PARAM_STR);
}

$ret = $stmt->execute();
// $ret is false! The statement fails.

这是 $stmt->errorInfo()[2] 显示的内容:

ERROR:  syntax error at or near "$1"
LINE 1: CREATE TEMP TABLE $1 ($2 bigint,
$3 bigint,
$4 bigint,
$5 text,
$6 te...

为什么 $1、$2、$3 等出现在查询中?关于如何进一步调试此 PDO 语句,您有任何提示吗?

更新我正在尝试一种不同的方法,不使用 bindParam,只是将参数数组传递给 $stmt->execute()。不过,我仍然遇到同样的错误......

$stmt = $this->pdo->prepare($this->createSql);

$keys = [];
// Bind column names
foreach($this->columnNames as $name) {
$keys[] = ':'.$name;
}
$params = array_combine($keys, $this->columnNames);

// Bind table name
$params[':tmp_table_name'] = 'tmp_'.$this->objName;

$ret = $stmt->execute($params);
if (!$ret) {
throw new Exception('execSchema() failed! '. $stmt->errorInfo()[2]);
}

最佳答案

在我看来,您似乎在尝试绑定(bind)到表名/列,而使用 PDO 无法做到这一点 - 您只能将值绑定(bind)到占位符。

如您此处的代码所示:

// Bind table name
$stmt->bindValue(':tmp_table_name', 'tmp_patients', PDO::PARAM_STR);

感觉好像应该可以,但实际上没有。

例如这将工作:

$sql = "insert into mytable (:thing1) values (:thing2);
$stmt->bindValue(':thing1', 'column_name' ); // this would not
$stmt->bindValue(':thing2', 'column_value' ); // this would have (on its own)

但是,这样的事情会起作用,它应该提供您的解决方案或类似的东西:

// imagine an incoming POST load like this:
$cols = ['fname','lname'];

$array_cnt = count($cols); // 2
$sql = 'INSERT INTO mytable ('.join(',', $cols).') ';

// and then that number of placeholders used
$sql .= 'VALUES (' . join( array_fill( 0, $array_cnt, '?' ), ', ' ) . ')';

echo $sql;

关于PHP - bindValue() 的 PDO 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11784355/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com