相对于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'
EDIT:我已经在函数外测试了这个,并且它正如预期的那样工作:
$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;
}
}
不能在准备好的语句中使用表名和列名进行替换。:tbl
-是表名。因此,在查询:col, :val
中只有两个令牌。
同样:col
将被'column_name'
(带引号)取代。其中condition将是'column_name'='value'
。