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

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

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

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

Q&A

解決済

1回答

1641閲覧

csvファイルをphpmyadminへループ処理で保存させたい

tk5923

総合スコア12

PHP

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

0グッド

2クリップ

投稿2017/01/05 17:18

編集2017/01/06 03:56

csvファイルが4カラム1行だと保存することは可能ですが、
4カラム2行以上だとなぜか保存されなく、ループされません。
また2行以上だと、1行目も保存されていなく、カラム数が4以上でエラーが出てしまいます。
なぜなのか解決策を教えて下さい。

csvファイル例
aaaa,bbbb,cccc,dddd
eeee,ffff,gggg,hhhh

php

1 $stmt = $pdo->prepare('INSERT INTO test_table VALUES (?, ?, ?, ?)'); 2 3 /* トランザクション処理 */ 4 $pdo->beginTransaction(); 5 try { 6 $fp = fopen($tmp_name, 'rb'); 7 while ($row = fgetcsv($fp)) { 8 if ($row === array(null)) { 9 // 空行はスキップ 10 continue; 11 } 12 if (count($row) !== 4) { 13 // カラム数が異なる無効なフォーマット 14 throw new RuntimeException('Invalid column detected'); 15 } 16 $executed = $stmt->execute($row); 17 } 18 if (!feof($fp)) { 19 // ファイルポインタが終端に達していなければエラー 20 throw new RuntimeException('CSV parsing error'); 21 } 22 fclose($fp); 23 $pdo->commit(); 24 } catch (Exception $e) { 25 fclose($fp); 26 $pdo->rollBack(); 27 throw $e; 28 } 29

php

1if (count($row) !== 4) { 2 echo __LINE__ . "\n"; 3 echo count($row); 4 // カラム数が異なる無効なフォーマット 5 throw new RuntimeException('Invalid column detected'); 6}

上記の箇所でエラーが出てしまいます。
またカウント数が7と表示され、4以外になり上記のようなエラーになります。

また、var_dump($row); 変数の中身はこのように表示されます
array(7) { [0]=> string(4) "aaaa" [1]=> string(4) "bbbb" [2]=> string(4) "cccc" [3]=> string(9) "dddd eeee" [4]=> string(4) "ffff" [5]=> string(4) "gggg" [6]=> string(4) "hhhh" }

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

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

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

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

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

popobot

2017/01/06 00:47 編集

長いので回答に書きました...
popobot

2017/01/06 03:30

var_dump($row);で変数の中身をみるとどうなっていますか?
tk5923

2017/01/06 03:46

変数の中身はこのように表示されます array(7) { [0]=> string(4) "aaaa" [1]=> string(4) "bbbb" [2]=> string(4) "cccc" [3]=> string(9) "dddd eeee" [4]=> string(4) "ffff" [5]=> string(4) "gggg" [6]=> string(4) "hhhh" }
popobot

2017/01/06 04:31 編集

改行が正しく認識されていないみたいですね Macですか?
tk5923

2017/01/06 04:27

Macですね
popobot

2017/01/06 04:31

だとしたら、改行コードが正しく認識されていないため1レコードとして処理されているためですね。回答にも書きましたが、リンク先の内容をやってみてください。
guest

回答1

0

ベストアンサー

手元の環境で動かしたら正常に動きましたよ。
「4カラム2行以上だとなぜか保存されなく、ループされません」とは具体的にどうなるのでしょうか?
1行は保存されている? エラーはでない?

また、各処理の間に、以下のようなデバックコードを入れてみて、どこが想定通りに動いていないかを調べたらどうでしょうか

php

1echo __LINE__ . "\n";

各所でvar_dump();で変数出力でもよいですが。


(追記)

改行が正しく認識されていないみたいですね Macですか?
コードの先頭の方に以下を追加するといいみたいですよ

php

1ini_set('auto_detect_line_endings',TRUE);

参考:マックで作成したCSVだと上手くfgetcsvできないけど改行にさえ気をつければ関係ないよねっ
※改行コードを\nに置換する方法でもいいみたいですね。

投稿2017/01/06 00:46

編集2017/01/06 04:32
popobot

総合スコア6586

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問