質問: ![![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/4ecf61b32d2b11cb57a18b9c56329c17.png)](fadebad2fd9a28a1fd4d1ebd714c7f9b.png) 今、PHPとMySQLを使った認証システムを作成しているのですが、ここで質問があります。 自分が新たに「partid」というものを付けてみました。 しかし、PHPにpartidを表示することができません。 今は、以下のコードを使用しています。 ようこそ=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん あなたは=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>パートの方です。 このコードだと、Useridは表示されるのですが、partidは表示されません。 partidをPHPに表示する方法を教えてください。
回答: $_SESSION['userid']を$_SESSION['partid'] と変えることについてですが、 そもそも**前画面(login.php)で値を受け取る構造になっていない**ので、その**構造になるように修正が必要**です。 そのためには、いくつかのポイントがあるので、それぞれごとの説明を実際にソースを提示しながら していきます。 またこの設計の前提条件ですが**、userid を partidとして扱いたいという要件**を推測で決め打ちしている点をご了解いただければ。 [追記] ここから この解説の参考サイト: 1.SQL 2.PHPのセッション 3.htmlとフォーム [追記] ここまで 以下解説 1.SQLの修正 認証にuseridではなくpartidにする必要があります。 partidは、php内部でHTML出力をしている点がありますので、そちらの修正時に提示します。 2.phpの修正 (1) 入力された情報は、$_POST["userid"]という形で受け取れるので、これを$_POST["partid"] とすることになります。こうすることで、入力された値は、partidとして受け取れます。 (2) 入力値の検証(入力されているか) (3) 認証処理(データベースに値が存在しているか) (4) (2)(3)の検証が成功の場合は、$_SESSION["userid"] = $_POST["userid"]という形で PHP間で利用するセッション用の変数に代入させています。 これは、$_SESSION["partid"]として画面で使いたいため、 $_SESSION["partid"] = $_POST["userid"]とするようにします。 3.php内部のhtmlの修正 入力フォームタグの中身を以下のイメージで修正します。 入力させる内容をpartid( $_POST["partid"] ) として受け取るため、 "> とされているところを、すべてpartidに修正することとします。 "> 以下各ソースごとの解説。 コメントで適宜入れています。 main.phpでは、useridの表示ではなくあらかじめlogin.phpで入力されたpartidを 表示している。以下大まかな処理のイメージを順番に (1) login.phpで入力フォームを作成。 (2) login.phpで入力からpartid, passwordを受け取る。 (3) 事前チェックで入力値が空でないことを確認して、認証させる。 (4) 認証は、partidがデータベースに存在しているか。 (5) データが存在すると、main.phpを表示するようにしている。 login.php 主にユーザーからの入力と検証、またログインチェック(データが存在するか)を行う。 ログインに成功(データの存在確認)すると、main.phpを表示させる。 ``` connect_errno) { print('データベースへの接続に失敗しました。' . $mysqli->connect_error); exit(); } // データベースの選択 $mysqli->select_db('データベース名'); // 入力値のサニタイズ $userid = $mysqli->real_escape_string($_POST["partid"]); // クエリの実行 // [terail]1.SQLの修正 // あらかじめ入力されたpartidが存在しているかをチェックしている。 // 入力をuseridで行いたい場合は、$partidではなく$useridとすること。 $query = "SELECT * FROM テーブル名 WHERE name = '" . $partid . "'"; $result = $mysqli->query($query); if (!$result) { print('クエリーが失敗しました。' . $mysqli->error); $mysqli->close(); exit(); } while ($row = $result->fetch_assoc()) { // パスワード(暗号化済み)の取り出し $db_hashed_pwd = $row['password']; } // データベースの切断 $mysqli->close(); // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。 //if ($_POST["password"] == $pw) { if (password_verify($_POST["password"], $db_hashed_pwd)) { // 4.認証成功なら、セッションIDを新規に発行する session_regenerate_id(true); // [teratail]ここで入力されたpartidをセッション用の変数に代入している。 // $_SESSION["PARTID"] = 値 // 以降は、PHP間セッションが有効な間 $_SESSION["PARTID"]として受け取り表示や検証が行える。 $_SESSION["PARTID"] = $_POST["partid"]; // <- [teratail]この記述が代入で、かつ必要な絶対条件です。 // [teratail]この渡し方は、あらかじめFORMから入力されたname="partid"の属性をもつ、タグinputから受け取っている。 header("Location: main.php"); exit; } else { // 認証失敗 $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。"; } } else { // 未入力なら何もしない } } ?> サンプルアプリケーション ログイン機能 サンプルアプリケーション ログインフォーム ユーザID"> パスワード ユーザー情報登録ページへ ``` main.php ログインに成功すると表示される画面、また画面ではセッションに$_SESSION["PARTID"]が存在するかをチェックし存在しなければ、直ちにlogout.phpを表示させる。 ログインに成功してれば、$_SESSION["PARTID"]は存在しているので、画面に表示される。 ``` サンプルアプリケーション ログイン機能 サンプルアプリケーション ようこそ=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>さん ログアウト ``` [追記] logout.php 閲覧の必要がなくなった時にログアウトして表示される画面 また、セッションタイムアウトした時には、セッションタイムアウトがわかるメッセージが表示される 主に$_SESSION["USERID"]が存在有無にかかわらずメッセージが表示される ここでは、設計前提に従い、 PARTIDとして扱いたいため $_SESSION["USERID"]をPARTIDとして変更させる必要がある。 ``` サンプルアプリケーション ログイン機能 サンプルアプリケーション ログイン画面に戻る ``` [終わりに] 以上で解説を終えますが、 当初の質問から懸念していた内容は、**どこかのサイトを参照したと**いう記述がなかったため どの回答をすべきかという点がわからず推測で対応することになりました。 以降質問する際は、 まず なにを したか そして なにを 調べて どう 判断(感じた)か。 それを 5H1H形式であらかじめ質問の整理を行うようにしてください。**自分が困った内容を、アヒルに説明してみる。** というのがありますが。僕は幼稚園に説明するとしたら。をお勧めします。 そうすることで、回答を持ってる方が即時で回答ができたり、また、別の質問者がこの回答や質問を ご覧になった時に参考になることがあります。