// 使用占位符的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执行效率。