我认为使用单引号或双引号没有任何区别。什么时候或为什么我应该使用第一个而不是后者?
我已经阅读了一些针对SQL的地方我应该使用单身 - 为什么?
答案 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 attack:SQL injection prevention,MySQL Injection
答案 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}'";