【发布时间】:2014-08-05 03:28:35
【问题描述】:
对于 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;
}
}
【问题讨论】:
-
您不能在查询需要标识符的情况下使用绑定变量。在您的情况下,
:tbl是一个表名 - 您不能将变量绑定到它。 -
"SELECT * FROM :tbl WHERE :col = :val")$tbl="tablename"; $col="column_name"; 然后"SELECT * FROM $tbl WHERE $col = :val") -
占位符可以在查询中表示 ONLY 值。永远不要使用 sql 关键字或字段/表名。
-
感谢弗雷德、迈克和马克!感谢你们,重写了我的代码以使其正常工作:)