Cookie

Cookie:入力されたIDを次回アクセス時まで覚える仕組み

  • クッキーは、保存できるデータのサイズや数がブラウザによって異なります
  • 多くのブラウザは、概ね「1サイト」につき、最大20個、4096バイトまでとなっています
  • クッキーには、有効期限があり、サーバのプログラム内で有効期限を設定する必要があります
  • クッキーの有効期限が過ぎると、自動的にクライアントのブラウザがそのクッキーを削除します

変数との違い

  • 入力されたIDを次回アクセス時まで覚える仕組み
  • いままで利用してきた変数は、保存期間に「Webページが表示されるまで」という制限があります
  • そこで利用するのが「クッキー」と「セッション」です


《input.php

<?php
if ( isset($_COOKIE[ 'my_id' ]) ) {
	$myId = $_COOKIE[ 'my_id' ];
} else {
	$myId = '';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>入力されたIDを次回アクセス時まで覚える</title>
<style>
h1 {
  font-size: 20px;
}
dt {
  font-weight: bold;
}
dd {
  margin-bottom: 30px;
}
</style>
</head>
<body>
<h1>入力されたIDを次回アクセス時まで覚える</h1>
<form action="cookie.php" method="post">
<dl>
<dt>ID</dt>
<dd><input type="text" name="my_id" id="my_id" size="25" value="<?php print $myId; ?>" autofocus placeholder="例:abcd 半角英字4文字"></dd>
<dt>パスワード</dt>
<dd><input type="password" name="password" id="password" size="25" placeholder="例:1234 半角数字4桁"></dd>
<dt>IDの保存</dt>
</dl>
<p><input type="checkbox" name="save" id="save" value="on"><label for="save">IDを保存する</label></p>
<input type="submit" value="送信する">
</form>
</body>
</html>
setcookie関数
  • クッキーは、スクリプトによる他のあらゆる出力よりも前に 送信される必要があります


setcookie ( クッキー名, 値, 保存期間, ディレクトリ, ドメイン, セキュア接続のみ, HTTPのみの接続 )


var_dump

  • 変数に関する情報をダンプする(引数として指定した変数の内容や命令の返値を画面上に出力)
  • 複数の変数や命令を確認したい場合は、引数をカンマで区切って指定することも出来ます
var_dump( $a, $b );


isset関数
  • 変数がセットされていること、そして NULL でないことを検査する
  • isset() はそれらすべてがセットされている場合にのみ TRUE を返します


empty と isset

  • empty() 無いかどうか
  • isset() あるかどうか
  • ある変数に値が代入されている場合に、それを「値が入っている」ということも「空ではない」ということもできます
  • 「空ではない」というのは、本来値が入っていなければならないものに、きちんと値が入っているかを確認する
  • 「値が入っている」というのは、空であってもかまわないが、現在はたまたま値が入っている


空の場合にエラーメッセージを表示する

  • empty


Cookieの情報があれば

  • isset

cookie.php

<?php
$myId = $_POST[ 'my_id' ];
$password = $_POST[ 'password' ];
$save = $_POST[ 'save' ];

// Cookieに保存
if ( $save == 'on' ) {
	setcookie( 'my_id', $myId, time() + 60 * 60 * 24 * 14);
	$message = 'ログイン情報を記録しました';
} else {
	setcookie( 'my_id' );
	$message = '記録しませんでした';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>入力されたIDを次回アクセス時まで覚える</title>
<style>
h1 {
  font-size: 20px;
}
</style>
</head>
<body>
<h1>入力されたIDを次回アクセス時まで覚える</h1>
<?php var_dump( $myId );  //IDの値が取得されているかチェック ?>
<p><?php print $message; ?></p>
<p><a href="./input.php">戻る</a></p>
</body>
</html>


ポイント

  • setcookie関数は、すべての先頭にプログラムを記述します
  • 3番目のパラメータまでで利用可能
  • 「保存期間」は、タイムスタンプ形式で指定(1970年1月1日からの経過秒数)
  • 60秒×60分×24時間×14日で2週間後を指定
  • 1番目のパラメータだけを指定した場合は、「その内容を削除する」関数に変わります
  • 「setcookie( 'my_id' );」で、チェックボックスにチェックが入っていない場合、Cookieの内容を削除しています
  • Cookieに情報が保存されると、「$_COOKIE」という特殊な配列で、それを取り出すことができます
  • isset関数を使って、Cookieの内容が保存されているかを確認します
  • 入っていれば、その値を変数に記憶させます
  • その内容おテキストフィールドの「value属性」に表示させれば、Cookieの内容が再現されることになります
  • 値を入力していない場合は、以下のように表示されます



Cookieのセキュリティ
  • setcookie関数の4番目以降のパラメータにセキュリティに関する設定があります


ディレクト

  • ここで設定したディレクトリ配下のみで有効になります


ドメイン

  • ここで設定したドメイン配下のみで有効になります


セキュア接続のみ

  • SSL接続のみ有効になります


HTTPのみの接続

  • JavaScriptなどからのアクセスはできなくなります

訪問回数の確認

《cookies1.php

<?php
  // 訪問回数を格納する変数
  $accessno = 0;
  
  // クッキー情報取得
  if ( isset( $_COOKIE[ "accessno" ]) ) {
      $accessno = $_COOKIE[ "accessno" ];
  }
  
  // 1回分の訪問回数加算
  $accessno++;
  
  //クッキー情報更新
  setcookie( "accessno", $accessno, mktime( 0,0,0,12,31,2020 ) );
  
  // 画面表示用メッセージをリクエストにセット
  $message = "";
  if( $accessno === 1) {
      $message = "はじめてのお越しですね!";
  } else {
      $message = $accessno . "回目のお越しですね!";
  }
  
  // 画面表示用PHP呼び出し
  require_once( "cookies2.php" );


《cookies2.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>クッキーのサンプル</title>
</head>
<body>
<h1>ようこそ!!</h1>
<h2>
<?=$message ?>
</h2>
</body>
</html>
クッキー情報取得
  • クッキー情報の取得は、「$_COOKIE」というPHPグローバル変数を使用します
  • この「$_COOKIE」は、連想配列になっており、キーにクッキーの名前を指定すると該当のクッキーの値を取得できます



$変数 = $_COOKIE[ クッキーの名前 ];

  • 指定したクッキーの名前でクッキー情報が取得できるか否かは、isset関数で判定します
クッキー情報の設定
  • クッキー情報をクライアント側に保存してもらうには、「setcookie関数」を使用します
  • setcookie関数の引数には、保存するクッキーの名前、クッキーの値、クッキーの有効期限(クッキーを破棄する日時)を設定します



setcookie( クッキーの名前 , クッキーの値 , クッキーの有効期限 );

  • 第3引数のクッキーの有効期限は、クッキーをいつ破棄するかの指定日時を示すタイムスタンプを指定します
  • 有効期限は省略可能ですが、省略したり、ゼロを指定すると、そのクッキーはブラウザが終了すると自動的に破棄されます