質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2251閲覧

確認画面を経由してPHP7で大量のCSVデータをデータベースにインポートする方法

tomona

総合スコア37

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/08/18 02:52

編集2019/08/18 05:40

PHP7でWebアプリを開発しております。
ユーザーがCSVでデータ(名簿情報)をシステムにインポートする際に確認画面を経由してデータベースにインポートする方法について悩んでいます。

ユーザーはインポート画面から確認画面に進み、インポートしたデータを確認します。
確認して修正が必要であればキャンセルを行い、やり直します。問題がなければ確定ボタンで本データとして登録されるイメージです。

CSVをインポートしてデータを変数に格納することは出来ました。
CSVデータを変数に格納し、そのデータを確認画面を表示するのですが、確認画面で表示した情報をhiddenフォームでPOSTしようとしたところPOSTデータの上限に引っかかってしまい、データベースへの格納ができませんでした。

インポート時にデータベースに格納すると確認画面でブラウザを閉じた場合にゴミデータが残ってしまう懸念があります。
※フラグを立ててバッチで消す方法も考えられますが、実務でそのような運用はされてますでしょうか?

確認画面⇒データベースへのデータの受け渡し方法についてアドバイスいただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/08/18 03:27

質問に現象を再現できるだけのコード、CREATE TABLEと数行で良いからcsvを追記できると適切なコメントが付きやすいのでは? 個人的には、MySQL CSVファイルをインポート https://qiita.com/Tamucha/items/c65ae417877ae01b132c で足りそうに思えます。
takasima20

2019/08/18 04:17

確認画面で何を確認(表示)しているか、確認画面で中止(キャンセル)はあるのか、あたりの流れをもう少し詳しく質問に書かれると、みなさんもイメージがつかみやすくなると思います。
tomona

2019/08/18 05:41

ご指摘ありがとうございます。 画面で表示されるデータやユーザーの操作手順について追記させていただきました。
退会済みユーザー

退会済みユーザー

2019/08/18 06:15

CSVは何行何列のデータですか?
tomona

2019/08/18 07:19

CSVは17列です。 行数はユーザーによって変わりますが、最大1万行程度はほしいと考えています。
takasima20

2019/08/18 08:57

「修正が必要」か否かは、具体的にどういったレベルのものになるのでしょうか? 事前にチェックできるものならばその方がラクですし、実行時に一万行のデータを(Webブラウザから)目で見て確認するのは非効率な気がします。
tomona

2019/08/19 04:01

例えば、名簿情報の電話番号のカラムに文字列が入っている等のテーブル定義に当てはまらない場合、ハイライトしてその旨をユーザーに表示したいと考えています。 1万行の個々のレコードというよりはCSVの行とデータベースの行がマッチしているかという観点で確認できるとよいと考えています。
takasima20

2019/08/19 22:26

となると、Webブラウザに表示するのはエラーになったものだけでよいかも? あと、エラーがなかったら即データベースにインポートする流れの方が作りやすいと思います。
tomona

2019/08/22 11:33

ありがとうございます。 確かにその方が作りやすそうですね。 1万件は最大値ですので通常は全件表示してユーザーに目視を促したかったのですが、そのようにしてみます。
guest

回答4

0

ベストアンサー

アップロードされたファイルを分解して確認画面を出しているわけですよね。
でも確認画面に入れてある <input type="hidden"> でPOSTした値でDBに入れようとしているということですね。

でも、それって無駄では?
POSTに制限があるということもそうだけど、

アップロードしたファイルはサーバーに存在しているのであるから、アップロードしたファイルを分解して配列にでも変換してDBに入れればいいのではありませんか?

<input type="hidden"> にしているということは、ユーザーが値を変更できるようにしているという仕様でもないでしょう。


ファイルからインポートする場合

  • エラーがあったら、全件取り消してデータを修正したのち再度アップロードする
  • エラーがあったら、エラー行をスキップし、ログを書き出して、エラーがないものを登録する。

どちらかの仕様になるのが普通だと思います。

投稿2019/08/18 06:27

編集2019/08/18 06:49
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomona

2019/08/22 11:13

回答ありがとうございます。 アップロードしたファイルを残しておき、そこからインポートするデータを取得する案が最も良いと感じました。 アップロードしたファイルを処理終了時に削除する必要がありますが、データベースのデータを消すよりは問題が少ないと感じました。
退会済みユーザー

退会済みユーザー

2019/08/22 11:14

>「アップロードしたファイルを処理終了時に削除する必要があります」 それだとちょっと考慮が足りないと思います。
tomona

2019/08/22 11:18

どういうことでしょうか? 一時ファイルとしてアップロードした場合、リクエスト終了時(確認画面を表示した時点)でファイルが削除されてしまうため、データベースに書き込むためには残しておく必要があると考えています。 そして、データベースに書き込んだ後、削除処理を入れるものと考えておりました。
退会済みユーザー

退会済みユーザー

2019/08/22 11:20

インポートをキャンセルしたとき
tomona

2019/08/22 11:26

あー理解しました。 確認画面でブラウザを閉じたらファイルが残り続けるということですね。 そしてKosuke_Shibuyaさんが提案している方法はエラーがあればDB処理を行わないで確認画面でユーザーにエラー内容を通知するということですね。
退会済みユーザー

退会済みユーザー

2019/08/22 11:28

> エラーがあればDB処理を行わないで確認画面でユーザーにエラー内容を通知するということですね。 私が提案しているのはそもそも確認画面はありません。
tomona

2019/08/22 11:35

認識と違うのであれば、詳細伺えますと幸いです。
退会済みユーザー

退会済みユーザー

2019/08/22 11:39

私が提案しているのは、どちらのケースも確認画面は存在しません。 存在しているのは、「input:file と submit」が含んでいる登録画面と完了画面のみです。
tomona

2019/08/22 11:46

わかりました。仕様を変えた方がスムーズにいくということですね。 ご丁寧に追加説明ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/08/22 12:00

> 仕様を変えた方がスムーズにいく コーディングに限らず、そう思います。 「最大1万行」まで想定しているとのことですから、そんな大量のデータをユーザーは確認画面でチェックするはずがないという点と、仮にチェックする人がいたとしても、セッションが切れるまでに次の動作を強いることになるからです。
guest

0

まず確認画面なんて全く意味のないものは付けない。

大量のデータをブラウザからインポートしようとしても時間切れで失敗する。
ファイルのアップロードだけしてインポートは別で実行。

投稿2019/08/18 03:27

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomona

2019/08/18 05:43

確認画面をそもそも付けないのはありかも知れませんが、意味がないのはなぜでしょうか。 バリデーションチェックの結果などはどのように表示すれば良いでしょうか。
guest

0

CSVデータの「大量」度合いにもよると思いますが(あと「確認」とは何を確認する/させるのかにもよりそうですが)参考までに。

POSTデータの上限に引っかかってしまい

POSTデータの上限を引き上げるとか。(php.iniのpost_max_sizeまたはmax_input_vars
(これやるぐらいなら他の方法使った方がいい気もしますが)

CSVデータを変数に格納し確認画面を表示する

確認画面はJavascriptなどで表示して(要はその時点ではサーバーへ送信せずローカルだけで処理し)、確認完了後にサーバーにファイルとして送信するとか。

もしくはAjaxを利用して、
ファイルがinputタグに入る→ユーザーが確認ボタン押す→確認用APIにファイル送信→確認結果が返って来る→確認内容を画面に表示→ユーザーが送信ボタン押す→本番用APIにファイル送信(ページ遷移が無いので維持されている)→結果表示
でもいいかもしれません。

フラグを立ててバッチで消す方法

そういう運用をする場合もあると思います(仕様次第)。

投稿2019/08/18 03:25

編集2019/08/18 03:33
sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomona

2019/08/18 05:48

複数案のご提案ありがとうございます。 2番目のJavascriptを用いる案が現実的かなと思いました。 参考にさせて頂きます。
guest

0

以下のような処理はあり得るかなと思います。

    1. CSVのupload時に 一時領域(ファイル(Local, S3, etc) or DBの特別なTableの行)に保存して、その識別子(ファイル名 や Tableの行の主Key)を 確認画面の hidden に埋めておく
    1. 確認画面からPOSTされたら、その識別子からデータを読み込んで、実際にDBに書き込む。正常終了したら一時領域からファイルを消す
  • 不定期) 一時領域にあるデータの古いものは削除する

実際のDBに書き込んで、後から削除するのは色々問題ありますが、
一時領域なら容量の問題さえなければ、大丈夫に思いますので。

投稿2019/08/18 03:18

mokemokechicken

総合スコア948

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomona

2019/08/18 05:49

ご回答ありがとうございます。 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問