【问题标题】:PHP and mySQL single quote or double quote?PHP和mySQL单引号还是双引号?
【发布时间】:2011-05-04 02:42:00
【问题描述】:

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

我已经阅读了一些关于 SQL 我应该使用单曲的地方 - 为什么?

【问题讨论】:

  • 相当肯定 SQL 中的 ANSI 标准是单引号。寻找参考
  • @Phil Brown:ANSI-92 支持对象名称的双引号 - 大多数数据库支持双引号以指定非标准字符。
  • @OMGPonies 啊,我以为 OP 只指字符串文字
  • @Phil Brown/@OMG Ponies,我很确定他指的是字符串文字,因为对象名称的单引号会导致字符串文字。这根本不是类似的效果。

标签: php mysql sql


【解决方案1】:

您应该使用单引号和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

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

【讨论】:

  • 忘记整套 mysql_* 函数,转而使用 PDO。
  • @Phil 是的,PDO 也是另一种安全的方式。
  • 另外,PHP 的 MySQL 扩展阻止了多个查询的执行,因此“Bobby Tables”用例通常不适用
  • @Phil 这不是一个特定示例,而是 SQL 注入功能的更通用示例。此外,我确实添加了 3 个链接,这些链接不仅显示而且解释了更多关于它是直接来自 php.net 的链接。还在顶部添加了关于 PDO 的链接;)
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    至于理论上的可移植性,我使用过 Oracle、MySQL、MS Sql 服务器、SQL Lite 和一些自产的版本,并且没有遇到过任何一个引号字符的问题。

    【讨论】:

      【解决方案4】:

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

      当字符串应该完全按照说明进行解释时,用单引号将字符串括起来很有用。这意味着在解析字符串时,变量和转义序列都不会被解释。

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

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

      【讨论】:

      • 这是从一本书中摘录的,认为它可能会有所帮助
      • PHP与SQL有什么关系?
      • 除了标题中的 PHP 之外,我假设您正在用 PHP 编写查询。我会补充我的答案...
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-02
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        • 2013-02-07
        • 2013-02-05
        • 2020-02-12
        相关资源
        最近更新 更多