《PHP関連》有力な回答者の方には高ポイントを差し上げます。


ユーザー認証システムを作成しており登録システムに最近入りかかりました。しかしメールアドレスをチェックするような機能がなかなかできません。

具体的にはIDやパスワード、メールアドレスを入力してもらいます。その後メールアドレス先に確認メールを送り、メールにあるランダムなURL(register_check.php?id=237uhuiedy78y7vbyc3 のようなもの)をクリックすることによって初めてIDが有効になるシステムを作り上げたいと思っています。

どのような感じで構成すればいいのでしょうか?
>>>実際にソースなどを書いていただくと助かります。<<<

(ユーザー情報等はデータベース(Mysql)にて管理しています。)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:fuk00346jp No.1

回答回数1141ベストアンサー獲得回数54

ポイント2pt

http://odn.okwave.jp/kotaeru.php3?q=716090

ODN@OKWaveコミュニティー Webサイトの会員仮登録について

※超手抜き回答です。URL参照下さい。

ANo.#2

参照ヨロ


ココでソースを書くと半角ダブルクォーテーションが全部全角に化けますので。

id:esecua

残念ながら動きませんでした。。。

2005/12/20 22:32:35
id:ito-yu No.2

回答回数323ベストアンサー獲得回数14

ポイント100pt

http://e-words.jp/w/E382B9E382ADE383BCE3839E.html

スキーマとは 【schema】 ─ 意味・解説 : IT用語辞典 e-Words

データベースのカラム名くらい書いてもらわないと「実際に(動く)ソース」なんて書けましぇん


usr(id,pwd,mail,key,st)のようなテーブルとして(idが主キー、stは状態:0は無効1で有効、など)。


フォームから$id、$pwd、$mailを取得。

 ↓

$keyを適当に生成して、

$sql = ”INSERT INTO usr(id,pwd,mail,key,st) VALUES(’{$id}’,’{$pwd}’,’{$mail}’,’{$key}’,0)”;

を実行

 ↓

$mail宛に、url(”register_check.php?id={$key}”)を含むメールを送る

 ↓

register_check.phpでは

$key = $_GET[’id’];

$sql = ”UPDATE usr SET st=1 WHERE key=’{$key}’”;

を実行

 ↓

あとはログインの時に条件st>0をつける


当然、$mailはあり得ないメアドではないか?とか各フォームの値のサニタイズは必須です。

id:esecua

なるほど、そういう方法がありますね。

試してみたいと思います。ありがとうございます。

2005/12/21 01:02:45
id:kuvera No.3

回答回数1ベストアンサー獲得回数0

ポイント10pt

URLはダミーです。


大まかな流れですが、


  ユーザが ID , パスワード を入力してフォーム送信

   ↓

  フォームの内容に問題なければ、このタイミングでデータベースに登録してしまう

   ↓

  データベースの内容をもとに URL を作成して sendmail

   ↓

  ユーザがそれをクリックしたら、データベースに「このIDは本物」の情報を付けて、完了。


ということで良いのでしょうか。


------------------------

register.html の内容


<form method=”POST” action=”register.php”>

<dl>

 <dt>ユーザID</dt><dd><input name=”userid” /></dd>

 <dt>パスワード</dt><dd><input type=”password” name=”password” /></dd>

 <dt>メール</dt><dd><input name=”email” /></dd>

</dl>

<input type=”submit” value=”メールを受け取る” />

</form>


------------------------

register.php の大まかな内容


<?php


if(過不足があったり、MySQLのデータの誰かと内容が被っている){


  print ”もう一度入力してちょ”;


}else{


$id = sha1( $_POST[’userid’].$_POST[’password’] ) . sha1( $_POST[’email’] );


  MySQLに登録;

  sendmail などをする; ( body に ”http://hogehoge.com/register_check.php?id=$id” )


  if(問題なく登録とか送信とかできた){


   print ”メールを送信したよん”;


  }else{


   print ”メンテナンス中だよん”;


  }

}


?>


------------------------


register_check.php の大まかな内容


<?php


if(isset($_GET[’id’])){


 if( MySQL から ID を探して $_GET[’id’] がある ){


  データベースで本登録状態にする。

  print ”登録完了”;


 }else{


  print ”不正なアクセスですか・・?”;


 }

}

?>


------------------------

MySQLで作っておくデータベース


 通し番号

 ユーザID

 パスワード

 メールアドレス

 $id


------------------------


あまりにも端折ってしまいましたが、あとはサニタイジングなどに注意を払ってカスタマイズをしていけば完成すると思います。

id:esecua

「 データベースで本登録状態にする。」を質問しております。。。

2005/12/21 01:12:14
id:angelsong No.4

回答回数94ベストアンサー獲得回数0

ポイント16pt

http://www.stackasterisk.jp/tech/php/php03_06.jsp

PHP��3���FPHP���p(�Z�b�V�����Ǘ�/�F��)

趣旨は異なりますが、セッションIDを使ったユーザ認証の例です。

session_id()に、ランダムな文字列が自動的に取得されるので、それを、

varchar2 USER_ID;

varchar2 PASSWORD;

varchar2 MAID_ADDRESS;

varchar2 SESSION_ID;

char IS_CERTIFIED DEFAULT=”0”; // 0=未認証 1=メール認証済み

といった感じのテーブルに格納しておき、ユーザへ送る確認メール中に、セッションIDを引数として渡しておきます。(ご質問中のランダムなURLに該当する部分です)


そして、register_check.php中で、メールアドレスとセッションIDが合致した場合のみ、認証済みフラグを立てユーザIDを有効とするような処理を書けば実現出来るかと思います。

id:esecua

データベースに 0 か 1 を入力させて未認証か、認証済みか判断するとありますが、ログイン機能に対してどのようにして1が認証済みと認識させればいいのでしょうか?疑問です。

2005/12/21 01:15:00
id:ito-yu No.5

回答回数323ベストアンサー獲得回数14

ポイント48pt

http://dev.mysql.com/doc/refman/4.1/ja/

MySQL 4.1 リファレンスマニュアル

2度目の解答

私の一度目の解答のusr(id,pwd,mail,key,st)と同じテーブルだとして。

認証に必要なのはidとpwd。これを入力してもらい、以下のSQLで引っかかってきたら認証OK、来なければ未認証か未登録。

$sql = ”SELECT * FROM usr WHERE st>0 AND id=’{$id}’ AND pwd=’{$pwd}’”;

st>0が認証済みのみの条件です

SQLはご存じですか?先にSQLの勉強をされてはいかがでしょうか

id:esecua

SQLは多少理解しています。回答ありがとうございました。

2005/12/21 10:05:16
id:cooper0524 No.6

回答回数296ベストアンサー獲得回数4

ポイント4pt

回答2の方の方法がベストだと思います。

補足として、ユニークIDの取得方法です。

参考までにどうぞ。

id:esecua

なるほど、これでランダムな文字を生成するのですね。

2005/12/21 12:42:15

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません