【问题标题】:PHP - Single quotes or double quotes around SQL query?PHP - SQL 查询周围的单引号或双引号?
【发布时间】:2011-08-29 00:49:46
【问题描述】:

在整个 SQL 查询中使用单引号与使用双引号有什么不同吗?

哪个更好:

这种方法(带单引号):

    $username = mysql_real_escape_string($username);
    $password = mysql_real_escape_string($password);

    $sql = 'SELECT * FROM users WHERE username = "' . $username . '" AND password = "' . $password . '" LIMIT 1';

?

或者这种方法(使用双引号):

    $username = mysql_real_escape_string($username);
    $password = mysql_real_escape_string($password);

    $sql = "SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}' LIMIT 1";

有没有更好的方法来做到这一点?

对我来说,我喜欢第一种方法,因为我总是更喜欢 PHP 中的单引号。所以我想确保在整个 SQL 查询中使用单引号是可以的,在变量或数据周围使用双引号是可以的,并且是跨平台的,并且可以与 MySQL 以外的数据库一起使用!

【问题讨论】:

  • 我可能弄错了,但我记得插值(您的第二种方法)比串联(您的第一种方法)更快
  • 由于对SQL Injection attacks 的敏感性,两者都不是推荐的做法。强烈建议使用 PDO 或准备好的语句。
  • @OMG Ponies:即使他们使用的是mysql_real_escape_string?
  • 唯一的区别是其中一件事比另一件事花费更少的精力。虽然 MySQL 是宽容的(取决于配置!),但只有单引号可用于在 SQL 中包含字符串。

标签: php mysql sql


【解决方案1】:

使用PDO 而不是这些方法中的任何一种。它将允许您使用参数而不是字符串。

$sth = $dbh->prepare('SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1');
$sth->bindParam(':username', $username, PDO::PARAM_STR);
$sth->bindParam(':password', $password, PDO::PARAM_STR);
$sth->execute();

顺便说一句,请确保您没有同时使用纯文本密码。

【讨论】:

  • 感谢您的回答。一件事,你能向我解释一下“确保你没有同时使用纯文本密码”是什么意思吗?我不明白你的意思(可能是因为我太困了,我的大脑几乎停止思考!)。
  • @XO39,您提供的示例暗示您以人们输入密码的方式存储密码。这是不好的!您永远不应该以纯文本形式存储密码。您应该始终通过带盐的单向加密函数传递它们。因此,如果有人访问您的数据库,您并没有让他们访问所有地方的每个人的帐户。见:stackoverflow.com/questions/1581610/…
  • 再次感谢您的帮助。我知道,我只想知道哪种语法/代码更好。再次感谢! :)
【解决方案2】:

它们都同样可怕。 :) 忘记你曾经听说过 mysql_real_escape_string 并使用 PDO 作为 acrosman 提到的。具体看prepare语句:http://www.php.net/manual/en/pdo.prepare.php。正如您甚至说的那样,这一点尤其重要:“是跨平台的,可以与 MySQL 以外的数据库一起使用!”不是想表现得像个混蛋,而是提示:调用以 mysql_ 开头的方法的代码可能不是跨平台的;)。但是,使用 PDO,允许您使用 Mysql 以外的数据库。当然,这里有不同风格的 sql 的明显警告,但如果使用参数化查询,至少你没有不同风格的字符串需要转义。

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2012-10-14
    • 2014-12-27
    • 1970-01-01
    • 2011-06-02
    • 2013-02-05
    • 2018-11-15
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多