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

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

ただいまの
回答率

87.36%

phpでデータベースに見つからなかった場合、接続できなかった場合、クエリ送信できなかった場合のエラーページへの遷移とエラー内容の表示

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 859

score 3

前提・実現したいこと

phpで入力フォームを作成しています。
その中で、入力ページ、確認ページを通し、確認ページから完了ページに遷移し、完了ページ
で入力した値に問題がなければ値をデータベースに入れ、データベースに接続できなかった場合、データベースが見つからなかった場合
クエリが送信できなかった場合にエラーページに遷移してそれぞれのエラー内容が表示される様にする
機能を実装するのですが、
「データベースに接続できなかった場合、データベースが見つからなかった場合
クエリが送信できなかった場合にエラーページに遷移してそれぞれのエラー内容が表示される様にする」
部分がどうしてもどう実装すればいいのかが分かりません。
解決方法をお教え頂けないでしょうか?

該当のソースコード

ソースコード

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>登録完了</title>
</head>
<body>
<?php

  $dsn      = 'mysql:dbname=subject;host=localhost';
  $user     = 'root';
  $password = '';

  try {
      $pdo = new PDO($dsn, $user, $password);
  } catch (PDOException $e) {
    echo 'Connection failed: ' . mb_convert_encoding($e->getMessage(),'utf-8','sjis');
    header('Location: system_error.php');

  }

  $stmt = $pdo->prepare("insert into applicant(name_1,
                                                name_2,
                                                name_kana_1,
                                                name_kana_2,
                                                birthday_year,
                                                birthday_month,
                                                birthday_day,
                                                postalNo_1,
                                                postalNo_2,
                                                address_1,
                                                address_2,
                                                tel,
                                                mail,
                                                explanation_day,
                                                pr,
                                                question) 

                                        values(:name_1,
                                                :name_2,
                                                :name_kana_1,
                                                :name_kana_2,
                                                :birthday_year,
                                                :birthday_month,
                                                :birthday_day,
                                                :postalNo_1,
                                                :postalNo_2,
                                                :address_1,
                                                :address_2,
                                                :tel,
                                                :mail,
                                                :explanation_day,
                                                :pr,
                                                :question)"
                            );



  $stmt -> bindvalue(':name_1',$_POST["Lname"], PDO::PARAM_STR);
  $stmt -> bindvalue(':name_2',$_POST["Fname"], PDO::PARAM_STR);
  $stmt -> bindvalue(':name_kana_1',$_POST["lname"], PDO::PARAM_STR);
  $stmt -> bindvalue(':name_kana_2',$_POST["fname"], PDO::PARAM_STR);
  $stmt -> bindvalue(':birthday_year',$_POST["Year"], PDO::PARAM_STR);
  $stmt -> bindvalue(':birthday_month',$_POST["Month"], PDO::PARAM_STR);
  $stmt -> bindvalue(':birthday_day',$_POST["Day"], PDO::PARAM_STR);
  $stmt -> bindvalue(':postalNo_1',$_POST["left"], PDO::PARAM_STR);
  $stmt -> bindvalue(':postalNo_2',$_POST["right"], PDO::PARAM_STR);
  $stmt -> bindvalue(':address_1',$_POST["Jadd"], PDO::PARAM_STR);
  $stmt -> bindvalue(':address_2',$_POST["addressmin"], PDO::PARAM_STR);
  $stmt -> bindvalue(':tel',$_POST["num"], PDO::PARAM_STR);
  $stmt -> bindvalue(':mail',$_POST["mailadd"], PDO::PARAM_STR);
  $stmt -> bindvalue(':explanation_day',$_POST["rdo"], PDO::PARAM_STR);
  $stmt -> bindvalue(':pr',$_POST["PR"], PDO::PARAM_STR);
  $stmt -> bindvalue(':question',$_POST["Question"], PDO::PARAM_STR);

  $stmt -> execute();

?>

<h1>お申し込みありがとうございました。</h1>

<a href="input_backup.php">登録画面へ</a>

</body>
</html>

試したこと

try catchで例外処理を実装しようとしましたが、それぞれのエラーメッセージをエラーページに
飛ばせませんでした。

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

XAMPPのバージョンは7.3.10
エディターはVSCを使用しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

別ページに受け渡すとなると
クエリパラメータとして、メッセージ内容を連結して遷移先で$_GETで取得するか
セッションに格納する
のどちらかにする必要があると思います

kei344さんのおっしゃるように、ファイルの一番上でPHPの処理を記述して
お試しいただけると幸いです

// GET版
 try {
      $pdo = new PDO($dsn, $user, $password);
  } catch (PDOException $e) {
    $message = 'Connection failed: ' . mb_convert_encoding($e->getMessage(),'utf-8','sjis');
    header('Location: system_error.php?message=' . $message);
    exit;
  }

// session版
session_start();

 try {
      $pdo = new PDO($dsn, $user, $password);
  } catch (PDOException $e) {
    $_SESSION['message'] = 'Connection failed: ' . mb_convert_encoding($e->getMessage(),'utf-8','sjis');
    header('Location: system_error.php');
    exit;
  }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/02 14:30

    申し訳ありません、あともう一点よろしいでしょうか。

    今回のエラーページへの遷移で
    try {
    $pdo = new PDO($dsn, $user, $password);

    } catch (PDOException $e) {

    $_SESSION['message'] = 'Connection failed: ' . mb_convert_encoding($e->getMessage(),'utf-8','sjis');
    $_SESSION['code'] = $e->getCode();

    の後に、codeがint2002だった場合はerrorに1049だった場合はerror2に飛ばすような処理をif文で
    ↓の様に書いたのですが
    ・・・
    $_SESSION['code'] = $e->getCode();

    if("int(2002)"){
    header('Location: system_error.php');
    }else if("int(1049)"){
    header('Location: system_error2.php');
    }

    }

    intが2002でもerror2に飛んでしまいます。
    if文の書き方が間違っているとは思うのですが、他の書き方をいくつか試しても上手くいきませんでした。
    度々すみませんが、どう変えればいいかお教えいただけないでしょうか?

    キャンセル

  • 2020/04/02 16:00

    PDOExceptionのcodeから判別できるんですね、勉強になりました。

    $e->getCode(); の返り値がどういった形式かわかりませんが
    調べた限り2002などのみの数値で返ってくるようですので

    下記のようになるのではないでしょうか
    if($e->getCode() == 2002)
    if("int(2002)")のような書き方ですと、問答無用でtrueになってしまいます->if(true)と書いているのと同義です

    またheaderの後exit;で後続処理を止める必要があります。

    header('Location: system_error.php');
    exit;

    上手くいきますと幸いです

    キャンセル

  • 2020/04/02 16:22

    回答ありがとうございます!
    ご指摘の通り実装したら動作しました!

    キャンセル

0

headerの前にHTMLを記述してはいけません。

【PHP: header - Manual】
https://www.php.net/manual/ja/function.header.php

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/01 22:35

    回答ありがとうございます

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • phpでデータベースに見つからなかった場合、接続できなかった場合、クエリ送信できなかった場合のエラーページへの遷移とエラー内容の表示