如何使用 PDO 动态构建查询

发布于 2024-12-18 14:51:27 字数 410 浏览 0 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒儿 2024-12-25 14:51:27

不幸的是,您无法通过列名称绑定参数。

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

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

只要确保清理来自其他地方的参数/变量,以防止 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:

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

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 by you 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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文