PHP - SQL查询周围的单引号或双引号?

时间:2011-08-29 00:49:47

标签: php mysql sql

使用单引号VS是否有任何差异。在整个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以外的数据库一起使用!

2 个答案:

答案 0 :(得分:10)

使用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();

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

答案 1 :(得分:3)

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