2011-04-14 64 views
1

我已經完成了我的研究,並決定在我的查詢中使用準備好的語句,我只是問是否有任何我應該知道的事情,關於切換到正常的mysqli查詢以準備好語句的好壞。在正常的mysqli語句中使用預處理語句的優點?

此外,我不明白如何不需要轉義壞字符的需要?

回答

5

轉義壞字符仍然需要,但是庫會自動爲您綁定的所有參數自動執行。它只是稍微方便一些,並且可以防止程序員忘記清理值。

但是,請注意,此自動功能僅限於參數!

下面的查詢是安全的,因爲bind_param()採取逃避的護理:

$code = $_GET["code"]; 
$name= $_GET["name"]; 
$percentage= $_GET["percentage"]; 

$stmt = $mysqli->prepare("INSERT INTO items VALUES (?, ?, ?)"); 
$stmt->bind_param('iss', code, $name, $percentage); 
$stmt->execute(); 

下面的查詢是不安全,因爲什麼,你直接放到查詢將不會自動轉義:

$tablename = $_GET["prefix"]."_items"; 
$code = $_GET["code"]; 
$name= $_GET["name"]; 
$percentage= $_GET["percentage"]; 

            ---- UNSAFE! ---- 
$stmt = $mysqli->prepare("INSERT INTO `$tablename` VALUES (?, ?, ?)"); 
$stmt->bind_param('iss', $code, $name, $percentage); 
$stmt->execute(); 

表示,不應該使用如本例中所示的動態表名稱。但是問題是:即使參數化查詢也要小心!

我能想到的唯一不足就是你不能再看到最後的查詢來進行調試(因爲它只在服務器端進行組裝)。

+0

按說逃逸仍然需要人品不好,我假定你的意思任何不會自動執行的字符? – Basic 2011-04-14 11:21:28

+0

@基本否,對於作爲參數添加的常規數據,不需要任何額外的轉義。圖書館將照顧一切。什麼參數化查詢*不能*處理是動態表和列名,但人們通常不應該使用那些擺在首位 – 2011-04-14 11:23:45

+0

@Pekka웃是能夠製備表名? – 2014-03-19 21:13:07

1

至少有兩個優點:

  • 沒有進行轉義值:它的自動完成
  • 的語句是(使用綁定的參數,當然,當)發送到SQL服務器,只准備一次;並且,然後,可以多次執行 - 這是偉大的表演(該語句解析只有一次,即使執行很多次)
+0

我總是有問題要問你的第二點 - >準備一次,多次執行的PHP文件相同的執行被限制或也適用於未來的執行 – 2016-03-30 05:49:42

2
  1. 如果您使用的佔位符準備語句(?未命名,或:name命名)插入的值自動引用。
  2. 準備好的語句由dbms-engine預編譯。所以查詢只被解析一次,稍後調用它只是用值替換佔位符。
2

大多數人會混淆準備好的語句和佔位符。

使用佔位符的一般想法非常棒,而預準備語句只是功能有限的佔位符的子集。

佔位符是偉大的,因爲:

  • 他們是安全的,因爲他們做了一切正確的格式
  • 它們更容易使用,因爲它們自動執行所有正確的格式(不傻「逃跑」!)。
  • 它們很方便,因爲它們只對正確進入查詢的值進行所有正確的格式設置,而不對源變量進行格式設置。

至於大家都在談論的性能問題,大部分時間準備語句比普通查詢慢。然而,在這兩種情況下,這種差異都是不明顯的。