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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

1回答

1009閲覧

SQL正規化で別テーブルを作った際、その別テーブルへの保存だけが失敗した場合の処理

gachapon

総合スコア5

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

1クリップ

投稿2020/04/04 02:46

編集2020/04/04 02:49

前提・実現したいこと

テーブルの正規化に取り組んでいます。
INSERTやUPDATEなどが失敗した場合の処理について疑問に思い質問させて頂きました。
よろしくおねがい致します。

発生している問題・エラーメッセージ

問題が発生したわけではなく、発生した場合の処理を知りたいです。

エラーメッセージ:なし

該当のソースコード

以下で➀➁までできたけど、➂が失敗した、という問題が発生した場合の処理はどのようにするのでしょうか?

php

1$arr = $_POST["arr"]; // -> ['name'=>'太郎','age'=>20] 2 3// ➀user_listテーブルへ登録 4$name = $arr['name']; 5$age = $arr['age']; 6$sql = " 7INSERT INTO user_list ( name, age ) 8VALUES ( $name, $age ) 9"; 10$res = $dbh->query($sql); 11 12// ➁IDを取得 13$insert_user_id = $dbh->lastInsertId(); 14 15// ➂そのIDを使いuser_metaテーブルへ登録 16$meta_data = rand(1, 100); 17$sql = " 18INSERT INTO user_meta ( user_id, meta_data ) 19VALUES ( $insert_user_id, $meta_data ) 20"; 21$res = $dbh->query($sql); 22 23// ➃IDを取得 24$insert_meta_id = $dbh->lastInsertId();

試したこと

以下のように成功するまで実行しようものなら、へたをすればずっとここで実行し続けることになりますからこれはイケてないと思います。

// ➀user_listテーブルへ登録 // 同上 // ➁IDを取得 // 同上 $insert_meta_id = x($insert_user_id); function x($insert_user_id){ // ➂そのIDを使いuser_metaテーブルへ登録 // 同上 // ➃IDを取得 // 同上 return $insert_meta_id; } // 問題が発生した場合はもう一度実行 if ( $insert_meta_id === 0 ) { x($insert_user_id); }

または以下のようにエラー専用テーブルに保存するようにしても、じゃそこでまた失敗したらどうするのか?ということになるのでこれもどうかと思います。

// ➀user_listテーブルへ登録 // 同上 // ➁IDを取得 // 同上 // ➂そのIDを使いuser_metaテーブルへ登録 // 同上 // ➃IDを取得 // 同上 // 問題が発生した場合 if ( $insert_meta_id === 0 ) { // ➄error_logテーブルへ登録 $sql = " INSERT INTO error_log ( user_id, meta_data ) VALUES ( $insert_user_id, $meta_data ) "; $res = $dbh->query($sql); // ➅IDを取得 $insert_error_id = $dbh->lastInsertId(); }

補足情報(FW/ツールのバージョンなど)

WordPress使用中に感じた疑問ですが、一般的なMySQLの処理としても疑問に思いました。

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

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

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

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

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

guest

回答1

0

以下で➀➁までできたけど、➂が失敗した、という問題が発生した場合の処理はどのようにするのでしょうか?

トランザクションの中で実行して、「1つでも失敗すればすべて元通り」に戻すのが適切です。

投稿2020/04/04 03:11

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問