如何使用PDO动态构建查询

时间:2011-11-29 16:15:18

标签: php pdo

我正在使用PDO并希望做这样的事情:

$query = $dbh->prepare("SELECT * FROM :table WHERE :column = :value");
$query->bindParam(':table', $tableName);
$query->bindParam(':column', $columnName);
$query->bindParam(':value', $value);

PDO会允许我像这样绑定表名和列名吗? 似乎允许它,但即使我使用PDO :: PARAM_INT或PDO :: PARAM_BOOL作为数据类型,它也会在我的参数周围加上引号。

如果这不起作用,我怎样才能安全地转义我的变量,以便我可以在查询中插入它们?

2 个答案:

答案 0 :(得分:13)

不幸的是,您无法按列名绑定参数。

您可以尝试动态创建SQL命令:

$sql = "SELECT * FROM $tableName WHERE $columnName = :value";
$query = $dbh->prepare($sql);
$query->bindParam(':value', $value);

如果它们来自其他地方,请确保清理参数/变量,以防止SQL注入。在这种情况下,$value安全到一定程度,但$tableName$columnName不是 - 再次,尤其是如果这些变量的值是不是由you提供,而是由您的用户/访客/等提供......

另一件事;请避免使用*并为您的列命名...请参阅以下原因:

http://www.jasonvolpe.com/topics/sql/

Performance issue in using SELECT *?

在此处查看其他类似帖子:

Why doesn't binding parameter in ORDER BY clause order the results?

How do I set ORDER BY params using prepared PDO statement?

答案 1 :(得分:-3)

从您的问题中不清楚为什么您想要“绑定”?表名。

PDO参数绑定的选项是

  • bindParam
  • bindValue
  • bindColumn

制作表或视图变量会破坏语句准备的目的。