1

コードのこの部分がメモリ リークを引き起こしている理由を理解するのに問題があります。

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

コードをコンテキストに入れるために、データベースに挿入されるすべての値を含む、値と呼ばれる以前に作成された配列があります。すべてのフィールドは文字列なので、すべてをエスケープする必要があります。このアプリケーションでは、addslashes または mysql_real_escape_string が良い選択です。

奇妙なことに、上記の部分を追加するとすぐに、次のようなメッセージが表示されます。

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)が 1 ずつ増えるため、無限ループが発生します。したがって、メモリの枯渇。

foreachデバッガーで確認するか、さらに良いことに、ループまたはarray_*関数のいずれかに切り替えます (何をしようとしているかに応じて 、 など) array_walk()array_map()

addslashes()@Jeremy は、文字列をエスケープするために使用してはならないことを正しく指摘しています。mysqli_real_escape_string()(彼が示唆するように) を参照するか、PDOできれば使用を検討してください。

于 2012-07-13T18:25:56.513 に答える
2

代わりにarray_walkを使用してみてください。

また、すべてのループを当てにしないでください。ループ条件に入れる前にカウントを取得します。これはデータベース用なので、実際には次を使用する必要があります: mysqli_real_escape_string

于 2012-07-13T18:24:57.720 に答える