###前提
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 にエラー文言を表示させたいです。
上記のどこのコードをどう修正すれば宜しいでしょうか?
回答3件
あなたの回答
tips
プレビュー