准备语句:处理 SELECT 查询中的动态列名
挑战:
准备好的语句可以在 SELECT
查询中容纳动态列名称吗?
场景:
用户演示了 MySQL 和 Java 示例:
<code class="language-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=?"; //...</code>
用 columnNames
字符串替换参数会得到:
<code class="language-sql">SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'</code>
然而,预期的结果是:
<code class="language-sql">SELECT a,b,c,d,e,f FROM some_table WHERE d='x'</code>
解决方案:
直接对动态列名使用准备好的语句不可行。 准备好的语句参数化值,而不是列标识符。
替代策略:
最有效的解决方案是修改数据库模式。 不要将数据分散在多个列中,而是引入单个列来保存动态命名的列。 该列将包含一个序列化字符串,表示每行的列名称列表。
这需要严格的输入清理以防止 SQL 注入。 使用 String#replace()
转义引号,然后将清理后的列名称连接到 SQL 查询字符串中是一种可行的方法。 考虑对查询的其他部分使用参数化查询,以尽可能保持安全优势。
以上是准备好的语句可以处理 SELECT 查询中的动态列名吗?的详细内容。更多信息请关注PHP中文网其他相关文章!