PHP双引号中的单引号

PHP双引号中的单引号,php,quotes,double-quotes,Php,Quotes,Double Quotes,我有一个问题,为什么在准备insert语句时在双引号中使用单引号。我的理解是可变的,双引号将得到解释。带有单引号的变量将不会被解释 $var1 = 5; print "$var1"; //output value 5 $var2 = 'jason'; print '$var2'; //output $var2 我不知道为什么在下面代码的值部分使用单引号。 请给我解释一下。谢谢 $first_name = $_POST['first_name']; $first_name = trim($fir

我有一个问题,为什么在准备insert语句时在双引号中使用单引号。我的理解是可变的,双引号将得到解释。带有单引号的变量将不会被解释

$var1 = 5; print "$var1"; //output value 5
$var2 = 'jason'; print '$var2'; //output $var2
我不知道为什么在下面代码的值部分使用单引号。 请给我解释一下。谢谢

$first_name = $_POST['first_name'];
$first_name = trim($first_name);
$last_name = $_POST['last_name'];

$stmt = $con->prepare("insert into reg_data (first_name, last_name) 
                       values('$first_name', '$last_name')");

原因:单引号用于获取最终查询,如:

将值('Bogdan'、'Burim')插入注册表数据(名字、姓氏)

一般来说,这是个坏主意


SQL注入是可能的。

原因:单引号用于获取最终查询,如:

将值('Bogdan'、'Burim')插入注册表数据(名字、姓氏)

一般来说,这是个坏主意


SQL注入是可能的。

引号的使用是正确的,但准备好的语句使用不正确-代码易受攻击!相反,请在查询中使用占位符(不带引号),并稍后传入实际值,如中所示:


您使用的引号是正确的,但您使用的语句不正确-您的代码易受攻击!相反,请在查询中使用占位符(不带引号),并稍后传入实际值,如中所示:


单引号实际上是SQL的单引号。SQL变成:

将值('bob'、'bobowitz')插入注册表数据(名字、姓氏)


SQL中的文字值需要用单引号括起来。

单引号实际上是SQL的单引号。SQL变成:

将值('bob'、'bobowitz')插入注册表数据(名字、姓氏)


SQL中的文字值需要用单引号括起来。

单引号是SQL语句的分隔符,与PHP无关。它们告诉MySQL字段的值从何处开始,在何处停止

考虑这一点:

SELECT * FROM mytable WHERE field=new order by name desc
查询应该限制where
字段
=“按名称描述新订单”还是应该限制where
字段
=“新建”,然后按“名称”字段降序排列结果

引文明确了这一点:

SELECT * FROM mytable WHERE field='new order by name desc'
此外:这就是您应该在MySQL中转义值的原因。如果用户键入
”或1=1--
输入用户名字段,您的身份验证查询为:

SELECT * FROM users WHERE username = '$_POST['username']' AND password = '$_POST['password']'
你最终会得到:

SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd'
SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd'
这是有效的SQL,将选择表中的所有用户(因为来自
$\u POST['username']
的输入已使查询的其余部分被注释掉。但是,如果您正确地转义值,您将得到:

SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd'
SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd'
这意味着MySQL将查找具有
用户名
=
\'或1=1--
和匹配密码的用户。您可以使用简单的
mysqli\u real\u escape\u字符串
进行转义,但始终建议使用PDO和参数化查询


在任何web应用程序中使用数据库之前,我强烈建议您先阅读一些关于PDO、参数和SQL注入的教程。稍后您会感谢自己。

单引号是SQL语句的分隔符,与PHP无关。它们告诉MySQL字段的值从何处开始,从何处停止

考虑这一点:

SELECT * FROM mytable WHERE field=new order by name desc
查询应该限制where
字段
=“按名称描述新订单”还是应该限制where
字段
=“新建”,然后按“名称”字段降序排列结果

引文明确了这一点:

SELECT * FROM mytable WHERE field='new order by name desc'
此外:这就是您应该在MySQL中转义值的原因。如果用户在用户名字段中键入
”或1=1;--
,您的身份验证查询是:

SELECT * FROM users WHERE username = '$_POST['username']' AND password = '$_POST['password']'
你最终会得到:

SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd'
SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd'
这是有效的SQL,将选择表中的所有用户(因为来自
$\u POST['username']
的输入已使查询的其余部分被注释掉。但是,如果您正确地转义值,您将得到:

SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd'
SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd'
这意味着MySQL将查找具有
用户名
=
\'或1=1--
和匹配密码的用户。您可以使用简单的
mysqli\u real\u escape\u字符串
进行转义,但始终建议使用PDO和参数化查询


在任何web应用程序中使用数据库之前,我强烈建议您先通读一些关于PDO、参数和SQL注入的教程。稍后您会感谢您自己。

声明他们的答案的人非常技术性,可能会给出非常具体的答案,说明在查询中使用单引号将如何邀请SQL注入。但正如您所问的那样为什么您应该在查询中使用单引号我将尝试用一个例子来解释您

使用静态值进行查询:

insert into reg_data (first_name,last_name)values('fn_value','ln_value');

您不能从值部分删除单引号,因为如果这样做,您将得到mysql的一个错误,因为值是字符串。因此,要在db中插入带有变量的字符串值,您必须将这些变量放在单引号中,并避免mysql错误。

声明答案的人非常专业,可能会给出非常具体的答案w在查询中使用单引号将导致SQL注入。但是,当您询问为什么在查询中使用单引号时,我将尝试用一个示例来解释您

使用静态值进行查询:

insert into reg_data (first_name,last_name)values('fn_value','ln_value');

您不能从值部分删除单引号,因为如果这样做,您将得到mysql的错误,因为值是字符串。因此,要在db中插入带有变量的字符串值,您必须将这些变量放在单引号中,并避免mysql错误。

因为如果mysql不是一个数字,因为您没有解析va,那么它将出错。

'
中的值。这就像创建一个如下的PHP字符串:
$myvar=mytext
,但它不起作用。请注意,您准备错误,仍然很容易受到SQL注入的攻击。您搜索过stackoverflow吗?不应该在那里使用单引号。您应该使用占位符和绑定变量。事实上