使用mysql_real_escape_string的速度

时间:2014-04-03 21:28:25

标签: php mysql

我的问题是:对阵列中的每个项目执行操作是否更快,即使它不需要它,也可以先检查它是否需要它。

示例:我有一个像[metacode]

这样设置的循环
foreach($array as $varkey => $varvalue){
    if(!is_array($varkey)) $varvalue = mysql_real_escape_string($varvalue); 
}

我的一个同事认为我们应该只使用mysql_real_escape_string函数,因为$ varvalue中有一个撇号。这需要使用strstr()preg_match()来查看在使用mysql_real_escape_string之前是否存在撇号,如下所示:

foreach($array as $varkey => $varvalue){
    if(!is_array($varkey)){
        if(strstr("'", $varvalue) $varvalue = mysql_real_escape_string($varvalue); 
    }
}

进入其中一个是否有任何速度/安全优势?

* PS。我知道我们应该使用PDO或mysqli_的预处理语句。这是我们需要在另一天内部进行的另一次对话。*

2 个答案:

答案 0 :(得分:2)

mysql_real_escape_string()已经在字符串中搜索撇号和其他字符,并且只转义它设计的字符。它用C语言编写,就像PHP中的内置函数一样,所以它真的非常快。

preg_match()不知道MySQL连接字符集,所以它有可能给出假阴性 - 换句话说,你应该转义字符串的情况,但你的测试告诉你不要。

正如其他人所指出的,当您决定通过测试字符串来保存代码或性能时,您处于无意义的微优化领域。通过将此问题发布到StackOverflow,您可能已经浪费了更多的计算资源和人力资源,而不是通过优化转义字符串时的优化来保存。

只需调用转义函数,然后将注意力转移到将代码转换为PDO,使用参数保护查询。

我同情将代码转换为PDO的项目规模,以及为改变辩护的难度。很难说服具有该项目价值的权力,当它导致模糊的承诺,即更大的“安全”而不是任何功能变化。

您可以将这些工作与其他一些重构相结合,从而提供更具体的好处,例如为所有查询创建包装函数,以便您可以审核或分析数据库活动。这可能使决策者相信该项目的价值。

答案 1 :(得分:1)

你可能在评论中找到了答案。但要在结束之前回顾一下:

  • 安全优势:绝对不是!!!正如@Dagon在评论中所说,撇号远非唯一的问题
  • 速度优势:不是真的。即使您设法提高速度(例如,通过最好的案例情况,我们所有的变量都避免了转义功能),但与DB访问时间相比,它仍然没有任何效果。

我强烈建议您切换到准备好的陈述,再也不要担心这样的事情了。