CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
2019/06/08
CakePHP3でデータベースに値を保存する save()を実行するときのログを確認する方法
通常の save()実行ではエラーの情報が分からない
CakePHP3のシェルを利用してシステムを開発している際に、データを保存する save()を実行するところでエラーが発生していました。
ですが、save()処理の戻り値を取得しても、エラーである「False」が帰ってきているだけで、どのようなエラーが起こっているのかが分かりませんでした。
ブラウザで表示する処理を作っているのであれば、デバッグキットを利用して、エラーの原因を探ることもできますが、今回はシェルのプログラム開発をしていましたので、デバッグキットを利用する方法も採れませんでした。
と言うわけで、なんとかして「save()」を実行したときのエラーログを取得する方法を探したところ、それがありました。
通常は、下記の様に保存処理を記述します。
1 2 3 4 5 |
if($tableObject->save($saveData) === false) { return '500(Save Failed)'; } else { return '200(Save Success)'; } |
上記の方法では、save()の戻り値は、「true:正常終了」「False:エラー終了」のどちらかです。
エラーの場合は、どのようなエラーが出ているのかを確認する方法がありません。
そのため、エラーを確認するためには、下記の様に変更します。
1 2 3 4 5 6 7 8 |
try { $tableObject->saveOrFail($saveData); } catch (\Cake\ORM\Exception\PersistenceFailedException $e) { echo $e; // echo $e->getEntity(); return '500(Save Failed)'; } return '200(Save Success)'; |
「save()」を「saveOrFail()」に変更します。
それを「try ... catch 文」でエラーを取得します。
「echo $e;
」
を記述することで、エラーログを表示することができます。
上記のソースコード上ではコメントアウトしていますが、
「echo $e->getEntity();
」
を記述すると、保存しようとしたデータの実態(エンティティ)を表示することができます。
エラーログと保存しようとしたデータを確認しながら、エラーの原因を探ることができます。
参考サイト
CakePHP3 Cookbook 厳密な保存
https://book.cakephp.org/3.0/ja/orm/saving-data.html#id21
また、今回の記事では、データベースに値を保存する際のエラーを「try + catch 構文」を使って取得する方法ですが、保存処理をする前に事前にバリデーションを行って、その結果を取得する場合の処理については下記に記事を書いていますので参考にしてください。
CakePHP3で保存前にバリデーション結果を取得する2つの方法
Cake\ORM\Exception\PersistenceFailedException: Entity save failure (user_id: “_existsIn”, account_id: “_existsIn”).というエラーが出ていた
前項の対応を行ったところ、下記のエラーログが出力されました。
1 2 3 4 |
Cake\ORM\Exception\PersistenceFailedException: Entity save failure (user_id: "_existsIn", account_id: "_existsIn"). in /var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:1945 Stack trace: #0 /var/www/html/src/Shell/GetUserShell.php(811): Cake\ORM\Table->saveOrFail(Object(App\Model\Entity\UserAccount)) (以下略) |
このエラーですが、「user_id: “_existsIn”, account_id: “_existsIn”」というところが大事なポイントです。
保存しようとしているデータに連携するはずの「user_id」「account_id」の値が、「users」「accounts」テーブルの中にありませんよ、というエラーです。
まだ開発をしている途中ですので、該当のテーブルのデータの保存の処理だけを作っていましたので、「users」「accounts」テーブルにはデータを入れていませんでした。
そのため、該当テーブル内にある「user_id」「account_id」の値がないので保存できません、というエラーでした。
エラーの原因が分かりましたので、「users」「accounts」テーブルに該当 IDのレコードを作成したところ、正しく保存することができるようになりました。
ちなみに、生の SQL文を直接実行する方法については下記に記事を書いていますので、合わせて参考にしてください。
CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。
-
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!
-
-
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。
-
-
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。
-
-
CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製UsersプラグインのCakePHP4版の紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
-
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。
-
-
CakePHP4のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP4の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。
-
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
-
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。