首頁 >資料庫 >mysql教程 >準備好的語句可以處理 SELECT 查詢中的動態列名嗎?

準備好的語句可以處理 SELECT 查詢中的動態列名嗎?

Barbara Streisand
Barbara Streisand原創
2025-01-19 17:26:09299瀏覽

Can Prepared Statements Handle Dynamic Column Names in SELECT Queries?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn