我在理解为什么我的代码部分导致内存泄漏时遇到了问题:
for($i=0; $i<count($values); $i++){
$values[$i] = addslashes($values[$i]);
}
要将代码放在上下文中,我有一个先前构建的名为values的数组,它包含要插入数据库的所有值。所有字段都是字符串,所以我需要转义所有字段,对于这个应用程序,addslashes或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.
)
答案 0 :(得分:11)
您的数组包含字符串键,但您正在检查/分配数字键。正如@nickb所说,每次添加数字键时,count($values)
都会增加1,所以你有一个无限循环。因此内存耗尽。
使用调试器检查,或者更好的是,切换到foreach
循环或其中一个array_*
函数(array_walk()
,array_map()
等,具体取决于您正试图这样做。
@Jeremy正确地指出你不应该使用addslashes()
来逃避你的字符串。看看mysqli_real_escape_string()
(正如他的建议),或者更好的是,如果可以,请考虑使用PDO
。
答案 1 :(得分:2)
请尝试使用array_walk。
另外,不要指望每个循环。在将其置于循环条件之前获取计数。由于这是针对数据库的,因此您应该使用:mysqli_real_escape_string