前提・実現したいこと
phpとmysqlの練習サイトを作っています。
内容としてはindex.phpから日付選択をしてサーバーに送信、データベースからマッチする日付のデータを引っ張って来てindex.phpの任意の位置に結果を表示するというものです。
問題点として <label> 日付: <input type="date" name="date"></label> で選択した日付がPOSTすると保持されず日付がundefindになることです。
こちらに掲載したコードでエラーは出ませんが、実現したいことは(index.php)の<?phpif($_SERVER['REQUEST_METHOD'] === 'POST') {$search->post();を(index.php)の上の方で書いて、(search.php)の処理にてreturnで結果を返す。その結果を(index.php)の任意の場所で表示するということです。
POSTしてretutn処理すると消えるのでreturn処理でデータを返す方法をご教授お願いできますでしょうか?
補足情報:
- ローカル開発環境で練習しています。
- POSTの関係ないメソッドのrerun処理は問題なくできています。
発生している問題・エラーメッセージ
Notice: Undefined variable …
該当のソースコード
//ファイル名 index.php
php
1<?php 2 3require_once(__DIR__ . '/config.php'); 4require_once(__DIR__ . '/search.php'); 5 6try { 7 $search = new \SearchDate\Price(); 8} catch (Exception $e) { 9 echo $e->getMessage(); 10 exit; 11} 12 13?> 14<!DOCTYPE html> 15<html lang="ja"> 16<head> 17 <meta charset="utf-8"> 18 <title>練習サイト</title> 19 <link rel="stylesheet" href="styles.css"> 20</head> 21<body> 22 23 <form action="" method="post"> 24 <label> 日付: <input type="date" name="date"></label> 25 <input type="submit" value="検索"> 26 27 <div>サンプル1</div> 28 <div>サンプル2</div> 29 <div><?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { 30 $search->post(); 31 } ?></div> 32 //本来ここではなく、このファイルの上の方でこちらのコードを書きたいです。 33 34 </form> 35 36</body> 37</html> 38
//ファイル名 search.php
php
1<?php 2 3namespace SearchDate; 4 5class Price { 6 private $_db; 7 8 public function __construct() { 9 $this->_connectDB(); 10 $this->_createToken(); 11 } 12 13 private function _connectDB() { 14 try { 15 $this->_db = new \PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 16 $this->_db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 17 } catch (\PDOException $e){ 18 throw new \Exception('Faild to connect DB'); 19 } 20 } 21 22 private function _createToken() { 23 24 if (!isset($_SESSION['token'])) { 25 $_SESSION['token'] = 26 bin2hex(openssl_random_pseudo_bytes(16)); 27 } 28 } 29 30 private function _validateSelect() { 31 32 $date = filter_input(INPUT_POST,'date',FILTER_SANITIZE_NUMBER_INT); 33 if ($date == NULL || FALSE) { 34 echo '日付を指定してください'; 35 exit; 36 } 37 } 38 39 private function _validateToken() { 40 41 if (!isset($_SESSION['token'])) { 42 throw new \Exception('invalid token!'); 43 } 44 } 45 46 public function _searchDate() { 47 48 $date = filter_input(INPUT_POST,'date',FILTER_SANITIZE_NUMBER_INT); 49 $res = $this->_db->prepare('select カラム名 from テーブル名 where カラム名 = :date'); 50 $res->bindValue(':date', $date, \PDO::PARAM_STR); 51 $res->execute(); 52 53 $price = $res->fetch(\PDO::FETCH_ASSOC); 54 55 if ($price == false) { 56 echo '該当なし'; 57 } else { 58 echo $price["カラム名"]; 59 //こちらの結果を return で返して(index.php)の任意の位置で表示したいです。 60 } 61 } 62 63 public function post() { 64 try { 65 66 $this->_validateSelect(); 67 $this->_validateToken(); 68 $this->_searchDate(); 69 70 } catch (\Exception $e) { 71 header('Location: http://' . $_SERVER['HTTP_HOST']); 72 } 73 exit; 74 } 75 76} 77
試したこと
__construct内での初期化や、index.phpに変数を書いて結果を引っ張ってくるなど試してみましたが、そもそも問題が初期化で合っているのかも不明。search.phpの_searchDate() のechoやvar_dump()では結果が取れているのであともう一歩な気がしているのですが・・・。要は、ページにアクセスしたユーザーが日付指定をしてsubumitしないと日付が選択されず空のままになってしまっていて、index.phpで変数書いてもエラーになっているのかとか色々悩んでいます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー