2009-12-12 65 views
5

任何人都可以給我舉例說明如何使用MySQL/PHP的參數化查詢嗎?參數化查詢的例子

+2

http://www.google.com.au/search?hl=en&source=hp&q=+MySQL++parameterized+queries&meta=&aq=f&oq= – 2009-12-12 17:05:29

回答

8

參數化查詢本質上是抽象了所有輸入的查詢。這有幾個好的副作用,比如使所有輸入無害(即不會有害注入是可能的),並且在重複使用時使其更快,因爲它是預分析和編譯的,所以引擎知道如何應用所給出的輸入。在純MySQL的一個例子是:

PREPARE qry FROM "INSERT INTO tbl VALUES (?)"; 

語句現在被編譯和緩存,可以無需重新編譯和解釋它多次執行:

SET @var = "some input"; 
EXECUTE qry USING @var; 
SET @var = "some other input"; 
EXECUTE qry USING @var; 

當在PHP中使用,它通常像此(縮短):

$stmt = prepare('INSERT INTO tbl VALUES(?)'); 
execute($stmt, array("some input")); 
execute($stmt, array("some other input")); 
execute($stmt, array("some more input")); 
+0

我不完全理解這是如何停止SQL注入的。我並不懷疑它的確存在,但你能否進一步解釋它? – 2010-05-19 04:01:18

+2

因爲查詢是在任何參數放入之前預先編譯的。即使有一個參數是「DELETE FROM stuff」,或者類似的東西,它只會插入到編譯語句所說的任何地方,作爲一個完整的字符串,它不會通過解析器,因爲主語句已經被解析過了,你可以把它和'eval()'比較一下,比如''eval(「new Class($ data);」)''將數據看作是'); delete_all_my_files('。預編譯語句基本上意味着你避免了「eval」問題。 – 2010-05-19 10:34:40

4
PREPARE stmt_name FROM "SELECT name FROM Country WHERE code = ?"; 

SET @test_parm = "FIN"; 

EXECUTE stmt_name USING @test_parm; 

來源:MySQL Dev: Prepared Statements