質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

1250閲覧

PHPで作成中のログイン機能で、ユーザー情報の編集ができない

progblog

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

1クリップ

投稿2020/09/07 15:04

いつもお世話になっております。
現在、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?>

初心者の質問で申し訳ございません。
ご教授いただけますと幸いでございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答

web、書籍で参考を探しましたが、そもそも理解できていない部分が多く、違った書き方のソースを自分のソースに反映することができませんでした。

その状態で質問してもただのデバッグ依頼です。

これではどうにもなりません。
勿体無いと思うでしょうが、ソースを全て理解できるところまで一旦機能を削って、一つ一つ理解していくことをお勧めします。

具体的には、デバッグ方法が把握できていないのが一番の問題で、問題がある度に勘で何とかするしかなくなってきます。

PHP デバッグ 方法等で検索してデバッグ方法を把握するか、
文法はある程度理解できていることでしょうから、
デバッグ方法を紹介している書籍やweb教材を探して1から体系立てて学習されることをお勧めします。

補足

ここだけ直しても他で躓くとは思いますが、とりあえずは

PHP

1$sql = 'UPDATE users SET name = ?, email = ?';

はWHERE句が無いので全データが更新されてしまいそうです。
エラーは出ないかも

PHP

1 try { 2 $stmt = connect()->prepare($sql); 3 $result = $stmt->execute($arr); 4 return $result; 5 } catch (\Exception $e) { 6 return $result; 7 }

では例外が発生してもエラー内容が分からないので

PHP

1 try { 2 $stmt = connect()->prepare($sql); 3 $result = $stmt->execute($arr); 4 return $result; 5 } catch (\Exception $e) { 6 echo $e->getMessage(); 7 echo $e->getTraceAsString(); 8 var_dump($userData); 9 die(); 10 //return $result; 11 }

等として、どこに問題があるかを確認してみてください。

どの時点で変数がどうなっているかを一つづつvar_dump()とdie()などで確認していけばとりあえずデバッグは可能です。
(xdebugとIDEを使ってブレークポイントを仕掛ける方が楽です)

投稿2020/09/07 15:20

tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

progblog

2020/09/08 00:06

ご回答ありがとうございます。 >その状態で質問してもただのデバッグ依頼です。 おっしゃる通りです。 失礼いたしました。 >具体的には、デバッグ方法が把握できていないのが一番の問題で、問題がある度に勘で何とかするしかなくなってきます。 まさに現在の私がそうで、エラーが出ずに困っていました。 「デバッグ方法」を検索しつつ、対応していきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問