PHPでCSVファイルをUTF8に変換する方法

このQ&Aのポイント
  • PHPでCSVファイルをUTF-8に変換する方法を知りたいです。
  • ブラウザからCSVファイルをアップロードし、MySQLのデータベースにインポートするプログラムをPHPで作成しています。エクセルで作成したCSVファイルはsjis形式のため、UTF8に変換してからMySQLにインポートしたいと考えています。
  • ファイルのアップロードまでは動作していますが、CSVファイルをsjisからUTF-8に変換する方法がわかりません。ご教示いただけると幸いです。
回答を見る
  • ベストアンサー

PHPでCSVファイルをUTF8に変換したい

ブラウザからCSVファイルをアップロードし、MySQLのデータベースにインポートするプログラムをPHPで作成しています。 エクセルで作成したCSVファイルはsjis形式のため、UTF8に変換してからMySQLにインポートしてあげると文字化けせずにインポートする事が出来るのですが、毎回手動でUTF8に変換するのは面倒ですのでファイルをアップロードしたタイミングで自動的にsjis形式からUTF8に変換したいと考えております。 ファイルのアップロードまでは動作していますが、CSVファイルをsjisからUTF-8に変換するにはどうすればよいでしょうか? どなたかご教示いただければ幸いです。以下は作成中のコードです。 index.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>sample</title> </head> <body> <form action="read.php" method="POST" enctype="multipart/form-data"> ファイル:<br> <input type="file" name="upfile" size="30"><br> <br> <input type="submit" value="アップロード"> </form> </body> </html> read.php <?php //csvファイルのアップロード if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {     //「files」という名前のフォルダを同じ階層に設置。ここにCSVファイルをアップロード if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); //fileパス $file = "files/" .$_FILES["upfile"]["name"]; //DB接続 $sv = "localhost"; $dbname = "shop"; $user = "user"; $pass = "password"; $conn = mysql_connect($sv, $user, $pass) or die("コネクトエラー"); mysql_select_db($dbname) or die("DBセレクトエラー"); mysql_query("SET NAMES utf8"); //CSVデータの取り込み $sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE food"; $sql .= " FIELDS"; $sql .= " TERMINATED BY ',' "; //TERMINATED BY 区切り文字 $sql .= " ENCLOSED BY '\"' "; //ENCLOSED BY 囲み文字 $sql .= " LINES TERMINATED BY '\r\n' "; $sql .= " IGNORE 1 LINES"; $result = mysql_query($sql, $conn); if (!$result) { $message = 'Invalid query: ' . mysql_error() . "\n"; $message .= 'Whole query: ' . $sql; die($message); } echo "インポートが完了しました!"; //失敗したとき } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> CSVファイル "No","food","price" "1","うどん","100" "2","カレー","300" "3","パスタ","500" MySQLテーブル CREATE TABLE IF NOT EXISTS `food` ( `No` int(11) NOT NULL, `food` varchar(50) NOT NULL, `price` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 使用中のバージョン PHP/5.4.19 Apache/2.4.4 XAMPP v3.2.1 素人の質問で凝縮ですが、よろしくお願いいたします。

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

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

お礼ありがとうございます、お返事遅くなりました。 まず、pdo で接続するときは、dsnで、phpファイルの文字コードで charset を指定する。phpもmysqlも最新版なので、これが標準。 http://jp.php.net/manual/ja/ref.pdo-mysql.php To_aru_Userさんのでもそうなっています。 あと、第4引数のoption配列 で PDO::ATTR_ERRMODE と PDO::MYSQL_ATTR_LOCAL_INFILE も指定しましょう。phpの最新版では、PDO::MYSQL_ATTR_LOCAL_INFILE をここでtrueにしないと、load出来ないようです。ここらへん、私もまだphpが古いversionでやってたりするので、マニュアルみて漸く気づいたりします。 mysqlとphpのversionの組み合わせで、制約がいろいろ変わるので、混乱しやすいかと思いますが、なるべく、それぞれのマニュアルを参照するようにしてください。 以下、お礼の提示文に少々追加。字下げは全角空白使ってるのでコピー時は削除のこと。 <?php // PDOオブジェクト生成 $dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';      $user = 'user';      $password = 'password'; $option = array(      // エラーモードを例外スローに設定      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,      // local ファイルからload可能にする      PDO::MYSQL_ATTR_LOCAL_INFILE => true , ); $pdo = new PDO($dsn, $user, $password, $option); ?> それから、$pdo->query($sql) に入れてる、$sql文を先に表示してみて、間違いがないか見ることと、query()メソッド はprepared ではないので、executeは不要。 細かいことをいうと、mysql本体は、load文にプレースホルダーが使えないのですが(mysqliでの接続も同様)、 pdo_mysqlでは、通常設定時、エミュレーションモードといって、php側で先に置き換えてしまうので、load文でもプレースホルダーが有効になります。To_aru_Userさんのはプレースホルダー使用例。 オプションでPDO::MYSQL_ATTR_DIRECT_QUERY をtrueにすると、mysql本体と同じ動作になります。 最後にエラーチェック、例外モードにしていないときは、query発行後に var_dump( $pdo->errorInfo() ); してみる。 または、PDO::ATTR_ERRMODEを例外モードにしていれば、query 発行部分を try{}catch(){} でくるんで、sql発行時のエラーチェックをしてください。 <?php try{ /* ここに query 発行部分 */ }catch(Exception $e) { echo 'エラー:', $e->getMessage(); }

do79tama13
質問者

お礼

>PDO::MYSQL_ATTR_LOCAL_INFILE をここでtrueにしないと、load出来ないようです。 どうりでファイルを読み込んでくれないわけですね!他のサイトのPDOを使った作成例を見ても同じ書き方をしていたので、どこが間違っているのか分かりませんでした。 では書き直したPHP文をもう一度。 <?php //csvファイルのアップロード if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { //「files」という名前のフォルダを同じ階層に設置。ここにCSVファイルをアップロード if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); //fileパス $file = "files/" .$_FILES["upfile"]["name"]; //接続文字列 $dsn = 'mysql:dbname=shop;host=localhost;charset=utf8'; $user = 'user'; $password = 'password'; $option = array( // エラーモードを例外スローに設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // local ファイルからload可能にする PDO::MYSQL_ATTR_LOCAL_INFILE => true , ); try{ $pdo = new PDO($dsn, $user, $password, $option); $sql_src = <<<SQL LOAD DATA LOCAL INFILE %s INTO TABLE `%s` CHARACTER SET sjis fields terminated by ',' enclosed by '"' lines terminated by '\\r\\n' IGNORE 1 LINES SQL; $table= 'food'; $sql = sprintf($sql_src , $pdo->quote($file), $table); //sql文の実行 $stmt = $pdo->query($sql); echo "インポートが完了しました!"; }catch(Exception $e) { echo 'エラー:', $e->getMessage(); } //失敗したとき } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> これで接続できました!ありがとうございました★

その他の回答 (2)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

load 文にも、読み込むファイルの文字コードを指定できます。field の指定より前に記述します。これが一番確実で、csvから読みとったデータをこの指定文字コードから対象テーブルやカラムの設定文字コードに変換します。 本家の英文マニュアルみると、5.1.17から使える構文のようです。というか、このversion以降は、これしか参照しないみたいなニュアンス? http://dev.mysql.com/doc/refman/5.1/en/load-data.html 「it is usually preferable to specify the character set of the file by using the CHARACTER SET clause, which is available as of MySQL 5.1.17. 」 日本語版マニュアルは、これ以前の情報しかないようです。 質問文に肝腎のMySQLのversion記載がないですね。XAMPPのversionも違う物みてるみたいだし。3.2ってXAMPP controllerアプリのversionかな MySQLのversion は select version() で確認した物を書いてください。ときどきdistribution番号を書いてる人がいるので。 あと、\n は、mysql に渡すときに 文字バックスラッシュとn でないとならないので、 phpの文字列内では \\n とする必要があります、または、文字列全体をシングルクォート'で括れば、\' 以外の \ は文字バックスラッシュ。 蛇足だけど " や ' のエスケープが面倒だから、ヒアドキュメントを使うのをおすすめする。 以下 例文, あ、pdo 使用前提で。。 <?php $file = /* 適宜 */ ; $table= 'food'; $sql_src = <<<SQL LOAD DATA LOCAL INFILE %s INTO TABLE `%s` CHARACTER SET sjis fields terminated by ',' enclosed by '"' lines terminated by '\\r\\n' IGNORE 1 LINES SQL; $sql = sprintf($sql_src , $pdo->quote($file), $table); $stmt = $pdo->query($sql);

do79tama13
質問者

お礼

教えていただきました通り、SQL文内の「fields」の前に「CHARACTER SET sjis」を追加したところ文字化けせずにインポートできました!ありがとうございました。 >質問文に肝腎のMySQLのversion記載がないですね。XAMPPのversionも違う物みてるみたいだし。3.2ってXAMPP controllerアプリのversionかな バージョンの記載が漏れてしまい申し訳ございませんでした。当方のmyaqlのバージョン5.5.32です。 XAMPPのversionはおっしゃる通りコントロールパネル画面に記載されている数字をバージョンかと勘違いしておりました。当方のXAMPPのバージョンはXAMPP Version 1.8.2でした。 XAMPPのバージョンは、コントロール画面内の「Helpボタン」→「View ReadMeボタン」→メモ帳ひらいて確認しました。 >蛇足だけど " や ' のエスケープが面倒だから、ヒアドキュメントを使うのをおすすめする。 ヒアドキュメントというものがあったのですね。これならsql文を書くのにいちいち「sql=.""」みたいな形で書かなくともスッキリしますね!調べてみたら他にもprint文を書くときなどにも使用できるようですね。参考になりました。ありがとうございます。 ちなみにPDO接続でコードを書き換えてみたところ何故かSQL文を実行してくれません。書き直したコードは以下の通りです。 <?php //csvファイルのアップロード if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { //「files」という名前のフォルダを同じ階層に設置。ここにCSVファイルをアップロード if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); //fileパス $file = "files/" .$_FILES["upfile"]["name"]; /* データベース接続 */ // PDOオブジェクト生成 $dsn = 'mysql:dbname=shop;host=localhost';      $user = 'user';      $password = 'password';      $pdo = new PDO($dsn, $user, $password); //CSVデータの取り込み $table= 'food'; $sql_src = <<<SQL LOAD DATA LOCAL INFILE %s INTO TABLE `%s` CHARACTER SET sjis fields terminated by ',' enclosed by '"' lines terminated by '\\r\\n' IGNORE 1 LINES SQL; $sql = sprintf($sql_src , $pdo->quote($file), $table); //sql文の実行 $stmt = $pdo->query($sql); $stmt->execute(); echo "インポートが完了しました!"; //失敗したとき } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> 初心者のため初歩的な質問ばかりで申し訳ございません。。

noname#244856
noname#244856
回答No.1

アップロード処理はこのページのコピペでしょうか。 http://www.php-labo.net/tutorial/php/upload.html 上記はいわゆる「ダメなコピペ」です。例外処理はちゃんとしましょう。 http://qiita.com/mpyw/items/939964377766a54d4682 http://qiita.com/mpyw/items/73ee77a9535cc65eff1e 非推奨のMysql関数を使うのもやめましょう。 http://qiita.com/mpyw/items/b00b72c5c95aac573b71 以上を踏まえて下記のようなコードでどうでしょうか・・・ http://pastebin.com/EAQ8yg3x しかしこれ、何故か文字化けを起こすんですよね。文字化けを回避するためのこともしているのに何故かうまくいきません・・・ http://d.hatena.ne.jp/hchuno/20120324/1332554400

do79tama13
質問者

お礼

返信が遅くなり申し訳ございません。教えていただいたソースを解読するのに時間がかかっておりました。 http://pastebin.com/EAQ8yg3x sql文がスッキリしていて目からうろこです。このような書き方があったのですね! それに、エラー対策に感動しました!確ユーザー側の視点に立った目線でエラー対策を考える事も必要だと感じました。 $conn = mysql_connect($sv, $user, $pass) or die("コネクトエラー"); mysql_connect関数は非推奨だったのですね。今のうちに知る事が出来てよかったです! ちなみに教えていただいたソースをコピペし実施したところ、PDO接続では何故かsql文が実行できません。当方のmysqlのバージョンはmysql:5.5.32です。

関連するQ&A

  • csvファイルをMySQLにインポートしたい

    phpでcsvファイルをフォルダにアップロードし、これをMySQLにインポートするプログラムを作成しています。 以下のソースを実行したところエラーが発生しました。 -----food.csv---------------------------------------------------------------------- "No","name","price" "1","うどん","100" "2","ぱすた","500" "3","カレー","300" ---------------------------------------------------------------------------------- -----BaseDAO.php------------------------------------------------------------------ <?php class BaseDAO{ function connect(){ try { $dsn = "mysql:host=localhost;dbname=food"; $option = array( // エラーモードを例外スローに設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // local ファイルからload可能にする PDO::MYSQL_ATTR_LOCAL_INFILE => true ); $user = 'username'; $password = 'password'; $pdo = new PDO($dsn, $user, $password, $option); $pdo->exec("SET NAMES utf8"); return $pdo; //var_dump($pdo); } catch (PDOException $ex) { print($ex->getMessage()); die("データベース接続に失敗しました"); } return null; } function disconnect($dao){ $dao = null; } } ?> ---------------------------------------------------------------------------------- ------uploadcsv.php----------------------------------------------------------------- <?php require_once 'BaseDAO.php'; //csvファイルのアップロード if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { //「files」という名前のフォルダを同じ階層に設置。ここにCSVファイルをアップロード if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0644); //fileパス $file = "files/" .$_FILES["upfile"]["name"]; $sql_src = <<<SQL LOAD DATA LOCAL INFILE %s INTO TABLE `%s` CHARACTER SET sjis fields terminated by ',' enclosed by '"' lines terminated by '\\r\\n' IGNORE 1 LINES SQL; $table= 'food'; //テーブル名 $inport=new BaseDAO(); //インスタンス作成 $pdo=$inport->connect(); //pdoクラスに接続 $sql = sprintf($sql_src , $pdo->quote($file), $table); //sql文の実行 $stmt = $pdo->query($sql); echo "インポートが完了しました!"; //失敗したとき } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> -----index.html--------------------------------------------------------------------- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>sample</title> </head> <body> <form action="uploadcsv.php" method="POST" enctype="multipart/form-data"> ファイル:<br> <input type="file" name="upfile" size="30"><br> <br> <input type="submit" value="アップロード"> </form> </body> </html> ---------------------------------------------------------------------------------- --------foodテーブルを作成するSQL文------------------------------------------------ CREATE TABLE IF NOT EXISTS `food` ( `No` int(11) NOT NULL, `name` varchar(50) NOT NULL, `price` varchar(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ---------------------------------------------------------------------------------- 実行したところ以下のエラーが発生しました。 Warning: PDO::query() [pdo.query]: LOAD DATA LOCAL INFILE forbidden in C:\xampp\htdocs\food\uploadcsv.php on line 30 <当方のPC環境> phpMyAdmin:3.3.9 PHP: 5.3.5 Apache 2.2.17 MySQL 5.5.8 XAMPP version 1.7.4 フォルダ(files)にcsvファイルがアップロードされているところまでは確認できましたが、MySQLにインポートされていないようです。 BaseDAO.php内の「PDO::MYSQL_ATTR_LOCAL_INFILE => true」が効いていないように思えます。 初歩的な質問で凝縮ですが、原因を教えていただきたく存じます。

    • ベストアンサー
    • PHP
  • PHPでのファイルアップロード。リネーム機能実装

    インターネット上でフリーで配布されていたPHPスクリプトです。 <?php 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); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?> --- files フォルダにファイルをアップロードするのですが このままアップロードすると、同じファイル名でアップした場合ファイルが上書きされてしまいます。 アップロードした時、[お腹すいた.zip] だった場合、[20120808-1958-お腹すいた.zip]のように 時間と日付を入れたいのですが、私の知識では調べて試してみたのですが、白紙になる限りで うまくいきません。 どなたかご教授頂けませんでしょうか。

    • ベストアンサー
    • PHP
  • PHP ファイルupロードのセキュリティ

    ただいま ファイルUPロードするための簡単なPHPプログラムをせいさくしています 。 セキュリティの部分とか足らないところがるとは思うのですが、 下のプログラjムをどうやって改造すればいいのでしょうか? たとえば 容量を制限する。 ファイル種類を限定する等  おしえて頂きたいと思っています。 よろしくお願いたします。 <body> <p><?php 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); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?></p> </body> </html>

    • 締切済み
    • 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でアップロードしたファイルが開けない

    CSVファイルにDBのデータが入っていて、 これを、phpのフォームでアップロードしてinsertまたはupdateしたいと思っています。 で、以下のようにやったのですが、 ###################################################### update.txtをアップロードしました。 <hr> files/update.txtファイルを開けませんでした ###################################################### と表示されています。 ソースはこんなかんじです。 (タブを全角空白4文字に置換してます) <?php //<fileをおきやすいいちにもってく> 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);         echo $_FILES["upfile"]["name"] . "をアップロードしました。";         } else {         echo "ファイルをアップロードできません。";         }    } else {     echo "ファイルが選択されていません。"; } //</fileをおきやすいいちにもってく> ?> <hr /> <?php //<fileひらく> $filename ="files/" . $_FILES["upfile"]["name"]; $fp = fopen($filename,'r'); print $filename ; if(is_resource($fp)){     die("ファイルを開けませんでした"); } flock($fp,LOCK_SH); //</fileひらく> //<1行ずつアップデート> while(!feof($fp)){ 以下無謀・・・ なお、ディレクトリはこんなかんじです。 #################################################### [root@★ files]# pwd /var/www/admin_html/files [root@★ files]# ls -al /var/www/admin_html/ total 24 drwxr-xr-x 3 mygwdisk mygwdisk 4096 Aug 12 08:25 . drwxrwxr-x 11 root root 4096 Aug 12 05:11 .. -rw-r--r-- 1 root root 51 Aug 12 05:28 .htdigest -rw-r--r-- 1 mygwdisk mygwdisk 2991 Aug 12 09:04 bc-refresh.php drwxrwxrwx 2 mygwdisk mygwdisk 4096 Aug 12 09:10 files -rw-r--r-- 1 mygwdisk mygwdisk 1511 Aug 12 07:44 index.php [root@★ files]# ls -al /var/www/admin_html/files total 12 drwxrwxrwx 2 mygwdisk mygwdisk 4096 Aug 12 09:10 . drwxr-xr-x 3 mygwdisk mygwdisk 4096 Aug 12 08:25 .. -rw-r--r-- 1 apache apache 1657 Aug 12 09:10 update.txt [root@★ files]# "########################################################## どなたかお助けいただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVファイルをMYSQLにインポート

    先日からMYSQL+PHPの勉強をはじめました。 データベース構築の際、以前作成したCSVファイルをMYSQLのテーブルとして 利用したいと考えております。 そこで、MYSQLコマンドより、 LOAD DATA LOCAL INFILE 'ファイル名.csv' INTO TABLE テーブル名 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'; Query OK, 0 rows affected (0.04 sec) Records: 102 Deleted: 0 Skipped: 102 Warnings: 0 とCSVファイル自体が悪いのかSQL文に問題がるのかインポートがうまくいきません。。 ちなみにCSVは  0,2011/6/2 0:00,80.94,81.32,80.55,80.92 0,2011/5/25 0:00,81.94,82.17,81.8,81.95 0,2011/5/23 0:00,81.77,82.04,81.32,81.99 環境はphpdevで一括でインストールした phpadmin: バージョン2.3.2 MYSQL: MySQL4 apache: 1.3.27 初心者で基本的な質問かもしれないですがどうかご教授お願いします。

    • ベストアンサー
    • MySQL
  • 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からmySQLのデータベース作成

    カンマ区切りのcsvファイルを読み込んでMySQLのデータベースを作成したくて、下記のプログラムを作成しました。 しかし、正常に動作しません。どこに問題があるのでしょうか。 よろしくお願いします。 <?php $file = '"test.txt"'; //------------------------------------------------------------- //データベースアクセス //------------------------------------------------------------- $url = 'test-test.com'; // MySQL hostname $user = 'test_user'; // Your MySQL user name. $pass = 'password'; // Your MySQL password. $db = 'test_db'; // MySQLへ接続する $link = mysql_connect($url,$user,$pass); if ( $link == FALSE ) { error(__line__); } // データベースを選択する $sdb = mysql_select_db($db,$link); if ( $sdb == FALSE ) { error(__line__); } mysql_query("SET NAMES utf8"); //CSVデータの取り込み $sql = "LOAD DATA LOCAL INFILE '$file' INTO TABLE test fields terminated by"; $sql .= " LINES "; $sql .= " TERMINATED BY '\r\n' "; $sql .= " IGNORE 1 LINES"; $result = mysql_query($sql, $conn); if (!$result) { $message = 'Invalid query: ' . mysql_error() . "\n"; $message .= 'Whole query: ' . $sql; die($message); } //------------------------------------------------------------- // エラーメッセージ表示 //------------------------------------------------------------- function error($line) { echo "error code:" . $line; exit; } ?> ---------- .CSVファイル ---------- 日付,内容,備考 0901,value,etc 0902,value2,etc2

    • ベストアンサー
    • PHP
  • PHP重複ファイルに連番をつけてアップロードしたい

    ファイルをアップロードするページをPHPで作りました。 testup.htmlでファイルを選択し、 testup.phpでファイルをサーバーにアップする 簡単な仕組みです。 アップロードには成功したのですが、 同じファイル名のデータがある場合、上書きされてしまいます。 上書きされずに、連番等をファイル名に追加してアップロード できればと思いましたが、方法がわかりません。 当方PHPの初心者です。何卒お力をお貸しください。 よろしくお願い致します。 ソースを記入しておきます。 「testup.html」 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>test</title> </head> <body> テストアップローダー<br> <form action="testup.php" method="post" enctype="multipart/form-data"> アップロードするファイルを選択してください。 <br> <input type="file" name="upfile" size="30"><br> <br> <input type="submit" value="アップロード"> <label>  <input type="reset" name="button" id="button" value="リセット" /> </label> </form> </body> </html> 「testup.php」 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>test</title> </head> <body> <p><?php 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"], 0777); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; echo "<br><br>ありがとうございました。"; echo "<br><FORM><INPUT TYPE=button value=閉じる onClick=window.close()></FORM>"; } else { echo "ファイルをアップロードできません。"; echo "<br>お手数ですが前の画面に戻ってもう一度ファイルをアップロードしてください。"; echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>"; } } else { echo "ファイルが選択されていません。"; echo "<br>お手数ですが前の画面に戻ってファイルを選択してください。"; echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>"; } ?></p> </body> </html>

    • ベストアンサー
    • PHP
  • 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

専門家に質問してみよう