記事内に広告が含まれています

【ワレコPHP講座】セッション変数、Cookieなど【状態変数を使う】

この記事は約14分で読めます。
スポンサーリンク

例えばWEBサイトを作成して利用者さんがWEBサイトを訪問したとする。

その訪問期間中に何らかの情報を利用者とWEBサーバーの間で共有したい場合がある。

そう言う状況は幾らでもある。

一つの例を上げるとGoogleのサイト

Google
ハロウィーンを祝おう #GoogleDoodle

を開いて何らかのキーワードを検索欄に入れて [ENTER] を押して検索を実行する。

そうするとサーバー側で検索が実行されてそのキーワードに関する検索結果が表示される。

かつ、その検索結果表示ページの検索欄には先ほど入力したキーワードが入力された状態になっているので、追加でキーワードを入れるなどして条件を絞り込むなどが可能だ。

この場合、クライアントサイドとサーバーサイドでキーワードの文字列が共有されていると見る事が出来る。

Google検索を実行した場合のように、キーワードを検索欄に復元する手法はいろいろある。

当記事では、PHPのセッション変数などの使い方を備忘録としてまとめた。

スポンサーリンク
スポンサーリンク

URLクエリパラメータ(クエリストリング)の方法

一つ目の手法としては、検索実行の [ENTER] 押下でキーワードがサーバーに送信される。

 https://www.google.co.jp/search?q=稀勢の里

具体的にはそのサイトの URLに

 ?q=文字列

の部分を追加すると ‘文字列’ がサーバーに送られる。

サーバーでは search.php ファイルを以下のように作成しておくと、

<?php
     $keyword = '';
     if (isset($_GET['q'])) {
          $keyword = $_GET['q'];   // q の値を取り出す
     }else{
          // 変数 q に何もセットされていない場合。
     }
?>

このようにすると、$keyword にその文字列を取り出せる。

URLクエリパラメータ(Query Parameter)、クエリストリング(Query String)などと呼ばれる手法だ。

 

複数個のデータを送信したい場合には、

?QueryParm1=文字列1&QueryParm2=文字列2&QueryParm3=文字列3

のように複数個のパラメータを連結すれば良い。

QueryParm1などのクエリパラメータの名前は自分で好きな名前を使う事が出来る。

 

これでサーバーサイドにデータを送信出来るので、サーバーサイドではその文字列を使って検索を実行する。

サーバーサイドで検索結果を表示するページを作成する時には、検索結果を埋め込むだけでは無く、検索欄にもこのキーワードを入力しておけば良い。

そうすると最終的にクライアントサイドで表示されるWEBページにはそのキーワードが再現される。

 

まあ、この手法は手っ取り早いのでよく使われる。ワテもよく使う。

欠点(と言うほどでも無いが)としては、サーバーサイドに送信したい文字列を毎回URLにパラメータとして連結する必要がある。その結果、沢山のデータを送りたい場合にはURLの文字列が数百文字とか数千文字などになる場合もある。

もしクライアントサイドだけで情報を保持したいなら

一方、サーバーサイドに情報を送る必要は無くて、クライアントサイドだけで情報を保持したいなら

  • Cookie
  • LocalStorage

などの機能をブラウザで実行されるJavaScriptから使うと、利用者さんのパソコンのハードディスクに様々なデータを記録しておく事も可能だ。

例えば、

Yahoo! JAPAN
あなたの毎日をアップデートする情報ポータル。検索、ニュース、天気、スポーツ、メール、ショッピング、オークションなど便利なサービスを展開しています。

を開いて、

右上のアイコンをクリックするとページの色合いを変えられる。

一度設定しておくと、その設定が恐らく Cookie か LocalStorage に保管されていて、その後はヤフーのページを訪問する度にその色で表示出来る。

 

これを応用すると、例えば、最初に説明したgoogle検索の場合にキーワードを復元する別のやり方が思い付く。

具体的には、検索を実行した時に LocalStorage にキーワードを保存しておく。

サーバーサイドでは検索結果のみページに埋め込む。

クライアントサイドで検索結果ページが表示された時に、事前に LocalStorageに保管しておいたキーワードを読み出して、

window.onload = function () {
     ここで検索欄のテキストボックスにキーワードを書き込む処理
}

などで可能である。

さて、お勧めなのは次の方法だ。

一回送信すればそのセッション期間中にはサーバーサイドで保持される変数

セッション変数と言う手法を使うと毎回データを送信する必要が無くなる。

つまり、クライアントサイドから何らかのデータをサーバーサイドに送信する。

それをサーバーサイドではセッション変数と言うものに保管しておく。

そうすると、しばらくの間はサーバーサイドではそのデータが保持されている。

ここで幾つか疑問が湧くと思う。

  • クライアントサイドからサーバーサイドにどうやってデータを送信するの?
  • しばらくの間と言うのはどれくらいの期間?

などである。

データの送信に関しては、ワテが知っている手法は以下の二つ。

  • 上でも説明したURLクエリパラメータの手法
  • JQuery のAjaxの機能を使ってデータをPostする手法

だ。

 

jQueryのAjaxについて

脇道に逸れるがAjaxは便利なのでワテもよく使う。

でも、初めてAjaxを勉強した頃は何のこっちゃ良く分からんかった。

Ajaxとはクライアントサイドから非同期でサーバーサイドに処理を投げる手法だ。

 

ワテ流にAjaxを説明すると、通常はWEBページでボタンや文字リンクをクリックすると、サーバーサイドでその新しいURLに遷移して画面表示が更新される。

入力欄などがあるページではそれらの内容はクリアされたり初期値が入る。

なので、冒頭のGoogle検索の例で説明したように、遷移前の画面に入力していたデータなどを復元したい場合には何らかの手法でそれを行う必要がある。

 

では、画面を遷移せずに、今表示しているページのhtml要素を部分的に更新したい。

そんな事が出来るのがAjaxだ。

つまり、例えばキーワード入力欄があるページで [ENTER] キー押下で何らかの検索結果をサーバーサイドでAjax方式で取得する。

その検索結果をページを遷移せずに現在表示しているページの中の特定の

 <div id="result"></div> 

に埋め込むなどがAjaxでは可能になる。

AjaxでHTMLページを部分的に更新する例

具体例としては、ワテが最近作った「パソコン自作シミュレーター」のページだ。

404 - ファイルまたはディレクトリが見つかりません。

多数のタブがあり、そのタブページ上に検索欄がある。

どのタブページで検索を実行しても、他のタブページの情報は保持したままにしたい。

そういう場合にはAjaxが適している(と思う)。

ページを遷移せずに、つまり全更新せすに部分的に更新できるのがAjaxである。

でもまあAjaxと言うのはクライアントサイドからサーバーサイドに非同期処理を投げる手法であり、ページを部分的に更新するのはその応用例の一つであると言うのが正しいかな。

つまりAjaxで検索実行すると、非同期処理なので数ミリから数秒くらい掛かって検索が実行され、検索が成功したらクライアントサイドの Ajax成功時にコールされる関数が呼び出される。

その関数内で、特定の div の innerHtml を変更する処理を入れれば良いのだ。

以上、ワテが理解しているAjaxの説明でした。

 

さてセッション変数の話題に戻るとしよう。

PHPでこのセッション変数を使う手法

さて、PHPでこのセッション変数を使う手法を覚えたので、備忘録としてメモしておく。

セッション変数を使うと、複数の利用者さんがWEBサーバーに接続していても、各ユーザーさんごとに、状態変数をサーバー側で一定期間保持出来るわけだ。

こんな感じか。

 

 

セッション変数を利用したい phpファイルの冒頭でこんな風にすると良い。

<?php
     if(session_id() === ''){
          session_start();  // セッションを開始すると言う意味かな?
     }
     if (isset($_SESSION['session_value'])) {
          // 他のphpファイルで既に設定されている場合なので何もしない。
     } else {
          $_SESSION['session_value'] = '初期値をここで入れても良い';
     }
?>

もし複数のphpファイルがある場合には、全てのphpファイルの冒頭でこの処理を実行すると誰かが最初に session_valueに初期値を代入する事になる。

ここで注意すべき点は(そんな誤解をする人はいないかもしれないが)、大勢の人が同時アクセスしていても session_value変数はそれぞれの人のセッションに応じて生成され、それらは全く独立しているので互いに関係しない。

つまり、Aさんのセッションで session_valueに設定した値が、Bさんのセッションの session_valueにも同じ値になるなどの心配は無い。

 

あとは、実際にこの session_valueを使って自分の好きな処理を行えば良い。

例えばクライアントサイドからデータが送られて来てそれを受け取ったphpファイルの中で、そのデータをこのセッション変数に代入しておけばよい。

<?php
     $_SESSION[' session_value '] = '自分で好きな値を代入する;
?>

そうすると、その値は全てのphpファイルで共有されるのであたかもグローバル変数のように扱えるのだ(ワテの理解では)。

PHPのセッションの特徴

このようにセッションとは、データを保存しておく仕組みのことである。

その特徴としては、リロードやスーパーリロードしたり、他のページに遷移してもデータは消えない。

他のページとは、そのサイト内の他のページでも良いし、他のサイトのページでも良い

兎に角、一つのセッションが開始すると、どのページに遷移しても一定期間はデータが保持されるのだ。

ただし、ブラウザを閉じるとセッションは終了するのでデータは消えてしまう。

それでもデータを保持したい場合には、cookie(クッキー)などを併用すると良い。

セッションの使用例としては、ワテが知っている範囲で以下のものがある。

ログイン機能

PHPのセッションはログイン機能を持つサイトを作成する場合に利用される。

そのサイト内でページが切り替わっても、ログイン状態はキープされる。

有効期限を設定すれば、その期限が過ぎると自動的にログアウトされる。

ショッピングカート

お買い物サイトで、自分の好きな商品を選んでショッピングカートへ入れる。

そのページが切り替わっても、商品はカートに入ったままだ。

セッションはページが切り替わっても、サーバー側に保存されているためショッピングカートのデータは残り続ける。

ワテの場合、電子部品の購入で幾つかのショッピングサイトを利用する。

  • 秋月電子
  • マルツ電子部品
  • 千石電商
  • RSコンポーネンツ
  • 共立エレショップ
  • アマゾン
  • Yahooショッピング
  • 楽天市場

その他いろいろ。

この中で共立エレショップさんは、セッションの期間が短いのが難点だ。

確か24時間だったかな。

今日何か買おうと思ってショッピングカートに入れていて、翌日発注しようとしたらカートが空って言う状況が良くある。

共立エレショップさん、セッションの期間を無制限にすれば売上が飛躍的に伸びると思うんだけどなあ。

PHPのセッション変数の有効期限

PHPで以下の処理を実行すると有効期限が得られる。

<?php
     echo 'session_cache_expire ='.session_cache_expire().'[分]';
?>

PHPの公式サイトの session_cache_expire の説明を見ると、

返り値

session.cache_expire の現在の設定を返します。 返り値は分単位で、デフォルトは 180 です。

引用元 http://php.net/manual/ja/function.session-cache-expire.php

実際に実行してみると、確かに180分だった。3時間か。

 session_cache_expire = 180[分]

 

PHPのセッション関数一覧

PHP: Sessions - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites i...

から引用すると、こんなに沢山ある。

 セッション関数  説明
 session_abort session 配列の変更を破棄してセッションを終了します
 session_cache_expire  現在のキャッシュの有効期限を返す
 session_cache_limiter 現在のキャッシュリミッタを取得または設定する
 session_commit  session_write_close のエイリアス
 session_create_id  Create new session id
 session_decode  セッションエンコードされた文字列からセッションデータをデコードする
 session_destroy  セッションに登録されたデータを全て破棄する
 session_encode  現在のセッションデータを、セッションエンコードされた文字列に変換する
 session_gc  Perform session data garbage collection
 session_get_cookie_params  セッションクッキーのパラメータを得る
 session_id  現在のセッション ID を取得または設定する
 session_is_registered  変数がセッションに登録されているかどうかを調べる
 session_module_name  現在のセッションモジュールを取得または設定する
 session_name  現在のセッション名を取得または設定する
 session_regenerate_id  現在のセッションIDを新しく生成したものと置き換える
 session_register_shutdown  セッションのシャットダウン関数
 session_register  現在のセッションに1つ以上の変数を登録する
 session_reset  session 配列を元の値で再初期化します
 session_save_path  現在のセッションデータ保存パスを取得または設定する
 session_set_cookie_params  セッションクッキーパラメータを設定する
 session_set_save_handler ユーザー定義のセッション保存関数を設定する
 session_start  新しいセッションを開始、あるいは既存のセッションを再開する
 session_status  現在のセッションの状態を返す
 session_unregister  現在のセッションから変数の登録を削除する
 session_unset  全てのセッション変数を開放する
 session_write_close セッションデータを書き込んでセッションを終了する

ワテの場合、今回初めて

 

  • session_start
  • session_cache_expire

の二つを使った。

それだけでも十分いろんな事が出来る。

具体的には、WordPressのWEBサイトにおいて、クライアントサイドからデータを送信してそれをPHP側のセッション変数に記憶するなどをやってみたらいい感じで出来た。

まとめ

ワテの場合

  • Visual Studio 2015 Community
  • PHP Tools for Visual Studio

を使っている。

この組み合わせで使うとVisual Studioで作成した各種のWEBプロジェクトにPHPファイルを追加した場合には、エディタの画面で見易く色表示がされ、デバッグも可能だ。

なおワテの場合、PHPのプログラミングは苦手である。

う~ん、理由は何というかその、PHPは

「JavaScriptのようでJavaScriptでない。」…… ベンベン

「C言語のようでC言語ではない。」…… ベンベン

「それは何かと尋ねたら、それはPHPだった。」

今一つ落ちがヘボイな。

ワテが「豊竹屋」を演じるにはまだまだ修行が足らん。

 

時代はPHP7だな。PHP5.6はもう古い。

スポンサーリンク
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

PHP
スポンサーリンク
シェアする
warekoをフォローする
スポンサーリンク

コメント