いつもお世話になっております。
現在、PHPの勉強中でログイン機能を作成しているのですが、「ログイン時、ユーザー情報の変更」ができません。
ご教授いただけますと幸いです。
##コード
###入力フォーム
functions.php
には「XSS対策:エスケープ処理」「CSRF対策」が記載。今回の件と関係ないと思われるので省略しました。
PHP
1<?php 2 3session_start(); 4require_once '../classes/UserLogic.php'; 5require_once '../functions.php'; 6// ログインしているか判定し、していなかったら新規登録画面へ戻す 7$result = UserLogic::checkLogin(); 8 9if(!$result) { 10 $_SESSION['login_err'] = 'ユーザーを登録してログインしてください。'; 11 header('Location: signup_form.php'); 12 return; 13} 14$login_user = $_SESSION['login_user']; 15 16?> 17<!DOCTYPE html> 18<html lang="en"> 19<head> 20 <meta charset="UTF-8"> 21 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 22 <title>登録情報を修正</title> 23</head> 24<body> 25<form action="update.php" method="POST"> 26 <p class="input-name">ユーザー名: 27 <input type="text" name="username" class="input-area" placeholder="ユーザー名を記入してください" value="<?php echo h($login_user['name']) ?>"> 28 </p> 29 <p class="input-email">アドレス: 30 <input type="email" name="email" class="input-area" placeholder="アドレスを記入してください" value="<?php echo h($login_user['email']) ?>"> 31 </p> 32 <p class="input-submit"> 33 <input type="submit" name="" value="修正する"> 34 </p> 35 </form> 36</body> 37</html>
###更新後ファイル
フォームに入力後、こちらのupdate.php
に飛ばしています。
PHP
1<?php 2session_start(); 3require_once '../classes/UserLogic.php'; 4 5// エラーメッセージ 6$err = []; 7// バリデーション 8if(!$username = filter_input(INPUT_POST, 'username')) { 9 $err[] = '修正するユーザー名を記入してください'; 10} 11if(!$emal = filter_input(INPUT_POST, 'email')) {{} 12 $err[] = '修正するアドレスを入力してください'; 13} 14if(count($err) == 0) { 15 //ユーザー登録の処理 16 $hasCreated = UserLogic::updateUser($_POST); 17 18 if (!$hasCreated) { 19 $err[] = '修正に失敗しました。'; 20 } 21} 22?> 23<!DOCTYPE html> 24<html lang="en"> 25<head> 26 <meta charset="UTF-8"> 27 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 28 <title>登録完了画面</title> 29</head> 30<body> 31 <?php if(count($err) > 0) : ?> 32 <?php foreach($err as $e) : ?> 33 <p><?php echo $e ?></p> 34 <?php endforeach ?> 35 <?php else : ?> 36 <p>修正が完了しました。</p> 37 <?php endif ?> 38 <p><a href="./signup_form.php">戻る</a></p> 39</body> 40</html>
###処理ファイル
ユーザー登録の処理をUserLogic.php
で実装しております。
色々な処理がありますが、関係ない部分も多々ありますので、該当処理だけ記載させていただきます。
※念のため全文は補足に記述させていただきます。
PHP
1 /** 2 * ユーザー情報を更新する ->説明を書く 3 * @param array $userData ->引数を書く 4 * @return bool $result ->返り値を書く 5 */ 6 public static function updateUser($userData) 7 { 8 9 $result = false; 10 $sql = 'UPDATE users SET name = ?, email = ?'; 11 // ユーザーデータを配列に入れる 12 $arr = []; 13 $arr[] = $userData['username']; 14 $arr[] = $userData['email']; 15 try { 16 $stmt = connect()->prepare($sql); 17 $result = $stmt->execute($arr); 18 return $result; 19 } catch (\Exception $e) { 20 return $result; 21 } 22 } 23
##結果
browser
1修正に失敗しました。
と表示される。
つまりUserLogic.php
での処理がうまく行われていないとのことだと思いますが原因がわかりません。
「新規登録」「ログイン」「ログアウト」 機能の実装はできましたので、他箇所の記述は間違っていないと思います。
##試したこと
web、書籍で参考を探しましたが、そもそも理解できていない部分が多く、違った書き方のソースを自分のソースに反映することができませんでした。
##補足
UserLogic.php
の全記述。
今回は対象になる箇所は上記にも書き出した通り、最下段の箇所になります。
PHP
1<?php 2require_once '../deconnect.php'; 3 4class UserLogic { 5 /** 6 * ユーザーを登録する ->説明を書く 7 * @param array $userData ->引数を書く 8 * @return bool $result ->返り値を書く 9 */ 10 public static function createUser($userData) 11 { 12 $result = false; 13 $sql = 'INSERT INTO users (name, email, password) VALUES (?, ?, ?)'; 14 // ユーザーデータを配列に入れる 15 $arr = []; 16 $arr[] = $userData['username']; 17 $arr[] = $userData['email']; 18 $arr[] = password_hash($userData['password'], PASSWORD_DEFAULT); 19 try { 20 $stmt = connect()->prepare($sql); 21 $result = $stmt->execute($arr); 22 return $result; 23 } catch (\Exception $e) { 24 return $result; 25 } 26 } 27 /** 28 * ログイン処理 ->説明を書く 29 * @param array $email ->引数を書く 30 * @param array $password ->引数を書く 31 * @return bool $result ->返り値を書く 32 */ 33 public static function login($email, $password){ 34 // 結果 35 $result = false; 36 // ユーザーをemailから検索して取得 37 $user = self::getUserByEmail($email); 38 39 if(!$user) { 40 $_SESSION['msg'] = 'emailが一致しません。'; 41 return $result; 42 } 43 44 // パスワードの照会 45 if(password_verify($password, $user['password'])) { 46 // ログイン成功 47 session_regenerate_id(true); 48 $_SESSION['login_user'] =$user; 49 $result = true; 50 return $result; 51 } 52 53 $_SESSION['msg'] = 'パスワードが一致しません。'; 54 return $result; 55 } 56 /** 57 * emailからユーザーを取得 ->説明を書く 58 * @param array $email ->引数を書く 59 * @return array|bool $user|false ->返り値を書く 60 */ 61 public static function getUserByEmail($email){ 62 // SQLの準備 63 // SQLの実行 64 // SQLの結果を返す 65 $sql = 'SELECT * FROM users WHERE email = ?'; 66 67 // emailを配列に入れる。 68 $arr = []; 69 $arr[] = $email; 70 71 try { 72 $stmt = connect()->prepare($sql); 73 $result = $stmt->execute($arr); 74 // SQLの値を返す 75 $user = $stmt->fetch(); 76 return $user; 77 } catch (\Exception $e) { 78 return false; 79 } 80 } 81 /** 82 * ログインチェック ->説明を書く 83 * @param void ->引数を書く 84 * @return bool $result ->返り値を書く 85 */ 86 public static function checkLogin(){ 87 $result = false; 88 // セッションにログインユーザーが入ってなかったらfalse 89 if (isset($_SESSION['login_user']) && $_SESSION['login_user']['id'] > 0) { 90 return $result = true; 91 } 92 return $result; 93 } 94 /** 95 * ログアウトの処理 ->説明を書く 96 * @param void ->引数を書く 97 * @return bool $result ->返り値を書く 98 */ 99 public static function logout() { 100 $_SESSION = array(); 101 session_destroy(); 102 } 103 /** 104 * ユーザー情報を更新する ->説明を書く 105 * @param array $userData ->引数を書く 106 * @return bool $result ->返り値を書く 107 */ 108 public static function updateUser($userData) 109 { 110 111 $result = false; 112 $sql = 'UPDATE users SET name = ?, email = ?'; 113 // ユーザーデータを配列に入れる 114 $arr = []; 115 $arr[] = $userData['username']; 116 $arr[] = $userData['email']; 117 try { 118 $stmt = connect()->prepare($sql); 119 $result = $stmt->execute($arr); 120 return $result; 121 } catch (\Exception $e) { 122 return $result; 123 } 124 } 125 } 126?>
初心者の質問で申し訳ございません。
ご教授いただけますと幸いでございます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/08 00:06