前回の記事は「PHPでwebアプリを作る時に何から作り始めればいいか【最初の手順】」です。
ユーザー登録の実装
ここから具体的にメールアドレスとパスワードを入力したユーザー登録を実装していきましょう。
フォームの修正
前回のsignup.phpの中身を以下のように修正します。
<?php include('header.php'); ?> <p>こちらは新規登録ページです</p> <form action="signup_exe.php" method="post"> <div>メールアドレス:<input type="text" name="email"></div> <div>パスワード:<input type="password" name="password"></div> <div>ニックネーム:<input type="text" name="nickname"></div> <div><input type="submit" value="登録する"></div> <form> <?php include('footer.php'); ?>
続いてsignup_exe.phpを新規作成します。先頭と最後のheader.phpとfooter.phpの読み込みは省略しますが全ページに付けておいてください。
<?php echo $_POST['email']; echo $_POST['password']; echo $_POST['nickname']; ?>
これでメールアドレスとパスワードを入力して送信し、次のページで表示されていればフォームの送信はOKです。
続いて送られてきた値を元にデータベースに登録する処理に書き換えていきます。データベース回りは以下の記事を参考にしてください。
シングルクォーテーションの自動エスケープ
バージョンによってはPHPのデフォルトで送信される値の中に含まれるシングルクォーテーションが勝手にエスケープされることがあります。
その場合php.iniのmagic_quotes_gpcをonからoffに買い替えて再起動する必要があります。
なぜそんなことをいうかというとシングルクォーテーションはそのままSQLに組み込むとSQLインジェクションという攻撃を受ける脆弱性になるからです。
送信先の処理
signup_exe.phpを以下のように書き換えます。
<?php include('header.php'); ?> <?php define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASSWORD', ''); define('DB_NAME', 'whateat'); $db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if ($db->connect_error){ echo '接続失敗'; } else { echo '接続成功'; } $db->set_charset('utf8'); $email = $_POST['email']; $password = $_POST['password']; $nickname = $_POST['nickname']; $stmt = $db->prepare("INSERT INTO users (user_id, mail, password, nickname, created_at) VALUES (NULL, ?, ?, ?, now())"); $stmt->bind_param('sss', $email, $password, $nickname); $res = $stmt->execute(); $stmt->close(); if (!$res){ echo '登録失敗'; } else { echo '登録成功'; } ?> <?php include('footer.php'); ?>
ステートメントを使う部分が引っかかるかもしれません。bind_paramでは先ほど書いたSQLインジェクションを回避するエスケープ処理が行われるのでこの形式で書くのが無難です。
最初の’sss’はstring(文字列型)の変数が3つという宣言になります。数字型であればintegerのiとなります。
バリデーション
さて、上記で登録処理は作れたのですが、全部空白で進めた場合、空のデータが登録されてしまうようになります。
これらを防ぐために入力された値のチェックを行うことをバリデーションといいます。例えば入力必須の項目が入力されているか等です。
signup_exe.phpにて以下のように書き換えるとチェックできます。
if (!$email) { echo 'メールアドレスが入力されていません'; exit; }
本来は前の入力画面に戻ってエラー表示するという制御が理想ですが、ひとまずは大丈夫です。
パスワードの暗号化
今はまだそこまでやりませんが、入力されたパスワードをそのままデータベースに保存するのはご法度です。
必ず暗号化して格納する必要があります。詳しくは以下の記事をご参照ください。
まとめ
ユーザー登録の処理を見てきました。まだまだ補足しなければいけないことがあるので、追って記事にしていきます。
今後ともよろしくお願い致します。