fgetcsvのバグ

この記事は公開から1年以上経過しており、内容が古くなっている可能性があります。

【2025年4月26日 追記】現在のPHP8系では、fgetcsv正常に動作するようになっています。

いまさらですが、PHP4ではまともに使用できていた「fgetcsv」関数。
PHP5になった途端不具合の嵐です。(サーバによるかもしれませんが。)

$csv = “/www/csv/test.csv”;
$fl = fopen($csv, “r”);
while($data = fgetcsv($fl, 10000)){
echo $data[0].”:”.$data[1];
}
fclose($fl);

としていると、カンマでの区切りがうまくいっていないのか、表示されなかったり、特定の文字で文字化けを起こしたりします。
こうなると、mb_convert_encodingで文字コードを調整しようとしてもうまくいきません。

ここはおとなしくfgetcsvをあきらめてfgetsとexplodeを使用しましょう。

$csv = “/www/csv/test.csv”;
$fl = fopen($csv, “r”);
while($data_fl = fgets($fl)){
$data_fl = rtrim($data_fl);
$data = explode(“,”, $data_fl);
echo $data[0].”:”.$data[1];
}
fclose($fl);

※rtrimは行の最後にある改行コードを取り除いてくれます。必要に応じて記述してください。自分はよく取り出したデータを条件分岐にかけることがあるので、改行コードの\r\nがあると不具合を起こすことがあります。

記述が少し長くなりますが、これで解決します。

コメント

タイトルとURLをコピーしました