youtubeの動画を見ながらコードを手入力する形で、現在、PHPのログイン認証システムを再度作成しています。
現在使用している開発環境は、IDEのpaizacloudで、ログイン認証に必要なファイルのうち、ユーザーアカウントの登録までは進めております。
ログイン認証システムのファイルを収めるディレクトリの構成は、次の画像のとおりです。
内部のファイルのコードは、以下のとおりです。
sql
1//MySQL 2 3-- create "users" table 4CREATE TABLE `crud`.`users` ( 5 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 6 `name` VARCHAR(64) NOT NULL , 7 `email` VARCHAR(191) NOT NULL UNIQUE, 8 `password` VARCHAR(191) NOT NULL UNIQUE 9) ENGINE = InnoDB;
php
1 2//dbconnect.php 3<?php 4 5require_once('env.php'); 6/* ↓次の構文があれば具体的に何が原因で接続エラーになっているのかが分かる。 */ 7ini_set('display_errors',true); 8function connect() 9{ 10 $host = DB_HOST; 11 $db = DB_NAME; 12 $user = DB_USER; 13 $pass = DB_PASS; 14 15 $dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4"; 16 try{ 17 $pdo = new PDO($dsn,$user,$pass, [ 18 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 19 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 20 ]); 21 // echo '接続できました。'; 22 return $pdo; 23 }catch(PDOExeption $e){ 24 echo '接続できませんでした... '.$e->getMessage(); 25 exit; 26 } 27 28}
php
1//env.php 2 3<?php 4 5define('DB_HOST','localhost'); 6define('DB_NAME','crud'); 7define('DB_USER','root'); 8define('DB_PASS','');
php
1// classes/UserLogic.php 2 3<?php 4 5require_once('../dbconnect.php'); 6 7/* PHPDocとは? 8コメントを書く時の共通の形式。 9(例)クラスやメソッドの役割を書く時は・・・ 10*/ 11 12class UserLogic 13{ 14 /** 15 * ユーザーを登録する 16 * @param array $userData 17 * @return bool $result 18 */ 19 public static function createUser($userData) 20 { 21 $result = false; //←最初にこちらを設定しておく 22 $sql = 'INSERT INTO users (name, email, password) VALUES (?, ?, ?)'; 23 24 // ユーザーデータを配列に入れる 25 $arr = []; 26 $arr[] = $UserData['username']; 27 $arr[] = $UserData['email']; 28 $arr[] = password_hash($UserData['password'],PASSWORD_DEFAULT); 29 /* これでパスワードをハッシュ化している */ 30 try { //これが「例外処理」。 31 $stmt = connect()->prepare($sql); 32 $result = $stmt->execute($arr); 33 return $result; //←うまく言った場合は$resultがtrueになる 34 }catch(\Exception $e){ 35 return $result; //そうでなければfalseのまま 36 } 37 38 } 39} 40
php
1// public/register.php 2 3<?php 4 5 require_once('../classes/UserLogic.php'); 6 // エラーメッセージ 7 $err = []; 8 9 // バリデーション 10 if(!$username = filter_input(INPUT_POST, 'username')){ 11 $err[] = 'ユーザー名を記入して下さい。'; 12 } 13 if(!$email = filter_input(INPUT_POST, 'email')){ 14 $err[] = 'メールアドレスを記入して下さい。'; 15 } 16 $password = filter_input(INPUT_POST, 'password'); 17 // 正規表現を使う 18 if(!preg_match("/\A[a-z\d]{8,100}+\z/i",$password)){ 19 $err[] = 'パスワードは英数字8文字以上100文字以下にして下さい。'; 20 } 21 $password_conf = filter_input(INPUT_POST, 'password_conf'); 22 if($password !== $password_conf){ 23 $err[] = '確認用パスワードと異なっています。'; 24 } 25 26 if(count($err) === 0){ 27 // ユーザー登録処理 28 $hasCreated = UserLogic::createUser($_POST); 29 if(!$hasCreated){ 30 $err[] = '登録に失敗しました。'; 31 } 32 } 33 34 $theme = 'ユーザー登録'; 35?> 36<!DOCTYPE html> 37<html lang="ja"> 38<head> 39 <meta charset="UTF-8"> 40 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 41 <title><?= $theme; ?>完了画面</title> 42</head> 43<body> 44 <?php if(count($err) > 0): ?> 45 <?php foreach($err as $e): ?> 46 <p><?= $e; ?></p> 47 <?php endforeach ?> 48 <?php else: ?> 49 <p><?= $theme; ?>が完了しました。</p> 50 <?php endif ?> 51 <button><a href="signup_form.php">戻る</a></button> 52</body> 53</html> 54
php
1 2// public/signup_form.php 3 4<?php 5 $theme = 'ユーザー登録'; 6?> 7<!DOCTYPE html> 8<html lang="ja"> 9<head> 10 <meta charset="UTF-8"> 11 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 12 <title><?= $theme; ?>画面</title> 13</head> 14<body> 15 <h2><?= $theme; ?>フォーム</h2> 16 <form action="register.php" method="post"> 17 <p> 18 <label for="username">ユーザー名:</label><input type="text" name="username" id="username"> 19 </p> 20 <p> 21 <label for="email">メールアドレス:</label><input type="text" name="email" id="email"> 22 </p> 23 <p> 24 <label for="password">パスワード:</label><input type="password" name="password" id="password"> 25 </p> 26 <p> 27 <label for="password_conf">パスワード確認:</label><input type="password" name="password_conf" id="password_conf"> 28 </p> 29 <p><input type="submit" value="新規登録"></p> 30 </form> 31</body> 32</html>
ここまでを動画で紹介されている通りに記述してきたのですが、次のようなエラーが画面に表示されてしまい、対処できずに詰まっている次第です。
Notice: Undefined variable: UserData in /home/ubuntu/public_html/login/classes/UserLogic.php on line 24 Notice: Trying to access array offset on value of type null in /home/ubuntu/public_html/login/classes/UserLogic.php on line 24 Notice: Undefined variable: UserData in /home/ubuntu/public_html/login/classes/UserLogic.php on line 25 Notice: Trying to access array offset on value of type null in /home/ubuntu/public_html/login/classes/UserLogic.php on line 25 Notice: Undefined variable: UserData in /home/ubuntu/public_html/login/classes/UserLogic.php on line 26 Notice: Trying to access array offset on value of type null in /home/ubuntu/public_html/login/classes/UserLogic.php on line 26 登録に失敗しました。
「classes/UserLogic.php on line 24~26」は、「UserLogic.php」の
php
1 // ユーザーデータを配列に入れる 2 $arr = []; 3 $arr[] = $UserData['username']; 4 $arr[] = $UserData['email']; 5 $arr[] = password_hash($UserData['password'],PASSWORD_DEFAULT);
にあたる部分です。
おそらくはこの「UserLogic.php」か、或いは「register.php」のphp部分に誤りがあるのではないか、と見ているのですが、それをどう修正すればよいかが分からずにいます。
解決方法にお気づきの方がおられましたら、今回も畏れ入りますが、ご教示宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/22 13:52
2020/10/22 13:57 編集