@Diego 是正确的,您不能将 SQL 参数用于表名、列名、SQL 关键字、值列表(如在 IN() 谓词中)或任何其他表达式。
SELECT :column FROM table -- NO, unless you want to select a constant string
SELECT * FROM :table -- NO
SELECT * FROM table WHERE column IN (:list) -- NO
SELECT * FROM table ORDER BY :column -- NO
SELECT * FROM TABLE ORDER BY column :asc_or_desc -- NO
基本上,请记住这条规则:如果您可以用一个常量值(例如,带引号的字符串、日期或整数)代替 SQL 参数,那么这是对参数的合法使用。否则,没有。
SELECT :string FROM table -- OK, but returns value of :string for every row
SELECT * FROM table WHERE column = :string -- OK
SELECT * FROM table WHERE column IN (:x, :y, :z) -- OK, one parameter per value
prepare()
此外,在编程 PDO 时,您应该始终检查和的返回值execute()
。它们将返回false
错误,您应该编写代码来检测并做出适当的响应(即记录错误、显示错误页面、给用户另一个机会等)
$stmt = $conn->prepare("SELECT * FROM :type"); // illegal use of parameter
if ($stmt === false) {
// check $pdo->errorInfo(), see documentation
}
$stmt->bindParam(':type', $type);
$status = $stmt->execute();
if ($status === false) {
// check $stmt->errorInfo(), see documentation
}
您甚至可能想要检查其他 PDO 函数的返回值。请参阅文档,其中许多返回false
错误。