mysql_real_escape_string方法确实很慢(接近1秒)

时间:2012-03-19 18:02:57

标签: php mysql sql-injection

我在这里有一个查询(使用Zend Framework在MySQL数据库上的PHP),在SQL语句中使用一个POST参数作为参数。

所以我在我的开发机器上有一个本地XAMPP安装,这个小脚本的运行时间就像是150ms,不管我是否在之前使用或不使用mysql_real_escape_string()传递参数。

然后我确实安装了BitNami-WAMP-Stack的虚拟服务器。当我在那里运行脚本(100%相同的数据库内容)时,如果没有mysql_real_escape_string需要大约260ms,这不是“快”(我知道150ms并不是真的很快)作为我的本地机器但是没关系。但是,如果我只在POST变量中为参数添加一个mysql_real_escape_string(),整个过程需要1.2秒。

我进一步注意到,每次调用mysql_real_escape_string都会使脚本在虚拟服务器上的运行速度慢1秒左右。在我的本地机器上,这没有任何效果。

这怎么可能?这是一个MySQL安装程序或PHP.ini的东西或什么?因为我在两台机器上都有100%相同的数据库和PHP源,我猜它只能是参数化吗?

提前感谢您的帮助!

修改

所以这就是我做的,首先连接数据库(在Bootstrap.php中):

$GLOBALS["db"]= new Zend_Db_Adapter_Pdo_Mysql(array(
            'host'     => "localhost",
            'username' => "user",
            'password' => "password",
            'dbname'   => "database"
            ));

然后又想查询数据库:

global $db;

$query = sprintf("SELECT * FROM table WHERE id = '%s'", mysql_real_escape_string($id) );

$db->query("SET NAMES 'utf8'");

$db->fetchAll($query);

我刚做了另一个测试:当我将这个简单的测试行添加到我的代码中时,它会使脚本在虚拟机上慢600毫秒:

mysql_real_escape_string("TEST");

3 个答案:

答案 0 :(得分:0)

使用预准备语句来执行此操作:

http://framework.zend.com/manual/en/zend.db.statement.html

答案 1 :(得分:0)

长期解决方案必须转向准备好的陈述,这是正确的。对于PDO连接,mysql_real_escape_string的等效值似乎为PDO::quote

http://php.net/manual/de/pdo.quote.php

与基于mysql_real_escape_string的解决方案相比有哪些缺点?

答案 2 :(得分:0)

我在第一次调用mysql_real_escape_string方法时有同样的延迟,我的案例中的解决方案是来自手册的信息:http://php.net/manual/en/function.mysql-real-escape-string.php

"在使用mysql_real_escape_string()之前需要MySQL连接,否则会生成级别为E_WARNING的错误,并返回FALSE。如果没有定义link_identifier,则使用最后一个MySQL连接。"

如果没有建立连接,那么missig唯一有关延迟的信息。

在您的情况下,我认为如果您使用PDO进行连接,那么您应该使用PDO :: quote。如果你使用的是mysql_pconnect / mysql_connect,那么你可以毫不拖延地使用mysql_real_escape_string。