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

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

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

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

Q&A

解決済

1回答

1040閲覧

HPのユーザー登録時のMAILの重複チェックを実装したい

kurutonken

総合スコア11

PHP

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

0グッド

0クリップ

投稿2019/07/11 05:40

PHPのユーザー登録時のMAILの重複チェックを実装したい

当方プログラミングは初心者です。インターネットなどで調べて現在ログインページを作成しております。色々なページを参考にさせて頂き、色々は方が書かれているソースを利用させて頂きなんとか形になってきたのですが、どうしても解決できない問題がありまして、投稿させていただきました。プログラムについてはほぼ初心者となっております。失礼を承知で質問させて頂きました。

開発環境
XAMPP 3.2.4
PHPは7.3.6

ユーザーの新規登録時のメールの重複チェックの機能を実装中にエラーメッセージが発生しました。
新規登録画面にて仮登録の為のメールアドレスを入力して貰うときにデータベースに接続して重複チェックし重複しているならエラーを返すという機能を実装したいと思っています。自分なりに色々と調べて記述してみたのですが上手く作動してくれません、
未熟者ですがどなたかご教授いただけますでしょうか?

テーブル構成は以下の通りです
名前  データ型   照合順序  属性  NULL  デフォルト値 コメント その他
1 iint(11) いいえ なし          AOUT_INCREMENT 
2 account varchar(50) utf8_general_ci いいえ なし
3 mail varchar(20) utf8_general_ci いいえ なし
4 password varchar(128) utf8mb4_general_ci いいえ なし
5 flag tinyint(1) いいえ 1
6 addres varchar(10) utf8_general_ci いいえ なし
7 ag varchar(50) utf8_general_ci いいえ なし

発生している問題・エラーメッセージ

該当の記述は動いているようですが、チェックできていないようです。

該当のソースコード

php

1<?php 2session_start(); 3 4header("Content-type: text/html; 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$errors = array(); 21 22if(empty($_POST)) { 23 header("Location: registration_mail_form.php"); 24 exit(); 25}else{ 26 //POSTされたデータを変数に入れる 27 $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL; 28 29 //メール入力判定 30 if ($mail == ''){ 31 $errors['mail'] = "メールが入力されていません。"; 32 }else{ 33 if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)){ 34 $errors['mail_check'] = "メールアドレスの形式が正しくありません。"; 35} 36 37----------この部分が上手く動いてくれません---------------- 38//重複アカウントのチェック 39function emailExists($mail, $dbh){ 40 $sql="SELECT * FROM members WHERE mail= mail limit 1"; 41 $stmt = $dbh->prepare($sql); 42 $stmt->execute(array(":mail" => $mail)); 43 $member = $stmt->fetch(); 44 return $user ? true : false; 45} 46----------この部分が上手く動いてくれません---------------- 47 } 48} 49 50if (count($errors) === 0){ 51 52 $urltoken = hash('sha256',uniqid(rand(),1)); 53 $url = "http://localhost/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 print('Error:'.$e->getMessage()); 72 die(); 73 } 74 75 //メールの宛先 76 $mailTo = $mail; 77 78 //Return-Pathに指定するメールアドレス 79 $returnMail = 'web@sample.com'; 80 81 $name = "メールで売上管理(仮称)"; 82 $mail = 'getakarubi@gmail.com'; 83 $subject = "【メールで売上管理(仮称)】会員登録用URLのお知らせ"; 84 85$body = <<< EOM 86メールで会計への登録手続きありがとうございます。24時間以内に下記のURLから本登録へとお進み下さい。 87{$url} 88EOM; 89 90 mb_language('ja'); 91 mb_internal_encoding('UTF-8'); 92 93 //Fromヘッダーを作成 94 $header = 'From: ' . mb_encode_mimeheader($name). ' <' . $mail. '>'; 95 96 if (mb_send_mail($mailTo, $subject, $body, $header, '-f'. $returnMail)) { 97 98 //セッション変数を全て解除 99 $_SESSION = array(); 100 101 //クッキーの削除 102 if (isset($_COOKIE["PHPSESSID"])) { 103 setcookie("PHPSESSID", '', time() - 1800, '/'); 104 } 105 106 //セッションを破棄する 107 session_destroy(); 108 109 $message = "本登録用の認証リンクのメールをお送りしました。このウィンドウは閉じていただき、24時間以内にメールに記載されたURLからご登録下さい。"; 110 111 } else { 112 $errors['mail_error'] = "メールの送信に失敗しました。"; 113 } 114} 115 116?> 117 118<!DOCTYPE html> 119<html> 120<head> 121<title>メール確認画面</title> 122<meta charset="utf-8"> 123</head> 124<body> 125<h1>メール確認画面</h1> 126 127<?php if (count($errors) === 0): ?> 128 129<p><?=$message?></p> 130 131<p>↓このURLが記載されたメールが届きます。</p> 132<a href="<?=$url?>"><?=$url?></a> 133<!--ページ上にトークンが表示されるとメールを受信して無くてもそのまま登録できてしまうのでトークンを表示させる記述だけコメントアウト--> 134 135<?php elseif(count($errors) > 0): ?> 136 137<?php 138foreach($errors as $value){ 139 echo "<p>".$value."</p>"; 140} 141?> 142 143<input type="button" value="戻る" onClick="history.back()"> 144 145<?php endif; ?> 146 147</body> 148</html> 149

試したこと

重複チェックのために色々と調べて
下記の記述を書いてみたのですがどうも上手くうごきません。
//重複アカウントのチェック
function emailExists($mail, $dbh){
$sql="SELECT * FROM members WHERE mail= mail limit 1";
$stmt = $dbh->prepare($sql);
$stmt->execute(array(":mail" => $mail));
$member = $stmt->fetch();
return $user ? true : false;

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

SELECT * FROM members WHERE mail= mail limit 1

キーワード(名前)パラメータは:パラメータ名でセットします。

$stmt->execute(array(":mail" => $mail));とバインド時は正しく指定できているのでそれにあわせるだけですね。

PHPマニュアルも確認してください。

投稿2019/07/11 05:44

編集2019/07/11 05:46
m.ts10806

総合スコア80842

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

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

kurutonken

2019/07/11 07:44

アドバイスありがとうございます。お分かりだと思いますが、最初に書きました通りこちらのソースは他の方が書かれた物をコピーしたのものです。アドバイスを頂いたので自分でもっとより調べて試行錯誤してみます。着眼点はずれていなかったようでよかったです。マニュアルももう少しよく読んでみます。
m.ts10806

2019/07/11 07:46

>ソースを利用させて頂き なので「あくまで参考に作り上げた」ものかと思っていました。 いずれにしてもネットで拾ったものがそのまま動く保証はないのでPHPマニュアルと見比べて正誤確認は必要に思います。
kurutonken

2019/07/11 15:42

ありがとうございます。全てコピーではなく記述の問題の記述の部分は自分なりに色々と調べて数日格闘してみたて書いてみましたが、なかなか上手く安易に質問してしまい失礼致しました。  丁寧なご回答ありがとうございます。マニュアルをよく読んで一から勉強いたします
m.ts10806

2019/07/11 21:19

それは良いのですが、回答の冒頭は読まれて試してみましたか? ほぼそのままで解決可能とは思っているのですが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問