2012-09-14 54 views
0

我有一個PHP文件中此查詢:兩件事情,我真的不明白

return $this->_getDb()->fetchRow(' 
SELECT * 
FROM xf_user 
WHERE user_id = ? 
', $userId); 

是什麼最後一行做的,咋一看在谷歌之後,我發現一個問題標記是一個動態參數。有人能給我更詳細的解釋嗎?謝謝。

+0

你應該表現出更多的代碼上下文。它看起來像也許你正在使用一個非標準的數據庫庫? –

+0

這是一回事 - 關於SQL你不明白的另一件事是什麼? ;-) –

回答

3

那麼,你缺少部分命令(注意不平衡的報價)。我懷疑你一開始就放棄了一兩行。(用戶編輯帖子以包含缺失的行)。

參數的作用是取參數的值(保存在$ userID變量中的值)並用它來評估SQL查詢。因此,如果$ userID包含值101,則執行的查詢基本上爲SELECT * FROM xf_user WHERE user_id = 101

但是,使用參數不同於簡單地將查詢構造爲文本語句,因爲參數是類型檢查的,並且對於SQL注入攻擊是安全的。同樣,執行多次同一個命令並使用$ userID中的新值執行的速度會更快,因爲SQL引擎只能「準備」該語句一次,而不是每次執行該語句。

+0

哇謝謝你!如果一個變量等於一個字符串,我將如何在PHP中執行SQL查詢執行? (text) –

+0

如果數據庫中的user_id列是一個字符串,只要確保$ userID包含一個字符串值(我假定它們在我的例子中都是整數,但只要它們都是兼容的類型就可以正常工作)。但是,如果數據庫中的user_id是一個整數並且$ userID包含一個字符串,那麼只需將$ userID轉換爲整數,即PHP爲此提供的任何函數。 –

1

閱讀這篇文章:

http://www.unixwiz.net/techtips/sql-injection.html

,你需要特別注意名爲「使用綁定參數(PREPARE語句)」

希望這有助於段落。

+0

建議在鏈接到外部文章時,將相關部分複製到答案中,以防外部鏈接不再可用。 – Fluffeh

0

看起來您正在處理準備好的聲明。允許你「準備」一個查詢,期望動態參數在MySQL服務器上傳遞給它。然後您在單獨的操作中發送必要的參數。

這可以提供一些性能優勢,但在防止SQL注入攻擊方面也提供了巨大的安全優勢。

雖然它看起來liek你不使用的mysqli,你可能會讀PHP的mysqli ::更多背景資料編寫文件:

http://php.net/manual/en/mysqli.prepare.php