csv読み込み - PHPプロ!Q&A掲示板

3286

  • 0P

csv読み込み

質問日時 / 2011年7月1日 15:59    回答数 / 2件

Questioner:  koonii26  このエントリーをはてなブックマークに追加 

キーワード / CSV    POST    文字化け   

$torikomi = date("Y/m/d-H:i");
$today = date("Y/m/d-H:i");
debug.print $torikomi;

print("<br>");
print "取込日: " . $today . "\n";

define('UPLOAD_DIR','./files/');
if(!isset($_FILES['upfile'])){
    die('no upload file');
}
$upload =  UPLOAD_DIR.$_FILES['upfile']['name'];
print("<br>");
print "CSVファイル: " . $upload . " を読み込んでいます。\n";

if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
    if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) {
        chmod("files/" . $_FILES["upfile"]["name"], 0644);
        print("<br>");
         print "ファイル " . $_FILES["upfile"]["name"] . " をアップロードしました。\n";
    } else {
        print("<br>");
        print "ファイル " . $_FILES["upfile"]["name"] . " をアップロードできません。\n";
    }
}else{
    print("<br>");
    print "ファイルが選択されていません。\n";
    print("<br>");
    exit("処理を終了します。");
}

    $row = 1;
    $handle = fopen("$upload", "r");
    while (($data = fgetcsv_reg($handle)) !== false) {
        $_enc_to=mb_internal_encoding();
        $_enc_from=mb_detect_order();
        mb_convert_variables($_enc_to,$_enc_from,$data);
        $num = count($data);
        echo "<p> $num fields in line $row: </p><br />\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo nl2br($data[$c]) . "<br />\n";
            echo "OK";
        }
    }
    fclose($handle);

前ぺージのところで、CSVを input type = fileで選択してもらい、このPHPで
CSVアップロード→読み込みをし、確認として一覧表示して、その内容から次のページへ行きメール送信まで持って行きたいです。
CSVファイルが、SJIS形式でhtmlのcharsetはUTF-8です。
まず、ファイルアップロードはできました。
SJISで一覧表示ではなくUTF-8で一覧表示したいです。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimix>まず、ファイルアップロードはできました。 >SJISで
┃┗A01-1koonii26いつも答えていただきありがとうございます。 mb_c
┗A02iroha_codeこの意見は投稿者によって削除されました。

回答一覧

並び替え:

A01 満足
answerershimix [7月1日 18:34] (最終編集:7月1日 18:43)

>まず、ファイルアップロードはできました。
>SJISで一覧表示ではなくUTF-8で一覧表示したいです。

質問のポイントに無関係なソースはカットしてください。ファイルを読み込んで出力する部分だけ提示していただければかまいません。

ファイルの中身がSJISで出力がUTF-8であれば(前のQ&Aのレスでも書きましたが)、mb_convert_encodingするだけでいいのでは?
  1. $array = file($upload);
  2. foreach ($array as $line) {
  3.   print mb_convert_encoding($line, 'utf-8', 'sjis');
  4.   print "<br />" . PHP_EOL;
  5. }
まぁ(書かれてはいませんが)さすがにカンマ区切りのままではいけないんでしょうね(汗
  1. $fh = fopen($upload, 'r');
  2. while (($array = fgetcsv($fh, 512, ",")) !== false) {
  3.   foreach ($array as $item) {
  4.     print mb_convert_encoding($item, 'utf-8', 'sjis');
  5.   }
  6.   print "<br />" . PHP_EOL;
  7. }
  8. fclose($fh);
mb_convert_variablesが使いたければ、もちろんそれでもいいです。
  1. $fh = fopen($upload, 'r');
  2. while (($array = fgetcsv($fh, 512, ",")) !== false) {
  3.   mb_convert_variables('utf-8', 'sjis', $array);
  4.   foreach ($array as $item) {
  5.     print $item;
  6.   }
  7.   print "<br />" . PHP_EOL;
  8. }
  9. fclose($fh);
出力方法によって書き方は変わりますが同じことです。お好きな方法でどうぞ。
  1. $fh = fopen($upload, 'r');
  2. while (($array = fgetcsv($fh, 512, ",")) !== false) {
  3.   mb_convert_variables('utf-8', 'sjis', $array);
  4.   print implode(' - ', $array) . '<br />' . PHP_EOL;
  5. }
  6. fclose($fh);


(蛇足)
>$upload =  UPLOAD_DIR.$_FILES['upfile']['name'];

サーバに保存するファイル名に「クライアントPCの(ローカルの)ファイル名」を使うのはマズイです。日本語のファイル名のままPOSTされたりするとトラブルの元です。出来ればランダムな文字列のファイル名で保存して(元ファイル名が必要なら)元ファイル名との関連付けの仕組みを考えましょう。


というか、ここで$uploadという変数にファイル名を生成しているのに

>move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])

こちらでは "files/" . $_FILES["upfile"]["name"] と指定しているのですね。おそらく『今現在は』同じ内容になるんでしょうけどバグの元です(片方を変更し忘れたりします)。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerkoonii26 [7月4日 14:50]

いつも答えていただきありがとうございます。

mb_convert_encodingだけでいけました。

ありがとうございます。

この意見に回答する

ツリーへ TOPへ

A02
answereriroha_code [7月1日 19:38] (最終編集:7月1日 19:43)

この意見は投稿者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
マジッククォートとmysql_real_escape_string
 このエントリーをはてなブックマークに追加 
A
magic_quotes_gpcでは、SQLインジェクション対処は十分できません。主な理由として、以下が上げられます。 ・magic_quotes_gpcは文字コードを考慮しないで処理するので、Shift_JISを使っている場合、SQLインジェ...

>>続きを読む

SQLインジェクション対策は時と場合で使う関数が変わります。その時にあったものを使いましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)