PHPでCSVファイルの日本語データが表示されない対策方法

このQ&Aのポイント
  • CSVファイルを読み込んで表示させるプログラムで、サーバーが変わった場合に日本語のデータが表示されない現象が発生しました。
  • 参考にしたサイトやソースコードを試してみましたが、上手くいきませんでした。
  • どなたかご教示いただけると幸いです。よろしくお願いいたします。
回答を見る
  • ベストアンサー

PHP、CSVファイルの日本語データが表示されない

どうもこんにちわ。PHP初心者です。 どうか助けてください! CSVファイルを読み込んで表示させるプログラムなんですが、 サーバーが変わったら、日本語のデータのみ表示されなくなりました。 以前質問があった下記件と同じ事象で、 参考に色々試してみましたが上手くいきません。 http://oshiete1.watch.impress.co.jp/qa5972094.html ソースは下記です。 どうか、どこをどういじれば良いか、どなたか教えて頂けないでしょうか? 何卒よろしくお願いします。 ------------------ <?php //今日の日付を取得 $today = date("Ymd"); //表示数の設定。 $disp_num = 1; //CSV格納先 $fp = fopen("data/today_word.csv", "r"); while ($data = fgetcsv($fp, 10000)) { for($n = 0; $n < count($data); $n++){ $data[$n] = mb_convert_kana($data[$n], "ak", "SJIS"); } if ((ereg($today,$data[0]))) { $result[] = "<a href='$data[2]'>$data[1]</a><br />"; } } fclose ($fp); ?> -----------------------------

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

申し訳ありません。 こちらで テスト用のCSVファイルを作り、確かめました。 完全に 挙動を思い違いしておりまして、#1のでは、エラーが出たというより、 無限ループ発生で、タイムアウトで落ちたんではないかと思います。 前回と同じ部分を 以下のように変更するとどうでしょうか? while ($str = fgets($fp, 10000)) { $data = explode(',', trim($str));

ssbuybye
質問者

お礼

上手くいきました! 相談に出して本当に良かったです。 ありがとうございました!!

その他の回答 (1)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

とりあえず、なんも確認とかしておりませんので、うまく動かなかったらご報告ください。 そちらが提示されたリンクと同じ事をすれば良いのではないかと思います。 そちらのソースの↓以下の部分を、 while ($data = fgetcsv($fp, 10000)) { 以下のように書き換えてみるとどうなるでしょう? while ($data = explode(',', trim(fgets($fp, 10000)))) { 日本語の入ったCSVファイルをfgetcsv()する場合は、文字コードに気をつけないと地雷になるっぽいです。

ssbuybye
質問者

お礼

ありがとうございます!! でも、 上手くいかないです。 エラーになってしまいました。。 どうすれば良いでしょうか。

関連するQ&A

  • PHPでCSVファイルの特定行のみ表示

    PHPでCSVファイルを読み込ませるにあたり、「クエリで指定した特定の1行だけ」を取りだしたいと考えています。 下記だと、1行目からクエリで指定した特定行までの抽出が可能です。 hoge.php?repert=5  → 1から5行目までが表示される。 従い、下記から特定行より上の行を削除すれば、当方が考えている「クエリで指定した特定の1行だけ」を取りだすことになりますが、その方法がわかりません。 ご教示いただきたくお願いいたします。 <?php $repeat = $_GET['repert']; $fp = fopen("file2.csv", "r"); $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0]・$data[1]・$data[2]<br> EOD; $count++; } fclose ($fp) ?>

    • ベストアンサー
    • PHP
  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP
  • CSVファイルを読み込み表示すると行頭がおかしくなります

    ・CSVファイルを読み込み表示すると行頭がおかしくなります。 -【 CSVファイル(test.csv) 】------------------- 1,単一,必須 2,…,… ----------------------------------------- ・例えば上記のCSVを読み込んで、  PHPで表示すると以下のように表示されます。 -【 ブラウザ表示 】-------------------------- 1 P一 K須 2 … ----------------------------------------- ・というように最初の文字が正常に表示されません。 ・ちなみに数字(半角?)はちゃんと表示されました。 ・プログラムは下のような感じになります。 ・どこを編集すればよいでしょうか? -【 PHP 】--------------------------------- <?php  if( $fp = fopen( 'test.csv', 'r' ) ){   $data = fgetcsv( $fp );   while( ( $data = fgetcsv( $fp ) ) !== FALSE ){    echo $data[0] . ' ' . $data[1] . ' ' . $data[2] . '<BR>';   }  } ?> ----------------------------------------- -【 仕様 】--------------------------------- [OS]: CentOS5 [Server]: Apache_2.2.10 [PHP]: PHP_5.2.6 -----------------------------------------

    • ベストアンサー
    • PHP
  • PHPでCSVファイルを呼び出す条件の複数指定

    PHPでCSVファイルを呼び出すことを考えています。 下記のようなデータがあり、5000番以上の4銘柄を抽出したいと考えています。 4996 クミアイ化学工業 345 4997 日本農薬 456 4998 フマキラー 1215 4999 セメダイン 456 5002 昭和シェル石油 1025 5007 コスモ石油 2451 5008 東亜石油 1265 5009 富士興産 998 5010 日本精蝋 562 5011 ニチレキ 412 下記のようにしたのですが表示されません。 && ($data3 < $number)を外すと、下から4つ(4996-4999)が表示されます。 (5000番以上という選択ができません) どこが間違っているかご教示戴けますでしょうか? よろしくお願いいたします。 <?php $fp3 = fopen("kabu.csv", "r"); $repeat = 4; //表示する件数 $count = 1; $number = 5000; while (($data3 =fgetcsv($fp3, 10000)) && ($data3 >$number)) { if ($count > $repeat) { break; } print($data3[1]); print($data3[0]); print($data3[2]); $count = $count + 1; } fclose ($fp3) ?>

    • ベストアンサー
    • PHP
  • PHPで、CSVファイルを、指定した行数だけ出力するには?

    同じようなトピックは、いくつかありましたが、あと一歩、わからないので質問させてください。 CSVファイルをPHPを使って読み込み、出力させる場合で、 CSVファイル data.csv --------------------------- データ1,説明,詳細 データ2,説明,詳細 データ3,説明,詳細 データ4,説明,詳細 データ5,説明,詳細   … データ100,説明,詳細 --------------------------- 上記のように100行あったとします。 この時、 PHPファイルを、 --------------------------- <?php $fp = fopen("data.csv", "r"); while ($data = fgetcsv($fp, 10000)) { $num = count ($data); print <<<EOD $data[0]・$data[1]・$data[2]<br> EOD; } fclose ($fp) ?> --------------------------- と書くと、100行目まで普通に出力してしまいます。 もし、10行目までを出したい場合は、どう記述すればよいのでしょうか? 上記のPHPソースに少し書き加える形で解決できればと思うのですが・・・ 色々試しましたが、私の力だけでは無理でした。

    • ベストアンサー
    • PHP
  • 外部のCSVファイルをPHPで読み込み、出力させたい

    下記の質問を参考に外部のCSVファイルをPHPで読み込み、出力させるphpを書きました。 http://oshiete1.goo.ne.jp/qa1615206.html data.csvは "データ01" "データ02" "データ03" ・・・ といったように100行書いてあります。 <1ページ目に記述したphp> <?php $fp = fopen("data.csv", "r"); $repeat = 10; $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0] EOD; $count++ ; } fclose ($fp) ?> 2ページ目には11行目からのデータを出力したいと思い、 $data[0]の部分を$data[11]に変えたり、 $repeat = 20; $count = 11;にしたりしたのですが、 両方ともうまくいきませんでした。 2ページ目にcsvの11行目からのデータを出力するにはどうすればいいのでしょうか? 私がしたいことは、1ページ目にcsvの1~10行目を、2ページ目にcsvの11~20行目を出力したいとおもっております。 上記のphp以外の記述でも構いませんので、どなたかお分かりになる方がいらっしゃいましたら是非教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでCSVファイルのデータを表示したところ日本語が表示されません

    PHPで、CSVファイルの中身を表示させようと思ったのですが、一部の日本語が正しく表示されません。 問題のPHPとCSVファイルの内容を明記します。アドバイスお待ちしております。 PHP <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>tokuten</title> </head> <body> <TABLE border="1"> <TBODY> <TR> <TD>ID</TD> <TD>名前</TD> <TD>点数</TD> </TR> <?php $fname = "name.csv"; $fp = fopen($fname, "r"); while (list($id, $name, $point) = fgetcsv($fp, 100, ",")) { echo"<TR>"; echo"<TD>".$id; echo"</TD>"; echo"<TD>".$name; echo"</TD>"; echo"<TD>".$point; echo"</TD>"; echo"</TR>"; } fclose($file); ?> </TBODY> </TABLE> </body> </html> CSV 1,a,50 2,b,70 3,c,100 55,松井,55 530000,フリーザ,530000

    • 締切済み
    • PHP
  • 【PHP】CSVファイルの特定行を書き出す

    PHPでCSVファイルを読み込み、特定行のみを別のCSVファイルに書き出したいと思います。 作りたいものは、 http://example.com/file.php?repert=5 とすると、「002.csvファイルの5行目のみ」を「003.csv」に書き込むというものです。 下記で作りましたが、 Parse error: syntax error, unexpected end of file in C:\xampp\htdocs\file.php on line 32 になります。 指摘された32行は ?> の行です。 ググると改行コードのトラブルのようでしたのでCR+LF CR LF と試しましたが、改善されません。 どこが不味いかご教示戴けませんでしょうか? 宜しくお願い致します。 <?php $repeat = $_GET['repert']; $inFile = '002.csv'; // 抽出元ファイル $outFile = '003.csv'; // 結果ファイル $inFp = fopen($inFile, 'rb'); $outFp = fopen($outFile, 'w'); while ($data = fgetcsv($fp, 10000)) { if ($count == $repeat) { { $outLineArray = array( 0 => $data[0], 1 => $data[1], 2 => $data[2] ); fputs($outFp, implode(",", $outLineArray) . ""); } } fclose($inFp); fclose($outFp); exit(); ?>

    • 締切済み
    • PHP
  • PHP5でCSVの指定行データだけを取得するには?

    PHP初心者です。 下記のような方法で全てのデータを取得する方法があると知りました。 $fp = fopen("url.csv", "r"); while ($data = fgetcsv($fp, 1)) { foreach ($data as $d) { print $d . "<br>\n"; } } しかし指定行、例えば10行目等だけを取得する方法がわかりません。 CSVは1列で1000行ほどあります。 恐れ入りますが具体的なソースを教えてくださいませ。

    • ベストアンサー
    • PHP
  • PHP5で、utf-8形式のcsvファイルを読み込む際、常にファイル内

    PHP5で、utf-8形式のcsvファイルを読み込む際、常にファイル内容の行数+1を返すようにしたいのですが、初回(ファイルの中身がないとき)がうまくいきません。どうなおせば、よいでしょうか。 ■うまく動作しないコード setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('data.csv','r'); $data = array(); while ($row= fgetcsv($fp)) { $data[] = $row; } $no = 1; if (0 < count($data)) { $no = count($data); $no++; } var_dump($no); fclose($fp); ■現在の状態 ---------------------------------------- ▽csvファイルの内容が、下記の場合 1,名前,内容 2,名前,内容 最終的なvar_dump($no);は、3 → O.K. ---------------------------------------- ▽csvファイルの内容が、下記の場合 1,名前,内容 最終的なvar_dump($no);は、2 → O.K. ---------------------------------------- ▽csvファイルの内容が、下記(中身が何もない)の場合 最終的なvar_dump($no);は、2 → × この部分を1にしたいのですが、どうすればよいでしょうか。 ---------------------------------------- また、csvファイルの内容が空の(つもりの)状態で、 var_dump($data);すると、下記表示となってしまいます。 これは、なぜでしょうか? array(1) { [0]=> array(1) { [0]=> string(3) "?" } }

    • ベストアンサー
    • PHP

専門家に質問してみよう