PHP入門 | ページ遷移、Cookie、セッション | Cookie利用の基本

Webアプリケーションでは、継続的に何らかの情報を保存しなければならない場合がある。たとえばログイン情報を保持していなければ、ページは誰がアクセスしているのかわからなくなってしまう。そこで、ユーザーの情報を保持できるようにすることは、Webアプリケーションを作成するうえで非常に重要である。

そのための方法はいくつかあるが、「Webブラウザー側に情報を保存する」方法として使われるのが「Cookie」である。Cookieとは、ブラウザーに保存できる非常に小さなデータである。CookieはWebサイトごとに細かな情報をブラウザーへ保存できる。ここにデータを保管しておけば、必要に応じてデータを取り出して利用できる。

このCookieには、それほど大きなデータは保存できない。注意すべき点は、「保存できるCookieの数と最大サイズはブラウザーごとに異なる」ということである。おおよその最低ラインとして、「1つのサイトにつき最大20個、4096バイトまで」という条件は現在のブラウザーで明確なので、これ以下の量であれば問題ないだろう。Cookieに大きなデータを保存することは推奨されない。ブラウザーに保存されない場合があることを忘れないようにしよう。

Cookieを利用する場合、「読み込み」と「書き込み」で方法が異なるため注意しよう。まずCookieの書き込み、つまり保存にはsetcookieという関数を使う。これは次のように指定する。

setcookie(名前, 値, 破棄日時);

第1引数の名前は、保存するCookieの名前である。これは適当な名前を付けられる。第2引数は実際に保存される値である。第3引数は「そのCookieをいつ破棄するか」を指定する。これは破棄する時刻を示すタイムスタンプ、つまり1970年1月1日からの経過秒数の値を指定する。

この破棄日時の指定は省略できる。省略するか0を指定すると、そのCookieはブラウザー終了時に自動的に削除される。

続いてCookieの読み込みである。これはPHPのシステムが提供する連想配列$_COOKIEから読み取れる。次のように書く。

$変数 = $_COOKIE[Cookie名];

このように名前を指定してCookieを取り出せる。注意すべきなのは、$_COOKIEの値を変更してもCookie自体を変更できないという点である。つまり、値を読み込むことだけが可能である。以前の$_POSTなどと同じだ。

Cookieを使ってみよう

それでは、Cookieを使った例を見てみよう。

<?php
    if ($_POST != null){
        $str = $_POST['text1'];
        setcookie("mycookie",htmlspecialchars($str),time() + 60 * 1);
        header("Location: ./index.php");
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p>
            <?php
                $cookie = $_COOKIE['mycookie'];
                echo "Cookie情報: {$cookie}";
            ?>
        </p>
        <hr>
        <form method="post" action="./index.php">
            <input type="text" name="text1">
            <input type="submit" value="送信">
        </form>
        <hr>
    </body>
</html>

この例は、入力フィールドに書いたテキストをCookieに保存する例である。何かを書いて送信してみよう。Cookie情報に、保存されたCookieの内容が表示される。

ここではCookieの保存と読み込みが、それぞれ別の<?php ?>タグに書かれている。Cookie操作をしているのは次の部分である。

setcookie("mycookie",htmlspecialchars($str),time() + 60 * 10);

第3引数では、time関数で現在のタイムスタンプを取得し、そこに10分ぶんの秒数を加えている。つまり、「10分後に破棄する」設定にしている。そしてCookieの読み込みは次のように行う。

$cookie = $_COOKIE['mycookie'];

これでCookieの値が読み込まれる。もしそのCookieがすでに削除されている場合、値はnullになる。

ところで、Cookieを利用する場合には1つ注意すべき点がある。それは「setcookieした段階では、Cookieはまだ保存されていない」という点である。

CookieはHTTPヘッダーを使ってやり取りされる。setcookieは、実際にはヘッダーにCookie保存情報を追加する。したがって、これもheader関数と同じように、まだヘッダーが出力されていない時点で呼び出さなければならない。ヘッダーが送信された後にsetcookieを実行しても、Cookieへ保存することはできない。

setcookieでヘッダーにCookie情報が追加されると、それがブラウザーへ送信され、ブラウザー側で読み込まれたときにCookieが作成、保存される。そしてその後に該当サイトのページへアクセスすると、そのときブラウザーのCookie情報がWebサーバーへ送られ、$_COOKIEに保存された値を取得できるようになる。

つまり、setcookieを実行した時点ではCookieはまだ存在せず、次に訪問したときから取得できる。Cookieの値を変更する場合も同様で、変更は後で訪問したときに適用される。

上の例のコードを見ると、setcookieした後にheader関数を使って自分自身へページ移動していることがわかる。このようにすると、Cookieを保存した後にページを再訪問し、Cookieをすぐ利用できるようにしている。