我有一個PHP文件中此查詢:兩件事情,我真的不明白
return $this->_getDb()->fetchRow('
SELECT *
FROM xf_user
WHERE user_id = ?
', $userId);
是什麼最後一行做的,咋一看在谷歌之後,我發現一個問題標記是一個動態參數。有人能給我更詳細的解釋嗎?謝謝。
我有一個PHP文件中此查詢:兩件事情,我真的不明白
return $this->_getDb()->fetchRow('
SELECT *
FROM xf_user
WHERE user_id = ?
', $userId);
是什麼最後一行做的,咋一看在谷歌之後,我發現一個問題標記是一個動態參數。有人能給我更詳細的解釋嗎?謝謝。
那麼,你缺少部分命令(注意不平衡的報價)。我懷疑你一開始就放棄了一兩行。(用戶編輯帖子以包含缺失的行)。
參數的作用是取參數的值(保存在$ userID變量中的值)並用它來評估SQL查詢。因此,如果$ userID包含值101,則執行的查詢基本上爲SELECT * FROM xf_user WHERE user_id = 101
。
但是,使用參數不同於簡單地將查詢構造爲文本語句,因爲參數是類型檢查的,並且對於SQL注入攻擊是安全的。同樣,執行多次同一個命令並使用$ userID中的新值執行的速度會更快,因爲SQL引擎只能「準備」該語句一次,而不是每次執行該語句。
哇謝謝你!如果一個變量等於一個字符串,我將如何在PHP中執行SQL查詢執行? (text) –
如果數據庫中的user_id列是一個字符串,只要確保$ userID包含一個字符串值(我假定它們在我的例子中都是整數,但只要它們都是兼容的類型就可以正常工作)。但是,如果數據庫中的user_id是一個整數並且$ userID包含一個字符串,那麼只需將$ userID轉換爲整數,即PHP爲此提供的任何函數。 –
建議在鏈接到外部文章時,將相關部分複製到答案中,以防外部鏈接不再可用。 – Fluffeh
看起來您正在處理準備好的聲明。允許你「準備」一個查詢,期望動態參數在MySQL服務器上傳遞給它。然後您在單獨的操作中發送必要的參數。
這可以提供一些性能優勢,但在防止SQL注入攻擊方面也提供了巨大的安全優勢。
雖然它看起來liek你不使用的mysqli,你可能會讀PHP的mysqli ::更多背景資料編寫文件:
你應該表現出更多的代碼上下文。它看起來像也許你正在使用一個非標準的數據庫庫? –
這是一回事 - 關於SQL你不明白的另一件事是什麼? ;-) –