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以外的数据库!
使用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
@Amir Raminfar:感谢您编辑链接。 – XO39
@ 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的明显警告,但至少你没有不同的风格,如果你使用参数化查询,那么需要转义的字符串。
我可能会误会,但我记得插值(你的第二种方法)比连接(你的第一种)更快 – Phil
由于[SQL注入攻击](http://xkcd.com/327/)的易感性, 。强烈建议PDO或准备好的声明。 –
@OMG小马:即使他们使用'mysql_real_escape_string'? – icktoofay