1

我无法理解为什么我的这部分代码会导致内存泄漏:

for($i=0; $i<count($values); $i++){
        $values[$i] = addslashes($values[$i]);
}

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

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

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes)

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

深入研究,我注释掉了 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.
) 
4

2 回答 2

11

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

使用调试器进行检查,或者更好的是,切换到foreach循环或array_*功能之一(array_walk(),array_map()等,具体取决于您要执行的操作)。

@Jeremy 正确地指出你不应该addslashes()用来转义你的字符串。看看mysqli_real_escape_string()(正如他建议的那样),或者更好的是,PDO如果可以的话,考虑使用。

于 2012-07-13T18:25:56.513 回答
2

尝试使用array_walk代替。

另外,不要指望每个循环。在将其放入有条件的循环之前获取计数。由于这是针对数据库的,因此您应该真正使用:mysqli_real_escape_string

于 2012-07-13T18:24:57.720 回答