FuelPHPで読み込んだCSVの内容をDBに一括挿入する流れ(概要)

概要

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 をコピーします。

こちらの記事が参考になりました。

koumei2.com

おわりに

FuelPHP初学者なので苦労しましたが、いい勉強になりました。
全体の流れは、こちらの記事のおかげでイメージできました。助かりました。

blog.seeds-std.co.jp

タイトルとURLをコピーしました