準備語句:處理 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中文網其他相關文章!