【PHP】会員登録・ログインシステムを作ってみた

phpを真面目に勉強してみようシリーズ第2弾。今回はログインシステムをつくってみました。
機能としては、DBを使った会員の新規登録及び会員情報の確認・削除となります。

今回は以下の記事を参考にさせていただきました。

ほぼこちらの記事をもとに作成していますが、会員退会(DBからの情報削除)機能を追加しています。

ダンロード

サンプルファイル一式(zip/12KB)

内容:phpファイル*6、.htaccess
ほか、DBの用意

仕様

構造


わかりやすい図が描けるようになりたい…

機能

会員登録フォーム画面(register.php)

  • 氏名、メールアドレス、パスワード、誕生年を登録できる
  • 登録に成功したら「登録しました」、失敗したら「エラーが発生しました。」のテキストを表示する
  • すでにログイン済みのユーザは会員情報ページへリダイレクト

ログインフォーム画面(index.php)

  • メールアドレス、パスワードでログインできる
  • メールアドレスがDB上に存在しない場合「ログインに失敗しました。メールアドレスが違う可能性があります。」のテキストを表示する
  • メールアドレスはDB上に存在するが、パスワードが異なっている場合は「メールアドレスとパスワードが一致しません。」のテキストを表示する
  • ログイン済みのユーザは会員情報ページへリダイレクト

マイページ画面(home.php)

  • 氏名、メールアドレス、誕生年の情報を確認できる
  • 会員退会をすると、DB上から自身のユーザ情報を削除してログインフォームへ(logout.phpでの処理)
  • ログインしていないユーザはログインフォームへリダイレクト

メモ

mampでのDB作成方法(SQL)について

mampでログインシステム用のDBを作成するのは以下の手順で可能です。

  1. DBの新規作成
    1. MAMPを起動し、Open WebStart Pageをクリック
    2. 「phpMyAdmin」をクリック→上段中央タブから「データベース」をクリック
    3. データベースを作成する項目にあるフォームに任意の値を入力し、作成をクリック(今回はlogin_test)
  2. DBの構造設定
    1. 作成したDBを選択し、上段中央タブから「SQL」をクリック
    2. SQL文を用いて、会員情報の値をいれるためのtableを作成する。「データベース login_test 上でクエリを実行する」に、今回は以下の文を入力。
CREATE TABLE users (
	user_id INT( 5 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
	username VARCHAR( 25 ) NOT NULL ,
	email VARCHAR( 35 ) NOT NULL ,
	password VARCHAR( 60 ) NOT NULL ,
	birth_year INT( 4 ) NOT NULL,
	UNIQUE (email)
);

→これで「user_id」「username」「email」「password」「birth_year」のカラムがある空欄のテーブルが作成されます。

2018/12/18追記)
上記でDBの用意は完了です。
サンプルファイル一式内のcore/config.phpの中身を作成したDB情報に差し替えれば、動くようになります。(Mampならconfig.phpの修正は不要かもしれませんが、間違いがないか確認しておきましょう)

上段中央タブから「表示」をクリックすると、実際に新規追加・削除された会員情報が確認できます。

参考)MAMPのphpMyAdminでMySQLデータベースの作成 – MAMPの使い方 – PC設定のカルマ

phpで内部エラーが発生した、構文をチェックしたいとき

こちらのサイトで確認できます。有難い…
PHPコードの構文チェック

セキュリティについて

今回実装しませんでしたが、ログインフォームのセキュリティの参考になりそうな記事があったので、今後用にメモ。
安全なログインとパスワードの実装方法 | Webセキュリティの小部屋

感想

今回のログインシステムを通して、例えば「URLクエリパラメータ」(url最後の?以降の文字列)の意味・制御の仕方、同じphp内でボタンを押下したかの判定方法(if($_POST[‘buttonのname’]))などなど、これまで疑問に感じていたことが色々と解消できました。

ほぼ初めて触ったDBについては、今までは仕組みがわからず未知数に感じていましたが、思ったより構造や処理が理解できるものだったので(今回の機能に関してはだと思いますが)自分の中でDBに対するハードルが大分下がった気がします。

むしろ、DBを使うことであれも出来るようになるんじゃ・・・!と夢が膨らみます(笑)

その第一歩として、DBの書き方についても今後勉強していきたいですね。