56904
いつもお世話になっております。

ネット上のサイトにて拝見致しました以下のphpファイルの記述を元に、ローカル上で作成したエクセルのcsvファイルをサーバーのmysqlへインポートするとエクセル上でタイプした時点では日本語は当然のことながら問題なく表示されておりますし、データ自体もインポートされますが、mysql上で日本語が文字化けしてしまいます。

どのようにすれば文字化けせずにインポートできるかお教え願いませんでしょうか？（英語は問題ないと思われますが、他の言語も文字化けしないような設定方法をお教えいたただければ有難いです。）

```

    <form method="post" action="ファイル名.php" enctype="multipart/form-data">
    <input type="file" name="csvfile" /><br />
    <input type="submit" name="csvsub" value="csv呼出" /><br />
    </form>
    
    <?php
    //フォームから送られたデータは、   $_FILES["csvfile"]["tmp_name"]で受け取ることができる。
    $tmp = fopen($_FILES['csvfile']   ['tmp_name'], "r");
    
    while ($csv[] = fgetcsv($tmp, "1024")) {}
    //fopen()関数で、ファイルを開く。"r"というのは「読み込み専用」という指示です。
    //ここで2次元配列にする。fgetcsv()関数により、csvデータを読み込む。
    
     mb_convert_variables("UTF-8", "SJIS-win", $csv);
     //文字化け防止のため、UTF-8に変換する// 配列  $csv の文字コードをSJIS-winからUTF-8に変換
    
    
     $lim = count($csv);//for文で読み込むために、配列の最大行数を出す
    
     for($i=0; $i<=$lim; $i++){
     if($i < ($lim-1)){
     $ar = $csv[$i];
     $aaa = implode("\",\"", $ar);
     //echo $aaa,"\n";
    
     $host = "サーバホスト";
     $mysql_user = "ユーザ名";
     $mysql_password = "パスワード";
     $db = "データベース名";
     $tb = "テーブル名";
    
     $cn = mysql_connect($host,$mysql_user,$mysql_password);
     if(!$cn){
         die("db connect Error");
     }
     if(!(mysql_select_db("$db"))){
         die("db select error");
     }
    
     $sql = "INSERT INTO tb1 VALUES(\"$aaa\");";
    
     echo $sql;
     $query = mysql_query($sql);
     mysql_close($cn);
     }
    
     }
     ?>
    
```

Plesk バージョン： 17.0.17  
構成名： Plesk 12 Web Admin for Linux  
PHP： 5.3.3  
OS: ‪CentOS 6.9  
MySQL:5.1.73  
エクセル2010
CC BY-SA 4.0
2019-07-12T09:18:56.890
56592
2019-07-27T03:10:59.597
19211
question
php mysql excel csv 文字化け
エクセルで作成したcsvファイルをphpファイルでサーバーのmysqlへインポートすると文字化けする
日本語文字コードの違いによるものと思われます。

Excelで作成されたファイルは、Windowsのマシンで作られている訳ですからの日本語文字コードは、Shift-JISのはずです。

それに対して、CentOSの文字コードはUTF8です。  
文字化けは、shift-JISのファイルをUTF8のファイルだと判断して表示したことで起きたのだと思われます。

文字コードが違っているのですから、文字コードを変換するプログラムを使ってExcelのファイルをUTF8に変えることで解決すると思います。
CC BY-SA 4.0
2019-07-13T04:26:12.773
56610
2019-07-13T04:26:12.773
217
56592
answer
excelでUTF8でCSV保存する方法です。参考にしてください。  
<https://did2memo.net/2016/11/14/excel-csv-utf8/>
CC BY-SA 4.0
2019-07-26T03:41:58.070
56904
2019-07-26T03:41:58.070
24490
56592
answer
DBを用いるプログラムでエンコーディングがずれる可能性があるのは次の通りです

  1. そもそも元データが思っているのと違う
  2. データとプログラム内部のずれ
  3. DBへの接続時のエンコーディング
  4. DBのエンコーディング

上記のプログラムでは、元データはおそらくShiftJISですが、プログラムでUTF-8に変換されています。DBへの接続時のエンコーディングは指定されていません。またDBのエンコーディングも不明です。

DBへの接続時のエンコーディングは、Webサーバが起動された環境のロケールがデフォルトになります。DBのエンコーディングは作成時に指定しますが多分Latin1になっていると思います。

ということで、

・DBが適切なエンコーディングになっているか確認する。なっていなければ作り直す  
・DB接続時に適切なエンコーディングを指定する

必要があります。

書かれたプログラムにはそれ以前に

  * もはや太古の遺物である`mysql_*`系の関数が使われています。
  * 典型的なSQLインジェクション脆弱性があります。

といった根本的な問題があり、全面的に書き直す必要があります。

しかし、PHPとMySQLについてこのあたりを「正確に」説明している資料はかなり希です。Webで見つかるものは大抵間違っています。

信頼できる資料として、「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」という書籍を紹介しておきます。作り直す前に一読されることをお勧めします。
CC BY-SA 4.0
2019-07-27T03:10:59.597
56934
2019-07-27T03:10:59.597
5793
56592
answer