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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MySQL

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

PHP

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

Q&A

解決済

1回答

6836閲覧

phpでCSVファイルを確認画面つきでMySQLへのインポートする方法

singlestroke

総合スコア68

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MySQL

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

PHP

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

0グッド

0クリップ

投稿2016/06/05 09:25

php にてCSVファイルアップロード→CSVの内容を確認画面で表示→MySQLへインポートというものを作りたいと思い、下記を参考に作成してみました。

CSVアップロードからのMySQLへのデータ挿入

■問題点
・確認画面でCSVファイルの内容は表示されるものの、MySQLへデータが挿入されません。

・確認画面/完了ページの切り替えをhiddenのmodeを使ってやろうとしているのですが、それが間違いなのでしょうか。

(確認画面の表示処理とDBへの登録処理がごちゃごちゃになってきてしまい、非常にわかりにくくなってきてしまいました。)

php

1<?php 2 3$mode = (string) filter_input ( INPUT_POST, 'mode' ); 4 5if ( isset($_FILES['csvfile']['error']) && is_int($_FILES['csvfile']['error']) ) { 6 7 try { 8 9 // エラーチェック 10 switch ($_FILES['csvfile']['error']) { 11 case UPLOAD_ERR_OK: 12 // エラーなし 13 break; 14 case UPLOAD_ERR_NO_FILE: 15 //ファイル未選択 16 throw new RuntimeException ('File is not selected'); 17 case UPLOAD_ERR_INI_SIZE: 18 case UPLOAD_ERR_FORM_SIZE: 19 // 許可サイズを超過 20 throw new RUntimeException ('File is too large'); 21 default: 22 throw new RUntimeException ('Unknown error'); 23 } 24 25 // 一時ファイル名 26 $tmp_name = $_FILES['csvfile']['tmp_name']; 27 28 $detect_order = 'ASCII,JIS,UTF-8,CPS51932,SJIS-win'; 29 setlocale(LC_ALL, 'ja_JP.UTF-8'); 30 31 // 文字コードを変換 32 $buffer = file_get_contents($tmp_name); 33 34 if ( !$encoding = mb_detect_encoding( $buffer, $detect_order, true ) ) { 35 // 文字コードの自動判定に失敗 36 unset ($buffer); 37 throw new RuntimeException('Character set detection failed'); 38 } 39 40 file_put_contents ( $tmp_name, mb_convert_encoding($buffer, 'UTF-8', $encoding) ); 41 unset ($buffer); 42 43 44 $dsn = "mysql:dbname=guestbook;host=localhost;charset=utf8"; 45 $pdo = new PDO ( $dsn, 'test', 'test' ); 46 $pdo->setAttribute ( PDO::ATTR_EMULATE_PREPARES, false ); 47 $pdo->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 48 $sql = "INSERT INTO ms_member (username, password, reg_date) VALUES (?, ?, NOW())"; 49 $stmt = $pdo->prepare($sql); 50 51 // トランザクション処理 52 $pdo->beginTransaction(); 53 54 try { 55 $fp = fopen( $tmp_name, 'rb' ); 56 //var_dump($tmp); 57 58 // 確認用テーブル表示 59 if ( $mode === "confirm" ) { 60 echo "<table border=\"1\">\n"; 61 while ( $rows = fgetcsv( $fp, "1024") ) { 62 echo "<tr>\n<td>{$rows[0]}</td>\n"; 63 echo "<td>{$rows[1]}</td>\n"; 64 echo "<td>{$rows[2]}</td>\n"; 65 echo "<td>{$rows[3]}</td>\n</tr>\n"; 66 } 67 echo "</table>\n"; 68 69 // 完了 70 } else if ( $mode === "finish" ) { 71 while ( $rows = fgetcsv( $fp ) ) { 72 if ( $row === array(null) ){ 73 // 空行はスキップ 74 continue; 75 } 76 77 $stmt->bindValue (1, $row[0], PDO::PARAM_STR); 78 $stmt->bindValue (2, $row[1], PDO::PARAM_STR); 79 $stmt->bindValue (3, $row[2], PDO::PARAM_INT); 80 81 $executed = $stmt->execute($row); 82 } 83 if ( !feof($fp) ) { 84 // ファイルポインタが終端に達していなければエラー 85 throw new RuntimeException ( 'CSV parsing error' ); 86 } 87 fclose($fp); 88 $pdo->commit(); 89 } 90 91 } catch (Exception $e) { 92 93 if ( $mode === "finish" ) { 94 fclose($fp); 95 $pdo->rollBack(); 96 throw $e; 97 } 98 99 } 100 101 if ( $mode === "finish" ) { 102 if ( isset($executed) ) { 103 $err_msg = 'Import Successful'; 104 header ( 'Location: ./finish.html' ); 105 } else { 106 $err_msg = 'There was nothing to import'; 107 } 108 } 109 110 } catch (Exception $e) { 111 $err_msg = $e->getMessage(); 112 } 113} 114 115header ( 'Content-Type: text/html; charset=utf-8' ); 116?> 117<!DOCTYPE html> 118<html lang="ja"> 119<head> 120 <title>csvアップロード</title> 121</head> 122<body> 123 124 <?php if (isset($err_msg)) { 125 echo "<p style=\"color:red;\">" . $err_msg . "</p>"; 126 }?> 127 128 <?php 129 // POSTされていない状態 130 if ( !$mode ) { 131 echo <<<EOD 132 <form action="" method="post" enctype="multipart/form-data"> 133 <input type="file" name="csvfile" size="30"><br> 134 <input type="submit" value="アップロード確認"> 135 <input type="hidden" name="mode" value="confirm"> 136 </form> 137EOD; 138 139 // 確認画面 140 } else if ( $mode === 'confirm' ) { 141 echo <<<EOD 142 <form action="" method="post"> 143 <input type="submit" value="アップロード完了"> 144 <input type="hidden" name="mode" value="finish"> 145 </form> 146EOD; 147 } 148 ?> 149 150</body> 151</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

ぱっと見た限り、
確認画面ではファイルがアップロードするフォームが無いので、
確認画面からの送信では常にファイルが無い状態になるんじゃないかと思います。

最初にアップロードされたタイミングで一時的にファイルをサーバ側で保存して、
sessionか何かで確認画面後のアクセスと紐づけられるようにしたり、
CSVの中身をhiddenで確認画面後のフォームに入れる等、
何らかの方法で最初の送信画面と確認画面とでデータの受け渡しの仕組みを作る必要があります。

同じファイルでやってしまっているので混乱されているようにも見えるので、
一度違うファイルで作ってみると、わかりやすくなるかと思いますよ。

投稿2016/06/05 09:39

tanat

総合スコア18706

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

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

singlestroke

2016/06/05 10:17

ありがとうございます。確かに一旦分けて整理した方が良さそうですね。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問