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

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

ただいまの
回答率

88.37%

入力フォームのDBに内容を入れる前のエラーメッセージの出力先の遷移

解決済

回答 3

投稿

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

masa354

score 3

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
入力フォームを作成中で、入力完了ページからDBに値を送る際に、DBでエラーがあった際に
コードによって違うエラーページに飛ばす処理を実装したいです。

該当のソースコード

<?php

session_start(); 

if($_POST['token'] != $_SESSION['token']){
  header('Location: senierror.php');
}else{
  //echo '遷移成功';
  session_destroy();
}

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

session_start();

 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();

  if("int(2002)"){
    header('Location: system_error.php');
  }
  if("int(1049)"){
    header('Location: system_error2.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();
?>

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

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

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

</body>
</html>

試したこと

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

session_start();

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();

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

}

上記の部分で、コードをセッションに入れ、コードがそれぞれ2002だった場合はerrorに1049だった場合はerror2に行くように
するためにif文を使用しましたが、コードが2002の場合でもerror2に遷移してしまいます。
解決方法をどうかお教え頂けないでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

0

if("int(2002)") は、"int(2002)"が文字列なので必ずtrueになります。

if ($e->getCode() === "int(2002)" ) {
} // こういうことをしたいのでしょうか。
/* $e->getCode() が文字列"int(2002)"なら上記はtrue、数値2002ならfalse */

【PHP: PHP 型の比較表 - Manual】
https://www.php.net/manual/ja/types.comparisons.php

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/04/02 16:06

    回答ありがとうございます。
    kei344様のソースで実装しましたが、


    Notice: Undefined variable: pdo in C:\xampp\htdocs\EXAM\kadai1\done.php on line 43

    Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\EXAM\kadai1\done.php:43 Stack trace: #0 {main} thrown in C:\xampp\htdocs\EXAM\kadai1\done.php on line 43

    のエラーが出てしまいます、、。

    キャンセル

  • 2020/04/02 16:12

    $e->getCode() の値が違うのでしょう。ifの前で
    var_dump($e->getCode());とでもして内容を確認してください。

    キャンセル

  • 2020/04/02 16:13

    書いてる内容を読まれていないようだ。

    キャンセル

0

申し訳ありません。以下の記述で上手くいきました!

if($e->getCode() == 2002){
header('Location: system_error.php');
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

-1

申し訳ありません。以下の記述で上手くいきました!

if($e->getCode() == 2002){
header('Location: system_error.php');
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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