前提・実現したいこと
PHPでログイン機能を作成しようとしています
そのなかで新規登録の部分を作成しようとしています
発生している問題・エラーメッセージ
以下のコードで表示したページで、ユーザーネームとパスワードを設定しても新規登録が完了せず、”登録に失敗しました”が出力されてしまいます
また、データベースへも新規登録の情報は追加されませんでした
該当のソースコード
signup.php
PHP
1 2<!DOCTYPE html> 3<html lang="ja"> 4 5<head> 6 <meta charset="UTF-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 <title>Signup</title> 9</head> 10 11<body> 12 <h2>新規登録</h2> 13 <form action="register.php" method="POST"> 14 <p> 15 <label for="username">ユーザー名:</label> 16 <input type="text" name="name"> 17 </p> 18 <p> 19 <label for="password">パスワード:</label> 20 <input type="password" name="password"> 21 </p> 22 <p> 23 <label for="password">パスワード確認</label> 24 <input type="password" name="password_conf"> 25 </p> 26 <p> 27 <input type="submit" value="新規登録する"> 28 </p> 29 </form> 30</body> 31 32</html>
register.php
PHP
1<?php 2 3require_once './classes/UserLogic.php'; 4 5//エラーメッセージ 6$err = []; 7 8//バリデーション・・・内容の妥当性のチェック 9 10//ユーザー名やパスワードがうまく記入されていない場合 11 12if (!$username = filter_input(INPUT_POST, 'name')) { 13 14 $err[] = 'ユーザー名を記入してください'; 15} 16 17$password = filter_input(INPUT_POST, 'password'); 18 19//正規表現 20if (!preg_match("/\A[a-z\d]{6,100}+\z/i", $password)) { 21 22 $err[] = 'パスワードは英数字6文字以上にしてください'; 23} 24 25$password_conf = filter_input(INPUT_POST, 'password_conf'); 26 27if ($password !== $password_conf) { 28 29 $err[] = '確認用パスワードと異なっています'; 30} 31 32//ユーザー登録がうまくいかない場合 33 34if (isset($err)) { 35 36 $hasCreated = UserLogic::createUser($_POST); 37 38 if (!$hasCreated) { 39 40 $err[] = '登録に失敗しました'; 41 } 42} 43 44?> 45 46<!DOCTYPE html> 47<html lang="ja"> 48 49<head> 50 <meta charset="UTF-8"> 51 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 52 <title>Document</title> 53</head> 54 55<body> 56 57 <?php if (count($err) > 0) : ?> 58 59 <?php foreach ($err as $e) : ?> 60 61 <p><?php echo $e ?></p> 62 63 <?php endforeach ?> 64 65 <?php else : ?> 66 67 <p>登録完了</p> 68 69 <?php endif ?> 70 71 <a href="./signup.php">戻る</a> 72</body> 73 74</html> 75
UserLogic.php
PHP
1<?php 2 3// 相対パスで指定するとうまくいかないので(../dbconnect.php)、絶対パスで指定 4require_once dirname(__FILE__) . '/../dbconnect.php'; 5 6class UserLogic 7{ 8 9 10 // PHPDoc・・・コメントを書く時のあるきまった形式 11 // ー>他の人が見ても分かりやすいようにするため 12 13 /** 14 * ユーザーの登録 ー>説明を書く 15 * @param array $userData ->引数 16 * @return bool $result ->返り値 17 */ 18 19 public static function createUser($userData) 20 { 21 22 $result = false; 23 24 $sql = 'INSERT INTO user (name, password) VALUES (?, ?)'; 25 26 // ユーザーデータを配列に入れる 27 28 $arr = []; 29 $arr[] = $userData['name']; 30 $arr[] = password_hash($userData['password'], PASSWORD_DEFAULT); 31 32 try { 33 34 $stmt = connect()->prepare($sql); 35 $stmt->execute($arr); 36 return $result; 37 } catch (\Exception $e) { 38 39 return $result; 40 } 41 } 42} 43
env.php
<?php define('DB_HOST', 'ホスト名'); define('DB_NAME', 'データベース名'); define('DB_USER', 'データベースユーザー名'); define('DB_PASS', 'データベースパスワード');
dbconnect.php
<?php require_once 'env.php'; ini_set('display_errors', true); function connect() { $host = DB_HOST; $db = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host = $host; dbname = $db"; try { $pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); return $pdo; } catch (PDOException $e) { echo '接続失敗です' . $e->getMessage(); exit(); } }
試したこと
ここに問題に対して試したことを記載してください。
補足情報
UserLogic.phpのみ同じ階層にあるclassesディレクトリ内にあります
質問の仕方やコードの記述などの未熟な部分もあるかと思いますが、よろしければご指摘のほどよろしくお願いします
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/18 12:28
2020/05/18 12:49