PHP和mySQL单引号还是双引号?

时间:2011-05-04 02:42:01

标签: php mysql sql

我认为使用单引号或双引号没有任何区别。什么时候或为什么我应该使用第一个而不是后者?

我已经阅读了一些针对SQL的地方我应该使用单身 - 为什么?

5 个答案:

答案 0 :(得分:6)

您应该使用单引号和mysql_real_escape_string的组合,或者进入PDO

mysql_real_escape_string将负责清理您要存储在数据库中的任何不干净的变量,单引号将阻止其中的任何执行。

以下是一个例子:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

PDO的例子:

$dbh = new PDO('mysql:dbname=your_database;host=your_host', $user, $password);
$stmt = $dbh->prepare('SELECT * FROM users WHERE user = :username AND password = :password');
$stmt->execute(array('username' => $user, 'password' => $password)); 

如果您没有正确清理要存储的数据,则可能会遭受SQL注入。

例如普通查询

SELECT * FROM users WHERE user = 'test'

注入查询:

SELECT * FROM users WHERE user = 'anything' OR 'x'='x'

另一个例子:

SELECT * FROM users WHERE user = ' '; DROP TABLE users

More about SQL injection attackSQL injection preventionMySQL Injection

Why you should be using php's PDO for database access

答案 1 :(得分:2)

使用更方便或更方便的方法。如果它们对你来说都是一样的话,那么单引号就更容易了,至少是理论上的。

如果查询是从例如PHP生成的,则单引号更方便编写SQL查询,因为双引号允许PHP表达式替换变量。

$query = "SELECT * FROM $sometable WHERE somefield = '1'";

根据PHP规则,单引号(如果使用它们)会阻止$sometable的扩展。

至于理论上的可移植性,我使用过Oracle,MySQL,MS Sql服务器,SQL Lite和一些本土版本的口味,并且从来没有出现任何引号字符的问题。

答案 2 :(得分:2)

如果您的MySQL服务器使用--ansi标志运行,那么""引号将停止工作。 SQL字符串必须用'单个'引号括起来。

或者更具体地说,双引号实际上就像反引号一样。它们可用于列名:

SELECT "colum&name", `x&y` FROM "fictional-query"
 WHERE strcolumn = 'text' OR "column&name" = 'string'

如果mysqld没有在ansi兼容模式下运行,那么同样会失败。只有这样,双引号才相当于字符串的单引号。这就是他们应该避免的原因。

答案 3 :(得分:1)

单引号在PHP中更具限制性。例如,单引号不允许在字符串内部替换变量。

$myval = "world";
echo "Hello $myval";   // produces "Hello world"
echo 'Hello $myval';   // produces "Hello $myval"

另外,你会认为,由于单引号更严格,它们也会更有效率,但事实并非如此。 PHP字符串操作性能是一个有趣(并且记录在案)的事物as seen here

答案 4 :(得分:1)

用双引号括起来的字符串是PHP脚本中最常用的字符串,因为它们提供了最大的灵活性。这是因为将相应地解析变量和转义序列。

当字符串应完全按照所述解释时,将字符串括在单引号内非常有用。这意味着解析字符串时不会解释变量和转义序列。

当你的mysql语法中有单引号时,双引号就派上用场了

$query = "SELECT * FROM tableName WHERE columnName = '{$value}'";