IDを忘れた人にキーワードを尋ねて、IDを再発行する
全体像
HTMLフォーム
<form action="" method="post" class="login_input">
<input type="text" name="furigana_sei" placeholder="姓(ふりがな)">
<input type="text" name="furigana_mei" placeholder="名(ふりがな)">
<input type="text" name="age" placeholder="年齢">
<select name="gender">
<option value="">性別</option>
<option value="0">男性</option>
<option value="1">女性</option>
<option value="2">その他</option>
</select>
<input type="submit" name="submit" value="次へ" class="center">
<a href="login_err.php">戻る</a>
</form>
re_login.php
$errors = [];
if(isset($_POST['submit'])){
$furigana_sei = trim($_POST['furigana_sei']);
$furigana_mei = trim($_POST['furigana_mei']);
$age = (int)$_POST['age'];
$gender = (int)$_POST['gender'];
//バリデーション
if($furigana_sei == "" || $furigana_mei == "" || $age<=0 || ($gender !=0 && $gender != 1 && $gender != 2)){
$errors[] = "入力値が不正です。";
}else{
try{
$sql = "SELECT email FROM users WHERE furigana_sei = ? AND furigana_mei = ? AND age = ? AND gender = ? ";
$stmt = $dbh->prepare($sql);
$stmt->execute([$furigana_sei,$furigana_mei,$age,$gender]);
$users = $stmt->fetchAll();
if(count($users) == 1){
$mail = $users[0]['email'];
$maskedEmail = substr($mail,0,3)."****".substr($mail,-3);
$_SESSION['maskedEmail'] = $maskedEmail;
$subject = "登録メールアドレスの送付";
$message = "あなたの登録されているメールアドレスは".$mail."です。";
if(sendmail($mail,$subject,$message)){
header("Location:id_complete.php");
exit;
}else{
$errors[] = "メールの送信に失敗しました。もう一度試してください。";
}
exit;
}elseif(count($users)>1){
$errors[] = "複数のアカウントが該当しました。情報をもう一度確認して、必要であればサポートにお問い合わせください。";
}else{
$errors[] = "該当するユーザーは存在しません。";
}
}catch(PDOException $e){
error_log($e->getMessage());
$errors[] = "データベースのエラーが発生しました。もう一度お試しいただくか、管理者にお問い合わせください。";
}
}
foreach($errors as $error){
echo $error."<br/>";
}
}
説明
HTMLフォーム
<form action="" method="post" class="login_input">
<input type="text" name="furigana_sei" placeholder="姓(ふりがな)">
<input type="text" name="furigana_mei" placeholder="名(ふりがな)">
<input type="text" name="age" placeholder="年齢">
<select name="gender">
<option value="">性別</option>
<option value="0">男性</option>
<option value="1">女性</option>
<option value="2">その他</option>
</select>
<input type="submit" name="submit" value="次へ" class="center">
<a href="login_err.php">戻る</a>
</form>
姓名と年齢、性別を入力してポストする
サーバーサイド側
//送信ボタンを押す
if(isset($_POST['submit'])){
//POSTされた必要項目を受け取る
$furigana_sei = trim($_POST['furigana_sei']);
$furigana_mei = trim($_POST['furigana_mei']);
$age = (int)$_POST['age'];
$gender = (int)$_POST['gender'];
//バリデーション
//必要項目が条件に合っているか確認
if($furigana_sei == "" || $furigana_mei == "" || $age<=0 || ($gender !=0 && $gender != 1 && $gender != 2)){
$errors[] = "入力値が不正です。";
}else{
必要項目がポストされて、それが空だったり、条件で問題がなければ、次へ進める。
try{
//必要項目から絞ってメールアドレスを取得する
$sql = "SELECT email FROM users WHERE furigana_sei = ? AND furigana_mei = ? AND age = ? AND gender = ? ";
$stmt = $dbh->prepare($sql);
$stmt->execute([$furigana_sei,$furigana_mei,$age,$gender]);
$users = $stmt->fetchAll();
//メールアドレスの存在を確認して、値を変数に入れる。
if(count($users) == 1){
$mail = $users[0]['email'];
//メールアドレスの一部を隠して画面表示させる
$maskedEmail = substr($mail,0,3)."****".substr($mail,-3);
//再発行完了画面のサーバーサイドid_complete.phpに渡す
$_SESSION['maskedEmail'] = $maskedEmail;
$subject = "登録メールアドレスの送付";
$message = "あなたの登録されているメールアドレスは".$mail."です。";
//メールを送信する
if(sendmail($mail,$subject,$message)){
header("Location:id_complete.php");
exit;
}else{
$errors[] = "メールの送信に失敗しました。もう一度試してください。";
}
exit;
}elseif(count($users)>1){
$errors[] = "複数のアカウントが該当しました。情報をもう一度確認して、必要であればサポートにお問い合わせください。";
}else{
$errors[] = "該当するユーザーは存在しません。";
}
}catch(PDOException $e){
error_log($e->getMessage());
$errors[] = "データベースのエラーが発生しました。もう一度お試しいただくか、管理者にお問い合わせください。";
}
}
foreach($errors as $error){
echo $error."<br/>";
}
}
データベースのusersテーブルから入力した必要項目で対象を絞ってメールアドレスを取得して、
メールアドレスが存在すれば、そのメールアドレスの値を変数に渡し、メール送信を行う。