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

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

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

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

Q&A

解決済

1回答

976閲覧

フォーム作成にて、完了画面のみ表示されない

YTKM

総合スコア22

PHP

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

0グッド

0クリップ

投稿2022/07/18 02:02

編集2022/07/18 02:37

実現したいこと

確認画面の送信ボタン押し時

完了画面
お問い合わせ内容を送信しました。
ありがとうございました。

と、送信完了画面を表示させたい。

現状

確認画面
Image from Gyazo

送信ボタンを押しても、送信完了画面が表示されなくて困っています。
元々は表示されていたのですが、セキュリティ対策、サニタイズ、バリデーションを実装して、気づいたら表示されなくなっていました。

実装方法

フォームボタン押し時、$pageFlagの数値が変わる事でページを切り替えてます。
値はしっかりデータベースに保存出来るし、var_dumpにて送信完了画面で、しっかりbtn_submit要素が来ているので、なぜ送信完了画面の文字が表示されないのかが分かりません。
分かる方居ましたらお願い致します」。

Image from Gyazo

Image from Gyazo

コード

view

php

1<?php 2session_start(); 3function h($str) 4{ 5 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 6} 7require 'validation.php'; 8require_once(ROOT_PATH .'Controllers/ContactController.php'); 9 10 11$create = new ContactController(); 12$params = $create->index(); 13 14 15if (!empty($_POST)) { 16 ($_POST); 17} 18 19$errors = validation($_POST); 20/// $pageFlagにて切り替え 21/// 入力画面 22$pageFlag = 0; 23/// 確認画面 24if (!empty($_POST['btn_confirm']) && empty($errors)) { 25 $pageFlag = 1; 26 var_dump($_POST); 27} 28/// 完了画面 29if (!empty($_POST['btn_submit'])) { 30 $pageFlag = 2; 31 var_dump($_POST); 32 $create->contact($_POST); 33} 34/// 更新画面 35 36?> 37 38 39 40<!DOCTYPE html> 41<html> 42<head> 43<meta charset="UTF-8"> 44<link rel="stylesheet" type="text/css" href="/css/base.css"> 45<link rel="stylesheet" type="text/css" href="/css/st.css"> 46<link rel="stylesheet" type="text/css" href="/css/table.css"> 47<script src="validation.js"></script> 48</head> 49 50<body> 51<div class = "container"> 52 53<!-- 入力画面フォーム --> 54<?php if($pageFlag === 0 ) : ?> 55 56<?php if(!empty($errors) && !empty($_POST['btn_confirm'])) : ?> 57<?php echo '<ul>' ; ?> 58<?php 59 foreach($errors as $error){ 60 echo '<li>'. $error . '</li>' ; 61 } 62?> 63<?php echo '</ul>' ; ?> 64 65<?php endif ;?> 66<div class = "title"> 67<h1>入力画面</h1> 68</div> 69<form method="POST" action="contact.php"> 70 <p>氏名</p> 71<input type="text" name="name" id="inputName" value="<?php if(!empty($_POST['name'])) { echo h($_POST['name']); } ?>" > 72<br> 73 <p>フリガナ</p> 74<input type="text" name="kana" id="inputKana" value="<?php if(!empty($_POST['kana'])) { echo h($_POST['kana']); } ?>" > 75<br> 76 <p>電話番号</p> 77<input type="text" name="tel" value="<?php if(!empty($_POST['tel'])) { echo h($_POST['tel']); } ?>" > 78<br> 79 <p>メールアドレス</p> 80<input type="email" name="email" id="inputMail" value="<?php if(!empty($_POST['email'])) { echo h($_POST['email']); } ?>" > 81<br> 82 <p>お問い合わせ内容</p> 83<textarea name="body" id="inputBody"> 84<?php if(!empty($_POST['body'])) { echo h($_POST['body']); } ?> 85</textarea> 86<p><input type="submit" name="btn_confirm" id="btnSubmit" value="送信"> </p> 87<br> 88</form> 89<section> 90 <table border="1"> 91 <tbody> 92 <tr> 93 <th>氏名</th> 94 <th>フリガナ</th> 95 <th>電話番号</th> 96 <th>メールアドレス</th> 97 <th>お問い合わせ内容</th> 98 <th>編集ボタン</th> 99 </tr> 100 <?php foreach($params['contacts'] as $content): ?> 101 <tr> 102 <td><?=$content['name'] ?></td> 103 <td><?=$content['kana'] ?></td> 104 <td><?=$content['tel'] ?></td> 105 <td><?=$content['email'] ?></td> 106 <td><?=$content['body'] ?></td> 107 <td> 108 <form> 109 <input type="submit" name="edit_submit" value="編集"> 110 </form> 111 </td> 112 </tr> 113 </tbody> 114 <?php endforeach; ?> 115 </table> 116 </section> 117 118<?php endif; ?> 119 120 121<!-- 確認画面フォーム --> 122<?php if($pageFlag === 1 ) : ?> 123 <h1>確認画面</h1> 124 <form method="POST" action="contact.php"> 125 <p>氏名</p> 126 <?php echo h($_POST['name']);?> 127 <br> 128 <p>フリガナ</p> 129 <?php echo h($_POST['kana']);?> 130 <br> 131 <p>電話番号</p> 132 <?php echo h($_POST['tel']);?> 133 <br> 134 <p>メールアドレス</p> 135 <?php echo h($_POST['email']);?> 136 <br> 137 <p>お問い合わせ</p> 138 <?php echo h($_POST['body']);?> 139 <br> 140 <p>上記の内容でよろしいですか?</p> 141 <input type="submit" name="back" value="キャンセル"> 142 <input type="submit" name="btn_submit" value="送信"> 143 <input type="hidden" name="name" value="<?php echo h($_POST['name']); ?>" > 144 <input type="hidden" name="kana" value="<?php echo h($_POST['kana']); ?>" > 145 <input type="hidden" name="tel" value="<?php echo h($_POST['tel']); ?>" > 146 <input type="hidden" name="email" value="<?php echo h($_POST['email']); ?>" > 147 <input type="hidden" name="body" value="<?php echo h($_POST['body']); ?>" > 148 </form> 149 150<?php endif; ?> 151 152<!-- 完了画面フォーム --> 153<?php if($pageFlag === 2 ) : ?> 154 完了画面 155<br> 156お問合せ内容を送信しました。 157<br> 158ありがとうございました。 159<?php endif; ?> 160 161 162<!-- 更新画面 --> 163 164 165</div> 166</body> 167</html>

バリデーション サーバー

php

1<?php 2function validation($request){ 3 $errors = []; 4 5 if(empty($request['name']) || 10 < mb_strlen($request['name']) ){ 6 $errors[] = '氏名は必須です。 10文字以内で入力してください。'; 7 } 8 9 if(empty($request['kana']) || 10 < mb_strlen($request['kana']) ){ 10 $errors[] = 'フリガナは必須です。 10文字以内で入力してください。'; 11 } 12 13 if(empty($request['email']) || !filter_var($request['email'], FILTER_VALIDATE_EMAIL) ){ 14 $errors[] = 'メールアドレスは必須です。正しい形式で入力してください'; 15 } 16 17 if(!empty($request['tel'])){ 18 if(preg_match("/[0-9]{3}[0-9]{4}/", $request['tel']) === 0){ 19 $errors[] = '電話番号を正しい形式で入力してください'; 20 } 21 } 22 23 if(empty($request['body'])){ 24 $errors[] = 'お問い合わせ内容は必須です。'; 25 } 26 27 return $errors; 28} 29?>

バリデーション フロント

js

1 window.onload = function(){ 2 /*各画面オブジェクト*/ 3 const btnSubmit = document.getElementById('btnSubmit'); 4 const inputName = document.getElementById('inputName'); 5 const inputKana = document.getElementById('inputKana'); 6 const inputMail = document.getElementById('inputMail'); 7 const inputBody = document.getElementById('inputBody'); 8 const reg = /^[A-Za-z0-9]{1}[A-Za-z0-9_.-]*@{1}[A-Za-z0-9_.-]{1,}.[A-Za-z0-9]{1,}$/; 9 10 11 btnSubmit.addEventListener('click', function(event) { 12 let message = []; 13 /*入力値チェック*/ 14 if(inputName.value ==""){ 15 message.push("氏名が未入力です。") 16 } 17 if(inputKana.value==""){ 18 message.push("フリガナが未入力です。") 19 } 20 if(inputBody.value==""){ 21 message.push("お問い合わせ内容が未入力です。"); 22 } 23 if(inputMail.value==""){ 24 message.push("メールアドレスが未入力です。"); 25 }else if(!reg.test(inputMail.value)){ 26 message.push("メールアドレスの形式が不正です。"); 27 } 28 if(message.length > 0){ 29 alert(message); 30 return; 31 } 32 }); 33 }; 34

コントローラー

php

1 2<?php 3require_once(ROOT_PATH .'Models/ContactModel.php'); 4class ContactController { 5 private $request; // リクエストパラメータ(GET,POST) 6 private $Contact; // Playerモデル 7 public function __construct() { 8 // リクエストパラメータの取得 9 $this->request['get'] = $_GET; 10 $this->request['post'] = $_POST; 11 12 // モデルオブジェクトの生成 13 $this->Contact = new ContactModel(); 14 // 別モデルと連携 15 $dbh = $this->Contact; 16 } 17 18 public function contact($data) 19 { 20 $this->Contact->contact($data); 21 exit(); 22 } 23 24 25 26 public function index() { 27 $pageFlag = 0; 28 if(isset($this->request['get']['pageFlag'])) { 29 $pageFlag = $this->request['get']['pageFlag']; 30 } 31 32 $contacts = $this->Contact->findAll($pageFlag); 33 $params = [ 34 'contacts' => $contacts, 35 'page' => $pageFlag // ページ番号 36 ]; 37 return $params; 38} 39} 40?>

モデル

php

1 2<?php 3require_once(ROOT_PATH .'Models/Db.php'); 4 5class ContactModel extends Db { 6 public function __construct($dbh = null) { 7 parent::__construct($dbh); 8 } 9 public function contact($data) 10 { 11 $name = $data['name']; 12 $kana = $data['kana']; 13 $tel = $data['tel']; 14 $email = $data['email']; 15 $body = $data['body']; 16 $this->dbh->beginTransaction(); 17 try { 18 $sql = "INSERT INTO contacts (name, kana, tel, email, body) VALUES (:name,:kana,:tel,:email,:body)"; 19 $sth = $this->dbh->prepare($sql); 20 $sth -> bindValue(':name', $name); 21 $sth -> bindValue(':kana', $kana); 22 $sth -> bindValue(':tel', $tel); 23 $sth -> bindValue(':email', $email); 24 $sth -> bindValue(':body', $body); 25 $sth->execute(); 26 $this->dbh->commit(); 27 // $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 28 // $pdo->exec("updateeee test set name = 'aaa' where id = 1"); 29 } catch (Exception $e) { 30 echo "接続失敗: " . $e->getMessage() . "\n"; 31 // echo $e->getMessage()." - ".$e->getLine().PHP_EOL; 32 exit(); 33 } 34 } 35 36 public function findAll($pageFlag = 0):Array { 37 $sql = 'SELECT'; 38 $sql .= ' name,'; 39 $sql .= ' kana,'; 40 $sql .= ' tel,'; 41 $sql .= ' email,'; 42 $sql .= ' body'; 43 $sql .= ' FROM contacts'; 44 45 46 $sth = $this->dbh->prepare($sql); 47 $sth->execute(); 48 $result = $sth->fetchAll(PDO::FETCH_ASSOC); 49 return $result; 50 } 51 } 52?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

if (!empty($_POST['btn_submit'])) {の中の$create->contact($_POST);が非常に怪しいですが
該当のコントローラーのコードがないので何とも言えませんね…

投稿2022/07/18 02:32

RiaFeed

総合スコア2701

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

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

YTKM

2022/07/18 02:39

回答いただきありがとうございます。 承知いたしました。 コントローラーと、念の為モデルも追記します。
RiaFeed

2022/07/18 02:49 編集

コントローラーのcontactメソッド内でexit();しているから その後に表示する予定の完了画面部分を表示する前にPHPを終了させちゃってますね。 ひとまずexit()をコメントアウトしてみてください。
YTKM

2022/07/18 02:56

MS_ttさんのコメントでコントローラー見直した所 自分も今気づきました。 確認しながらコードを書いている時に消すのを忘れて居た事が原因です。 くだらない事に付き合わせてしまい申し訳ありません。泣
YTKM

2022/07/18 02:57

RiaFeed 回答いただきありがとうございます。 おっしゃる通りです。 exit()削除したら表示されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問