セッション情報
実装に入る前に、セッションと呼ばれる機能に関して説明をしておきます。デモ画面でログインに成功すると、左メニューに次のメッセージが表示されます。
ようこそ大家さん!
このウェルカムメッセージが、商品一覧画面でも商品詳細画面でも表示されていることを確認してください。この「大家」というユーザー名が変数に入っていることは分かると思いますが、通常の変数では、画面遷移をすると変数の中身が消えてしまうため、別の画面に引き継ぐことができません。
この場合、「セッション変数」と呼ばれる特殊な変数を使います。セッション変数は、同じサイト内であればどの画面に遷移しても変数の中身が消えることはありません。
セッション変数は$_SESSION
という特殊な連想配列です。session_start
という命令でセッションを使う意思表示をした後で用います。例えば「大家」というユーザー名を格納するためには、次のように記述します。
session_start(); $_SESSION["name"] = "大家";
session_start
は必ずプログラムが記述されたファイルの一番上に記述して下さい。
ログイン機能(設計)
それでは、前述のセッション変数を用い、ログイン機能より実装を進めていきます。まずはphpmyadminにアクセスし、顧客情報のテストデータを確認しましょう。m_customers
テーブルの中を見てください。
3人の顧客情報がテストデータとして登録されているはずです。customer_code
カラムの値が「ログインID」、pass
カラムの値が「パスワード」となります。
では、テストデータ内にある「大家正登」というユーザーがログインした場合、入力されたIDとパスワードが正しいことを、SQLで判断するには、どのようにすればいいかを考えてみましょう。例えば、次のようなSQLを実行し、結果が存在するか否かを判断することができます。
SELECT * FROM m_customers WHERE customer_code='<入力されたID>' and pass='<入力されたパスワード>'
ログイン機能(実装)
それでは、実装に入ります。サンプルソースのitem_list_ver3.php
を開いてください。前回の記事で実装したitem_list.php
に、40行目~65行目の「ログイン処理(1)」とその下の「ログイン処理(2)」を追記したものです。これらの処理の中で、$_SESSION
変数の記述が見つかるはずです。
48行目の「この$sql変数の中身を埋めてください。
」と書かれている箇所を探し出して下さい。その直後の49行目に「$sql = "";
」と書かれた行があります。この行を上書きし、ログイン成功・失敗を判断するためのSELECT
文を記述してみましょう。
動作を確認する場合は、C:\xampp\htdocs\ec\item_list.php
として上書き保存し、商品一覧画面にアクセスしてください。
うまく動作しましたか? 設計段階では理解できても、プログラムとして記述するのは難しかったかもしれません。解答は、次のようになります。
$sql = "select * from m_customers "; $sql.= "where customer_code = '" . $_REQUEST["login_id"] . "'"; $sql.= "and pass='" . $_REQUEST["login_pass"] . "'";
「入力されたログインID」のように、テキストボックスの入力値は第5回で説明したとおり、$_REQUEST
変数を使います。156行目付近に、下記のようなログインIDのテキストボックスの記述があり、name="login_id"
と書かれていることから、$_REQUEST["login_id"]
がその入力値を表す変数となります。パスワードも同様です。
<input name="login_id" type="text" class="text" />
それでは、解答を踏まえて、プログラムを読み解いていきましょう。SELECT
文の結果が取れた時、すなわち正しいIDとパスワードが入力された時に、いくつかの変数をセットしています。プログラムの次の部分です。
$_SESSION["customer_code"] = $_REQUEST["login_id"]; $_SESSION["name"] = $row["name"]; $is_login = 1;
これらの変数は以下の目的で使用します。
$_SESSION["customer_code"]
ユーザーがログイン済か否かを判断するために用います。ログインしていない場合には、138行目付近の下記の条件の処理を実行します。
if( $_SESSION["customer_code"] == "")
ログイン済の場合には、170行目のelse
以下の処理を実行します。この条件分岐により、左メニューのログインボタンとログアウトボタンの表示が切り替わります。
$_SESSION["name"]
ログイン後に表示される「ようこそ○○さん!」というメッセージの、○○の部分にログインユーザー毎の名前を表示させるために使用します。178行目付近の以下の行で使用しています。
ようこそ<span class="person"><?php print($_SESSION["name"])?></span>さん!
$is_login
ログインに失敗した時のメッセージを出す際に用います。0の場合はログイン失敗、1の場合はログイン成功を現します。149行目付近のif
文で用いています。