我的问题是:对阵列中的每个项目执行操作是否更快,即使它不需要它,也可以先检查它是否需要它。
示例:我有一个像[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_的预处理语句。这是我们需要在另一天内部进行的另一次对话。*
答案 0 :(得分:2)
mysql_real_escape_string()已经在字符串中搜索撇号和其他字符,并且只转义它设计的字符。它用C语言编写,就像PHP中的内置函数一样,所以它真的非常快。
preg_match()
不知道MySQL连接字符集,所以它有可能给出假阴性 - 换句话说,你应该转义字符串的情况,但你的测试告诉你不要。
正如其他人所指出的,当您决定通过测试字符串来保存代码或性能时,您处于无意义的微优化领域。通过将此问题发布到StackOverflow,您可能已经浪费了更多的计算资源和人力资源,而不是通过优化转义字符串时的优化来保存。
只需调用转义函数,然后将注意力转移到将代码转换为PDO,使用参数保护查询。
我同情将代码转换为PDO的项目规模,以及为改变辩护的难度。很难说服具有该项目价值的权力,当它导致模糊的承诺,即更大的“安全”而不是任何功能变化。
您可以将这些工作与其他一些重构相结合,从而提供更具体的好处,例如为所有查询创建包装函数,以便您可以审核或分析数据库活动。这可能使决策者相信该项目的价值。
答案 1 :(得分:1)
你可能在评论中找到了答案。但要在结束之前回顾一下:
我强烈建议您切换到准备好的陈述,再也不要担心这样的事情了。