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

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

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

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

Q&A

解決済

4回答

1804閲覧

エラーを格納し別画面にて表示させたい

Roo

総合スコア55

PHP

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

0グッド

0クリップ

投稿2019/03/08 04:50

編集2019/03/08 07:17

###前提
【現在】
■form.php
・入力項目入力(JS実施)
・POST

…↓↓…

■check.php
・サーバーサイドのバリデーション&重複確認
・エラーがあった場合:check.php画面にてエラー表示されている

###やりたいこと
下記のようなエラー(check.php)にて、エラーが発生した場合、
form.phpのページに戻ってエラーを表示したいです。

form.php

php

1 <?php 2session_start(); 3----省略----- 4?> 5 6<!DOCTYPE html> 7<html> 8<head> 9-----省略----- 10</head> 11<body> 12 13<script type="text/javascript"> 14--JS省略---- 15</script> 16 17<form method="post" name="form1" id="form1" action="check.php"> 18 19<dt><span class="req">メールアドレス 必須</span></dt> 20<input type="text" id="mail" name="mail"> 21<p><input type="hidden" name="token" value="<?=$token?>"></p> 22<span id="mail_error" class="error_m"></span><br> 23 24 25<dt><span class="req">メールアドレス(確認用)必須</span></dt> 26<p><input type="text" id="mail_2" name="mail_2"></p> 27<span id="mail_error_2" class="error_m"></span><br> 28 29 30<p><input type="submit" name="sub" id="sub" value="登録する"></p> 31<?php echo $_SESSION["error"]; ?> 32 33</form> 34</body> 35</html>

check.php↓

php

1<?php 2session_start(); 3 4header("Content-type: text/html;unix_socket=/tmp/mysql.sock;charset=utf-8"); 5 6 7//データベース接続 8require_once("db.php"); 9$dbh = db_connect(); 10 11 12//エラーメッセージの初期化 13$errors = array(); 14 15if(empty($_POST)) { 16 header("Location: registration_mail_form.php"); 17 exit(); 18}else{ 19 //POSTされたデータを変数に入れる 20 $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL; 21 22 //メール入力判定 23 if ($mail == ''){ 24 $errors['mail'] = "メールが入力されていません。"; 25 }else{ 26 if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)){ 27 $errors['mail_check'] = "メールアドレスの形式が正しくありません。"; 28 }else{ 29 if(empty($erros)){ 30 $query = $dbh->prepare('SELECT * FROM member WHERE mail = :mail limit 1'); 31 $query->execute(array(':mail' => $_POST['mail'])); 32 $result = $query->fetch(); 33 if($result > 0){ 34 $errors['mail'] = "すでに登録されたデータです。"; 35} 36} 37if(isset($errors)){ 38 $_SESSION['error'] = $errors; 39 header("Location: registration_mail_form.php"); 40 exit(); 41 } 42 43 44 45} 46} 47} 48 49------トークン確認省略 50 51$body = <<< EOM 52仮会員登録完了 53-----------会員登録完了メール省略 54 55<!DOCTYPE html> 56<html> 57<head> 58<title>メール確認画面</title> 59<meta charset="utf-8"> 60</head> 61<body> 62<h1>メール確認画面</h1> 63 64<?php if (count($errors) === 0): ?> 65 66 67<?php elseif(count($errors) > 0): ?> 68 69<?php 70foreach($errors as $value){ 71 echo "<p>".$value."</p>"; 72} 73?> 74 75<input type="button" value="戻る" onClick="history.back()"> 76 77<?php endif; ?> 78 79</body> 80</html>

###質問点
エラー発生時にエラーをどこに格納して(セッション?)
前の画面に戻り表示すれば宜しいでしょうか?

コードどう修正すれば宜しいでしょうか?
お教え下さいませ。

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

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

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

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

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

guest

回答4

0

formタグの内容がわかりませんが、actionプロパティにform.phpを設定し、そのPHPプログラムの中でcheck.phpをincludeして呼び出せばいいでしょう。そしてエラーコードを変数に格納して、戻ってきたところで、その変数を展開すれば大丈夫です。

すごく簡潔に描いていますが、流れとしてはこうです。

PHP

1<?php 2 3 /*転送されたかどうかの判定フラグを出してから以下の判定を行う*/ 4 if($flg){ 5 include_once('check.php'); //確認用ファイルを呼び出し 6 } 7 8  if(isset($errors)) var_dump($errors); 9 10 11?> 12<html> 13<body> 14 <form method="post" action="form.php"> 15 </form> 16</body> 17</html>

投稿2019/03/08 05:10

編集2019/03/08 05:11
FKM

総合スコア3635

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

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

Roo

2019/03/08 05:18

お早い解答感謝いたします。 私の質問の仕方が悪かったので、質問修正させて下さいませ
FKM

2019/03/08 05:39 編集

必ずcheck.phpに転送しないといけないのなら、他の人のやり方で大丈夫です。変数の保持方法は $_SESSIONや$_COOKIEなどを使えばいいです。 尚、自分のやり方のようにincludeやrequireを使えば、そのままグローバル変数やセッションとかで受け渡す必要がないというメリットはあるので、機能を拡張するときには便利です。
m.ts10806

2019/03/08 05:41

check.phpに画面出力が伴わなくなるのであればわざわざリダイレクトするのは無駄だと私も思います。 ユーザーからすればform.phpで送信したらform.phpが表示されるわけですし。
m.ts10806

2019/03/08 05:45

つまりメール確認画面(というか完了?)はconfirm.phpとかsend.phpとか結果を表示するだけの画面をつくっておいて、check.phpでエラー引っ掛からなかったときだけリダイレクト。check.phpという機能名からも期待されるのは結果ではなくチェックそのものなので。
guest

0

ベストアンサー

ざっくりとした流れ

  • nyuryoku.php

PHP

1<?PHP 2session_start(); 3$error=isset($_SESSION["error"])?$_SESSION["error"]:null; 4?> 5<form method="post" action="kakunin.php"> 6<input type="text" name="hoge" value="" placeholder="123以外エラー"> 7<div id="err"><?=$error;?></div> 8<input type="submit" value="send"> 9</form>
  • kakunin.php

PHP

1<?PHP 2session_start(); 3$hoge=filter_input(INPUT_POST,"hoge"); 4if($hoge!=="123"){ 5 $_SESSION["error"]="bad hoge"; 6 header('Location:x.php'); 7 exit; 8} 9?> 10<form method="post" action="touroku.php"> 11hoge:<?=htmlspecialchars($hoge);?> - ok? 12<input type="submit" value="send"> 13</form>
  • touroku.php

PHP

1<?PHP 2session_start(); 3print_r($_SESSION["hoge"]); 4/*登録処理がおわったらheader()でkanryo.phpに飛ぶ*/
  • kanryo.php

PHP

1<?PHP 2session_destory(); 3?> 4登録完了

投稿2019/03/08 06:21

yambejp

総合スコア114839

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

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

yambejp

2019/03/08 07:04

追記しようとおもったら新しい回答になっちゃいました すみません
Roo

2019/03/08 07:30

上記の様に機能ごとの方がきれいだと思うのですが、 時間がなく・・・。 【check画面】 if(isset($errors)){ $_SESSION['error'] = $errors; header("Location: registration_mail_form.php"); exit(); } こちらご指摘通りheaderに飛ばしたのですが、 else文法の下に書いたため、elseが優先されてしまいます。 正しい格納の仕方をご教授いただきたいです。 【form画面】 そしてheaderで飛ばした場合、 <?php echo $_SESSION["error"]; ?> こちら記載いたしましたが、初期の画面でNotice出てしまいます。
yambejp

2019/03/08 07:33

> 初期の画面でNotice nyuryoku.php に対応書いてありますよね?
Roo

2019/03/08 08:25

懇切丁寧なご説明心より感謝いたします。 コードが汚いこと:知識が浅いまま進行していること 申し訳ありません。今後ともお力添えをいただけると恐縮です。
guest

0

以下の記述だといかがでしょうか。
入力画面でセッションを判別する仕組みを別途書けばエラーも表示できると思います。

PHP

1 2<?php 3 //セッション開始 4 session_start(); 5 6 if(empty($_POST)) { 7 header("Location: registration_mail_form.php"); 8 exit(); 9 }else{ 10 //POSTされたデータを変数に入れる 11 $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL; 12 13 //メール入力判定 14 if ($mail == ''){ 15 $errors['mail'] = "メールが入力されていません。"; 16 }else{ 17 if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)){ 18 $errors['mail_check'] = "メールアドレスの形式が正しくありません。"; 19 }else{ 20 if(empty($erros)){ 21 $query = $dbh->prepare('SELECT * FROM member WHERE mail = :mail limit 1'); 22 $query->execute(array(':mail' => $_POST['mail'])); 23 $result = $query->fetch(); 24 if($result > 0){ 25 $errors['mail'] = "すでに登録されたデータです。"; 26  } 27 } 28 //エラーが存在した場合入力画面に戻る、かつセッションにデータを保存する 29 if(isset($errors)){ 30 $_SESSION['error'] = $errors; 31 header("Location: registration_mail_form.php"); 32 exit(); 33 } 34 35 36?>

投稿2019/03/08 05:22

rmrmnrm

総合スコア139

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

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

Roo

2019/03/08 05:35

ご返答ありがとうございました。 参考に修正いたします。
guest

0

check.phpにてセッションを保持し

PHP

1header("Location:form.php"); 2

で元のページに飛ばして、form.php側でセッション情報を元に
エラー表示してください

投稿2019/03/08 05:17

yambejp

総合スコア114839

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

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

Roo

2019/03/08 05:35

いつもご回答ありがとうございます。 参考に修正いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問