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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

203閲覧

Exception の書き方がよく分かりません。一応習った通りにこちらのコードを書いたのですが、この状態では意味が無いようです。ここからどのような処理を書くと意味のあるものになるのでしょうか?

meka

総合スコア23

MySQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2019/05/05 02:58

編集2019/05/06 11:30

php

1<?php 2 3require_once(__DIR__ . '/config.php'); 4require_once(__DIR__ . '/search.php'); 5 6$search = new \SearchDate\Price(); 7if ($_SERVER['REQUEST_METHOD'] === 'POST') { 8 $search->post(); 9} 10?> 11<!DOCTYPE html> 12<html lang="ja"> 13<head> 14 <meta charset="utf-8"> 15 <title>練習サイト</title> 16 <link rel="stylesheet" href="styles.css"> 17</head> 18<body> 19 20 <form action="" method="post"> 21 <label> 日付: <input type="date" name="date"></label> 22 <input type="submit" value="検索"> 23 24 <div>サンプル1</div> 25 <div>サンプル2</div> 26 <div><?= $search->_day; ?></div> 27 <div><?= $search->_nodate; ?></div> 28 <div> 29<?php foreach($search->_result as $rownum=>$rowdata) { 30 echo $rowdata[カラム名]; 31 } 32?> 33 </div> 34 35 </form> 36 37</body> 38</html>

// ファイル名 search.php

php

1<?php 2 3namespace SearchDate; 4 5class Price { 6 private $_db; 7 public $_result = []; 8 public $_nodate; 9 public $_day; 10 11 12 public function __construct() { 13 $this->_connectDB(); 14 $this->_createToken(); 15 } 16 17 private function _connectDB() { 18 try { 19 $this->_db = new \PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 20 $this->_db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 21 } catch (\PDOException $e){ 22 throw new \Exception('Faild to connect DB'); 23 } 24 } 25 26 private function _createToken() { 27 if (!isset($_SESSION['token'])) { 28 $_SESSION['token'] = 29 bin2hex(openssl_random_pseudo_bytes(16)); 30 } 31 } 32 33 private function _validateSelect() { 34 $date = filter_input(INPUT_POST,'date',FILTER_SANITIZE_NUMBER_INT); 35 if (strptime($date, '%Y-%m-%d')) { 36 $this->_validateWeek(); 37 } else { 38 $this->_day = "無効な日付です"; 39 $this->_nodate = "日付を指定してください"; 40 } 41 } 42 43 private function _validateWeek() { 44 $date = filter_input(INPUT_POST,'date',FILTER_SANITIZE_NUMBER_INT); 45 $week = date('w', strtotime($date)); 46 47 if ($week == 6 || $week == 0) { 48 $this->_day = date('Y年 m月 d日', strtotime($date)); 49 $this->_nodate = "土日でお休みでした"; 50 } else { 51 $this->_searchDate(); 52 } 53 } 54 55//ここから下のException 56 private function _validateToken() { 57 if (!isset($_SESSION['token'])) { 58 throw new \Exception('invalid token!'); 59 } 60 } 61 62 63 public function _searchDate() { 64 try { 65 $date = filter_input(INPUT_POST,'date',FILTER_SANITIZE_NUMBER_INT); 66 $where = ''; 67 68 if(!is_null($date)) { 69 $where = ' where カラム名 = :date'; 70 } 71 72 $stmt = $this->_db->prepare('select カラム名 from テーブル名'.$where); 73 if(!is_null($date)) { 74 $stmt->bindValue(':date', $date, \PDO::PARAM_STR); 75 } 76 $stmt->execute(); 77 $this->_result = $stmt->fetchAll(); 78 $this->_day = date('Y年 m月 d日', strtotime($date)); 79 } catch (\PDOException $e){ 80 die(var_dump($e)); 81 } 82 } 83 84 public function post() { 85 try { 86 $this->_validateSelect(); 87 $this->_validateToken(); 88 } catch (\Exception $e) { 89 die(var_dump($e)); 90 } 91 } 92 93}

開発中や学習用ならば die(var_dump($e)) で終わらせるべきらしいのですが、では実際に運営するとなった場合にPDOException Exceptionはどのように書くべきなのでしょうか?

:追記①

php

1public function post() { 2   try { 3    $this->_validateSelect(); 4    $this->_validateToken(); 5    $this->_searchDate(); 6   } catch (\Exception $e) { 7   header('Location: http://&amp;amp;#039; . $_SERVER['HTTP_HOST']); 8   exit; 9   } 10  }

:追記②

php

1private function _connectDB() { 2 try { 3 $this->_db = new \PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 4 $this->_db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 5 } catch (\PDOException $e){ 6 error_log($e->getMessage(), 3, __DIR__ . "/exceptions.log"); 7 echo "Faild to connect DB"; 8 exit; 9 } 10 }

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

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

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

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

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

m.ts10806

2019/05/05 03:00

PHPマニュアルは確認されたのでしょうか
meka

2019/05/05 09:03 編集

前コードではphpのマニュアル通り書いていたと思うのですが意味が無いとのことだったので、、使いどころが悪かったのかと、、、リダイレクトすると意味が無くなるとのことでしたがマニュアル見てもその意味がつかめなかったものでスミマセン。
m.ts10806

2019/05/05 03:17

リダイレクトすると画面にはとどまらないので出力は行われないですし、そもそもheader関数の前には如何なる出力もしてはいけないので仕様上NGです
meka

2019/05/05 08:48 編集

メッセージがこちらでしたねスミマセン.... 少し意味が分かってきました! 本文の方に追記したコードが以前のコードですが、 _validateSelect(); と $this->_validateToken();は 意味があったけど post()処理のなかでこの二つが行われて、例外処理されると post() のheader('Location: http://&#039; . $_SERVER['HTTP_HOST']); で飛ばされてメッセージが出ないから意味が無かった。そういう感じでしょうか?
guest

回答2

0

ベストアンサー

実際に運営するとなった場合にPDOException Exceptionはどのように書くべきなのでしょうか?

設計次第です。
「異常系」の対応の設計ですね。
握りつぶして(何も出力しない)何もしないのか、システムエラーとだけだすのか、エラーログに出力するのか、運営に自動送信で通知するのか。
それは設計次第です。
Exceptionが出力する内容次第ではデータベース構成が漏れてしまうこともあるので画面への直接出力は避けるべきではありますが、それも含めてどうするかはアプリケーションの仕様なので、「絶対こうする」ような指標はないです。決めてください。
どうなっていると運営側がやりやすいか、ありがたいかの観点ですね。
それもプロジェクトによったりもするので、今、学習段階とのことですし、「画面出力しておく」ので間違いはなく「本番稼働時には画面に出力はしないが、どうするかはプロジェクトやシステムのルールによる」程度の認識で良いと思います。

投稿2019/05/05 03:01

編集2019/05/05 03:07
m.ts10806

総合スコア80850

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

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

meka

2019/05/05 09:04 編集

以前の _validateSelect()とか_validateToken()でException投げてるのはいいけど受け取ってもリダイレクトしているだけなので意味ないのでは。 が未だに理解できておりません・・・ これが意味のあるExceptionにするにはどのように考えればいいでしょうか? それともExcptionにするまでもないとの意味だったのでしょうか?
m.ts10806

2019/05/05 04:37

回答読まれましたか? 「意味」は作る側がつけるものです。「どうしたい」からExceptionを拾っているのか、そこは組まれている自身が一番知っているのではないでしょうか
meka

2019/05/05 08:51 編集

少し意味が分かってきました! 本文の方に追記したコードが以前のコードですが、 _validateSelect(); と $this->_validateToken();は 意味があったけど post()処理のなかでこの二つが行われて、例外処理されると post() のheader('Location: http://&amp;#039; . $_SERVER['HTTP_HOST']); で飛ばされてメッセージが出ないから意味が無かった。そういう感じでしょうか?
m.ts10806

2019/05/05 08:32

細かくて申し訳ないのですが、コードはなるべくコメントには書かれないほうが。マークダウンが使えないのがまずの理由ですが、解決までの経緯や流れが後から見たときに見えづらくなるからです。 htmlエスケープやurlエンコードも入るので読み替えが大変にもなります
meka

2019/05/05 08:44

いえ、悪いのは何も分かっていない私ですのでご注意頂いて助かります。今後気を付けさせていただきます。
m.ts10806

2019/05/05 08:46

卑下する必要はないです。 あくまで淡々と、質問に追記してもらえればそれで良いのです。
meka

2019/05/05 08:53

了解しました、コメント修正をして本文に追記させていただきました。 意味的には先ほどのコメント内容で合っていたでしょうか?
m.ts10806

2019/05/05 23:07

追記について、回答を繰り返すことになりますが、運用次第なので「決めてください」です。 プロジェクトによっては異常系の設計で決まっていればそれに準じるだけ。 学習段階であれば画面でもいいし自身で準備したログファイルでもいいので、出力するようにしてください。
meka

2019/05/06 11:34

追記②にPDOのデータベースにアクセスが失敗したときエラーが別ファイルに出力されるようにし、画面には 'Faild to connect DB' とだけ表示させるようなコードを書いてみました。実際の仕事現場で運用次第で変わるとは思いますが、実際に運用するとしてこのようなエラーの管理は「あり」でしょうか「なし」でしょうか?
m.ts10806

2019/05/06 12:51

繰り返しますね。 運用次第なので「決めてください」です。 プロジェクトによっては異常系の設計で決まっていればそれに準じるだけ。 「あり」「なし」は外部の誰かが決めるものではないです。 私がどちらかをここで伝えたとしてそれが全てだと思いますか?
meka

2019/05/06 13:33

どのようにお聞ききするのがふさわしいのか悩みますが、、、 新米料理人が目玉焼きを焼いたとして、出来上がったものに塩をかけて食べるのか醤油をかけて食べるのか、まれにソースをかけて食べる人もいると思います。これは人の好みで自由なものだと思いますが料理の段階で目玉焼きが丸焦げになってしまっては何をかけても焦げの味しかしませんし食べられたものじゃないと思います。 実務を長くやってらっしゃるとのことでしたので長年やってらっしゃる料理人の立場として追記②は丸焦げになってはいないでしょうか?
m.ts10806

2019/05/06 13:52

無理にたとえ話をすると余計混乱を招きます。(特に「アドバイスを求める立場」であれば的確な例え話になることはありません) 異常系設計こそそもそも現場でしか出てこないようなものなので、現場に入った時にその現場のルールに準じればいい話で、今考えるべきは正常系を全てきちんと通すことです。
meka

2019/05/06 14:11

とりあえずマニュアルを参考に頑張ってみます、、、、ありがとうざいました!
m.ts10806

2019/05/06 21:06

マニュアルには設計部分はほとんどないですが、学習期は正常系のみに比重をおいてもいいくらいなので、後の処理に影響のない程度の出力にとどめておくて良いでしょう
guest

0

例外処理の設計の話ですね。

お気に入りのスライドを貼っておきます。
PHP7 で堅牢なコードを書く

たしかどっかに動画もあったと思います。

投稿2019/05/05 03:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

meka

2019/05/05 08:04

ありがとうございます!見て勉強させていただきます‼
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問