php中的内存泄漏

Dan*_*ife 1 php memory-leaks addslashes

我有一个问题,理解为什么我的代码的这部分导致内存泄漏:

for($i=0; $i<count($values); $i++){
        $values[$i] = addslashes($values[$i]);
}
Run Code Online (Sandbox Code Playgroud)

为了将代码放在上下文中,我有一个先前构建的名为values的数组,它包含要插入数据库的所有值.所有字段都是字符串,所以我需要转义所有字段,对于这个应用程序,addslashes或mysql_real_escape_string是一个很好的选择imo.

现在奇怪的是,只要我添加上面显示的部分,我就会收到如下消息:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes)
Run Code Online (Sandbox Code Playgroud)

我明白这会产生内存泄漏,但我不知道为什么.

挖掘进来,我注释掉for循环中唯一的一行,只留下for语句的好奇心,泄漏就消失了.任何想法可能意味着什么?

PS:字符串都是UTF8编码的,这可能是个问题吗?

编辑:

该数组包含以下内容:

Array ( 
    [dossier] => 002A 
    [permis] => 
    [adresse] => 18, rue Bellevue
    [ville] => Ste-Anne-des-Lacs (Québec)
    [province] =>
    [code_postal] => J0R 1B0
    [numero_centrale] => N/A
    [routes] => De la Gare, droite chemin Avila jusqu'au bout et droite chemin Ste-Anne-des-lacs sur 1,8 km et droite sur Bellevue.
) 
Run Code Online (Sandbox Code Playgroud)

Tro*_*ott 11

您的数组有字符串键,但您正在检查/分配数字键.正如@nickb所说,每次添加数字键时,都会count($values)增加一个,所以你有一个无限循环.因此内存耗尽.

检查与调试器,或者更好,切换到foreach循环或的一个array_*功能(array_walk(),array_map(),等,这取决于你正在尝试做的).

@Jeremy正确地指出你不应该addslashes()用来逃避你的字符串.看mysqli_real_escape_string()(正如他所说),或者更好的是,PDO如果可以,请考虑使用.

  • @Jeremy这是真的(有点 - 你应该真的使用PDO,如果可以的话,根本不插入字符串),但不是海报所要求的. (2认同)
  • 对正在发生的事情的更准确的解释是:因为`count()`在每次迭代时被调用**并且**新元素总是被添加(`count()`从8开始并且每个增加1迭代,而`$ i`从0开始),循环是一个无限循环. (2认同)