使用单引号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以外的数据库一起使用!
答案 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的明显警告,但是如果使用参数化查询,至少你没有不同的字符串需要转义的字符串。