PHPでCSVファイルによりMysqlを更新

前回の続きで、PHPを使ってメールでアップロードしたCSVファイルでデータベースを更新する処理を作ってみます

行う内容としては

1,CSVファイルの解析

2,対象となるデータベース、テーブルの特定

3,データベースの更新(追加)

4,結果のレポート

となります

まず、CSVファイルの解析は

ファイルを開いて、データーの取得です

ファイルの大きさにもよるのですが

PHPには、CSVを読み込む関数があるので、それを使ってみる

また、1行目がフィールド名になっている事が多いので、

1行目は特別とします

データは、以下のような形式になります

ファイルを扱う場合、文字コードも意識しないと行けないのですが

文字化けに注意しながら進めてみる

ファイル名を

inp_file.csv

とすると

まずは、データベースを固定して

追加の文章を作ってみよう

insertとupdateがあるが全てinsertとしよう

ただし、以前にアップロードしたデータについては

除外することにする

1行目のヘッダーとカラムの対応表が必要になる

INSERT INTO テーブル名 (列名1, 列名2,…) VALUES (値1, 値2,…);

となるので、列名と値の対応が必要になる

列名を、ヘッダーに合わせて、順番を変更するか

あるいは、確定して、行く方法もあるが、順番は確定として

進めることにする

次に、重複を避ける方法として、レコードを特定するユニークなコードがあればいいが、必ずしもあるとは、限らないため

データの一致にて行うことにする

つまり、フィールドが全て、同じ場合は、見送りとし

カラムがわずかでも変わっていた場合には、新規に追加するものとする

INSERT INTO テーブル名 (列名1, 列名2,…) VALUES

まで、固定で、

(値1, 値2,…);

を、入力したデータにて変更するよになる

SQL文を、文字列で作成する方法もあるが、エラーチェックは、インジェクション処理などの処理を含まれた、処理を行う

データベース名
openbook

テーブル名
tp_gmo_corp

“日付”,”摘要”,”入金金額”,”出金金額”,”残高”,”メモ”

データベースへの書き込み(insert)はで行う

文字化けしたので

mb_convert_encoding($line,”utf-8″,”auto”)

を、追加した所、エラーとなった

sudo apt-get install php-mbstring

で、行ったが、やはりダメ

sudo apt install php7.4-mbstring

で、上手く行った

次は

could not find driver

のエラーになった

sudo apt-get install php7-mysql

では、読み込めなかったので

sudo apt-get install php7.4-mysql

で、解消した

これで、CSVに従って書き込んでいたら

数値カラムのInsertでエラーになった

$culum=””;

で、数値のカラムに入れるとエラーになる

””のときは、0に書き換える必要があるとると

カラムの属性情報も管理しないといけない

手抜きは、できないようである

まずは、ハードコーディングで、サンプルを書き込む所まで

行ってみる

ファイルを開けて、追加してみる

2つの処理を合体してみよう

これで、複数行の挿入ができた

次に、重複チェックを行う

既に登録済の行は登録しないようにする

行を特定する、カラムがないので、全てのカラムの一致で、除外するようにしてみる

一応できたが、データ依存性が大きいので、これをいかに、汎用化するか

まずは、ヘッダーにより、フィールドの定義を行う

これをもとに、前回のプログラムを書き換えてみます

重複検索のカラムの範囲と、挿入するカラムの範囲の処理はこれから

Stripのときには、不要なカラムが多いのと、ユニークカラムがあるので、この時に活用していく予定です

データディクショナリーは、Jsonに落として、外部にする事もできそうです

既存のデータを調べて、重複部分から、テーブルを特定する方法もあるが

当面は、この方法で

また、データディクションリーから、新規テーブルも作れるが

はじめの1回なので、後でいいかな