CSVデータ読込で1文字目のみ文字化け PHP4.xxでSQLIte3

このQ&Aのポイント
  • 名簿をCSVデータで一気にDBにインサートしたいのですが、なぜか名前の1〜2文字目あたりのみ文字化けします。
  • 色々試行錯誤していますが、糸口が見つからなくて困っています。
  • どなたかご教授していただけませんか?文字化け具合(というよりアルファベットに変わってる)が画像を参照してください。
回答を見る
  • ベストアンサー

CSVデータ読込だら・・・1文字目のみ文字化け

PHP4.xxでSQLIte3で行っています。 名簿をCSVデータで一気にDBにインサートしたいのですが・・・ なぜか名前の1~2文字目あたりのみ文字化けします。 色々試行錯誤していますが・・・ 糸口が見つからなくて・・・ どなかたかご教授して頂けませんか?! 文字化け具合(というよりアルファベットに変わってる)が画像を参照してください。 CSVデータでは、山崎まさよし、abc、岡田てるお となっています。 ちなみにコードはこのような形です。 -------------------------------------------------------- $updir = "./csv/"; $save_name = "list.csv"; if (is_uploaded_file($_FILES["csv"]["tmp_name"])) { if (move_uploaded_file($_FILES["csv"]["tmp_name"], $updir.$save_name)) { chmod($updir.$save_name, 0644); echo "<br />CSVファイルをアップロードしました。"; // CSVの各内容をインサート $row = 1; $handle = fopen($updir.$save_name, "r"); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); $insert = "insert into list values ("; $insert_row = ""; $row++; for ($c=0; $c < $num; $c++) { $data[$c] = mb_convert_encoding($data[$c], "EUC-JP", "SJIS"); $insert_row .= "'".$data[$c]. "',\n"; } $insert_query = $insert.$insert_row; $insert_query = substr($insert_query, 0, (strlen($insert_query)-2) ); $insert_query .= ")"; if(sqlite_query($insert_query, $conn)){ } else { echo "<br>配信先情報の追加を失敗しました。"; } } } } fclose($handle); --------------------------------------------------------

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • tongoko
  • ベストアンサー率87% (7/8)
回答No.1

EUC-JPで保存しようとしていますね。 SQLiteはUTF-8で保存した方がいいので、 $data[$c] = mb_convert_encoding($data[$c], "UTF-8", "SJIS"); とします。 読み込みはEUC-JPで行っているようですから、出力時に $data = mb_convert_encoding($data, "EUC-JP", "UTF-8"); でEUCに戻すか、プロジェクト全体の文字コードをUTF-8にしましょう。 まだ、書き始めだと思うので、プロジェクト全体をUTF-8に することをお勧めします。

noguri999
質問者

お礼

ありがとうございました! とても参考になりました。

関連するQ&A

  • PHP 全角文字が文字化けまたは表示されない

    PHPでエクセルで作成したcsvファイルから商品一覧を表示させたいのですが。 一覧ページで日本語や大文字英数が含まれるデータが表示されません。 エンコードはいろいろ試してみたのですが、utf-8だと文字化け、EUC_JPやSJISだと表示されなくなってしまいます。 csvから呼び出す際に mb_convert_variables('utf-8', 'sjis-win', $tmp); としても文字化けします。 ちなみに、$dataでprintすると問題なく表示されます。 $data1では上手く表示されません。 なので、for($i=$start;$i<$end;$i++){ 以降でおかしいんだろうなとは思うのですが。 1ページに数件ずつで、次へ次へで移りたいので、ここの部分が必要です。 商品詳細ページで、同じcsvファイルを読みだしてますが、 while ($data = fgetcsv($fp, 10000)) { if($atai==$data[0]){ ・・・・ と書いてこちらは問題なく表示できています。 何が原因か見つけられずに困っています。 お分かりになる方、教えてください。 初心者レベルですので、なるべく具体的に書いていただけると助かります。 よろしくお願いします。 //ファイルからデータを読み込む処理 function inst_view($page=0) { //読み込むファイル名 $filename = FILE_PATH; //データ数をカウントする $row = 0; $data = array(); //CSVファイルの中身をすべて読み込む $handle = fopen($filename, "r"); while (($tmp = fgetcsv($handle, 1000, ",")) !== FALSE) {    if (!empty($choice1) && $choice1 == "4") { $num = count($tmp); if( $tmp[0] == "" ){ }else{ $data[$row]["no"] = $tmp[0]; $data[$row]["hito"] = $tmp[1]; $data[$row]["kuni"] = $tmp[2]; $data[$row]["tochi"] = $tmp[3]; $data[$row]["nen"] = $tmp[4]; $data[$row]["size"] = $tmp[5]; $data[$row]["cm"] = $tmp[6]; $row++; } } } fclose($handle); //降順にする rsort($data); //1ページに表示するデータ数を読み込む $page_length = PAGE_LENGTH; //全ページ数を求める処理 $maxpage = $row/$page_length; $tmp = (int)$maxpage; if($maxpage>$tmp){$maxpage=$tmp+1;} $maxpage--; //現在のページ数からデータ開始と終わりを求める $start = $page * $page_length; $end = ($page * $page_length) + $page_length; //データを格納する配列と、その指標 $cnt=0; $data1 = array(); //データ格納処理(スタートからエンドまで繰り返す。 for($i=$start;$i<$end;$i++){ //最大データ数を超えたら取得終了する。 if($i >= $row){break;} $data1[$cnt]["no"] = $data[$i]["no"]; $data1[$cnt]["hito"] = $data[$i]["hito"]; $data1[$cnt]["kuni"] = $data[$i]["kuni"]; $data1[$cnt]["tochi"] = $data[$i]["tochi"]; $data1[$cnt]["nen"] = $data[$i]["nen"]; $data1[$cnt]["size"] = $data[$i]["size"]; $data1[$cnt]["cm"] = $data[$i]["cm"]; $cnt++; } return $data1; } 別のファイルからinst_viewを呼び出しています。

    • 締切済み
    • PHP
  • Django Python csv エラー

    下記のようなエラーでて解決できないです。 Unicodeのエラー? 解決できるやり方がわからなくて困っています。誰かがご教授お願いいたします。 データベースに保存しょうと思ったら不正な文字列値のエラーがでてきました。 ご教授お願いいたします! エラー: (1366, "Incorrect string value: '\\x8E\\x81\\x96\\xBC\\x83J...' for column 'user_name' at row 1") 私のViews.py def import_csv(request): response = HttpResponse(mimetype='application/vnd.ms-excel; charset=UTF-8') response['Content-Disposition'] = 'attachment; filename=file.csv' reader = csv.reader(response) with open('C:\Users\hasichaolu\Desktop\mkc\Py_meshi\sample.csv', 'r+b') as f: reader = csv.reader(f) for row in reader: tmp = User.objects.create() tmp.UserID = row[0] tmp.user_name = row[1] tmp.first_kana = row[2] tmp.save()

  • JS(ajax)でphp(csv)の読み込み

    こんにちは。 Javascriptのご教授お願いしたく、書き込みました。 今JavascriptでAjaxを使って、CSVを読み込むPHPを実行しています。 PHPでは、CSVを読み込み(readcsv.php)、その結果を別のファイル(alert.html)に受け渡しています。 問題が、読み込んでいるJavascript側でもデータを一つ一つ取得したいですが、 方法が分かりません。ご教授お願いします。 構成 : alert.html(Javascript), readcsv.php, test.csv コード構成 : -------------------------------------------------------------------------- alert.html <script type="text/javascript"> $.ajax({ type: "POST", url: "readcsv.php", success: function(printString) { alert(printString); --> ここをどうするべきか悩んでいます。 }, error:function(){ alert("error"); } } ); </script> ------------------------------------------------------------------------------- readcsv.php <?php $filename = "test.csv"; $row = 1; $rowS = 1; if (($handle = fopen($filename, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, "*")) !== FALSE) { $num = count($data); $row++; for ($c=0; $c < $num; $c++) { $String = explode(",", $data[$c]); foreach ($String as $AllString) { echo $AllString."\n"; } echo "\n"; } } fclose($handle); } ?> ---------------------------------------------------------------------------- test.csv 1,2,3,4,6,8*9,1,2,3,5,7,2,1,3,5*7,2,1,2,3,5,7,2*1,5,3 ---> 数字の羅列(コンマ区切り) ---------------------------------------------------------------------------- です。 一番問題になっているところは、 alert.html の alertのところで、 readcsv.php から受け取った値を一つ一つ変数に格納したいところです。 ご教授お願いします。

  • テキストファイルのアップロードについての質問です

    現在テキストファイルのアップローダーのページを表示し、アップロードされたテキストファイルの文章を表示するプログラムを作っております。 プログラムは以下です。 //省略 <form method="post" enctype="multipart/form-data" action="testup.php"> <input type="file" name="data" size="30"> <input type="submit" value="upload"> </form> <?php $updir = "./up/"; $filename = $_FILES['data']['name']; if(file_exists($_FILES['data']['tmp_name'])){ $filesize = filesize($_FILES['data']['tmp_name']); if($filesize <= 700000){ if(ereg("(^[a-zA-Z0-9_-]+)\.(txt)",$filename)){ move_uploaded_file($_FILES['data']['tmp_name'], $updir.$filename); echo "File : " . $filename . " Upload Suceeded!!"; echo $_FILES['data']['error']; echo "<br><br>"; include("./$updir/$filename"); } else { } }else { echo "$filesize Byte too large size。<br>File must be less than 700000 Byte"; } } if ($handle = opendir($updir)) { while (false !== ($file = readdir($handle))) { if ($file != "." and $file != "..") { include("./$updir/$file"); } } closedir($handle); //以下省略 このプログラムを実行すると問題なく動くのですが、今回お聞きしたいのは、アップロードされた文章をこのページだけでなくほかのページにも表示させるにはどうすればいいのかということです。 例えば <form method="post" enctype="multipart/form-data" action="testup.php">の[action = " "]のところに表示したいページのアドレスを入れればいいのかと思ったのですが、そうすると、テキストファイルの内容だけでなく、アップロード完了後のUpload Suceeded!!";まで表示されてしまうのであまり好ましくないと思います。また if ($handle = opendir($updir)) { からclosedir($handle);の部分を別に保存して include(-----);としたのですが、 Warning: include(.//ete.txt) [function.include]: failed to open stream: No such file or directory in C:\xampp\htdocs\inc2.php on line 8 Warning: include() [function.include]: Failed opening './/ete.txt' for inclusion (include_path='.;C:\xampp\php\pear\') in C:\xampp\htdocs\inc2.php on line 8 というようなエラーメッセージが出てしまいました。 長い文章になってしまいましたが、今まで書いてきたとおり、アップロードされたファイルを別のページでも表示させるにはどうすればいいのでしょうか?お分かりになる方がいらっしゃいましたら教えていただけないでしょうか?よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • csvファイルの読み込みとOracleDBへの更新

    VB6.0とOracle9i、どちらも初心者です。 C:\直下にあるtest.csvファイルを読み込み、Oracleのテーブルと比較して存在しないものはinsert、存在するものはupdateする。 ・test.csvファイル(百行) "LOCATE", "COMPANY_CODE", "COMPANY_NAME", "COMPANY_KANA", "ZIPCODE", "ADDRESS", "TEL_NO", "FAX_NO", "CATEGORY", "INDUSTRIES", "PERSONS" ・OracleのCustomerテーブル COMPANY_CODE NUMBER COMPANY_NAME VARCHAR2 COMPANY_KANA VARCHAR2 ZIPCODE CHAR ADDRESS VARCHAR2 TEL_NO CHAR TEL_NO_2 CHAR FAX_NO CHAR HP_URL VARCHAR2 NOTE VARCHAR2 CUST_VARCHAR_1 VARCHAR2 CUST_VARCHAR_2 VARCHAR2 CUST_VARCHAR_3 VARCHAR2 CUST_VARCHAR_4 VARCHAR2 ・ロジック 1.oo4oでOracleに接続 2.csvファイルの読み込み 3.oracleのレコードとの比較 4.insertプログラム 5.updateプログラム ・コード '** oo4o 接続 dbname = "****" cnuser = "****/****" Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, ORADB_DEFAULT) Open "c:\test.csv" For Input As #1 ' csvファイルをオープンして、1行ずつループで取り込んで、取り込んだcsvレコード(行)を元にキー項目(COMPANY_CODE)を条件に既にOracleテーブルにあればInsertクエリを, なければUpdateクエリを発行する、をファイルエンドまで繰り返します。 自分でなんとか書いて聞くのが礼儀だと思いますが、調べてもやっぱりどう書けばよいのか全くわかりません。懸念事項として、Oracleのテーブルの列とCSVの列の数や並び方が異なっていることがあります。よろしくお願いします。

  • PHP+mySQLでのCSV→DB登録で文字化けします

    現在タブ区切りのCSVファイルをPHPで取り込み mySQLへINSERTするものを作ろうとしているのですが INSERTするモノに全角が入ると文字化けているせいか mysql_queryでFALSEが帰ってきてしまいます。 使用環境、コードを以下に書きます。 どこかおかしな点等ありましたらご教授お願い致します。 OS:windowsXP PHP:Ver5.2.6、default_charset UTF-8 mysql:Ver5.0.51a UTF-8 取り込みたいCSV:Shift_JIS,CRLF,タブ区切り コード(一部) while(!feof($fp)){ $buf = fgets($fp); $buf = mb_convert_encoding($buf, "UTF-8", "Shift_JIS"); $buf=str_replace('\r\n', '\n', $buf); $array = preg_split("/\t/", $buf); if($array[0] == "") { break; } else { //INSERT用に加工( $values = replaceValues($array); } $sql = "INSERT INTO table_name VALUES($values)"; $res = mysql_query($sql); if(!$res){ echo "登録に失敗しました。"; echo "sql:".$sql; mysql_close($conn); exit; } $cnt++; }

    • 締切済み
    • PHP
  • CSVの操作方法について

    CSVの操作方法について 以下のようなソースでcsvからデータを配列に格納しています。 わからない事が2点あるのですがどのようにすれば可能でしょうか? ※csvの例 No,name,age 1,あああ,25 2,いいい,28 3,ううう,33 1:csvのカラム名を「No」とした場合ここに数字を入れます。IDみたいなもんです。 この数字の番号だけの情報を取得するにはどうすればいいでしょうか? 2:上記同様に「No」の1~5までといったような指定した番号の情報だけを取得するには どうすればいいでしょうか? // 読み込み開始行 $start = 1; // 初期化 $row = array(); // 読込み行数 $h = 0; $filename = APP_DIR . '/csv/' . $filename; $handle = fopen($filename, 'r'); while (($data = self::fgetcsv_reg($handle)) !== false) { $_enc_to = mb_internal_encoding(); $_enc_from = 'sjis'; mb_convert_variables($_enc_to, $_enc_from, $data); if ($h >= $start) { for ($i = 0; $i < count($data); $i++) { $row[$h - 1][$i] = $data[$i]; } } $h++; } fclose($handle);

    • ベストアンサー
    • PHP
  • SQLServer からのデータ移行(varbinary)

    SQLServer からのデータ移行(varbinary) SQLServer 2000 から PostgreSQL 8.4.3 へデータ移行を考えているのですが、 つまずいて困っています。 ご存知の方がいらっしゃいましたら教えていただけないでしょうか。 あるテーブル上にvarbinary(32)の項目があり、 クエリアナライザで見ると「0x11223344・・・」という値が入っているのですが、 PostgreSQL側ではこの項目のデータ型はどう定義したらよいでしょうか。 character varying(32)としてみましたが、 定義がふさわしくないのか、SQLがまずいのか、思うようにINSERTができませんでした。 たとえば、 insert into ... values(0x1122334455667788990011223344556677889900112233445566778899001122, ...) とすると --- NOTICE: 識別子"x1122334455667788990011223344556677889900112233445566778899001122"を"x11223344556677889900112233445566778899001122334455667788990011"に切り詰めます SQLステート:42601 --- が返りますし insert into ... values(x'1122334455667788990011223344556677889900112233445566778899001122', ...) では --- ERROR: 値は型character varying(32)としては長すぎます SQLステート:22001 --- が返ります。 実際は、.Net C# のプログラムにてDataTableにSQLServerからデータをFillして、それを元にINSERT文を作成しています。 デバッグすると、Byte配列に[0]17,[1]34... という具合に入ってくるので if ((col.DataType == typeof(String)) || (col.DataType == typeof(DateTime)) ||(col.DataType == typeof(Decimal)) ) { valueColumns.AppendFormat("'{0}',", row[col.ColumnName].ToString()); } else if(col.DataType == typeof(Byte[])) { string tmp = ""; for (int i = 0; i < ((Byte[])row[col.ColumnName]).Length; i++) { tmp += (string.Format("{0:X2}", ((Byte[])row[col.ColumnName])[i])); } valueColumns.AppendFormat("x'{0}',", tmp); } else { valueColumns.AppendFormat("{0},", row[col.ColumnName].ToString()); } のようにDataType別に振り分けて、上記else ifが通るようにコーディングしています。 よろしくお願いいたします。

  • php アップロードファイルが*.csv指定の問題

    <form name="csvupload" id="csvupload" action="csvread.php" method="post" enctype="multipart/form-data" > <input type="hidden" name="MAX_FILE_SIZE" value="30000" /><br /> csvfile:<input type="file" name="uploadfile" size="50" accept="text/comma-separated-values" /> <input type="submit" name="hyosi" value="ファイル表示" /><br /> </form> htmlからファイルが選択して、php言語でそのファイルが*.csv拡張子で指定して、アップロードする。以下わたし作ったのサンプルで*.exeだとうまくいかなかった。初心者です。急ぎです。誰か助けてください。 if(isset($_POST['hyosi'])){ $file_dir = 'C:\apaches\Apache2\htdocs\practice\csvupload\csvfile\\'; $file_path = $file_dir.$_FILES['uploadfile']['name']; if(!is_uploaded_file($_FILES['uploadfile']['tmp_name'])){ print'*.csvhh拡張子のファイルを参照してください。'; exit; } elseif(strtoupper(substr(trim($_FILES['uploadfile']['name']),-4))!=".CSV"){ print'*.csv拡張子のファイルを参照してください。'; exit; } elseif(strtoupper(substr(trim($_FILES['uploadfile']['name']),-3))=="EXE"){ print'*.csvrrr拡張子のファイルを参照してください。'; exit; /* elseif(preg_match("/^.*\.(?!csv)$/",$_FILES['uploadfile']['name'])){ print'*.csv拡張子のファイルを参照してください。'; exit; */ } elseif($_FILES['uploadfile']['name'] == '' && $_FILES['uploadfile']['size'] == 0){ print'ngngng'; exit; } else{ if(move_uploaded_file($_FILES['uploadfile']['tmp_name'],$file_path)){ $csv_dir = "./csvfile/"; $csv_path = $csv_dir.$_FILES['uploadfile']['name']; $sfile = addslashes($csv_path); $_SESSION['file'] =$sfile; $file=fopen($sfile ,'r'); }else{ print '正常にアップロード処理されませんでした。'; exit; } } }

    • 締切済み
    • PHP
  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP