0

有问题的声明是:

$sql="SELECT * FROM user WHERE id = '".$q."'";

其中 q 是一个整数。当您可以像这样键入时,为什么要那样键入

$sql="SELECT * FROM user WHERE id = $q"; 

因为它是一个整数,所以它不应该需要正确的引号,或者即使它确实需要引号,为什么不只是一对。有什么意义'".$var_name."'

4

2 回答 2

2

它不需要任何'', 但结合*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 注入。

于 2013-07-26T21:57:05.820 回答
0

首先,双引号的存在是因为使用了连接;以下两个语句是等价的:

$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));
于 2013-07-26T22:03:09.773 回答