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;#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 }
回答2件
あなたの回答
tips
プレビュー