我已經完成了我的研究,並決定在我的查詢中使用準備好的語句,我只是問是否有任何我應該知道的事情,關於切換到正常的mysqli查詢以準備好語句的好壞。在正常的mysqli語句中使用預處理語句的優點?
此外,我不明白如何不需要轉義壞字符的需要?
我已經完成了我的研究,並決定在我的查詢中使用準備好的語句,我只是問是否有任何我應該知道的事情,關於切換到正常的mysqli查詢以準備好語句的好壞。在正常的mysqli語句中使用預處理語句的優點?
此外,我不明白如何不需要轉義壞字符的需要?
轉義壞字符仍然需要,但是庫會自動爲您綁定的所有參數自動執行。它只是稍微方便一些,並且可以防止程序員忘記清理值。
但是,請注意,此自動功能僅限於參數!
下面的查詢是安全的,因爲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();
表示,不應該使用如本例中所示的動態表名稱。但是問題是:即使參數化查詢也要小心!
我能想到的唯一不足就是你不能再看到最後的查詢來進行調試(因爲它只在服務器端進行組裝)。
至少有兩個優點:
我總是有問題要問你的第二點 - >準備一次,多次執行的PHP文件相同的執行被限制或也適用於未來的執行 – 2016-03-30 05:49:42
?
未命名,或:name
命名)插入的值自動引用。大多數人會混淆準備好的語句和佔位符。
使用佔位符的一般想法非常棒,而預準備語句只是功能有限的佔位符的子集。
佔位符是偉大的,因爲:
至於大家都在談論的性能問題,大部分時間準備語句比普通查詢慢。然而,在這兩種情況下,這種差異都是不明顯的。
按說逃逸仍然需要人品不好,我假定你的意思任何不會自動執行的字符? – Basic 2011-04-14 11:21:28
@基本否,對於作爲參數添加的常規數據,不需要任何額外的轉義。圖書館將照顧一切。什麼參數化查詢*不能*處理是動態表和列名,但人們通常不應該使用那些擺在首位 – 2011-04-14 11:23:45
@Pekka웃是能夠製備表名? – 2014-03-19 21:13:07