双引号内的PHP单引号

时间:2013-02-20 13:23:26

标签: php quotes double-quotes

我怀疑在准备插入语句时为什么应该在双引号中使用单引号。我的理解是可变的,双引号将被解释。带单引号的变量不会被解释。

$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')");

5 个答案:

答案 0 :(得分:4)

您对引号的使用是正确的,但您错误地使用了预准备语句 - 您的代码容易受到SQL injection的攻击!相反,在查询中使用占位符(不带引号),稍后传入实际值,如the example中所示:

$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)");
$stmt->execute(array(':first_name' => $first_name, ':last_name' => $last_name));

答案 1 :(得分:2)

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

insert into reg_data (first_name, last_name) values('bob', 'bobowitz')

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

答案 2 :(得分:1)

为什么:单引号用于获取最终查询,如:

insert into reg_data (first_name, last_name) values('Bogdan', 'Burim')

一般都是坏主意。

可以进行SQL注入。

答案 3 :(得分:0)

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

考虑一下:

SELECT * FROM mytable WHERE field=new order by name desc

查询是否应该限制field ="新订单名称desc"或者它应该限制field ="新"然后通过" name"来排序结果。字段按降序排列?

引号明确指出:

SELECT * FROM mytable WHERE field='new order by name desc'

此外:这就是你应该在MySQL中转义你的值的原因。如果用户在您的用户名字段中键入' OR 1 = 1; --,则您的身份验证查询为:

SELECT * FROM users WHERE username = '$_POST['username']' AND password = '$_POST['password']'

你最终得到:

SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd'

哪个是有效的SQL并将选择表中的所有用户(因为来自$_POST['username']的输入已将查询的其余部分注释掉。但是,如果您正确地转义了值,则最终得到:

SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd'

这意味着MySQL会查找具有username = \' OR 1 = 1 --和匹配密码的用户。您可以使用简单的mysqli_real_escape_string进行转义,但始终建议使用PDO和参数化查询。

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

答案 4 :(得分:0)

提出答案的人是非常技术性的,可能会给出非常具体的答案,如何在查询中使用单引号来邀请SQL注入。但是当你问为什么你应该在查询中使用单引号时,我会尝试用一个例子来解释你。

使用静态值查询:

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

你不能从值部分删除单引号,就好像你会这样做你会得到mysql的错误,因为值是字符串。所以要在db中插入带有变量的字符串值,你要将这些变量放在单引号中,以避免mysql错误。