首页 > 数据库 > mysql教程 > 准备好的语句可以处理 SELECT 查询中的动态列名吗?

准备好的语句可以处理 SELECT 查询中的动态列名吗?

Barbara Streisand
发布: 2025-01-19 17:26:09
原创
356 人浏览过

Can Prepared Statements Handle Dynamic Column Names in SELECT Queries?

准备语句:处理 SELECT 查询中的动态列名

挑战:

准备好的语句可以在 SELECT 查询中容纳动态列名称吗?

场景:

用户演示了 MySQL 和 Java 示例:

String columnNames = "d,e,f"; // From user input
String tableName = "some_table"; // From user input
String query = "SELECT a,b,c,? FROM " + tableName + " WHERE d=?";
//...
登录后复制

columnNames 字符串替换参数会得到:

SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
登录后复制

然而,预期的结果是:

SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
登录后复制

解决方案:

直接对动态列名使用准备好的语句不可行。 准备好的语句参数化,而不是列标识符。

替代策略:

最有效的解决方案是修改数据库模式。 不要将数据分散在多个列中,而是引入单个列来保存动态命名的列。 该列将包含一个序列化字符串,表示每行的列名称列表。

这需要严格的输入清理以防止 SQL 注入。 使用 String#replace() 转义引号,然后将清理后的列名称连接到 SQL 查询字符串中是一种可行的方法。 考虑对查询的其他部分使用参数化查询,以尽可能保持安全优势。

以上是准备好的语句可以处理 SELECT 查询中的动态列名吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板