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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

2121閲覧

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

masa354

総合スコア7

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/04/01 05:11

前提・実現したいこと

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

該当のソースコード

PHP

1ソースコード 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6<meta charset="UTF-8"> 7<title>登録完了</title> 8</head> 9<body> 10<?php 11 12 $dsn = 'mysql:dbname=subject;host=localhost'; 13 $user = 'root'; 14 $password = ''; 15 16 try { 17 $pdo = new PDO($dsn, $user, $password); 18 } catch (PDOException $e) { 19 echo 'Connection failed: ' . mb_convert_encoding($e->getMessage(),'utf-8','sjis'); 20 header('Location: system_error.php'); 21 22 } 23 24 $stmt = $pdo->prepare("insert into applicant(name_1, 25 name_2, 26 name_kana_1, 27 name_kana_2, 28 birthday_year, 29 birthday_month, 30 birthday_day, 31 postalNo_1, 32 postalNo_2, 33 address_1, 34 address_2, 35 tel, 36 mail, 37 explanation_day, 38 pr, 39 question) 40 41 values(:name_1, 42 :name_2, 43 :name_kana_1, 44 :name_kana_2, 45 :birthday_year, 46 :birthday_month, 47 :birthday_day, 48 :postalNo_1, 49 :postalNo_2, 50 :address_1, 51 :address_2, 52 :tel, 53 :mail, 54 :explanation_day, 55 :pr, 56 :question)" 57 ); 58 59 60 61 $stmt -> bindvalue(':name_1',$_POST["Lname"], PDO::PARAM_STR); 62 $stmt -> bindvalue(':name_2',$_POST["Fname"], PDO::PARAM_STR); 63 $stmt -> bindvalue(':name_kana_1',$_POST["lname"], PDO::PARAM_STR); 64 $stmt -> bindvalue(':name_kana_2',$_POST["fname"], PDO::PARAM_STR); 65 $stmt -> bindvalue(':birthday_year',$_POST["Year"], PDO::PARAM_STR); 66 $stmt -> bindvalue(':birthday_month',$_POST["Month"], PDO::PARAM_STR); 67 $stmt -> bindvalue(':birthday_day',$_POST["Day"], PDO::PARAM_STR); 68 $stmt -> bindvalue(':postalNo_1',$_POST["left"], PDO::PARAM_STR); 69 $stmt -> bindvalue(':postalNo_2',$_POST["right"], PDO::PARAM_STR); 70 $stmt -> bindvalue(':address_1',$_POST["Jadd"], PDO::PARAM_STR); 71 $stmt -> bindvalue(':address_2',$_POST["addressmin"], PDO::PARAM_STR); 72 $stmt -> bindvalue(':tel',$_POST["num"], PDO::PARAM_STR); 73 $stmt -> bindvalue(':mail',$_POST["mailadd"], PDO::PARAM_STR); 74 $stmt -> bindvalue(':explanation_day',$_POST["rdo"], PDO::PARAM_STR); 75 $stmt -> bindvalue(':pr',$_POST["PR"], PDO::PARAM_STR); 76 $stmt -> bindvalue(':question',$_POST["Question"], PDO::PARAM_STR); 77 78 $stmt -> execute(); 79 80?> 81 82<h1>お申し込みありがとうございました。</h1> 83 84<a href="input_backup.php">登録画面へ</a> 85 86</body> 87</html>

試したこと

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

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

php

1// GET版 2 try { 3 $pdo = new PDO($dsn, $user, $password); 4 } catch (PDOException $e) { 5 $message = 'Connection failed: ' . mb_convert_encoding($e->getMessage(),'utf-8','sjis'); 6 header('Location: system_error.php?message=' . $message); 7 exit; 8 } 9 10// session版 11session_start(); 12 13 try { 14 $pdo = new PDO($dsn, $user, $password); 15 } catch (PDOException $e) { 16 $_SESSION['message'] = 'Connection failed: ' . mb_convert_encoding($e->getMessage(),'utf-8','sjis'); 17 header('Location: system_error.php'); 18 exit; 19 } 20

投稿2020/04/01 05:36

編集2020/04/01 05:38
natsume2233

総合スコア225

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

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

masa354

2020/04/01 14:29 編集

回答ありがとうございます。 SESSIONを利用してエラーメッセージをエラーページに転送、出力ができました! 申し訳ないのですが、もう二つお聞きしたいです。 1つ目は 接続エラーの際は接続エラーのエラーページに DBが見つからない場合はDBが見つからないエラーページにそれぞれ別のページに飛ばす ためにはどうすれば良いでしょうか? 2つ目は $stmt = $pdo->prepare("insert into applicant(name_1, name_2,  。。。。 の所でエラーがあった場合($stmt -> bindvalue(':address_2',$_POST["addressmin"], PDO::PARAM_STR);の部分で':addressの一文字が抜けているなど)のエラーメッセージも エラーページに転送するためにはどうすれば良いでしょうか? 現状だと完了ページに 「Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\EXAM\kadai1\done.php on line 84 お申し込みありがとうございました。」 という具合に出てしまいます。 これもtry catchの書き方を幾つか試してみましたが上手くいきません。 どうかお教えいただけないでしょうか?
natsume2233

2020/04/01 15:11

① 接続エラーとDBの存在可否は同一的なエラーとして扱われるので、一律接続エラーとして飛ばすしか無いと思います `new PDO(....略..)`が失敗した場合、 DBなりユーザ名なりパスなりに問題が有り落ちるので、DBがあってもほかが間違っていればおちてしまいます。 ここで、何が間違って落ちたのかは判断できないと思います。自分の中には知見がありません。 ② try catchは例外を受け取るのでnoticeやwarningはcatchされません undefined等は人為ミスで開発時に潰していけると思います。 こういったものもExceptionを発生させてcatchする場合、`set_error_handler`を利用すると NoticeやWarningが発生した場合Exceptionが投げられるようにできるのでcatchできます 別手法ですが、今おっしゃられたような状況 つまりSQL文にエラーがあったのを補足したいと言うのであれば `$stmt->execute();`実行後に`$stmt->errorCode()`や`$stmt->errorInfo()`でエラー情報を取得できます https://www.php.net/manual/ja/pdostatement.errorcode.php 参考になりましたら幸いです また何か有りましたらコメントください よろしくおねがいします
masa354

2020/04/02 00:44

丁寧に回答ありがとうございます! また不明点があれば質問させていただきます!
masa354

2020/04/02 05: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文の書き方が間違っているとは思うのですが、他の書き方をいくつか試しても上手くいきませんでした。 度々すみませんが、どう変えればいいかお教えいただけないでしょうか?
natsume2233

2020/04/02 07:00

PDOExceptionのcodeから判別できるんですね、勉強になりました。 $e->getCode(); の返り値がどういった形式かわかりませんが 調べた限り2002などのみの数値で返ってくるようですので 下記のようになるのではないでしょうか if($e->getCode() == 2002) if("int(2002)")のような書き方ですと、問答無用でtrueになってしまいます->if(true)と書いているのと同義です またheaderの後exit;で後続処理を止める必要があります。 header('Location: system_error.php'); exit; 上手くいきますと幸いです
masa354

2020/04/02 07:22

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

0

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

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

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。

投稿2020/04/01 05:26

kei344

総合スコア69400

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

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

masa354

2020/04/01 13:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問