第3回では新規会員登録画面を作っていきます。
第1回を見ていない方は、わからないことが多いと思うので、以下のリンクから飛んで先に見ることをオススメします。
全体のコード(register.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?php /* データベース情報を取り込み */ require_once('common.php'); /* セッション開始 */ session_start(); /* POSTで送信されている */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { /* usernameとpasswordが定義されて、かつ空白ではない */ if (isset($_POST['username'], $_POST['password']) && $_POST['username'] !== '' && $_POST['password'] !== '') { /* データベース接続 */ try { $dsn = 'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8mb4;port=8889'; $pdo = new PDO($dsn, DB_USER, DB_PASS); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); // エラーを出力できるように設定 } catch (PDOException $e) { //echo $e->getMessage(); $_SESSION['register_message'] = 'データベース接続に失敗しました'; header('Location:'.$_SERVER['PHP_SELF']); exit; } /* 重複チェック */ $stmt = $pdo->prepare('SELECT * FROM users WHERE username=?'); $stmt->bindValue(1, $_POST['username']); $stmt->execute(); if (count($stmt->fetchAll())) { $_SESSION['register_message'] = 'このユーザーネームはすでに使われています'; header('Location:'.$_SERVER['PHP_SELF']); exit; } /* データ挿入 */ $stmt = $pdo->prepare('INSERT INTO users (username, password) VALUES (?, ?)'); $stmt->bindValue(1, $_POST['username']); $stmt->bindValue(2, $_POST['password']); $stmt->execute(); $_SESSION['register_message'] = '会員登録が完了しました'; $_SESSION['username'] = $_POST['username']; header('Location: ./list.php'); exit; } else { $_SESSION['register_message'] = '送信データが正しくありません'; header('Location:'.$_SERVER['PHP_SELF']); exit; } } ?> <!DOCTYPE html> <html> <head> <title>新規会員登録</title> <meta charset="utf-8"> </head> <body> <h1>新規会員登録</h1> <form action"./" method="POST"> <?php echo($_SESSION['register_message']); ?> <p> ユーザーネーム: <input type="text" name="username"> </p> <p> パスワード: <input type="password" name="password"> </p> <input type="submit" value="送信"> </form> <p><a href="/">トップに戻る</a></p> </body> </html> <?php /* セッションの初期化 */ $_SESSION['register_message'] = ''; ?> |
このコードを実行すると、以下のような画面になります。
ユーザーネームとパスワードを入力して、同一のユーザーネームで既に会員登録をしている人がいなければアカウントを作ることができます。
どちらか空白だったり、入力に不備があったりする場合には注意を出力して会員登録はしないように実装しています。
コードの説明
会員登録をするときにデータベースを操作するので、
1 2 3 |
require_once('common.php'); |
で、データベースのログイン情報を取り込みます。
先にHTML部分を説明しますが、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<form action"./" method="POST"> <?php echo($_SESSION['register_message']); ?> <p> ユーザーネーム: <input type="text" name="username"> </p> <p> パスワード: <input type="password" name="password"> </p> <input type="submit" value="送信"> </form> |
の部分で入力フォームを定義しています。
php側では、ユーザーネームとパスワードのinputのname属性を使ってそれぞれの入力された値を受け取ります。
1 2 3 |
<?php echo($_SESSION['register_message']); ?> |
は、会員登録情報をサーバーに送信したい際の結果のメッセージを表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/* POSTで送信されている */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { /* usernameとpasswordが定義されて、かつ空白ではない */ if (isset($_POST['username'], $_POST['password']) && $_POST['username'] !== '' && $_POST['password'] !== '') { /* データベース接続 */ try { $dsn = 'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8mb4;port=8889'; $pdo = new PDO($dsn, DB_USER, DB_PASS); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); // エラーを出力できるように設定 } catch (PDOException $e) { //echo $e->getMessage(); $_SESSION['register_message'] = 'データベース接続に失敗しました'; header('Location:'.$_SERVER['PHP_SELF']); exit; } /* 重複チェック */ $stmt = $pdo->prepare('SELECT * FROM users WHERE username=?'); $stmt->bindValue(1, $_POST['username']); $stmt->execute(); if (count($stmt->fetchAll())) { $_SESSION['register_message'] = 'このユーザーネームはすでに使われています'; header('Location:'.$_SERVER['PHP_SELF']); exit; } /* データ挿入 */ $stmt = $pdo->prepare('INSERT INTO users (username, password) VALUES (?, ?)'); $stmt->bindValue(1, $_POST['username']); $stmt->bindValue(2, $_POST['password']); $stmt->execute(); $_SESSION['register_message'] = '会員登録が完了しました'; $_SESSION['username'] = $_POST['username']; header('Location: ./list.php'); exit; } else { $_SESSION['register_message'] = '送信データが正しくありません'; header('Location:'.$_SERVER['PHP_SELF']); exit; } } |
は、サーバーに送信された会員登録情報を処理している部分です。
POST送信で、かつユーザーネームとパスワードに不備が無い場合に処理を行うようにします。
不備があった場合は、メッセージをセッションに保存して同じページにリダイレクトします。
このとき、以下のような画面になります。
register.phpの一番下でセッション変数の初期化を行なっているので、
1 2 3 4 5 6 |
<?php /* セッションの初期化 */ $_SESSION['register_message'] = ''; ?> |
ページをリロードすると表示された『送信データが正しくありません』というメッセージは表示されなくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* データベース接続 */ try { $dsn = 'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8mb4;port=8889'; $pdo = new PDO($dsn, DB_USER, DB_PASS); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); // エラーを出力できるように設定 } catch (PDOException $e) { //echo $e->getMessage(); $_SESSION['register_message'] = 'データベース接続に失敗しました'; header('Location:'.$_SERVER['PHP_SELF']); exit; } |
この部分では、データベースに接続する処理をしています。
接続に失敗した場合は、メッセージをセッションに保存して同じページにリダイレクトします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* 重複チェック */ $stmt = $pdo->prepare('SELECT * FROM users WHERE username=?'); $stmt->bindValue(1, $_POST['username']); $stmt->execute(); if (count($stmt->fetchAll())) { $_SESSION['register_message'] = 'このユーザーネームはすでに使われています'; header('Location:'.$_SERVER['PHP_SELF']); exit; } /* データ挿入 */ $stmt = $pdo->prepare('INSERT INTO users (username, password) VALUES (?, ?)'); $stmt->bindValue(1, $_POST['username']); $stmt->bindValue(2, $_POST['password']); $stmt->execute(); $_SESSION['register_message'] = '会員登録が完了しました'; $_SESSION['username'] = $_POST['username']; header('Location: ./list.php'); exit; |
登録情報を接続する際に、まず最初に既に同じユーザーネームで登録している人がいないがチェックします。重複していればリダイレクトします。
重複していない場合は、データベースにデータを挿入して、リダイレクトします。