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

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

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

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

Q&A

解決済

3回答

1353閲覧

sバリデーションについて

Roo

総合スコア55

PHP

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

0グッド

0クリップ

投稿2019/02/28 06:11

編集2019/02/28 07:07

###前提
phpで仮会員登録機能実装中

仮会員登録機能(POST)のみ:(registration_mail_form.php)

php

1<?php 2session_start(); 3 4header("Content-type: text/html; charset=utf-8"); 5 6//クロスサイトリクエストフォージェリ(CSRF)対策 7$_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32)); 8$token = $_SESSION['token']; 9 10//クリックジャッキング対策 11header('X-FRAME-OPTIONS: SAMEORIGIN'); 12 13?> 14 15<!DOCTYPE html> 16<html> 17<head> 18<title>【DB課題】仮会員登録</title> 19<meta charset="utf-8"> 20</head> 21<body> 22<h1>仮会員登録</h1> 23 24①メールアドレスの入力 ➡ ②仮会員登録完了 25 26<p>メールアドレスを入力して「入力内容確認」ボタンを押してください。</p> 27<p>入力されたメールアドレスに仮会員登録メールが届きますのでそちらに掲載されているURKより本登録が行えます</p> 28 29 30<form action="registration_mail_check.php" method="post"> 31 32<p>メールアドレス 必須</p> 33<input type="text" name="mail" size="50"> 34 35 36<p>メールアドレス (確認用) 必須</p> 37<input type="text" name="mail_2" size="50"> 38 39 40<p><input type="hidden" name="token" value="<?=$token?>"></p> 41<input type="submit" value="登録する"> 42 43</form> 44 45 46</body> 47</html>

↓POSTされたトークン&メアド確認:(registration_mail_check.php)

php

1<?php 2session_start(); 3 4header("Content-type: text/html;unix_socket=/tmp/mysql.sock;charset=utf-8"); 5 6//クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定 7if ($_POST['token'] != $_SESSION['token']){ 8 echo "不正アクセスの可能性あり"; 9 exit(); 10} 11 12//クリックジャッキング対策 13header('X-FRAME-OPTIONS: SAMEORIGIN'); 14 15//データベース接続 16require_once("db.php"); 17$dbh = db_connect(); 18 19 20//エラーメッセージの初期化 21$errors = array(); 22 23if(empty($_POST)) { 24 header("Location: registration_mail_form.php"); 25 exit(); 26}else{ 27 //POSTされたデータを変数に入れる 28 $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL; 29 30 //メール入力判定 31 if ($mail == ''){ 32 $errors['mail'] = "メールが入力されていません。"; 33 }else{ 34 if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)){ 35 $errors['mail_check'] = "メールアドレスの形式が正しくありません。"; 36 } 37 require_once("db.php"); 38 $dbh = db_connect(); 39 40 function emailExists($email, $dbh){ 41 $sql = "select * from pre_member where email = :email limit 1"; 42 $stmt = $dbh->prepare($sql); 43 $stmt->execute(array(":email" => $email)); 44 $user = $stmt->fetch(); 45 return $user ? true : false; 46} 47 } 48} 49 50if (count($errors) === 0){ 51 52 $urltoken = hash('sha256',uniqid(rand(),1)); 53 $url = "http://www1002uj.sakura.ne.jp/registration/registration_form.php"."?urltoken=".$urltoken; 54 55 //ここでデータベースに登録する 56 try{ 57 //例外処理を投げる(スロー)ようにする 58 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 59 60 $statement = $dbh->prepare("INSERT INTO pre_member (urltoken,mail,date) VALUES (:urltoken,:mail,now() )"); 61 62 //プレースホルダへ実際の値を設定する 63 $statement->bindValue(':urltoken', $urltoken, PDO::PARAM_STR); 64 $statement->bindValue(':mail', $mail, PDO::PARAM_STR); 65 $statement->execute(); 66 67 //データベース接続切断 68// $dbh = null; 69 70 }catch (PDOException $e){ 71 $e->getMessage(); 72 echo $e->getMessage(); 73 $e->getLine(); 74 echo $e->getLine(); 75// print('Error:'.$e->getMessage()); 76// die(); 77 } 78 79 //メールの宛先 80 $mailTo = $mail; 81 82 //Return-Pathに指定するメールアドレス 83 $returnMail = 'web@sample.com'; 84 85 $name = "仮会員登録機能【DB課題】"; 86 $mail = ''; 87 $subject = "仮会員登録ありがとうございます"; 88 89$body = <<< EOM 90仮会員登録完了 91下記のURLから新規会員登録に移動して下さい。 92{$url} 93 94※このメールは送信専用メールアドレスから配信されています。 95ご返信いただいてもお答えできませんのでご了承下さい。 96URLの期限は24時間となっております。 97EOM; 98 99 mb_language('ja'); 100 mb_internal_encoding('UTF-8'); 101 102 //Fromヘッダーを作成 103 $header = 'From: ' . mb_encode_mimeheader($name). ' <' . $mail. '>'; 104 105 if (mb_send_mail($mailTo, $subject, $body, $header, '-f'. $returnMail)) { 106 107 //セッション変数を全て解除 108 $_SESSION = array(); 109 110 //クッキーの削除 111 if (isset($_COOKIE["PHPSESSID"])) { 112 setcookie("PHPSESSID", '', time() - 1800, '/'); 113 } 114 115 //セッションを破棄する 116 session_destroy(); 117 118 $message = "メールをお送りしました。24時間以内にメールに記載されたURLからご登録下さい。"; 119 120 } else { 121 $errors['mail_error'] = "メールの送信に失敗しました。"; 122 } 123} 124 125?> 126 127<!DOCTYPE html> 128<html> 129<head> 130<title>メール確認画面</title> 131<meta charset="utf-8"> 132</head> 133<body> 134<h1>メール確認画面</h1> 135 136<?php if (count($errors) === 0): ?> 137 138<p><?=$message?></p> 139 140<p>↓このURLが記載されたメールが届きます。</p> 141<a href="<?=$url?>"><?=$url?></a> 142 143<?php elseif(count($errors) > 0): ?> 144 145<?php 146foreach($errors as $value){ 147 echo "<p>".$value."</p>"; 148} 149?> 150 151<input type="button" value="戻る" onClick="history.back()"> 152 153<?php endif; ?> 154 155</body> 156</html>

+DB接続のファイル
の上記三つのファイル構成で仮会員登録を行っています。

###質問点
上記の形式だと.エラー文言を registration_mail_check.php で表示する仕様になっていますが、
エラーが出た際に、registration_mail_form.php にエラー文言を表示させたいです。
上記のどこのコードをどう修正すれば宜しいでしょうか?

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

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

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

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

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

kunai

2019/02/28 06:16

逆ではなく?formタグがあるとバリデーションが走る(if文がtrue)
退会済みユーザー

退会済みユーザー

2019/02/28 06:17

フォームを表示するphp、バリデーションを行うphp、登録処理を行うphpをそれぞれ掲載してください、ファイル名もわかるように。
date

2019/02/28 06:21

何がわからなくて質問しているのか?
Roo

2019/02/28 06:41

kunai 私の書き方がいけなかったのか、 formタグがあるとバリデーションはスルーされています
Roo

2019/02/28 06:42

@m6u @date 修正いたしました。
kunai

2019/02/28 06:49

registration_mail_check.phpはドコに行ったんでしょうか。 てっきり提示されたソースコードがregistration_mail_check.phpだと思ったのですが。
Roo

2019/02/28 06:53

test_1.php = registation_mail_form.php test_2.php = registration_mail_check.php です、失礼いたしました
guest

回答3

0

ベストアンサー

バリデーションって、2箇所構えられることはわかりますかね。

フォーム送信前:javascriptを駆使して入力状況をチェック。
フォーム送信後:POSTなどで受信したのをphp側でチェック。

で、フォーム送信後にphp側でチェックして、
エラーであれば元のフォームに戻したいわけですね。

そのためには、
registation_mail_form.php
で表示するフォームで、バリデーション処理を行う
registration_mail_check.php
からのPOST送信を受信できるようにしなければなりません。
そうしないと、
せっかく入力したフォームが空欄になってしまいますから。

エラー時に registration_mail_check.php のフォームでは、
最小限フォーム入力データを元のフォームに戻すためのデータと、
エラーメッセージをPOST送信するようにすればよいかと。

参考になるかどうか:
入力値の引き継ぎ | GRAYCODE PHPプログラミング

投稿2019/02/28 07:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Roo

2019/02/28 08:26

親切丁寧にご回答感謝いたします。 今回のこの問題は、どちらにせよいずれ当たるであろうJSの勉強踏まえ JSでの処理にしようと思います。 動作的には問題ないので、JSの方でエラーを出すことにします。 …ですが、JSでつまずいたら、下記等参考にPHPでの実施を想定いたします。 ご意見ありがとうございました
SakuBlade

2019/02/28 08:34

JavaScriptでのバリデーションは改ざんで回避できてしまうので躓かなくともPHP側で必ず実施してください
guest

0

formタグでactionを指定しないと、自分自身だったか、自分自身が置かれているパスの/(インデックスパス)に送られる仕様だったかと思います。
何れにせよ、actionで指定しないのに"registration_mail_check.php"という不明なURLには飛ばしてくれません。

なので、formを書かなかった場合は自分自身に送られるのでregistation_mail_form.phpのバリデーションが走り、書いた場合は_checkに飛んでいく、という動作になっているのだと思います。
_check側にはバリデーションの処理が書かれていないんですよね、多分。

投稿2019/02/28 06:58

kunai

総合スコア5405

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

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

Roo

2019/02/28 07:04

ご回答ありがとうございます。 その認識です。 "registration_mail_check.php"のエラーを ”registation_mail_form.php”←ページで表示させたいのです。
guest

0

actionで別ページに飛ばしているならそちらのページに
バリデーション処理が必要という話では?
actionを指定しなければ自分に飛ぶので、自分自身に書いてある
バリデーションを処理してくれます

投稿2019/02/28 06:34

yambejp

総合スコア114829

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

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

Roo

2019/02/28 06:45

action 記載 = バリデーション走るがページの遷移しない action 未記載 = バリデーション走らないがページの遷移は成功 ①のページにエラー文言を出したい場合 ②のバリデーションの部分にどう記載すれば①のページに遷移し、エラー文言を出してくれますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問