生活の跡

個人的な備忘録

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