PHP和mySQL单引号或双引号?
您应该使用单引号和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 attack:SQL injection prevention,MySQL Injection
使用哪一个更容易或更方便。如果它们对你来说都是一样的话,那么单引号是更便携的,至少是理论。
如果正在生成查询从-例如-PHP,然后单引号都比较方便写作的SQL查询,因为双引号允许PHP表达式来代替变量。
$query = "SELECT * FROM $sometable WHERE somefield = '1'";
根据PHP的规则,单引号(如果他们被使用)防止$sometable
扩张。
至于理论便携性,我已经使用了Oracle,MySQL和MS SQL服务器,SQL精简版,以及一些本土口味,和从未有过的问题,无论是引号字符。
单引号是PHP更加严格。例如,单引号不允许在字符串内部替换变量。
$myval = "world";
echo "Hello $myval"; // produces "Hello world"
echo 'Hello $myval'; // produces "Hello $myval"
此外,你会认为,由于单引号更严格,他们也会更有效,但事实并非如此。 PHP字符串操作的表现是一个有趣的(和记录)的事情as seen here。
字符串包含在双引号是在PHP脚本中最常用的,因为它们提供了最大的灵活性。这是因为变量和转义序列都将被相应地解析。
当字符串应完全按照陈述进行解释时,在单引号内包含一个字符串非常有用。这意味着当解析字符串时,变量和转义序列都不会被解释。
双引号派上用场,当你在你的MySQL语法
$query = "SELECT * FROM tableName WHERE columnName = '{$value}'";
单引号如果你的MySQL服务器与--ansi
标志运行,则"
双引号"
将停止工作。 SQL字符串必须包含在单引号'
中。
或更具体地说,双引号实际上表现得像反引号。它们可以用于列名称:
SELECT "colum&name", `x&y` FROM "fictional-query"
WHERE strcolumn = 'text' OR "column&name" = 'string'
但是,如果mysqld没有在ansi兼容模式下运行,那么也会失败。只有这样的话,双引号才能相当于字符串的单引号。这就是为什么他们应该避免。
很确定SQL中的ANSI标准是单引号。寻找一个参考 – Phil 2011-05-04 02:45:31
可能重复[在SQL中的单引号和双引号之间的区别是什么?](http://stackoverflow.com/questions/1992314/what-is-the-difference-between-single-and-double -quotes-in-sql) – 2011-05-04 02:45:42
@Phil Brown:ANSI-92支持对象名称的双引号 - 大多数数据库都支持双引号,以便指定非标准字符。 – 2011-05-04 02:47:07