前提・実現したいこと
PHPのMVCモデルにて、ユーザーの新規登録を実装したい。
現在、PHPのMVCを勉強中で、ユーザーの新規登録やログイン機能の実装中です。
しかし、ユーザーの新規登録ができないため、ユーザーの新規登録ができるように実装したいです。
発生している問題・エラーメッセージ
新規登録フォーム(signup_form.php)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> <link rel="stylesheet" href="/css/user.css"> <title>worldcup</title> </head> <body> <h2>ユーザー登録</h2> <div class="signup-wrapper"> <form action="register.php" method="POST" class="edit-form"> <div class="mb-3"> <label for="email" class="form-label">Eメール</label> <input type="email" class="form-control" id="email" name="email" value="" placeholder="Eメールアドレスを入力してください。"> </div> <div class="mb-3"> <label for="password" class="form-label">パスワード</label> <input type="password" class="form-control" id="password" name="password" value="" placeholder="パスワードを入力してください。"> </div> <div class="mb-3"> <label for="password_conf" class="form-label">パスワード確認用</label> <input type="password" class="form-control" id="password_conf" name="password_conf" value="" placeholder="同じパスワードを入力してください。"> </div> <button type="submit" class="btn btn-primary">新規登録</button> </form> </div> </body> </html>
登録画面(register.php)
<?php ini_set('display_errors', "On"); require_once(ROOT_PATH .'/Models/User.php'); $err = []; if(!$email = filter_input(INPUT_POST, 'email')) { $err[] = 'メールアドレスを入力してください。'; } $password = filter_input(INPUT_POST, 'password'); if(!preg_match("/\A[a-z\d]{8,100}+\z/i",$password)) { $err[] = "パスワードは英数字で8文字以上100文字以内で入力してください。"; } $password_conf = filter_input(INPUT_POST, 'password_conf'); if($password !== $password_conf) { $err[] = "確認用パスワードと異なっています。"; } $email = $_POST['email']; $password = password_hash($_POST['password'], PASSWORD_DEFAULT); if(count($err) === 0) { $user = new User(); $hasCreated = $user->createUser($email, $password); if(!$hasCreated){ $err[] = '登録に失敗しました'; } } var_dump($email); var_dump($password); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> <link rel="stylesheet" href="/css/user.css"> <title>worldcup</title> </head> <body> <?php if(count($err) > 0): ?> <?php foreach($err as $e): ?> <p><?php echo $e ?></p> <?php endforeach ?> <?php else: ?> <h2>ユーザー登録完了</h2> <?php endif ?> <a href="signup_form.php">ユーザー登録へ戻る</a> </body> </html>
User.php(ユーザーの新規登録のロジック)
<?php require_once(ROOT_PATH .'/Models/Db.php'); class User extends Db { public function __construct($dbh = null) { parent::__construct($dbh); } public function createUser($email, $password) { $sql = 'INSERT INTO users(email, password, role) VALUES (:email, :password, :role)'; $sth = $this->dbh->prepare($sql); $sth->bindValue(':email', $email, PDO::PARAM_STR); $sth->bindValue(':password', $password, PDO::PARAM_STR); $sth->bindValue(':role', 1, PDO::PARAM_INT); $result = $sth->execute(); return $result; } }
データベースの接続(Db.php)
<?php require_once(ROOT_PATH .'/database.php'); class Db { protected $dbh; public function __construct($dbh = null) { if(!$dbh) { try { $this->dbh = new PDO( 'mysql:dbname='.DB_NAME. ';host='.DB_HOST, DB_USER, DB_PASSWD ); } catch (PDOException $e) { echo "接続失敗:".$e->getMessage()."\n"; exit(); } } else { $this->dbh = $dbh; } } public function get_db_handler(){ return $this->dbh; } }
試したこと
このようにeメールとパスワードはsignup_form→registerに送信できていること確認ずみ。
INSERT INTO users(email, password, role) VALUES ('test02@gmail.com', 'aaaa1111', 1)
みたいな感じでSQL文を打てば、手動で登録はできること確認済み。
回答4件
あなたの回答
tips
プレビュー