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

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

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

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

Q&A

1回答

1361閲覧

php csvをDBに読みこむシステムを作っているのですが、途中でエラーがあっても通ってしまいます。

ennkai2414

総合スコア4

PHP

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

0グッド

0クリップ

投稿2020/04/27 09:13

このようなシステムを作っています。
1:指定されたcsvファイルを読み込み
2:サブのテーブル作成
3:インサート文作成
4:まず、サブのテーブルにインサート
5:問題なければ、元々あるテーブルを削除
6:サブのテーブルを元々あった名前にリネーム

という風にしたいのですが途中でエラーがあってもテーブルが削除されてしまいます。
どのように改正すればよろしいでしょうか。

php

1<?php 2 set_time_limit(0); 3 4 // コマンドライン パス取得 5 if($argc != 6){ 6 echo "filepass,DBname,tablename,username,passwordを指定してください。"; 7 exit(0); 8 } 9 $csv_path = $argv[1]; 10 $db_name = $argv[2]; 11 $table_name = $argv[3]; 12 $user_name = $argv[4]; 13 $password = $argv[5]; 14 15 try { 16 if(($handle_csv_file = fopen($csv_path, "r")) !== FALSE) { 17 $dbh = null; 18 // DB接続 19 $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_name.'; charset=utf8', $user_name, $password); 20 21 // dbからカラム情報取得 22 $column = "show columns from $table_name"; 23 $column_data = $dbh->query($column); 24 foreach($column_data as $value) { 25 $column_name[] = $value[0]; 26 $column_type[] = $value[1]; 27 } 28 29 // テーブル作成 30 $count_column_name = count($column_name); 31 $inport = 'CREATE TABLE test_inport ('; 32 for($i=0;$i<$count_column_name;$i++){ 33 if($i===0){ 34 $inport = $inport.$column_name[$i].' '.$column_type[$i].' AUTO_INCREMENT PRIMARY KEY'; 35 }else{ 36 $inport = $inport.','.$column_name[$i].' '.$column_type[$i]; 37 } 38 } 39 $inport = $inport.') engine=innodb default charset=utf8'; 40 $table_create = $dbh->query($inport); 41 42 //インサート内容 43 $count_column_name_min = $count_column_name; 44 // $insert = 'INSERT INTO'.$table_name.'('; 45 $insert = 'INSERT INTO test_inport ('; 46 for($i=1;$i<$count_column_name_min;$i++){ 47 if($i===1){ 48 $insert = $insert.$column_name[$i]; 49 }else{ 50 $insert = $insert.', '.$column_name[$i]; 51 } 52 } 53 $insert = $insert.') VALUES (:'; 54 for($i=1;$i<$count_column_name_min;$i++){ 55 if($i===1){ 56 $insert = $insert.$column_name[$i]; 57 }else{ 58 $insert = $insert.', :'.$column_name[$i]; 59 } 60 } 61 $insert = $insert.')'; 62 63 // インサート実行準備 64 $insert_start= $dbh->prepare($insert); 65 if(!$insert_start){ 66 $delet_table = "DROP TABLE test_inport"; 67 $dbh->query($delet_table); 68 throw new Exception('インサート先指定失敗'); 69 } 70 71 // ファイルポインタ有効時 72 $title_skip = 0; 73 while($handle_csv_file && !feof($handle_csv_file)) { 74 $input_csv = fgetcsv($handle_csv_file); 75 if($title_skip < 2) { 76 $title_skip++; 77 continue; 78 } 79 if(!$input_csv) { 80 continue; 81 } 82 83 // エンコード 84 $count_input_csv = count($input_csv); 85 for($i=1;$i<$count_input_csv;$i++) { 86 if($input_csv[$i]==="") { 87 continue; 88 } 89 $input_csv[$i] = mb_convert_encoding($input_csv[$i], 'UTF-8', 'SJIS-win'); 90 } 91 92 // インサート内容 93 $input_csv_array = []; 94 for($i=1;$i<$count_input_csv;$i++) { 95 $input_csv_array[$column_name[$i]] = $input_csv[$i]; 96 } 97 //実行 98 $insert_start->execute($input_csv_array); 99 } 100 101 if(!$inport){ 102 $delet_table = "DROP TABLE test_inport"; 103 $dbh->query($delet_table); 104 throw new Exception('インサート失敗'); 105 }else{ 106 // 上書き 107 $delet_table = "DROP TABLE $table_name"; 108 $dbh->query($delet_table); 109 $rename = "ALTER TABLE test_inport RENAME $table_name"; 110 $dbh->query($rename); 111 } 112 }else{ 113 throw new Exception('ファイル接続失敗'); 114 } 115 // 接続終了 116 fclose($handle_csv_file); 117 $insert_start= null; 118 $dbh = null; 119 120 echo "成功"; 121 // エラー 122 } catch(PDOException $e) { 123 $delet_table = "DROP TABLE test_inport"; 124 $dbh->query($delet_table); 125 echo 'DB接続失敗:' . $e->getMessage(); 126 exit(); 127 } 128 129?>

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

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

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

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

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

m.ts10806

2020/04/27 09:37

「エラーがあっても」の「エラー」とは何を想定しているのでしょうか。
yambejp

2020/04/27 10:24

$argvを使うということは、webベースではなくCLIモードのphpという 認識でよいですか?
guest

回答1

0

よくわかっていませんが、if(!$inport)で削除する/しないを判定しているように思います。
ただ、if(($handle_csv_file = fopen($csv_path, "r")) !== FALSE) のif文の中で
$inport = $inport.') engine=innodb default charset=utf8';
があるので、$inportが空になることはなく、冒頭のif(!$inport)で、必ずelseの方に行きそうに思います。

・どの部分のエラーを検知して、"インサート失敗"と出したいのでしょうか。
・削除する/しないの判定のときに$inportはどのようになっているとお考えでしょうか。

投稿2020/04/28 14:39

syeng

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問