概要
FuelPHPで読み込んだCSVの内容をDBに一括挿入する処理を作ったので、流れを整理して記録します。
この記事では、細かい手順やコードの書き方ではなく、全体の流れを把握することを目的とします。
環境
FuelPHP 1.8.2
処理の流れ
1. アップロードするCSVファイルを選択するためのフィールドを用意する
フォームはFieldSet:forge()を使って作れます。formタグにenctype属性を付ける必要があります。
2. POSTされたCSVファイルをサーバのフォルダに保存(アップロード)する
FuelPHPでは、$_FILE[ ]の代わりに Upload クラスでファイルを扱えます。ただ、内容を読み込むためには、一度サーバに保存する必要があるようです。
3. 保存したCSVファイルの内容を読み込み、連想配列に変換する
4. SQLでデータベースにINSERTする
連想配列をループ処理して、CSVの1行分ずつDBにINSERTします。
5. サーバからCSVファイルを削除する
DBにINSERTできたら、CSVファイルは不要なので削除します。
上記2~5に該当するコード
流れの概要は以上ですが、参考にコードの一部も記載します。
コントローラ
<?php 〜 省略 〜 //POST送信された場合の処理 if(Input::method() === 'POST'){ /***** ここから上記 2 の処理 *****/ //このアップロードのカスタム設定 $config = array( 'path' => DOCROOT.'files', 'randomize' => true, 'ext_whitelist' => array('csv'), ); //POST送信されたファイルを処理する Upload::process($config); //有効なファイルがある場合 if(Upload::is_valid()) { //$config['path']で指定したディレクトリにアップロードする Upload::save(); /***** ここから上記 3 の処理 *****/ //ファイル情報を取得 $file = Upload::get_files()[0]; //ファイルパスを取得 $path = $file['saved_to'].$file['saved_as']; //アップロードしたファイルの内容を取得 $csv_data = File::read($path, true); //ファイルの内容をCSVから連想配列に変換 $csv_data = Format::forge($csv_data, 'csv')->to_array(); /***** ここから上記 4 の処理(下記モデル参照) *****/ //モデルを呼び出してデータベースにINSERTする Model_Facility::insert_csv($csv_data); /***** ここから上記 5 の処理 *****/ //アップロードしたファイルを削除する File::delete($path); } } 〜 省略 〜
モデル
<?php class Model_Facility extends Model { public static function insert_csv($csv_data) { foreach($csv_data as $key => $val) { //DBにINSERT DB::insert('テーブル名') ->columns(array(カラム名1, カラム名2, ...)) ->values($val) ->execute(); } } }
苦労した点
1. formタグにenctype属性を付ける方法が分からなかった
私はここでハマりました。解決方法は別の記事に書いてあります。
ishii-akihiro.hatenablog.com
2. CSVデータが連想配列として読み込めない
CSVデータの囲み文字(エンクロージャ)が、デフォルトでは"
になっています。ただ、データの囲み文字が"
の時もうまく行きませんでした。
CSVのエンクロージャを空白に設定すると上手くいきました。APPPATH/config/format.php(※)で、’csv’の’enclosure’を次のように書き換えます。
<?php 〜 省略 〜 'csv' => array( 'import' => array( 'delimiter' => ',', 'enclosure' => '', 'newline' => "\n", 'escape' => '\\', ), 〜 省略 〜
(※)APPPATHになければ、COREPATH/config/format.php をコピーします。
こちらの記事が参考になりました。
おわりに
FuelPHP初学者なので苦労しましたが、いい勉強になりました。
全体の流れは、こちらの記事のおかげでイメージできました。助かりました。