• ベストアンサー

PHP⇒MySQL CSVファイルのアップロードについて

こんにちは。 先日も質問させていただいたのですが、宜しくお願い致します。 8万行ほどあるCSVをフォームから送信してDBに登録をおこなって いるのですが、フォームから登録をおこなうと何件か登録がされ ません。 また、登録内容に¥があったり、途中で文字が抜けていたりするの ですが何か原因かわかりません。 エンコードは全てsjisに設定し、EUC⇒sjisに変換する式も入れています。 コマンドプロンプトから「load data」で登録すると全て正常に登録されます。 また、前回質問させていただいたときに、処理を分けたほうが良いのでは? とアドバイスをいただいたため、 form.php⇒insert.php⇒test.php という流れにして insert.phpには DBの接続文(load文)とheader("Location:test.php"); を記述しています。 実行させるとtest.phpが表示さるのですが、SQL文は実行されておらず、 DBに登録されていません。 参考書やHPなどで調べながら作業をしているのですが、他に参考になる ようなサイトやサンプルコードがあれば教えてください。 宜しくお願い致します。

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

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>また、登録内容に¥があったり、途中で文字が抜けていたりするの >ですが何か原因かわかりません。 CSVファイルもSJISですか?loadであれば問題ないですが、SQL文を組み立てる場合にはmysql_real_escape_string()を使って「問題のないSQL文」にする必要があります。   http://www.php.net/manual/ja/function.mysql-real-escape-string.php 文字コードがSJISなら5c問題もありますしね。 あ、フォームからの受け取りならmagic_quotes_gpcがどうなっているかも確認しておた方がいいですね(「\」が付くということなので・・)。   http://www.php.net/manual/ja/ref.info.php#ini.magic-quotes-gpc

k1227_001
質問者

お礼

shimixさん ありがとうございます。 CSVファイルはAccessからエクスポートしただけのものと、テキストエディタでSJIS に変換したものとどちらでも同じ結果になりました。 magic_quotes_gpcについては、全てOFFにしてあります。 データの中身をみたところ、空欄のフィールドに「3」が入っていたり、 (これがcsvで吐き出したときに¥になっているようです) フィールドが1つ増えて「0」が追加されていたりします。 mysql_real_escape_string() 調べてやってみます。ありがとうございます。

その他の回答 (1)

回答No.2

PHPを使うなら、 このページを一度はひととおりみたほうがいいと思います。 ご質問に関連するような文字コード関係の話題も一通り取り上げられています。 http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html

参考URL:
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html
k1227_001
質問者

お礼

daisuke_dmさん ありがとうございます。 教えていただいたURLを参考にしてみます。

関連するQ&A

  • PHPからMySQL CSVファイルのアップロード

    こんにちわ。 現在、XAMPP(1.6)にて開発をおこなっています。 MySQL Ver 5.0.51 PHP 5.2.5 Web上からcsvファイルを参照して、作成してあるDB(フィールド数32)へアップロードを おこないたいのですが、タイムアウトエラーになってしまいます。 アップするCSVファイルが54M(8万行)ほどあるため、php.ini「uplaod_max_file_size」 増やしてみたり、タイムアウト時間を長くしてみても、INSERTではタイムアウトになって しまいます。 そのため、LOADで読込もうとしたのですが以下のようなエラーになってしまいます。 PHP初めてで'や"の使い方が間違っているのかも知れませんが、どこが間違っているのか 教えていただけますでしょうか? ↓エラー文 Parse error: syntax error, unexpected T_VARIABLE in C:\xampp\htdocs\dmti.php on line 24 ↓実行文(24行目前後)$polはテーブル名 mysql_query("set names sjis"); $sql ="load data infile '$fl' into tabale $pol fields terminated by ',' enclosed by '"' lines terminated by '\r\n';" $ret = mysql_query($sql, $db); if($ret){ print mysql_num_rows($db)."件の登録を完了しました。.<br><br>"; $body = "<br><br> <input type='button' value='次へ' onclick='window.location=\"news.php\"'> <input type='button' value='ホームへ戻る' onclick='window.location=\"index.htm\"'>"; }else{ print "登録に失敗しました。"; $body .= "<br><br> <input type='button' value='戻る' onclick='history.back()'> <input type='button' value='ホームへ戻る' onclick='window.location=\"index.htm\"'>"; } 以上、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP+MySQL エンコード

    文字コードについて教えて下さい。 データベースMySQL の文字セット: UTF-8 Unicode (utf8)に固定。 htmlはSIFT-JISで表示。 フォームで受けとったデータをPHPからDBに書き込む場合 i18n_convert($data,"UTF-8", "SJIS"); をして書き込めば問題ないでしょうか? DBがEUCの場合は問題なかったのですが、UTF-8は初めて 扱うため、文字化けの不安があります。 いまいち、文字コード(バイト数の違いなど)が理解できておりません。 ご教授お願い致します。

    • 締切済み
    • PHP
  • PHPでCSVをダウンロード/アップロードしたい

    会社の方で必要に迫られ、以下のような処理を行おうとして行き詰まっております。 (一旦ローカル環境にてテストをおこなっております。過去履歴やGoogle等で検索しましたが解決できなかったので、こちらに質問しました。)    1.MySQLのデータをCSVでダウンロード  2.excel等の表計算ソフトで編集  3.編集したCSVをMySQLへアップロード   1で、カンマ/改行を一旦代替(例,を')にした(excel/テキストエディタ等での表示がおかしいため) 3で、代替したものを元に戻しアップロードさせる。   作成したPHPでは、ダウンロード/アップロード自体は問題ないのですが、 問題点1.アップロードの際、MySQLの日本語フィールドは「”」になる。 問題点2.上記3の方法で詰まっている。   環境 XAMPP Mac OS X版 0.7.4 PHP 5.2.6 MySQL 5.0.67 Apache 2.2.11   【ダウンロード用PHP】 <?php header("Content-Type: application/octet-stream"); ?> <?php header("Content-Disposition: attachment; filename=output.csv"); ?> <?php $srv = "サーバー名"; $id = "ユーザーID"; $passwd = "パスワード"; // $dbn = "データベース名"; // $sql = "SELECT * FROM xxxx"; $db=mysql_connect($srv,$id,$passwd); mysql_select_db($dbn,$db); $rs=mysql_query($sql,$db); for($i=0; $i<mysql_num_fields($rs); $i++){ print(mb_convert_encoding(mysql_field_name($rs,$i),"SJIS","UTF-8").","); } print("\n"); for($j=0 ;$j<mysql_num_rows($rs); $j++) { for($k=0; $k<mysql_num_fields($rs); $k++) { $str=mysql_result($rs,$j,$k); $search = array("\r\n","\n","\r","<br />"); $str = str_replace($search,";",$str); $str = str_replace(",","-",$str); print(mb_convert_encoding($str,"SJIS","UTF-8").","); } print("\n"); } mysql_close($db); ?> 【アップロード用PHP】 <?php $file = $_FILES[userfile]['name'] ; //DB接続 $conn = mysql_connect($srv, $id, $passwd) or die("データベース接続エラー"); mysql_query("SET NAMES SJIS"); mysql_select_db($dbn) or die("データベース".$dbn."接続エラー"); $sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE phplesson.xxxx FIELDS TERMINATED BY ',' IGNORE 1 LINES"; mysql_query($sql, $conn) or die(アップデート失敗); ?>   以上、お知恵を拝借できましたら幸いです。

    • ベストアンサー
    • PHP
  • php mysqlについて

    初心者です宜しくお願いします。 phpからデータベースを使いたいのですが(mysql)、mysql_query()関数のところで1366エラーが出ます。 半角英数ならエラーは出ません。 プログラムを貼り付けます。どなたかお願いします、説明をもっと書きたいのですが私もあまりわかってないのでどうもすみません。 今やっていることは全てローカルですwindowsを使ってます、文字コードもshift_jisです。phpもmysqlも一台のコンピュータでやっています。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>MySQLへデータを登録</title> </head> <body> DBとの連携テスト結果<br> <?php // DBに接続 if(!$con=mysql_connect("localhost","root","y3kwyuba")){ echo"connect_error"; exit; } // DBを選択 if(!mysql_select_db("test",$con)){ echo"select_db_error"; exit; } //MySQL4.1への対応 //mysql_query("SET NAMES SJIS"); この上の行のコメントをはずすとうまく動くのですが色々調べましたら、この書き方は推奨されないと書いてありました、他に対策はあるのでしょうか? $name = $_POST['nm']; $age = $_POST['age']; // フォームで送られてきたデータでINSERT文を作成 $sql = "insert into t_touroku(name,age) values('$name',$age)"; // SQLを実行 if(!$res=mysql_query($sql,$con)){ echo"query_error"; echo "エラー番号:".mysql_errno(), #エラー番号 "メッセージ:".mysql_error(); #エラーメッセージ exit; } // DBから切断 mysql_close($con); // メッセージ出力 echo"登録完了"; ?> </body> </html> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP Mysql エラー

    データの新規登録を行っているのですが 番号が重複しないでまたデータがすべて入力されたらデータの追加を行いたいのですが エラーが出て対処できずに困っています 下記のエラーがでます Parse error: syntax error, unexpected end of file in C:\WWW\test\htdoes\insert.php on line 20 20行目は一番下の行です <html> <body> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); if($st->rowCount()>0){ if ($_POST['ID'] != '' && $_POST['NAME'] != '' && $_POST['ADDR'] != ''){ $st = $pdo->prepare("insert ignore into tbl_test values(?,?,?)"); $st->execute(array($_POST['ID'], $_POST['NAME'],$_POST['ADDR'])); header('Location: http://localhost/top.php'); }else{ print データ未入力の場所があります; } }else{ print "既に登録している番号です"; ?> </body> </html>

    • ベストアンサー
    • MySQL
  • MySQL5のデータを、SQL文を使いcsv形式でダウンロードさせると文字化けします

    環境:Apache2&PHP5&MySQL5 MySQL5のデータを、SQL文を使いcsv形式でダウンロードさせると文字化けします。 -- <?php header("Content-Type: application/octet-stream"); ?> <?php header("Content-Disposition: attachment; filename=output.csv"); ?> <?php $srv = "localhost"; // サーバー名 $id = "root"; // ユーザーID $passwd = "******"; // パスワード $dbn = "sample"; // データベース名 $sql = "SELECT * FROM result"; // SQL文 $db=mysql_connect($srv,$id,$passwd); mysql_select_db($dbn,$db); $rs=mysql_query($sql,$db); for($i=0; $i<mysql_num_fields($rs); $i++){ print(mb_convert_encoding(mysql_field_name($rs,$i),"SJIS","EUC-JP").","); } print("\n"); for($j=0 ;$j<mysql_num_rows($rs); $j++) { for($k=0; $k<mysql_num_fields($rs); $k++) { $str=mysql_result($rs,$j,$k); print(mb_convert_encoding($str,"SJIS","EUC-JP").","); } print("\n"); } mysql_close($db); ---ダウンロードしたCSVは半角英数文字はそのまま出ますが、 日本語(全角)が、?に化けます。(下記の参照してください) 24 2 1 444 4444 2008/7/3 15 ? 1E+18 ??? ????? ?????? 25 2 1 444 kojiide 2008/7/3 30 ? 1E+18 ??? ????? ?????? 26 2 1 444 kojiide 2008/7/3 30 ? 1E+18 ??? ????? ?????? --- print(mb_convert_encoding($str,"SJIS","EUC-JP").","); でSJISになっていると思うのですが、どなたかアドバイスいただけると幸いです。

    • ベストアンサー
    • PHP
  • PHPによるMySQLを使ったアップローダについて

    初めて投稿させて頂きます。 現在、PHPを使って、DB(MySQL)に情報を登録するシステムを構築しています。 そこで、質問なのですが、フォームからファイルをアップロードさせ、送信したファイルをDBに保存するにはどうすれば良いのでしょうか? DBを使った掲示板のプログラムを参考にしているのですが、肝心のファイルは、DBにファイル名が登録されるだけで、ファイル自体はPHPで設定したディレクトリに保存されます。 ファイルをホームページの領域に保存するのではなく、DBに保存する事は出来ないのでしょうか? また、可能であれば、どの様にDBに保存すれば良いのか・フィールドの型は何にしたら良いのでしょうか? わかりにくい説明ですいませんが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • MySQL+PHPサイトでSJISからEUCに変換したい

    いつもお世話になっております。 現在PHP4.3.9+MySQL4.1.2でSJISコードで運営をしておりますが、サイトの文字コードをEUCに変更しようかと検討しております。それで、現在いろいろとEUCコードでMySQLから引っ張ってきたデータの表示及びMySQLへのデータ登録の実験をしております。 まずは、PHPファイルをEUCに変換し、php.ini内のSJISだった箇所を下記のようにEUC-JPに変換しました。 mbstring.internal_encoding = EUC-JP mbstring.http_output = EUC-JP そして、PHPファイル内でMySQLへ接続後文字コードを指定している箇所を $sql="SET NAMES ujis"; mysql_query($sql); と変更しました。 実際のPHPファイルとphp.iniに関する部分のみEUCコードに変更し、sjisで設定しているMySQLの設定ファイルとテーブル内は何も変更していない状態です。この状態でフォームに入力した内容をMySQLのテーブルに追加し、追加した情報をPHPで表示する実験をしましたが特に文字化け等の問題は無く動作しました。また既にMySQLに登録してあるデータをEUCの環境で表示させましたが、問題なく表示されました。 前置きが長くなりましたが、MySQLの設定を特に変更しなくても今回私が行なった方法でSJISからEUCへの変換をしてしまって問題は無いでしょうか?PHPのファイル数やMySQLのテーブル数が多いので、いきなり実験通りに動くか不安があるので、質問させていただきました。 PHPやMySQLの文字コードの初歩的なことが分かっていないもので、変な質問になってしまいましたが、アドバイスいただければ幸いです。

    • ベストアンサー
    • PHP
  • PHPとMySQLについて

    社内サーバーにWebアプリをUPし、 全てデータベース管理にするため、MySQLを使用しました。 参考書を見ながら作成したため、構文に間違いはありません。 参考書は「 はじめての人のためのかんたんPHP + MySQL入門」です。 この参考書の第8章にあるWEBアプリを忠実に再現しました。 しかし、フォームに情報を入力し、登録を押しても情報が反映されません。 以上と同じように、ぶっとびねっと(フリーレンタルサーバー)でもUPし、phpMyAdminでDBを構築しましたが、 これも同じく登録情報が反映されませんでした。 無論、phpMyAdminから直接CREATEし、HPに情報を反映させるのは可能です。 その際、日本語が???となってしまいましたが、その他は正常です。 一番の問題は、なぜHPから情報を入力し、それがDBへ反映されないのかです。 .htpccessやPHP.iniの設定と何か関係があるのでしょうか? 社内サーバーに.htaccessファイルは無いそうです。 となると、php.iniだと思います。 私は初心者のため、イマイチPHP.iniが良く分かりません。 ローカルにApacheなどを落とした場合は、C:Windowsの中にPHP.iniの設定をいじればいいと思いますが、 社内サーバーの場合、サーバー上のどこかにあるPHP.iniファイルの設定を変える必要があるのでしょうか? 以上、ごちゃごちゃしてて申し訳ありませんが、 お助け下さい。

    • ベストアンサー
    • PHP
  • PHPとMySQLの文字化け

    DBを呼び出すPHPファイルを"Shift_JIS"で作りました。 ですが、レンタルサーバーのPHP、MySQLの文字コードが"EUC-JP"との事で、 全てのファイルに読込んでいるインクルードファイルの文字コードの記述をShift_JISからEUC-JPに変更しました。 ですが、DBから呼び出してるデータは文字化けしないのですが、その他がすべて文字化けしてしまい、JavaScriptも動かない状態です。 各phpのファイルは、最後に$body で書き出す記述をしているので、 $body = mb_convert_encoding($body,"SJIS","EUC-JP"); print $body; と実行してみてもだめでした。 どうか教えて下さい。よろしくお願い致します。 ---共通インクルードファイル---- 省略 //MySQL読み込み時の文字コードを設定 mysql_query("set names EUC-JP"); //データベースを選択します mysql_select_db($DBNAME,$db); function htmlheader($pagetitle) { //各ページのヘッダ部のHTMLを組み立てる $strret = "<DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'> <HTML> <HEAD> <META http-equiv='Content-Type' content='text/html; charset=EUC-JP'> <META http-equiv='Content-Style-Type' content='text/css'> <TITLE>$pagetitle </TITLE> </HEAD> <body border='0' cellpadding='0' cellspacing='0' width='100%'> <br>"; return $strret; } function htmlfooter() { //各ページのフッタ部のHTMLを組み立てる $strret = "<br> </BODY> </HTML>"; return $strret; } ?>

    • ベストアンサー
    • PHP