DBのテーブルの上書きでのトランザクションがうまくいきません
CSVを読み込み、DBのテーブルを上書きするものを作成しているのですが、途中でエラーがおこってもトランザクションが働かず、
$del = "DELETE FROM ".$table_name;
$dbh->query($del);
この処理のみ通ってしまいます。
どうすればうまく上書きができますか?
それとも、インサートよりも、UPDATE又はREPLACEのほうがいいですか?
(テーブルにデータがあれば上書き、なければインサート)という風にしたいです。
プライマリキーは設定していません。
idはオートインクリメント
php
1<?php 2// DB情報 3$dbh = null; 4$db_admin = "sbiccicms_admin_local_auto"; 5$db_common = "sbiccicms_common_local_auto"; 6$db_front = "sbiccicms_front_local_auto"; 7$user = 'root'; 8$pass = ''; 9 10// URlファイルパス取得 11$get_dir = __FILE__; 12$get_dir_path = dirname($get_dir); 13$csv_path = glob($get_dir_path.'/categoris/categori.csv'); 14$csv_color = glob($get_dir_path.'/categoris/category_colors.csv'); 15 16$table_name = "categories"; 17 18try { 19 // DB接続 20 $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass); 21 22 $sql = "SET AUTOCOMMIT=0" ; 23 $dbh->query($sql); 24 25 //例外処理を投げる(スロー)ようにする 26 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 27 28 // トランザクション開始 29 $dbh->beginTransaction(); 30 31 $del = "DELETE FROM ".$table_name; 32 $dbh->query($del); 33 $auto_reset = "ALTER TABLE ".$table_name." auto_increment = 1;"; 34 $dbh->query($auto_reset); 35 36 // color読み込み 37 if (($handle_color = fopen($csv_color[0], "r")) !== FALSE) { 38 // ファイルポインタ有効時 39 $color = []; 40 while ($handle_color && !feof($handle_color)) { 41 $input_color = fgetcsv($handle_color); 42 if (!$input_color) { 43 continue; 44 } 45 46 // エンコード 47 if ($input_color[1]==="") { 48 continue; 49 } 50 $input_color[1] = mb_convert_encoding($input_color[1], 'UTF-8', 'SJIS-win'); 51 $color[] = $input_color[1]; 52 } 53 } 54 fclose($handle_color); 55 56 // CSVファイルインサート準備 57 $insert = "INSERT INTO ".$table_name." (site_id, parent_id, name, pass, sort, level, color, user_id, created) VALUES (:site_id, :parent_id, :name, :pass, :sort, :level, :color, :user_id, cast(now() as datetime))"; 58 $insert_start = $dbh->prepare($insert); 59 if (!$insert_start) { 60 throw new Exception('インサート準備失敗'); 61 } 62 63 64 // CSVファイルインサート 65 if (($handle = fopen($csv_path[0], "r")) !== FALSE) { 66 // ファイルポインタ有効時 67 $title_skip = 0; 68 $co = 1; 69 while ($handle && !feof($handle)) { 70 $input_csv = fgetcsv($handle); 71 if ($title_skip < 2) { 72 $title_skip++; 73 continue; 74 } 75 if (!$input_csv) { 76 continue; 77 } 78 79 // エンコード 80 $count_input_csv = count($input_csv); 81 for ($i=1;$i<$count_input_csv;$i++) { 82 if ($input_csv[$i]==="") { 83 continue; 84 } 85 $input_csv[$i] = mb_convert_encoding($input_csv[$i], 'UTF-8', 'SJIS-win'); 86 } 87 88 // 実行 89 $synonyms_check = $insert_start->execute([':site_id' => $input_csv[1], ':parent_id' => $co, ':name' => $input_csv[3], ':pass' => $input_csv[4], ':sort' => $input_csv[5], ':level' => $input_csv[6], ':color' => $color[$co], ':user_id' => $input_csv[8]]); 90 if (!$synonyms_check) { 91 throw new Exception('インサート失敗'); 92 } 93 $co++; 94 } 95 } 96 97 // 接続終了 98 fclose($handle); 99 $insert_start = null; 100 101 // エラー // 102 $insert_users_check = $dbh>query($insert_site_configs); 103 104 // コミット 105 $dbh->commit(); 106 107} catch (PDOException $e) { 108 // ロールバック 109 $dbh->rollBack(); 110 echo 'DB接続エラー:' . $e->getMessage(); 111 die(); 112} catch (Throwable $e) { 113 echo "ロールバック"; 114 // ロールバック 115 $dbh->rollBack(); 116 echo '失敗:' . $e->getMessage(); 117 die(); 118} 119 120$dbh = null; 121 122?>
回答2件
あなたの回答
tips
プレビュー