如何使用 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 作为数据类型,它也会在我的参数周围加上引号。
如果这不起作用,我如何安全地转义我的变量,以便我可以在查询中插入它们?
I am using PDO and want to do something like this:
$query = $dbh->prepare("SELECT * FROM :table WHERE :column = :value");
$query->bindParam(':table', $tableName);
$query->bindParam(':column', $columnName);
$query->bindParam(':value', $value);
Will PDO allow me to bind the table name and the column name like this? It seems to allow it, but it puts quotes around my parameters even if I use PDO::PARAM_INT or PDO::PARAM_BOOL as the data type.
If this won't work, how can I safely escape my variables so that I can interpolate them in the query?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不幸的是,您无法通过列名称绑定参数。
您可以尝试动态创建 SQL 命令:
只要确保清理来自其他地方的参数/变量,以防止 SQL 注入。在这种情况下,
$value
在一定程度上是安全的,但$tableName
和$columnName
又不安全了。 ,尤其是如果这些变量的值不是由您提供的,而是由您的用户/访问者等提供的……另一件事;请避免使用
*
并命名您的列...查看一些原因:http://www.jasonvolpe.com/topics/sql/
性能问题使用选择*?
在这里查看其他类似的帖子:
为什么不在 ORDER 中绑定参数BY子句对结果进行排序?
如何使用准备好的 PDO 语句设置 ORDER BY 参数?
Unfortunately, you can't bind parameters by column names.
What you could try is to dynamically create your SQL command:
Just make sure to sanitize your parameters/variables if they are coming from elsewhere, to prevent SQL Injection. In this case,
$value
is safe to a degree but$tableName
and$columnName
are not -- again, that is most especially if the values for these variables are not provided byyou
and instead by your users/vistors/etc...One other thing; please avoid using
*
and name your columns instead... See some reasons why:http://www.jasonvolpe.com/topics/sql/
Performance issue in using SELECT *?
See other similar posts here:
Why doesn't binding parameter in ORDER BY clause order the results?
How do I set ORDER BY params using prepared PDO statement?