【发布时间】:2010-02-18 12:59:00
【问题描述】:
我刚刚看了下面的代码,但不明白为什么有 " 和 ' 使用。谢谢!
$sql='SELECT uid,name FROM users WHERE user="'.mysql_real_escape_string($_POST['login_name']).'" AND ..
【问题讨论】:
我刚刚看了下面的代码,但不明白为什么有 " 和 ' 使用。谢谢!
$sql='SELECT uid,name FROM users WHERE user="'.mysql_real_escape_string($_POST['login_name']).'" AND ..
【问题讨论】:
不应该。
“正确的”$sql 可能如下所示:
$sql="SELECT uid,name FROM users WHERE user='".mysql_real_escape_string($_POST['login_name'])."';
你在 SQL 中使用 ' 来表示它是一个字符串/文字。
我建议你看看prepared statements,我不相信mysql_real_escape_string 也不相信mysql_very_real_seriously_this_is_the_real_escape_string,php-syndrome 是不值得相信的。
【讨论】:
这是一个用于编写 SQL 查询(并将其存储在字符串中)的 PHP 程序。
目标 SQL 如下所示:
SELECT uid,name FROM users WHERE user="something" AND …
所以用 PHP 术语来说:
$foo = 'SELECT uid,name FROM users WHERE user="something" AND …'
但是您想用动态数据替换“某物”。在这种情况下,发布的 login_name ——但对 MySQL 来说是安全的。
$foo = 'SELECT uid,name FROM users WHERE user="' .
mysql_real_escape_string($_POST['login_name']) .
'" AND …'
更好的方法是使用prepared statements。
【讨论】:
单引号包围 SQL 语句 ("SELECT..."),双引号包围字段 "user" 的数据(尽管我会反过来使用引号)。
查询看起来像这样(使用单引号):
SELECT uid FROM users WHERE user='snake'
要将此查询分配给变量 $sql,您必须将其括在引号中,这次使用双引号,因此 PHP 不会假设字符串将在 'snake' 之前结束:
$sql = "SELECT uid FROM users WHERE user='snake'";
由于您不会总是静态地询问“snake”,因此您可以用动态名称交换“snake”,再次使用双引号退出/输入 $sql 字符串:
$sql = "SELECT uid FROM users WHERE user='" . $dynamic . "'";
如果您只想要一种引号,则必须转义包含用户字符串的引号。
【讨论】:
" 将包含在最终的 mysql 请求中,因此发送到 mysql 数据库的请求将是:
SELECT uid,name FROM users WHERE user="loginname" AND ..
【讨论】:
单引号用于在 PHP 中定义字符串。两个分隔符在 SQL 查询中分隔您的文本字段 (login_name)。
这样做是为了避免转义查询的引号(如果使用相同的话)。
【讨论】:
您可以使用单引号或双引号来包装 php 中的字符串。不过还是有区别的。
使用单引号字符串,您不能内联变量(例如:$a = 'hi $name'),也不能转义字符(例如:$a = 'hi!\n$name')。
这是一个很好的总结:http://www.jonlee.ca/php-tidbit-single-quotes-vs-double-quotes/
另外附注.. 不确定是否应该使用双引号来封装 SQL 中的字符串。我相信您应该在大多数数据库中使用单引号。
【讨论】:
field)。但是,由于这是 PHP,它可能是一个 MySQL 数据库,并且没有编写 vor 可移植性,所以这无关紧要。
看起来单引号用于 PHP 代码的查询形式,而双引号用于查询本身
在对数据库执行 SQL 之前,您始终可以回显 $sql 值以查看单引号/双引号的外观。
类似:
$sql='SELECT uid,name FROM users WHERE
user="'.mysql_real_escape_string($_POST['login_name']).'";
// Print the SQL
echo $sql."<br />";
【讨论】: