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のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でOGPを設定する方法を解説。metaタグを編集するHTMLヘルパーを利用してOGPのタグを編集する。また、エレメントとして分割することでメンテナンス性も向上させる。
-
-
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
CakePHP4で定数に変数を埋め込み、翻訳機能「__()」で変数に値を入れる方法を紹介。定型の文章の一部だけを置換したい場合に利用すると便利。
-
-
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。
-
-
CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定
CakePHPのアップロードするファイル名を乱数で変更しセキュリティを高める方法を解説。
-
-
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。
-
-
CakePHP5系で認証機能のAuthenticationプラグインをインストール・エラー発生注意
CakePHPのユーザ認証に使用するオフィシャルなプラグインAuthenticationだが、CakePHP5系では Authentication Ver.3系を使う必要があるが、公式ChiffonBookが間違えている。
-
-
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。
-
-
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP4、5系の認証処理でログイン認証が通らない場合の確認方法、確認箇所を解説。ログ出力し、ステータスを確認するが、ステータスの内容も紹介。それはそのままusernameを変更する際のポイントでもある。
-
-
CakePHP 2.3で PDFを作成する方法を調査「mpdf」「TCPDF」「FPDF」
CakePHPで PDFを編集、出力するには「mpdf」「TCPDF」「FPDF」といったプラグインがあり、使い勝手を比較検討しました。TCPDFが一番良さそうでした。
-
-
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。