1

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

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

5 回答 5

4

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

$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));
于 2013-02-20T13:26:17.070 回答
2

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

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

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

于 2013-02-20T13:26:41.310 回答
1

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

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

一般是坏主意。

SQL注入是可能的。

于 2013-02-20T13:25:39.773 回答
0

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

考虑一下:

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

查询应该限制 where field= "new order by name desc" 还是应该限制 where field= "new" 然后按 "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 注入的教程。以后你会感谢自己的。

于 2013-02-20T13:26:53.590 回答
0

那些说他们的答案的人非常技术性,并且可能会给出非常具体的答案,在查询中使用单引号将如何导致 SQL 注入。但是当你问为什么你应该在查询中使用单引号时,我会试着用一个例子来解释你。

使用静态值查询:

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

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

于 2013-02-20T13:37:40.700 回答