4

我想知道是否可以在不首先创建对象实例来应用函数的情况下转义字符串(使用 real_escape_string)?

即,我们可以这样做:

$database = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$database->real_escape_string($query);
$database->query($query)

等等

但是,为了在我的应用程序中保持一致性,我试图做的是拥有一个主要是静态的数据库类,它是 MySQLi 类的扩展,这样我就可以调用:database::real_escape_string($query),一个静态方法。

我确实意识到我可以构建一个在没有 MySQL 的情况下手动转义字符串的函数。

4

2 回答 2

8

最简洁的答案是不。

长答案是:嗯,不推荐,原因很简单——MySQLi 的真正转义考虑了字符编码,因为某种 SQL 注入技术使用和滥用字符编码来绕过常见的过滤器。这要求代码知道原始 (PHP) 字符集和接收 (MySQL) 字符集配置。这就是为什么它不能被静态调用(并且在你拥有到服务器的有效链接之前不能被调用)!

我也会避免它的程序版本,因为它只是通过有效地获取您连接到的最后一个服务器来完成“charset”位,一旦您处理多个数据库,这可能会导致有趣的东西同时连接。

于 2012-11-17T22:11:40.553 回答
1

mysql_real_escape_string() 可能会对您有所帮助,但您必须在两个版本中建立连接。原因是应用程序不知道如何为数据库转义字符串。当连接到数据库时,该函数会询问数据库如何转义以及转义什么。

于 2012-11-17T22:10:55.970 回答