PHPとMySQLでECサイトをフルスクラッチ開発⑪ECサイトの会員登録画面作成
2021-07-21
今回は、ECサイトの会員登録ページを作成します。
星マークが作成済のページになります。今回は雲マークのページを作成します。
このECサイトでは、会員登録者がログインすれば、商品を購入できるようにしています。
したがって、カートに入れる以降のページには会員登録、およびログイン済でなければ進めないようにします。
それではまず、会員情報を登録するテーブルをデータベースに作成します。
テーブルの作成
shopのデータベース配下に、会員情報管理のテーブルを作成します。テーブル名は「menber」とします。
カラムは6とし、下図のように「code」「name」「email」「address」「tel」「password」のカラム名、データ型、AI(AUTO_INCREMENT)を設定します。
カラム名 | データ型 | その他 |
code | int | AI |
name | varchar 値30 | - |
varchar 値50 | - | |
address | varchar 値50 | - |
tel | varchar 値20 | - |
password | varchar 値32 | - |
上から順に、会員番号、名前、email、住所、電話番号、パスワード、となります。
ECサイト利用者にはこれを登録してもらい、この情報を元にログインする仕組みを作成していきます。
phpファイルについては、htdocsディレクトリ内にmenber_loginディレクトリを作成し、その配下に会員登録ページの menber_login_db.php menber_login_db_check.php menber_login_db_done.php の3ファイルを作成していきます。
会員情報入力画面
menber_login_db.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content= "width=device-width, initial-scale=1.0"> <title>会員情報入力画面</title> <link rel="stylesheet" href="../style.css"> </head> <body> 新規会員登録画面<br><br> お名前<br> <form action="menber_login_db_check.php" method="post"> <input type="text" name="name"> <br> email<br> <input type="text" name="email"> <br> 住所<br> <input type="text" name="address"> <br> tel<br> <input type="text" name="tel"> <br> パスワード<br> <input type="password" name="pass"> <br> パスワード再入力<br> <input type="password" name="pass2"> <br><br> <input type="button" onclick= "history.back()" value="戻る"> <input type="submit" value="OK"> <br><br> </form> <br><br> </body> </html>
menber_loginディレクトリ配下にmenber_login_db.phpを作成します。
このページは会員情報の入力画面になります。
至ってシンプルで、formタグで入力した内容をpostするだけですね。もはや今更なにもいう事はありません。
会員情報入力チェック画面
menber_login_db_check.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content= "width=device-width, initial-scale=1.0"> <title>会員情報入力チェック</title> <link rel="stylesheet" href="../style.css"> </head> <body> <?php require_once("../common/common.php"); $post = sanitize($_POST); $name = $post["name"]; $address = $post["address"]; $tel = $post["tel"]; $email = $post["email"]; $pass = $post["pass"]; $pass2 = $post["pass2"]; $okflag = true; if(empty($name) === true) { print "お名前を入力してください。<br>"; $okflag = false; } if(empty($email) === true) { print "emailを入力してください。<br>"; $okflag = false; } if(preg_match("/\A[\w\-\.]+\@ [\w\-\.]+\.([a-z]+)\z/", $email) === 0) { print "正しいemailを入力してください。<br>"; $okflag = false; } if(empty($address) === true) { print "住所を入力してください。<br>"; $okflag = false; } if(empty($tel) === true) { print "電話番号を入力してください。<br>"; $okflag = false; } if(preg_match("/\A\d{2,5}-?\d {2,5}-?\d{4,5}\z/", $tel) === 0) { print "正しい電話番号を入力してください。 <br>"; $okflag = false; } if(empty($pass) === true) { print "パスワードを入力してください。<br>"; $okflag = false; } if($pass != $pass2) { print "パスワードが異なります<br>"; $okflag = false; } if($okflag === false) { print "<form><br>"; print "<input type='button' onclick='history.back()' value='戻る'>"; } else { print "下記内容で登録しますか?<br><br>"; print $name."<br><br>"; print $email."<br><br>"; print $address."<br><br>"; print $tel."<br><br>"; print "<form action= 'menber_login_db_done.php' method='post'>"; print "<input type='hidden' name='name' value='".$name."'>"; print "<input type='hidden' name='email' value='".$email."'>"; print "<input type='hidden' name='address' value='".$address."'>"; print "<input type='hidden' name='tel' value='".$tel."'>"; print "<input type='hidden' name='pass' value='".$pass."'>"; print "<input type='button' onclick='history.back()' value='戻る'>"; print "<input type='submit' value='登録'>"; } ?> <br><br> </body> </html>
menber_loginディレクトリ配下にmenber_login_db_check.phpを作成します。
このページは入力した内容が適正か判断するページになります。全て問題なければ次ページに値をpostします。
過去にあった入力チェック画面とほぼ同じすが、新たな正規表現がありますね。emailとtelの部分です。
emailならば@がないとか、telならば桁数がおかしいとか、全角はNGとかその辺りを全てチェックしてくれます。
記述の意味については深堀しませんが、とりあえずこういった記述になります。
emailの正規表現↓
preg_match("/\A[\w-.]+\@[\w-.]+.([a-z]+)\z/", $email)
これの返り値が0なら、問題なしとなります。1ならば、どこかおかしい入力となっている事になります。
※バックスラッシュは「¥」でも構いません。
telの正規表現↓
preg_match("/\A\d{2,5}-?\d{2,5}-?\d{4,5}\z/", $tel)
これも返り値が0なら、問題なしとなります。1ならば、どこかおかしい入力となっている事になります。
全て入力に問題がなければ、登録しますか?とコメントを表示させて、登録を押せば入力した値がpostされます。
会員情報データベース登録画面
menber_login_db_done.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content= "width=device-width, initial-scale=1.0"> <title>会員登録完了</title> <link rel="stylesheet" href="../style.css"> </head> <body> <?php try{ require_once("../common/common.php"); $post = sanitize($_POST); $name = $post["name"]; $address = $post["address"]; $tel = $post["tel"]; $email = $post["email"]; $pass = $post["pass"]; $pass = md5($pass); $dsn = "mysql:host=localhost; dbname=shop;charset=utf8"; $user = "root"; $password = ""; $dbh = new PDO($dsn, $user, $password); $dbh -> setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT email FROM menber WHERE1"; $stmt = $dbh -> prepare($sql); $stmt -> execute(); while(true) { $rec = $stmt -> fetch(PDO::FETCH_ASSOC); if(empty($rec) === true) { break; } $mail[] = $rec["email"]; } if(empty($mail) === true) { $mail[] = "a"; } if(in_array($email, $mail) === true) { print "すでに使われているmailアドレスです。 <br><br>"; print "<a href='menber_login_db.php'> トップへ戻る</a>"; $dbh = null; } else { $sql = "INSERT INTO menber (name, email, address, tel, password) VALUES(?,?,?,?,?)"; $stmt = $dbh -> prepare($sql); $data[] = $name; $data[] = $email; $data[] = $address; $data[] = $tel; $data[] = $pass; $stmt -> execute($data); $dbh = null; print "登録完了しました。<br><br>"; print "<a href='../shop/shop_list.php'> トップへ戻る</a>"; } } catch(Exception $e) { print "只今障害が発生しております。"; print "a href='menber_login.php'> ログインページへ戻る</a>"; exit(); } ?> <br><br> </body> </html>
menber_loginディレクトリにmenber_login_db_done.phpを作成します。
このページでは、まずemailすでにデータベースに登録されていないかを確認しています。emailが登録されていなければ、会員情報として入力された内容をデータベースに登録しています。
emailがすでに使用されているかの確認は、「ログイン認証に利用する」からです。重複しては困りますよね、したがって唯一無二のものにしたいので、今回はemailを重複させないような仕組みを導入します。
データベースに接続後、menberテーブルのmailカラムの情報をすべて$mailに格納していきます。
後はその$mailの中に、in_array($email, $mail) で、すでに利用されているemailかどうかを確認しています。返り値がtrueなら有りなので、登録不可として会員登録初期画面へ誘導しています。
ちなみに、途中でmailカラムから取り出した値が空なのかどうかを確認していて、空の場合は仮の値として「a」を代入していますが、これは入力されたemailと比較する際に何故か空だとエラーが発生するためです。(他に方法がありそうですがとりあえずこうしています。)
つまり1回目の会員登録の際のエラー回避ですね。
それでは会員登録を実行してみて、データベースにちゃんと反映されているか確認してみましょう。
次回はログイン画面の作成に入ります。