php+mysqlで

CSVをMYSQLに取り込もうとしたのですが、文字化けをしてしまいます。
1.CSVファイル選択
2.アップロードして、fgetcsvでデータを読む
3.そのデータを insetinto(…)valus…
4.MYSQL登録する。

PHPはUTF-8で、CSVはsjisで改行は入っています。
文字化けを防ぐ方法として、何か対策を教えて欲しいです。
あと、2行目以降から読みたいのですがなにか方法があればあわせてお願いします。
while (($field = fgetcsv($fp)) !== FALSE) {
for ($i=0; $i<count($field); $i++){
if ($field[$i] == "" || NULL) {
$field[$i] = "''";
}else{
$field[$i] = "'" . $field[$i] . "'";
}
}
}
$sql = "insert into テーブル名 (フィールド名,フィールド名,フィールド名,フィールド名,フィールド名,フィールド名,フィールド名,フィールド名) values ('" . 取り込み日 . "',". $field[0] . ", " . $field[1] . ", ". $field[2] . ", " . $field[3] . ", ". $field[4] . ", ". $field[5] .", '". $upname ."')";
$re = mysql_query($sql) or die($sql . '<br />' . mysql_error() . '<br>');
echo mysql_affected_rows(). "行データを追加しました<br>";
}

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/10/05 17:39:55
  • 終了:2011/10/12 17:40:03

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752011/10/05 17:56:40

文字化けは、

1.ロケールをちゃんと考える

2.http://yossy.iimp.jp/wp/?p=56 を使う

のどっちかかなと。自信がなければ、2の方がよいでしょう。

2行目から読みたいなら、1行目を無視すればいいのでは?


追記:

何がどう全然分からないのか分かりませんが、fgetcsvの代わりにfgetcsv_regを使えばいいというだけですが。もちろん、fgetcsv_regの定義はコピーしておいてください。

PHPそのものが分からない方ですか?


更に追記:

PHP5以降のfgetcsv関数はシステムロケールに依存するため文字化けが発生する可能性があります。そのため、指定したURLの人がロケールに依存せずに正規表現をつかってfgetcsvと同等の処理を行うfgetcsv_reg関数を公開してくれています。

指定したURLには2つのコードブロックがあると思いますが、そこの部分はまるまるコピーしてください。その上で、あなたが書いたコードでfgetcsv_regを使ってください。もし単一のファイルでやるなら、こんな感じ。

<?php
while (($field = fgetcsv_reg($fp)) !== FALSE) {
    // あなたが書いたコード
}

function fgetcsv_reg (&$handle, $length = null, $d = ',', $e = '"') {
    // サイトからコピー
}
?>
id:koonii26

回答ありがとうございます。

2.の方を閲覧したのですが、どこでどうしているのかが全然わかんなくて

INSERTをどこに入れたらいいのかわからないです。

追記:

PHP自体は分かります。

ただ、プログラミングの流れ全体がどう動いて、どういう処理をしているのかが解読できなくて

fgetcsv_regはただ単にいれればいいというわけではないですよね。

定義コピーとはどういうことでしょうか?

更に追記:

よくわかりました。丁寧な解説ありがとうございます。

ここからは自分でやってみます。

重ね重ねありがとうございます。


結果

やってみましたが、やはり文字化けが直らず、他の方法を試してみます。

2011/10/06 11:21:04

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません