相对较新的PDO(以及一般的OOP),我的 3 命名参数给我一个错误。这是我编写的函数,用于检查数据库中是否已存在某个值(因此我不会有重复的条目):
function checkTable($table, $column, $value, $con) {
$stmt = $con->prepare("SELECT * FROM :tbl WHERE :col = :val");
$stmt->execute(['tbl' => $table, 'col' => $column, 'val' => $value]);
return $stmt->fetchAll();
}
当然$ con是PDO连接(是的,我已经检查过,它已连接,我可以在数据库上运行正常查询) 我用这段代码调用函数:
checkTable("posts", "title", "title", $con);
我希望看到true
被退回,因为我在数据库中存在确实的价值,但我得到的一切是
'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens'
编辑:我已经在一个函数外测试了这个,这就像预期的那样有效:
$bind = ['tbl' => "posts", 'col' => "title", 'val' => "title"];
$query = query("SELECT * FROM :tbl WHERE :col = :val", $con, $bind);
var_dump($query);
query()
函数如下所示:
function query($query, $con, $bind = null) {
try {
$stmt = $con->prepare($query);
$stmt->execute($bind);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$result = $stmt->fetchAll();
return $result;
} catch(Exception $e) {
return false;
}
}
答案 0 :(得分:2)
您不能在预准备语句中使用表名和列名进行替换。 :tbl
- 是一个表名。因此,您的查询:col, :val
中只有两个令牌。
同样:col
将替换为'column_name'
(带引号)。条件看起来像'column_name'='value'
。