Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用php访问SQL时,为什么要输入像'&引用$q、 "';而不仅仅是$q或“q”$q";_Php_Sql_Variables_Quotations - Fatal编程技术网

在使用php访问SQL时,为什么要输入像'&引用$q、 "';而不仅仅是$q或“q”$q";

在使用php访问SQL时,为什么要输入像'&引用$q、 "';而不仅仅是$q或“q”$q";,php,sql,variables,quotations,Php,Sql,Variables,Quotations,有关声明如下: $sql="SELECT * FROM user WHERE id = '".$q."'"; 其中q是一个整数。既然你可以这样打,为什么还要这样打呢 $sql="SELECT * FROM user WHERE id = $q"; 因为它是一个整数,所以不需要正确的引号,或者即使它需要引号,为什么不只需要一对呢。“$var\u name.”“”的意义是什么?它不需要任何”,但结合*real\u escape\u string,要使其有效,您需要这些单引号 因为如果用户输入为

有关声明如下:

$sql="SELECT * FROM user WHERE id = '".$q."'";
其中q是一个整数。既然你可以这样打,为什么还要这样打呢

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

因为它是一个整数,所以不需要正确的引号,或者即使它需要引号,为什么不只需要一对呢。
“$var\u name.”“
”的意义是什么?

它不需要任何
,但结合
*real\u escape\u string
,要使其有效,您需要这些单引号

因为如果用户输入为:
1或1=1
,则查询为:

SELECT * FROM user WHERE id = 1 OR 1 = 1
什么可以选择整个表

但如果将单引号与
*real\u escape\u string
一起使用,且用户输入为
1'或'1'='1
,则查询将为:

SELECT * FROM user WHERE id = '1\' OR \'1\' = \'1'
what不会选择整个表,而只选择一个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\uu
函数):


或者你可以准备一下。您不需要在查询中包含变量。+1,另一种没有prepare的方法是
intval
或一些奇怪的技术。是的,我有时使用
(int)
看起来更干净的方法。但我喜欢太多的单引号,而不是不够;-)嘿,谢谢你帮我,但我还是个初学者,我还是不太懂。如果我能得到一个更详细的解释,好吗?@ USER 262476我会考虑阅读手册中的这篇文章:我只是做了,我仍然不明白所有这些。id=1或1=1的位置如何显示整个表格?它不是必须在id=1、2或3的位置吗。。。?引用名言如何真正防止这种情况?它会说,“.1或1=1。”?这将如何防止任何事情?我真的是个新手,我一直在w3schools网站上学习,但几乎没有提到这一点。
$sql = sprintf("SELECT * FROM user WHERE id = '%s'", mysql_real_escape_string($q));