在MySQL中,我們可以使用占位符的方式傳遞參數給SQL語句,這種方式可以有效的防止SQL注入攻擊。
// 使用占位符的SQL語句 SELECT * FROM users WHERE id = ? AND name = ? // 使用普通的SQL語句 SELECT * FROM users WHERE id = 1;DROP TABLE users; --
上面的例子中,第一個SQL語句使用了占位符,可以把參數傳遞給語句;而第二個SQL語句則存在SQL注入攻擊的風險,因為攻擊者可以通過在輸入框中輸入類似于"1;DROP TABLE users; --
"等惡意代碼來攻擊數據庫。
除了占位符,還有兩種類似的方式可以傳遞參數給SQL語句,分別是命名占位符和問號占位符。
// 命名占位符 SELECT * FROM users WHERE id = :id AND name = :name // 問號占位符 SELECT * FROM users WHERE id = ? AND name = ?
這些占位符的好處在于通常可以預編譯SQL語句,在多次執行同一SQL語句時,就不需要再次解析SQL語句,提高了SQL執行效率。
在PHP中,可以使用PDO或mysqli擴展庫來使用這些占位符。下面是使用PDO的例子:
// 使用PDO預處理占位符的SQL語句 $stmt = $dbh->prepare("SELECT * FROM users WHERE id = ? AND name = ?"); $stmt->execute([1, 'Tom']); while ($row = $stmt->fetch()) { // 處理結果集 }
在上面的例子中,$dbh是PDO類的對象,它提供了execute()方法來傳遞參數,第一個參數是一個數組,它的元素會被依次綁定到占位符上。
總之,使用占位符可以確保SQL語句的安全性,而且有利于提高SQL執行效率。