2012-11-20 43 views
1

我可以看到很多討論,爲什麼最好使用PDO bindValue vs bindValue。但是我無法找到的是關於爲什麼我應該在查詢中使用它而不是簡單變量的精確信息。誰能告訴我?感謝爲什麼我應該使用bindValue/Param與普通變量?

$sex = 'male'; 
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex'); 
$s->bindParam(':sex', $sex); 
$s->execute(); 

VS

$sex = 'male'; 
$s = $dbh->query('SELECT name FROM students WHERE sex = $sex'); // OR PREPARE, The question is how to pass the variable. 
+0

您是否正在尋找解釋爲什麼SQL注入是一個問題? –

+0

簡短回答:SQL注入。準備好的陳述會爲您做適當的轉義。 – Raziel

+0

@ÁlvaroG.Vicario我只想知道我是否應該在查詢中不使用$變量,如果是的話,爲什麼。 –

回答

2

像其他人一樣,你想使用PDO來防止SQL注入。假設有意圖的用戶在您網站的輸入框中輸入類似';drop table students;--的內容。沒有PDO,最終的查詢將是這樣的:

SELECT name FROM students WHERE sex = '';drop table students;--'

看看會發生什麼呢? select聲明會運行並且找不到任何結果(除非您的表中沒有指定性別的學生)。然後,將運行drop語句,並且您的整個學生表將被刪除。

這只是一個例子 - 有各種SQL注入攻擊,其中許多都比這更危險。使用PDO幾乎可以防止所有這些問題。在內部,綁定變量與查詢本身保持分離。

2

的主要原因是使用準備好的語句,你保護自己免受用於SQL注入攻擊中最常見的載體綁定變量。

第二個原因是,如果您有多重請求來運行相同的查詢語句,但具有不同的變量值,則可以通過僅讓服務器計算一次執行計劃,然後在您的變量上運行它來節省時間一遍又一遍地調用相同的語句。考慮幾次循環相同的語句。這是mysql允許和PDO支持的服務器預處理語句的概念。

相關問題