$_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の修正
入力フォーム<form>タグの中身を以下のイメージで修正します。
入力させる内容をpartid( $_POST["partid"] ) として受け取るため、
<input type="text" id="userid" name="userid" value="<?php echo htmlspecialchars($_POST["userid"], ENT_QUOTES); ?>">
とされているところを、すべてpartidに修正することとします。
<input type="text" id="partid" name="partid" value="<?php echo htmlspecialchars($_POST["partid"], ENT_QUOTES); ?>">
以下各ソースごとの解説。 コメントで適宜入れています。
main.phpでは、useridの表示ではなくあらかじめlogin.phpで入力されたpartidを
表示している。以下大まかな処理のイメージを順番に
(1) login.phpで入力フォームを作成。
(2) login.phpで入力からpartid, passwordを受け取る。
(3) 事前チェックで入力値が空でないことを確認して、認証させる。
(4) 認証は、partidがデータベースに存在しているか。
(5) データが存在すると、main.phpを表示するようにしている。
login.php
主にユーザーからの入力と検証、またログインチェック(データが存在するか)を行う。
ログインに成功(データの存在確認)すると、main.phpを表示させる。
php
1<?php
2require 'password.php';
3// セッション開始
4session_start();
5
6// エラーメッセージの初期化
7$errorMessage = "";
8
9// ログインボタンが押された場合
10if (isset($_POST["login"])) {
11 // 1.ユーザIDの入力チェック
12 // [teratail]ここでユーザーIDをpartidとして渡されたものを$_POST["partid"]として受け取っている
13 // ここでは、入力されたpartidが空かどうかをチェックしている。
14 // 認証時の情報をチェックさせるのがuseridの場合は、$_POST["userid"]とすること
15 if (empty($_POST["partid"])) {
16 $errorMessage = "ユーザIDが未入力です。";
17 } else if (empty($_POST["password"])) {
18 $errorMessage = "パスワードが未入力です。";
19 }
20
21 // 2.ユーザIDとパスワードが入力されていたら認証する
22 // [teratail]ここでは、ログインに必要な partidとpasswordをPOSTで受け取っている。
23 // formでSUBMITボタンを押下することで、遷移させた先で、$_POST["partid"]と$_POST["password"]と受け取れるが、その中身が入力されているか。をチェックしている。
24 // 入力していればログイン認証を実行させるため。
25 // 入力値のチェックをuseridで行いたい場合は、$_POST["userid"]とすること。
26 if (!empty($_POST["partid"]) && !empty($_POST["password"])) {
27 // mysqlへの接続
28 $mysqli = new mysqli('ホスト名', 'ユーザー名', 'パスワード');
29 if ($mysqli->connect_errno) {
30 print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error);
31 exit();
32 }
33
34 // データベースの選択
35 $mysqli->select_db('データベース名');
36
37 // 入力値のサニタイズ
38 $userid = $mysqli->real_escape_string($_POST["partid"]);
39
40 // クエリの実行
41 // [terail]1.SQLの修正
42 // あらかじめ入力されたpartidが存在しているかをチェックしている。
43 // 入力をuseridで行いたい場合は、$partidではなく$useridとすること。
44 $query = "SELECT * FROM テーブル名 WHERE name = '" . $partid . "'";
45 $result = $mysqli->query($query);
46 if (!$result) {
47 print('クエリーが失敗しました。' . $mysqli->error);
48 $mysqli->close();
49 exit();
50 }
51
52 while ($row = $result->fetch_assoc()) {
53 // パスワード(暗号化済み)の取り出し
54 $db_hashed_pwd = $row['password'];
55 }
56
57 // データベースの切断
58 $mysqli->close();
59
60 // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。
61 //if ($_POST["password"] == $pw) {
62 if (password_verify($_POST["password"], $db_hashed_pwd)) {
63 // 4.認証成功なら、セッションIDを新規に発行する
64 session_regenerate_id(true);
65 // [teratail]ここで入力されたpartidをセッション用の変数に代入している。
66 // $_SESSION["PARTID"] = 値
67 // 以降は、PHP間セッションが有効な間 $_SESSION["PARTID"]として受け取り表示や検証が行える。
68 $_SESSION["PARTID"] = $_POST["partid"]; // <- [teratail]この記述が代入で、かつ必要な絶対条件です。
69 // [teratail]この渡し方は、あらかじめFORMから入力されたname="partid"の属性をもつ、タグinputから受け取っている。
70
71 header("Location: main.php");
72 exit;
73 }
74 else {
75 // 認証失敗
76 $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";
77 }
78 } else {
79 // 未入力なら何もしない
80 }
81}
82
83?>
84<!doctype html>
85<html>
86 <head>
87 <meta charset="UTF-8">
88 <title>サンプルアプリケーション</title>
89 </head>
90 <body>
91 <h1>ログイン機能 サンプルアプリケーション</h1>
92 <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく -->
93 <!--<form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">-->
94 <!-- [teratail]ここからログインのフォームです。formタグ内で囲まれた範囲内で入力をさせるフォーム作成している-->
95 <form id="loginForm" name="loginForm" action="" method="POST">
96 <fieldset>
97 <legend>ログインフォーム</legend>
98 <div><?php echo $errorMessage ?></div>
99 <!--[teratail] ここでpartidをユーザーIDとみなして入力させている
100 もし、useridで入力させる場合は、$_SESSION["PARTID"]ではこの構造では受け取れないため
101 SQLの具体的な必要です。「useridの認証の確認だけではなく、partidを受け取ること。」
102 -->
103 <label for="userid">ユーザID</label><input type="text" id="partid" name="partid" value="<?php echo htmlspecialchars($_POST["partid"], ENT_QUOTES); ?>">
104 <br>
105 <label for="password">パスワード</label><input type="password" id="password" name="password" value="">
106 <br>
107 <input type="submit" id="login" name="login" value="ログイン">
108 </fieldset>
109 </form>
110 <a href="add.html">ユーザー情報登録ページへ</a>
111 </body>
112</html>
main.php
ログインに成功すると表示される画面、また画面ではセッションに$_SESSION["PARTID"]が存在するかをチェックし存在しなければ、直ちにlogout.phpを表示させる。
ログインに成功してれば、$_SESSION["PARTID"]は存在しているので、画面に表示される。
php
1<?php
2session_start();
3
4// ログイン状態のチェック
5if (!isset($_SESSION["PARTID"])) {
6 header("Location: logout.php");
7 exit;
8}
9
10?>
11
12<!doctype html>
13<html>
14 <head>
15 <meta charset="UTF-8">
16 <title>サンプルアプリケーション</title>
17 </head>
18 <body>
19 <h1>ログイン機能 サンプルアプリケーション</h1>
20 <!-- ユーザIDにHTMLタグが含まれても良いようにエスケープする -->
21 <!-- [teratail]ここでpartidをPHP間でlogin.phpから渡されたので、受け取ることができる-->
22 <p>ようこそ<?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>さん</p>
23 <ul>
24 <li><a href="logout.php">ログアウト</a></li>
25 </ul>
26 </body>
27</html>
[追記]
logout.php
閲覧の必要がなくなった時にログアウトして表示される画面
また、セッションタイムアウトした時には、セッションタイムアウトがわかるメッセージが表示される
主に$_SESSION["USERID"]が存在有無にかかわらずメッセージが表示される
ここでは、設計前提に従い、
PARTIDとして扱いたいため $_SESSION["USERID"]をPARTIDとして変更させる必要がある。
php
1<?php
2session_start();
3
4// [teratail]$_SESSION["PARTID"]が存在しないときにログアウトしましたと表示される
5if (isset($_SESSION["PARTID"])) {
6 $errorMessage = "ログアウトしました。";
7}
8else {
9 $errorMessage = "セッションがタイムアウトしました。";
10}
11// セッション変数のクリア
12$_SESSION = array();
13// クッキーの破棄は不要
14//if (ini_get("session.use_cookies")) {
15// $params = session_get_cookie_params();
16// setcookie(session_name(), '', time() - 42000,
17// $params["path"], $params["domain"],
18// $params["secure"], $params["httponly"]
19// );
20//}
21// セッションクリア
22@session_destroy();
23?>
24
25<!doctype html>
26<html>
27 <head>
28 <meta charset="UTF-8">
29 <title>サンプルアプリケーション</title>
30 </head>
31 <body>
32 <h1>ログイン機能 サンプルアプリケーション</h1>
33 <div><?php echo $errorMessage; ?></div>
34 <ul>
35 <li><a href="login.php">ログイン画面に戻る</a></li>
36 </ul>
37 </body>
38</html>
[終わりに]
以上で解説を終えますが、
当初の質問から懸念していた内容は、どこかのサイトを参照したという記述がなかったため
どの回答をすべきかという点がわからず推測で対応することになりました。
以降質問する際は、 まず なにを したか そして なにを 調べて どう 判断(感じた)か。
それを 5H1H形式であらかじめ質問の整理を行うようにしてください。自分が困った内容を、アヒルに説明してみる。
というのがありますが。僕は幼稚園に説明するとしたら。をお勧めします。
そうすることで、回答を持ってる方が即時で回答ができたり、また、別の質問者がこの回答や質問を
ご覧になった時に参考になることがあります。