PHP実習:クッキーとセッション
クッキーとセッションの章が終わればあとはこの本の総まとめとその他実務的な話が出てくるだけということがわかったので、もう少し続けようと思います。
第12章-01
クッキーにデータを保存すれば、ページを移動してもデータを保持し続けることが可能になる。以下のコードを作成する。
<?php
// クッキーに保存
setcookie('email','sample@sample.com',time()+(60*60*24*30));
?>
<html>
<body>
<h1>クッキーの練習</h1>
<a href='cookie_check.php'>次のページへ</a>
<a hrel='cookie_delete.php'>クッキーの削除</a>
</body>
</html>
よくあるログイン用のアドレスを覚えておく仕組みはこれだけ。
setcookie()は引数を3つ必要とする。第1引数は取り出すときに指定するキー名、第2引数は保存する値、第3引数は有効期限である。有効期限はUNIXタイムスタンプという1970年からの秒数で指定する。time()で現在のタイムスタンプが取得できるので、それに60秒×60×24×30=30日の間データをキープし続けるよう命令している。
作成したcookieのデータを確認するには以下のcookie_check.phpを作成する。
<?php
var_dump($_COOKIE);
?>
<html>
<body>
<a href='index.php'>戻る</a>
</body>
</html>
この状態でindex.phpにアクセスし、cookie_check.phpへ飛ぶと
array(1) { ["email"]=> string(17) "sample@sample.com" }
と画面に表示される。クッキーはデータを配列として保存していることが分かる。つまり、echo $_COOKIE['email']というように個別に指定して参照することも可能である。$_COOKIEは$_POSTや$_GETと同じくスーパーグローバル変数なので、どのページからでもアクセスが可能となる。デベロッパーツールを開き、Applicationタグ>Cookieを確認すると、以下のようになっていることが分かる。
ブラウザがクライアントのパソコンの中にクッキーデータを保存しているということがわかる。つまり、他人が同じパソコンを操作すればクッキーデータを盗まれる恐れがあるということである。したがって、クッキーに保存するのは他人に見られても問題ないデータのみということになる。よくある「ログインIDを記憶する」というチェックボックスはログインIDをクッキーに保存するか否かを聞いているものである。また、セキュリティの観点からパスワードをクッキーで管理するのは大変危険である。
クッキーの削除については、以下のcookie_delete.phpのようにすればよい。
<?php
setcookie('email','',time()-3600);
var_dump($_COOKIE);
?>
<html>
<body>
<p>クッキーが削除されました。</p>
<a href="index.php">戻る</a>
</body>
</html>
クッキーを削除するためのコードは存在しない。そのため、setcookie()を使って第2引数を空文字、第3引数を現在時刻より前に設定して強制的に時間切れの状態を作ることで削除している。
また、クッキーの有効範囲を指定することもできる。デフォルトではドメインは以下全体で有効だが、第4引数に指定することで範囲を狭めることもできる。
setcookie('email','sample@sample.com',time()+(60*60*24*30),'/practice');
このようにすることで、ドメイン直下のpracticeというディレクトリでのみ有効になる。
第12章-02
セッションについて学ぶ。これを学ぶことで、ログイン認証や通販サイトのカートシステムを作れるように!
ブラウザのクッキーにセッションIDを持たせ、アクセス時にWebサーバーにそのIDで問い合わせを行い、セッション情報が見つかれば「こんにちは〇〇さん」と返す動きができるようになる。
セッションでは多次元配列が使えるので、下記コードを試す。
<?php
session_start();
$_SESSION['profile']=array('user_name'=>'taro','location'=>'関東');
$_SESSION['cart']['desk_01']=3;
$_SESSION['cart']['chair_07']=5;
?>
<html>
<body>
<h1>セッションの練習</h1>
<p><a href='session_check.php'>次のページへ</a></p>
<p><a href='session_delete.php'>セッションデータ削除</a></p>
</body>
</html>
セッションを使うときはプログラムの初めにsession_start()と書かなければならず、これによりセッションの仕組みが使用できるようになる。使い方はそのまま配列と同じで、ユーザーデータをまるごと格納することもできる。ログイン時などにデータベースからユーザーデータを引き出して置き、常に「こんにちは、~さん」などと表示することも可能。また、個別に値を代入することもできる。
セッションデータはいつでも引き出して使用できる。session_check.phpを作成して動作を確認する。
<?php
session_start();
var_dump($_SESSION);
次のページでもsession_start()を書かなければならない。
二次元配列になっていることが分かる。cookieを確認すると…
PHPSESSIDというクッキーを持っていることが分かる。IDのみをクライアントに残し、それを用いてサーバーに保管しているデータへアクセスする仕組み。
実際のサイトのようにセッションデータを取り出してHTML内でデータを出力してみる。session_check.phpを以下のように書き換え。
<?php
session_start();
//var_dump($_SESSION);
$profile=$_SESSION['profile'];
$cart=$_SESSION['cart'];
?><html>
<body>
<p>こんにちは、<?php echo $profile['user_name']; ?>さん</p>
<p>地域:<?php echo $profile['location']; ?></p>
<h1>カートの中身<h1>
<hr>
<table border="1">
<tr><th>商品ID</th><th>個数</th></tr>
<?php foreach($cart as $key=>$var): ?>
<tr align="center"><td><?php echo $key; ?></td><td><?php echo $var; ?></td></tr>
<?php endforeach; ?>
</table>
</hr>
<a href='index.php'>戻る</a>
</body>
</html>
このように表示される。
カートの情報を上書きする場合、後から$_SESSION['cart']['desk_01']=12;など、数字を代入するだけで自動的に上書きされる。削除は配列用の組み込み関数であるunset()を使用する。以下のようにコードを書けば指定したものだけの削除が可能。
session_start();
unset($_SESSION['cart']['desk_01']); // 商品データを削除
unset($_SESSION['profile']); // profile全体を削除
unset()で指定した階層以下の要素がすべて削除される。cartのdesk_01だけを個別に削除する、profileの配列全体を削除するという風に書いた。
最後に、セッションデータ全体の削除の仕方を確認する。session_delete.phpを以下のように作る。
<?php
session_start();
$_SESSION=array(); //配列初期化
$session_name=session_name(); // セッション名を取得
if (isset($_COKKIE[$session_name])===true) {
setcockie($session_name,'',time()-3600); // cookie削除
}
session_destroy(); //セッションに関連付けられたデータを削除
var_dump($_SESSION);
?><html>
<body>
<a href='index.php'>戻る</a>
</body>
</html>
まずは$_SESSIONを初期化(全体をunset()するイメージ)。次にsession_name()でデベロッパーツールで確認したクッキー名である「PHPSESSID」を取得し、クッキーに登録されたセッションIDを削除する。最後にsession_destroy()でまだサーバー上に残っているセッションデータを削除する。
第12章-02 練習問題
- セッションを開始し、キー「age」に36を、キー「email」にsample@sample.comを代入せよ。確認でセッションデータの出力まで行うこと。
- 1.で格納したセッションデータののうち、キー「age」の値を40に書き換えよ。また、キー「email」は削除せよ。確認のため、セッションデータの出力まで行うこと。
☆問1のために作成したindex.php
<?php
session_start();
$_SESSION['age']='36';
$_SESSION['email']='sample@sample.com';
$age=$_SESSION['age'];
$email=$_SESSION['email'];
?><html>
<body>
<h1>第12章-02 練習問題</h1>
<p>年齢:<?php echo $age; ?></p>
<p>メールアドレス:<?php echo $email; ?></p>
<a href='session_next.php'>次のページへ</a>
</body>
</html>
☆問2のために作成したsession_next.php
<?php
session_start();
$_SESSION['age']='40';
unset($_SESSION['email']);
$age=$_SESSION['age'];
//$email=$_SESSION['email'];
?><html>
<body>
<h1>第12章-02 練習問題</h1>
<p>年齢:<?php echo $age; ?></p>
<!-- <p>メールアドレス:<?php //echo $email; ?></p> -->
<a href='index.php'>前のページへ</a>
</body>
</html>
明日はクッキーとセッションの実習としてショッピングカートを作り、余裕があれば総まとめに入る。