2011-05-04 252 views
2

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

我读过一些地方,对于SQL我应该使用单身 - 为什么?

+0

很确定SQL中的ANSI标准是单引号。寻找一个参考 – Phil 2011-05-04 02:45:31

+0

可能重复[在SQL中的单引号和双引号之间的区别是什么?](http://stackoverflow.com/questions/1992314/what-is-the-difference-between-single-and-double -quotes-in-sql) – 2011-05-04 02:45:42

+0

@Phil Brown:ANSI-92支持对象名称的双引号 - 大多数数据库都支持双引号,以便指定非标准字符。 – 2011-05-04 02:47:07

回答

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

+0

忘掉整套“mysql_ *”函数并移至PDO。 – Phil 2011-05-04 03:03:09

+0

@Phil是的PDO也是另一种安全的方式。 – Prix 2011-05-04 03:03:46

+0

此外,PHP的MySQL扩展可防止执行多个查询,因此“Bobby Tables”用例通常不适用于 – Phil 2011-05-04 03:04:36

2

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

如果正在生成查询从-例如-PHP,然后单引号都比较方便写作的SQL查询,因为双引号允许PHP表达式来代替变量。

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

根据PHP的规则,单引号(如果他们被使用)防止$sometable扩张。

至于理论便携性,我已经使用了Oracle,MySQL和MS SQL服务器,SQL精简版,以及一些本土口味,和从未有过的问题,无论是引号字符。

1

单引号是PHP更加严格。例如,单引号不允许在字符串内部替换变量。

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

此外,你会认为,由于单引号更严格,他们也会更有效,但事实并非如此。 PHP字符串操作的表现是一个有趣的(和记录)的事情as seen here

1

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

当字符串应完全按照陈述进行解释时,在单引号内包含一个字符串非常有用。这意味着当解析字符串时,变量和转义序列都不会被解释。

双引号派上用场,当你在你的MySQL语法

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

这是来自一本书,认为它可能有帮助 – Brett 2011-05-04 02:55:02

+2

PHP与SQL有什么关系? – 2011-05-04 03:11:58

+0

除了PHP在标题中,我假设你正在用PHP写你的查询。我会添加到我的答案... – Brett 2011-05-04 03:15:54

2

单引号如果你的MySQL服务器与--ansi标志运行,则"双引号"将停止工作。 SQL字符串必须包含在单引号'中。

或更具体地说,双引号实际上表现得像反引号。它们可以用于列名称:

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

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