PHP - 单引号或双引号SQL查询?

问题描述:

使用单引号VS有什么区别。在整个SQL查询中使用双引号?PHP - 单引号或双引号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

我可能会误会,但我记得插值(你的第二种方法)比连接(你的第一种)更快 – Phil

+3

由于[SQL注入攻击](http://xkcd.com/327/)的易感性, 。强烈建议PDO或准备好的声明。 –

+0

@OMG小马:即使他们使用'mysql_real_escape_string'? – icktoofay

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

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

+0

感谢您的回答。有一件事,你能向我解释你的意思是“确保你没有同时使用纯文本密码”吗?我不明白你的意思(也许是因为我太困了,脑子几乎停止思考!)。 – XO39

+1

@Amir Raminfar:感谢您编辑链接。 – XO39

+0

@ XO39,您提供的示例暗示您以人们输入密码的方式存储密码。这不好!你不应该以纯文本存储密码。您应该始终通过带盐的单向加密函数传递它们。所以如果有人访问你的数据库,你并没有让他们访问所有地方的每个人的账户。请参阅:http://*.com/questions/1581610/how-can-i-store-my-users-passwords-safely – acrosman

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