【PHP】CSVファイルの内容をMySQLで登録する方法とは?

このQ&Aのポイント
  • 超初心者の方に向けて、PHPを使ってCSVファイルの内容をMySQLに登録する方法をご紹介します。
  • 具体的な手順やサンプルコードを交えながら、CSVファイルの読み込みからMySQLへのデータ登録までを解説します。
  • また、参考になる情報源や注意点も併せてご紹介します。
回答を見る
  • ベストアンサー

【PHP】CSVファイル内の文字列をMySQLへ

■質問内容: 超初心者です。質問が的外れかもしれませんが自己解決できずにいます。何卒ご教授ください。 達成したい内容は 「PHPでCSVの内容をMySQLで既に作成されたテーブルへ登録したい」というものです。 ネットや書籍でCSVを読み込む方法や、テキストファイルを読み込む方法など試行してみましたが上手くいきません。 ■環境: php:ver5.2.6 MySQL:ver4.0.24 ホスティングサーバはロリポップです。 ■状況と経緯: ソースを交え直接的なご指摘いただけると、大変ありがたいです。 【aaa.csv】 091010-01,TO_001,'【内装】','ドアの取り付け' 091011-02,TO_002,'【外装】','タイル拭きつけ' ・・・・・ のようにカンマ区切りの4つの項目があります。 これを、PHPを介して、 MySQL/DB/ TABLE: day|ver|module|naiyou (|は区切り) 4つのフィールドへ上記のCSVファイルの左から順に格納したいのです。 ○結果的に、 day|ver|module|naiyou(|は区切り) 091010-01|TO_001|'【内装】'|'ドアの取り付け' 091011-02|TO_002|'【外装】'|'タイル拭きつけ' ・・・のようにしたいです。 --以上-- 上記について教えてください。 出来れば具体的な記述でご指摘いただけるか参考サイトをご紹介 下さるとありがたいです。 何卒、宜しくお願いいたします。

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

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

そもそもPHPからMySQLへのアクセス方法がわからないという質問に見え すでに質問の内容が元ネタからはなれている感がありますが 流れ的にはこんな感じで。 <? $host='localhost'; $user='root'; $passwd='hogehoge'; $db='mydb'; $link=mysql_connect($host,$user,$passwd); mysql_select_db($db,$link); $sql="・・・"; $res=mysql_query($sql,$link) or die("error:".mysql_error()); ?>

m_toma
質問者

お礼

ありがとうございました。 できました!! 助かりました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>で、$splの内容(aaa.csv)が表示される状態です。 っというのは INSERT INTO `table` (`day`,`ver`,`module`,`naiyou`) VALUES('091010-01','TO_001','\'【内装】\'','\'ドアの取り付け\''), ('091011-02','TO_002','\'【外装】\'','\'タイル拭きつけ\'') が表示されるということでよろしいですか? (それとも単にcsvのデータが表示されるだけ?) あとはmysqlへデータを投げるだけです。 http://www.php.net/manual/ja/book.mysql.php

m_toma
質問者

お礼

再び、ご回答頂きありがとうございます。 >が表示されるということでよろしいですか? はい。その通りです。 >あとはmysqlへデータを投げるだけです。 参考のURLを見ています。 現在のところ、自己解決に至っておりませんがもう少し粘ってみたいと思います。

m_toma
質問者

補足

URLを参考に、また違うサンプルなどwebで探しテストしてみましたが、 MySQL登録にいたっておりません。 引き続きお解りでしたら、教えていただけると助かります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

いくつかやり方はあると思いますが、はしょって書くとこんな感じ <? $fname="aaa.csv"; $fp=fopen($fname,"r"); $count=0; $sql=""; while (($data = fgetcsv($fp, 1024, ",")) !== FALSE) { $str=""; foreach($data as $val){ if($str!="") $str.=","; $str.="'".addslashes($val)."'"; } if($sql!="") $sql.=","; $sql.="({$str})"; } $sql="INSERT INTO `table` (`day`,`ver`,`module`,`naiyou`) VALUES".$sql; print $sql; ?> セキュリティなどのことを考えるともう少しきちんとエスケープ処理を 入れた方がいいですが、フローをみるだけならこれでわかると思います。

m_toma
質問者

お礼

早速のご回答を頂き、ありがとうございます。 教えていただいた方法を試して見ましたが上手く行きませんでした。 私の理解不足が大きいのですが、 $sql="INSERT INTO `table` (`day`,`ver`,`module`,`naiyou`) VALUES".$sql; print $sql; ?> で、$splの内容(aaa.csv)が表示される状態です。 勘違いなどご指摘いただけるとありがたいです。

関連するQ&A

  • 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
  • PHP+MySQL でのcsvファイルインポート

    PHP + MySQL で、他システムから出力されてきたcsvファイルをテーブルへインポートしたいと考えています。 LOAD DATA INFILE で取り込もうとしていますが、対象のcsvファイルの特徴のためにうまく行かず苦戦しています。 取り込みたいファイルは、以下のようになっています。  ・各フィールドが "(ダブルクォート) で囲まれている  ・各フィールドは ,(カンマ) で区切られている  ・金額の項目には、桁区切りのカンマが入っている  例) "0001","あああああ",…(中略)…,"105,000","100,000","5,000",…     コード 項目名            税込み  税抜き 消費税  というような形です。    困っているのは、金額に使われている、桁区切りのカンマの処理についてです。  目的としては、データベースへ取り込むときには 105,000 は 105000 として取り込めればいいのですが、他システムから、桁区切りがなされた状態でcsvが作成されてきています。 LOAD DATA INFILE test.csv INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;  各項目のダブルクォートはENCLOSED BY で、項目を分けるカンマはTERMINATED BYで処理できていると思うのですが、金額の区切りに使われているカンマと項目の区切りのカンマを区別させられずに苦戦しています。  事前にcsvを加工するのも考えてはいるのですが、なるべくcsvを加工せずにそのまま取込したいと思います。  何か、簡単に回避できる方法等があればご教示願います。  宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPで表示したテーブル内容をCSV出力したい(PHPとMySQL別サーバ)

    はじめまして。 PHPで別サーバにあるMySQLのテーブル内容を表示しています。 表示されたテーブル内容をPHPからCSV出力したいのですが、どうすればよいのでしょうか? 下記のように、MySQLのあるサーバに接続して $host = "10.160.XX.XXX"; mysql_connect($host, "test_user", "test_passwd") 下記のようにエクスポートしてみましたがダメでした。 $sql = "select * into outfile '/home/test/test.txt' fields optionally enclosed by '~' terminated by ',' from test"; $res = mysql_query($sql,$conn); やりたいことは、ユーザがPHPの画面上からMySQLのさまざまなテーブル内容を選択表示した際に ユーザの任意で("CSV出力"という文字をクリック)、表示されたテーブル内容をCSV出力したい。 サーバはPHP、MySQLともにLinuxです。 PHPのバージョンは5.1.4 MySQLのバージョンは4.1.20です。 宜しくお願い致します。

    • 締切済み
    • 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
  • PHPを使ってcsvファイルアップロードページ

    質問失礼します。 すごくおおざっぱな質問内容かと思うのですが、 ↓PHPでこんなしくみを作りたいと思っています・・・ +-----------------+ │ファイル名     │ [参照] [インポート] +-----------------+ ※しくみ 参照ボタンを押すと、デスクトップなどにあるcsvファイルを選択することができ、 選択した後インポートボタンを押すとMySQLにデータが保存される 検索の際に 「PHP csv 参照ボタン インポート」 などで検索しましたが、どうも思うようなページにたどり着けません。 1からこの仕組みを作るのは私の技術では難しいのですが、 参照になるページなどありましたら教えて下さい。 サンプルページも公開していると嬉しいのですが・・・ もしくは、検索方法でも大丈夫です。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP/mySQLでインサートができません。

    PHPとmySQLを勉強中の初心者ですが、よろしくお願いします。 PHPで簡単なインサート文を作ってそれをmySQLに保存しようとしているのですが、以下のエラーが出てしまいます。 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource プログラムは以下の通りです。HOSTNAME,USERNAME,DBPWDは別のところで定義していますが、mysql_connect, mysql_select_dbではエラーにならないので、データベースの選択まではうまく行っていると思うのですが。 $conn = mysql_connect(HOSTNAME, USERNAME, DBPWD); if(!$conn){ die("Logon Failure to mysql Server."); } $db = mysql_select_db(DBNAME, $conn); if(!$db){ die("Cannot access to the DB"); } foreach($csv_ary as $a => $b) { $query = "INSERT INTO TEST field_a VALUES $a"; if (!mysql_query($query, $db)){ echo "更新失敗: SQL=$query<br>"; } } mysql_close($conn); field_aはvarchar(10)でPrimary_key, NOT NULLの設定です。 Foreachで展開した配列の値はちゃんと長さ10の文字列が入っています。 PHP 4.3.11は mySQL 4.0.27です。 よろしくお願いします。

    • ベストアンサー
    • 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
  • CSVファイルのデータが、データベース上で文字化け

    CSVファイルのデータが、データベース上で文字化けする現象を解決したい! CSVファイルは、任意の場所にFTPソフトを使用してアップロードし、プログラム上でCSVを読み込むという手順です。 ■開発関係情報 phpは使用しておらず開発はperlを使用 開発プログラムの文字コードはEUC-JPで、出力されるHTMLの文字コードはShift-JISです。 (1)hetemlに設置した場合は正常に動作しました。 予め作成されていたデータベースのエクスポートファイルをインポートしてテーブルを作成しましたがインポート時のファイルの文字セットは「utf8」で、コーディングへの変換は「non」で実行しています。 MySQLバージョン:5.0.82 MySQLの文字セット:UTF-8 Unicode(utf8) MySQLの接続照合順序:utf8_unocode_ci phpMyAdmin - 2.11.11.3 MySQL クライアントのバージョン: 4.0.25 (2)無料のレンタルサーバー(国外)に設置すると文字化けします。 (1)と同じ手順で行うと、データベース上でCSVデータの日本語が文字化けします。 MySQLバージョン:5.1.65-cll MySQLの文字セット:UTF-8 Unicode(utf8) MySQLの接続照合順序:utf8_unocode_ci phpMyAdmin - 3.4.11.1 MySQL クライアントのバージョン: 4.1.22 そこでCSVをFTPでアップせずデータベースでインポート(ファイルの文字セット:utf-8、エンコーディングの変換なし)しようとすると「CSV入力のカラム数が不正です」というエラーになります。 色々と調べていると、文字コードをすべてEUCに統一すると文字化け解決と書いてあったので、CSVファイル・MySQLの接続照合順序・インポートするときの文字セットなどの思い当るところ全てをEUCに指定して、エンコーディングへの変換を「EUC」に「全角カナへ変換する」にチェックを入れて実行してみても、やはり「CSV入力のカラム数が不正です」エラーになります。 この時、フォーマット項目で「LOAD DATA文を使用したCSVの読み込み」を選択し、特有のオプションで「カラムの終端記号」を「,」「カラム囲み記号」を「"」に設定して、CSVファイルでは区切りを「,」と「","」の2パターンで試しても同じエラーでした。 また、気になる点としては、MySQLの文字セットはUTF-8のままでどうやって変更するのかがわかりません。 開発にphpは使用していなくても、phpmyadminを使用しているということはphp.iniの設定が必要ですよね? php.iniの設定は、権限が与えられていなければサーバー側で設定を行ってもらう必要があるのでしょうか?(初歩的な事ですみません) 試行錯誤していますが、解決法が分からず困っています。 どなたかご教示いただけませんでしょうか。 何卒よろしくお願い致します。

  • 検索とレコード数(CSVファイルより)

    PHP初心者です CSVファイルを参照して 項目で検索 検索した内容のレコード数(件数)を 表示させる関数(方法)を教えて頂きたいです 今までMysqlで操作していたのですが CSVファイルに変わって 困ってしまいました よろしくお願いします

    • 締切済み
    • PHP
  • phpからmysqlへ接続できなくて困っております

    phpからmysqlへ接続したいのですが、データベースへ接続できません。 まず、使用環境は以下の通りです。 ------------------------------ OS:RedHatLinuxES4 MYSQL:mysql-4.1.7-4.RHEL4.1 PHP:php-4.3.9-3.1 MysqlとPHPはRedHatサイトのパッケージを使用してrpmでインストール しております。 MySQLのデータディレクトリをデフォルトの/var/lib/mysqlから /home/mysqlへ変更してます。 それに伴い、/etc/my.cnfのソケットとデータディレクトリの箇所 を変更しております。 <デフォルト設定> socket=/var/lib/mysql/mysql.sock datadir = /var/lib/mysql <変更後> socket=/home/mysql/mysql.sock datadir = /home/mysql ------------------------------ 色々調べていて原因は分かりました。 mysqlで指定しているソケットの場所と、PHPで指定している ソケットの場所が違うため、接続できないようです。 phpinfoにて情報を取得したところ、mysqlの箇所でソケットを指定 がデフォルト値の/var/lib/mysql/mysql.sockとなっておりました。 そこで、php.iniファイルのMYSQLの箇所を以下のように修正しました。 <デフォルト設定> mysql.default_socket = <変更後> mysql.default_socket = /home/mysql/mysql.sock 上記変更後、apacheを再起動し、再度phpinfoにて情報を取得した ところ、以下のようになりました。 MySQL Support項目、 MYSQL_SOCKET → /var/lib/mysql/mysql.sock #変更されず、反映されていないように見受けられるます Directive項目、 mysql.default_socket → /home/mysql/mysql.sock #php.ini修正前は確か、no valueであったと思います。 #従いまして、php.iniの内容が反映されている? --- その後、mysqlへ接続する、mysql_connect関数を利用して 接続テストを行った結果、エラーとなり接続できませんでした。 <エラーメッセージ> 接続できませんでした: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) --- おそらく、上記のphpinfo情報取得した時の、MYSQL_SOCKETが反映 されていないからだと思っておりますが、php.iniファイルの mysql.default_socketを修正すれば反映されると思ったにも関わらず 反映されないので、次にどこを修正すれば良いのか分かりません。 ご教授頂けませんでしょうか。宜しくお願い致します。

    • ベストアンサー
    • PHP