一个原因是转义只能保护带引号的字符串文字。例如(我将使用伪代码,因为您没有引用任何特定的编程语言):
$escapedName = EscapeString("O'Reilly")
$sql = "SELECT * FROM MyTable WHERE name = '$escapedName'"
在上面的例子中,撇号应该被转义,所以它会变成WHERE name = 'O\'Reilly',因此可以安全地插入到 SQL 查询中而不会导致任何错误。
但是,数字不需要在 SQL 中引用,并且转义包含撇号的字符串不会做正确的事情:
$escapedId = EscapeString("123'456")
$sql = "SELECT * FROM MyTable WHERE id = $escapedId"
这将导致WHERE id = 123\'456 仍然是一个错误。
您可能会说,“将数字放在单引号中”,但这并不总是可行的,例如 MySQL 中的 LIMIT 子句需要实整数,而不是包含数字的引号字符串。
除了上述问题之外,使用参数而不是使用转义来编写代码只是更容易!
例如,您可以编写如下代码:
$sql = "INSERT INTO mytable (col1, col2, col3, col4, col5, col6)
VALUES ('" . mysqli_real_escape_string($_POST['col1']) . "', "
. $mysqli->real_escape_string($_POST['col2']) . "', '"
. $mysqli->real_escape_string($_POST['col3']) . "', '"
. $mysqli->real_escape_string($_POST['col4']) . ", '"
. $mysqli->real_escape_string($_POST['col5']) . "', '"
. $mysqli->real_escape_string($_POST['col6']) . "')";
你能找出错误吗?有足够的时间,我相信你可以。但它会减慢您的编码速度,并可能在您寻找缺少的引号字符和其他错误时让您的眼睛疲劳。
但是写这篇文章要容易得多,之后也更容易阅读:
$sql = "INSERT INTO mytable (col1, col2, col3, col4, col5, col6)
VALUES (?, ?, ?, ?, ?, ?)";
查询参数对于更多数据类型是安全的,它们可以帮助您更快地编写代码,减少错误。这是一个巨大的胜利。