有问题的声明是:
$sql="SELECT * FROM user WHERE id = '".$q."'";
其中 q 是一个整数。当您可以像这样键入时,为什么要那样键入
$sql="SELECT * FROM user WHERE id = $q";
因为它是一个整数,所以它不应该需要正确的引号,或者即使它确实需要引号,为什么不只是一对。有什么意义'".$var_name."'
?
有问题的声明是:
$sql="SELECT * FROM user WHERE id = '".$q."'";
其中 q 是一个整数。当您可以像这样键入时,为什么要那样键入
$sql="SELECT * FROM user WHERE id = $q";
因为它是一个整数,所以它不应该需要正确的引号,或者即使它确实需要引号,为什么不只是一对。有什么意义'".$var_name."'
?
它不需要任何''
, 但结合*real_escape_string
, 使其有效,您需要这些单引号。
因为如果用户输入是:1 OR 1 = 1
,那么查询是:
SELECT * FROM user WHERE id = 1 OR 1 = 1
什么会选择整个表。
但是,如果您使用单引号*real_escape_string
并且用户输入是1' OR '1' = '1
,那么查询将是:
SELECT * FROM user WHERE id = '1\' OR \'1\' = \'1'
什么不会选择整个表格,而只会选择一个 id。
tl;dr:它不是必需的,但它使您的代码可以安全地防止 sql 注入。
首先,双引号的存在是因为使用了连接;以下两个语句是等价的:
$sql = "SELECT * FROM user WHERE id = '" . $q . "'";
$sql = "SELECT * FROM user WHERE id = '$q'";
也就是说,整数不需要在 SQL 中引用,所以这很好:
$sql = "SELECT * FROM user WHERE id = $q";
如果$q
尚未清理并且您不希望使用准备好的语句,则可以sprintf()
按以下方式使用:
$sql = sprintf("SELECT * FROM user WHERE id = %d", (int)$q);
在字符串的情况下,我会使用准备好的语句或确保变量被正确转义(以防mysql_
仍然使用不推荐使用的函数):
$sql = sprintf("SELECT * FROM user WHERE id = '%s'", mysql_real_escape_string($q));