【问题标题】:How to dynamically build queries with PDO如何使用 PDO 动态构建查询
【发布时间】:2012-01-08 23:40:27
【问题描述】:

我正在使用 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 作为数据类型,它也会在我的参数周围加上引号。

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

【问题讨论】:

  • 准备好的语句是一个查询谁的路径已被分析。您无法分析没有表甚至列信息的查询。

标签: php pdo


【解决方案1】:

很遗憾,您不能通过列名绑定参数。

您可以尝试动态创建 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?

【讨论】:

  • 那么在 PDO 中逃避事情的正确方法是什么?看来 PDO::quote() 不是我想要的。
  • 您可以查看以下内容:php.net/manual/en/function.mysql-escape-string.php 或 php.net/manual/en/function.htmlentities.php(以及其他验证输入的方法)。人们说 not 在使用 PDO 的 bindParam 或 bindValue 绑定时转义参数是可以的,因为该值被“绑定”为一个值而不是被解释为其他任何东西,但我 highly recommend 您清理/验证来自用户的所有输入。这包括查询字符串。
  • 好的,我不确定使用 mysql_real_escape_string 之类的东西是否可以跨数据库工作,或者是否有更通用的函数可供使用。
  • 在 PHP 中,您仍然可以使用:htmlentities 和 html_entity_decode,或者如果您想自定义验证数据的方式,您可以使用正则表达式。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多