2011-11-06 70 views
0

我正在使用一個類來構建一個具有命名參數的MySQL查詢以將數據綁定到它。示例查詢可能是。現在使用佔位符區分用戶數據和查詢中的參數名稱

INSERT INTO table (title, text) VALUES (?title, ?text) 

你可以指定值通過給參數名稱和值使用這些佔位符(?title?text)。在這個過程中,這個值將會被轉義(基本上mysql_real_escape_string帶有布爾值,數組等的特殊處理)。

問題是一個包含佔位符本身的值,因爲我依次替換它們。爲了完成上面的例子,替換可以如下。

title -> "hey ?text" 
text -> "lorem ipsum ..." 

我的第一個想法是首先用唯一值替換佔位符。這些必須是不能出現在轉義字符串中的字符串。

這是一個好方法,以及爲此目的存在哪些字符序列?

+0

你是如何做字符串替換? – hafichuk

+0

爲什麼你不使用PDO? – Paul

+0

@hafichuk現在他們在foreach循環中調用簡單的'str_ireplace'調用。參數保存在關聯數組中,直到請求最終查詢。 – Frank

回答

0

看看使用mysqli_prepare()mysqli_stmt_bind_param()

你需要做的是拿你現有的命名參數,並用只有問號代替它們。當你順序地從查詢字符串中提取命名參數時,你將會構建一個有序數組,你將在你的函數中使用這個數組,並從你的數組中放置合適的值。一旦構建了有序數組,您需要遍歷它並進行類型檢查,以便您可以將$types值傳遞到mysqli_stmt_bind_param()

我強烈建議你看看使用像PDO這樣的庫來代替自己。

+0

我使用命名參數以我需要的任何順序添加它們。當一個函數調用中有10個參數時,它看起來非常討厭。是的,有陣列的解決方案,但我現在決定這些命名參數。另外可以多次使用它們。 – Frank

+0

我瞭解使用命名參數的目的。如果我的回答不明確,我建議您可以使用現有的PHP函數(mysqli_prepare和mysqli_stmt_bind_params)來查看mysql類的內部以及您可以遵循的邏輯。 – hafichuk

+0

僅供參考,源代碼可用於PDO庫。它可能會給你一些關於如何實現這種事情的想法。 – hafichuk

0

我相信你的整個概念是錯誤的。
您正在混合的事項。

佔位符應僅用於向查詢添加值。不要創建花哨的語法。

沒有阻止你做一些像

$文字= 「Lorem存有......」; $ title =「hey $ text」;

所以讓你的變量準備好這種方式。 然後才把它們放入查詢中。

但是,我可能會忽略一些明智的問題。如果您有一些理由充分的反對意見 - 我會盡力爲您找到解決方案

至於您的標題中的問題,我只是逃避?和另外一個 ??在我的佔位符解析器。

+0

你最後一句話告訴我你沒有理解這個問題。現在阻止你的用戶進入「??」後跟您的查詢中使用的佔位符名稱?雖然你可以想象任何奇特的替代品不可能被用戶偶然發現,但我正在尋找一種使它不可能的價值。這更多的是理論上的東西。後來我發現了一個高度依賴於使用的轉義函數的解決方案,但我對此並不滿意,這就是爲什麼我沒有發佈它。 – Frank

相關問題