所有mySQL查询都有mysql_real_escape_string?

时间:2010-04-19 23:00:52

标签: php mysql

mysql_real_escape_string是否应该替换addslashes()和stripslashes()??

ie ..我是否使用它来编码MySQL插入的表单输入变量,以及在MySQL select语句中使用它来代替stripslashes?

此致 困惑的PHP菜鸟

6 个答案:

答案 0 :(得分:6)

如果您使用常规的MySQL driver module用于PHP,那么是的,mysql_real_escape_string()是可行的方法。实际上,您可以完全忽略addslashes()stripslashes()

您的查询创建将如下所示:

$sql = "INSERT INTO tbl (x) VALUES '".mysql_real_escape_string($x)."'";

mysql_real_escape_string()应该用于进入查询的任何用户输入。请注意,在插入数据之前,您不希望以任何其他方式转义 。您不应该使用addslashes()htmlentities(),这是将HTML片段存储在数据库中时常见的错误。检索后,您不需要以任何方式取消数据。

正如其他海报所提到的,PHP还有其他MySQL数据库驱动程序模块,包括PDOMySQLi。两者都提供称为预准备语句的功能,这是创建处理转义的查询的另一种方法。

答案 1 :(得分:3)

我建议改用PDOprepared statements;请参阅PDOStatement课程。准备好的语句可以更有效(如果引擎不必重新解析SQL)。它们还应该防止您意外地将转义数据存储在db(双重转义)中。使用PDO可以更轻松地添加对other databases的支持。

答案 2 :(得分:2)

是的,它应该为你做所有反斜杠(基于mysql服务器的任何字符集)

答案 3 :(得分:1)

是的,它应该转义字符串以准备在MySQL中使用。但是,避免SQL注入并不是最重要的。事实上它确实让你非常容易受到影响。

最好使用PHP PDO代替参数化查询;)

答案 4 :(得分:1)

我建议使用prepared statements。这样你就不会有手动转义每个查询的麻烦。

$stmt = $db->prepare("SELECT stuff FROM table WHERE something = ?");
$stmt->execute('s', 'something'); // s means string

另一种选择是使用PDO,这是一个更好的版本,并且通常与数据库无关。

答案 5 :(得分:1)

http://php.net/manual/en/function.mysql-real-escape-string.php

您不想使用addslashes()stripslashes()。如果我没记错的话,mysql_real_escape_string()addslashes()更相似,但它会逃脱不同的角色。