2010-05-10 31 views
1

我想用SQL選擇代碼一個bbcode。基本上我希望用戶能夠在文本字段中輸入[user]Anotheruser[/user],然後在前端將其轉換爲如下所示的URL:http://mydomain.com/user/[userid]/anotheruser。因此,爲了獲得用戶標識,我需要包含一個SQL選擇,另外還要找出其他用戶實際存在的地方。我可以通過preg_replace這樣做來創建bbcode,還是需要做更復雜的事情?PHP:BBCode與SQL選擇?

回答

0

pre_replace應該工作,小心tho。確保你修補任何漏洞......特別注意sql注入。

0

你應該避免注射POST方,就像你應該在其他地方做的一樣。

這種情況根本就沒有什麼不同。

0

preg_match標籤首先,獲取用戶名,執行查詢(要小心,並作出這樣的工序的安全!),並更換整個匹配的字符串與新網址:

preg_match_all ('#\[user\](.*?)\[/user\]#i', $text, $matches, PREG_SET_ORDER); 

for ($i = 0, $j = count($matches); $i < $j; $i++) 
{ 
    $userName = $matches[$i][1]; 
    $userId = 0; 

    // query example with mysqli 
    $stmt = $sql->prepare('SELECT uid FROM users WHERE username = ? LIMIT 1'); 
    $stmt->bind_param('s', $userName); 
    $stmt->execute(); 
    $stmt->bind_result($userId); 

    if ($stmt->fetch()) 
    { 
     $text = str_replace($matches[$i][0], "<a href=\"/user/$userId/$userName\" title=\"$userName\">$userName</a>", $text); 
    } 
} 
+0

好的解決方案。爲了節省資源,你可以清理每一個匹配,然後'implode()'$ matches'並且查詢'WHERE用戶名IN(..imploded matches ..)'。這樣你只需要執行*一個*查詢。 – Alec 2010-05-10 10:46:53

+0

是的,我只是想爲SQL查詢顯示一個可能的代碼。使用預準備語句時,最好在語句之前(循環之前)準備語句,並更新參數並執行它。準備好的陳述實際上是相當快的,我相信它會比使用'IN'更快(並且可能有點安全,因爲你不需要自己逃脫)。 – poke 2010-05-10 11:33:07