UPDATE:2020年06月20日
PHP $_COOKIE(クッキー変数)のすべて!【初心者向け基本】
$_COOKIE(クッキー変数)簡単まとめ
$_COOKIE(クッキー変数)とは
- $_COOKIE は PHPの定義済み変数(=スーパーグローバル変数)の1つ
- $_COOKIE は Cookie(クッキー)システムによってHTTP クッキーから渡された値の変数
- $_COOKIE は 連想配列として使用する
- $_COOKIE は、関数やメソッドの内部で使用する場合、global $_COOKIE; とする必要がない
クッキー(Cookie)の仕組み
- クッキー(Cookie)とは、ウェブサーバーとウェブブラウザの間で状態を管理する機構、
または機構による保存データ自体のこと - クッキー(Cookie)は、ユーザーとサーバー間の状態を管理する機能を提供する
- クッキー(Cookie) は、固有のユーザを識別できる
- クッキー(Cookie)の送信と削除には、setcookie()関数を使用する
- setcookie()関数はすべての出力の前に設定するヘッダー(header)情報、<DOCTYPE>タグ、<html>タグ、空白、echo、print などより前にコールする
- setcookie()関数では、name,value,expire,path,domain,secure,httponlyを指定する
※name以外省略可能 - setcookie()関数が成功するとTRUEを返し、失敗するとFALSEを返す
- クッキー(Cookie)の受信には、スーパーグローバル変数 $_COOKIE を使用する
- ブラウザに保存されているクッキー(Cookie)はPHPの$_COOKIEへ自動的に格納される
- クッキー(Cookie)による保存データはテキストデータのみ
- クッキー(Cookie)をブラウザへ送信する際は、あらゆる出力の前に行う
COOKIE(クッキー)を利用してみる
setcookie()関数 と クッキーデータの登録と呼び出し
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php setcookie('wepicksCookieData','「name:wepicksCookieData」のクッキーとして保存する文字列データです。'); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>クッキー</title> </head> <body> <?php if(empty($_COOKIE['wepicksCookieData'])){ echo 'ブラウザを更新して下さい。'; }else{ echo '$_COOKIE[\'wepicksCookieData\']の出力:'.$_COOKIE['wepicksCookieData']."<br>\n"; } ?> </body> </html> |
setcookie() をコールしてクッキーにデータを登録します。setcookie()の利用方法は以降で詳しく説明します。気を付けることは、setcookie()をあらゆる出力の前に記述することです。次に、クッキー変数を echo で呼び出します。echo $_COOKIE['wepicksCookieData'];。登録した $_COOKIE['wepicksCookieData'] の内容は、ページ遷移などしても呼び出し可能です。期限を指定しなければ、基本的にブラウザを閉じるまで登録したクッキーデータは生きています。
$_COOKIE(クッキー変数)とは
- $_COOKIE は PHPの定義済み変数(=スーパーグローバル変数)の1つ
- $_COOKIE は Cookie(クッキー)システムによってHTTP クッキーから渡された値の変数
- $_COOKIE は 連想配列として使用する
- $_COOKIE は、関数やメソッドの内部で使用する場合、global $_COOKIE; とする必要がない
$_COOKIEは、PHPの定義済み変数のクッキー変数です。この変数は、現在のスクリプトへCookie(クッキー)システムによってHTTP クッキーから渡された値の変数です。
HTTPとは、ウェブブラウザとウェブサーバの間でHTMLなどのコンテンツの送受信に用いられる通信プロトコル(通信方法、通信規約というようなものです)のことです。
$_COOKIEは、連想配列で使用します。
$_COOKIEは、スーパーグローバル変数なので、スクリプトのコード中どこからでも使用することが出来る変数です。関数やメソッドの内部で使用する場合にも global $_COOKIE; とする必要はありません。
$_COOKIEはPHPの定義済み変数
PHPの定義済み変数はスーパーグローバル変数とも言います。
$_COOKIE = PHPの定義済み変数 = スーパーグローバル変数
また、$_COOKIEは自動グローバル変数とも呼ばれます。
(PHPには定義済みの定数というものもあります。詳細はこちらを参照下さい。)
PHPの定義済み変数(=スーパーグローバル変数)
$GLOBALS (グローバル変数) | ・グローバルスコープで使用可能なすべての変数への参照 ・連想配列として使用 |
---|---|
$_SERVER (サーバー変数) | ・サーバ情報および実行時の環境情報 ・連想配列として使用 |
$_GET (ゲット変数) | ・HTTP GET 変数 ・連想配列として使用 |
$_POST (ポスト変数) | ・HTTP POST 変数 ・連想配列として使用 |
$_FILES (ファイル変数) | ・HTTP ファイルアップロード変数 ・連想配列として使用 |
$_REQUEST (リクエスト変数) | ・HTTP リクエスト変数 ・連想配列として使用 |
$_SESSION (セッション変数) | ・セッション変数 ・連想配列として使用 |
$_ENV (環境変数) | ・環境変数 ・連想配列として使用 |
$_COOKIE (クッキー変数) | ・HTTP クッキー ・連想配列として使用 |
これら、PHPの定義済み変数は、プログラムコード中何処からでも使用することができます。関数の内部でも globalキーワードを使用せず呼び出すことが出来ます。このように、スーパーグローバル変数は非常に便利なものです。
通常、変数には有効範囲などのルールがあります。このルールは、PHPにおいて変数のスコープという宣言の場所とそれによる有効範囲として定められています。スコープには、「グローバルスコープ」「ローカルスコープ」「スタティック変数」「関数の引数」の4種類ありますが、これらすべてのスコープを持っているのがスーパーグローバル変数です。
変数のスコープについてはこちらを参照下さい。
※注意2:
ただし、スーパーグローバル変数は、関数やクラスメソッドの中の 可変変数 として使用することはできません。
可変変数についてはこちらを参照下さい。
クッキー(Cookie)とは
- クッキー(Cookie)とは、ウェブサーバーとウェブブラウザの間で状態を管理する機構、または機構による保存データ自体のこと
- クッキー(Cookie)は、ユーザーとサーバー間の状態を管理する機能を提供する
- クッキー(Cookie) は、固有のユーザを識別できる
HTTPプロトコル(通信方法、通信規約)はユーザーとサーバー間の状態を管理してくれる機能はなく、ステートレス(状態を保持しない)なプロトコルです。ウェブアプリケーションはユーザーとサーバー間の状態を管理してステートフル(状態を保持する)なサービスを提供する必要があります。HTTPとは、ウェブブラウザとウェブサーバの間でHTMLなどのコンテンツの送受信に用いられる通信プロトコル(通信方法、通信規約というようなものです)のことです。
例えばショッピングカートの場合を考えて見ましょう。
オンラインショップでは多数の商品が取り揃えられており、ユーザーは、検索機能を利用したりバナーやナビゲーションなどをクリックして目的の商品や興味のある商品を探します。探し当てた商品をその場で一々決済手続きしたり、商品ページのURLや商品名をメモなどして再度そのページへ戻ってきて商品を検討するなどということでは購入手続きが煩わしくなります。そこで、オンラインショップでは、ユーザー専用のショッピングカート機能を提供し、商品を一時的に保存できるようにします。一通り商品を閲覧した後で、選択した商品内容を再度確認したり、数量を変更したり、商品を削除したり、ショッピングカート内で精査することが出来ます。精査後、ショッピングカートに残っている商品の決済手続きや配送手続きなどを纏めて行うとができます。このようなショッピングカート機能を実現すには、ユーザーを特定し、ユーザーとサーバー間の状態を保持する機能が必要です。
そこで、クッキー(Cookie)が活躍します。
クッキー(Cookie)は、ユーザー(ウェブブラウザ)とウェブサーバー間の状態を管理する機能を提供します。HTTPプロトコルの拡張で、Set-Cookieレスポンスヘッダ と Cookieリクエストヘッダ という2つのHTTPヘッダから成り立ちます。クッキーは、サイトを訪れたユーザーのブラウザに文字列データを格納したり、再度サイトを訪問したユーザーを特定したりする機能を提供します。
クッキー(Cookie)は厳密にはHTTP cookie(エイチティーティーピークッキー、単にCookieとも表記される)といいます。
クッキー(Cookie)はHTTP通信によってウェブサーバとウェブブラウザの間で状態を管理する機構です。或いは、このシステムによってウェブサーバーとウェブブラウザとの通信で、ウェブブラウザに保存された情報それ自体のことを示します。つまり、ウェブサーバーとウェブブラウザ間での情報の通信・管理・保存データ等のことをクッキー(Cookie)といいます。
サーバーとユーザー間での情報の通信と保存が可能なので、固有のユーザを識別することができます。固有のユーザーを識別できるということは、例えば、ホームページへの訪問階数をユーザー毎に表示させたり、ユーザーのログイン状態を維持させたり、ショッピングカート機能を実装したりすることが可能になるということです。
クッキー(Cookie)の送信・削除・受信 クッキー関数の setcookie() と $_COOKIE
- クッキー(Cookie)の送信と削除には、setcookie()関数を使用する
- setcookie()関数はすべての出力の前に設定するヘッダー(header)情報、<DOCTYPE>タグ、<html>タグ、空白、echo、print などより前にコールする
- setcookie()関数では、name,value,expire,path,domain,secure,httponlyを指定する※name以外省略可能
- setcookie()関数が成功するとTRUEを返し、失敗するとFALSEを返す
- クッキー(Cookie)の受信には、スーパーグローバル変数 $_COOKIE を使用する
- ブラウザに保存されているクッキー(Cookie)はPHPの$_COOKIEへ自動的に格納される
クッキー(Cookie)の送信や削除を行うには、「setcookie()」関数を使用します。また、この関数はブラウザへのあらゆる出力の前にコールする必要があるます。ヘッダー(header)情報、<DOCTYPE>タグ、<html>タグ、空白、echo、print などより前にコールして下さい。
クッキー(Cookie)を受信するにはスーパーグローバル変数 $_COOKIE を使用します。ブラウザに保存されているクッキー(Cookie)は$_COOKIEへ自動的に格納されます。$_COOKIEは連想配列として使用します。$_COOKIE['クッキー名']という形でデータを出力します。
setcookie()関数
論理値 = setcookie(name [, value [, expire [, path [, domain [, secure [, httponly]]]]]]);
//[ ]省略可
引数 | 内容 |
---|---|
name (string) | クッキーの名前を指定します。名前は一意です。空白やセミコロンは使用できません。この名前は$_COOKIEで値を出力する際のキー名として使用します。名前が「tryphpCookie」だった場合は、$_COOKIE['tryphpCookie']で取得します。 |
value (string) | 保存するクッキーの値を指定します。クライアント(ウェブブラウザ)に保存されるクッキーのデータです。保存可能なのは文字列データのみです。容量制限はありませんが、4KB以下が目安です。この値はPHPのスパーグローバル変数 $_COOKIE で取得できます。 |
expire (int) | クッキーの有効期限をUnixタイムスタンプで指定します。「time()+60*60*24*30」とした場合、30日後まで有効となります。「time()-1800」マイナスを指定するとクッキーデータが削除されます。有効期限を指定しない場合は、ブラウザを閉じた時点でクッキーが削除されます。 |
path (string) | サーバー上のクッキーを有効とするパスを指定します。「/」とした場合、ドメイン以下すべてでクッキーが有効になります。「/dir/」とした場合、 dir ディレクトリ以下すべてで有効になります。 |
domain (string) | クッキーを有効とするドメイン(domain)を指定します。このドメイン配下のときのみクライアントへクッキーが送信されます。 |
secure (bool) | SSLの有無の設定。「TRUE」にするとクライアントからHTTPS接続されたときのみクライアントへクッキーが送信されるようになります。デフォルトでは「FALSE」です。 |
httponly (bool) | HTTPからのみ接続を有効とする指定です。「TRUE」にするとHTTPを通してのみクライアントのクッキーにアクセスできるようになります。javascriptからはアクセスできません。 |
クッキー送信の例
setcookie()関数をコールしてクッキーを送信します。送信された内容はクッキーに登録され、$_COOKIE で呼び出すことが出来ます。注意すべきことは、setcookie()関数は、あらゆる出力の前に記述しなければならないことです。ヘッダー(header)情報、<DOCTYPE>タグ、<html>タグ、空白、echo、print などより前です。
1 2 3 4 5 6 | <!-- サンプルコード --> <?php setcookie('tryphpCookie1','「name:tryphpCookie1」のクッキーとして保存する文字列データです。'); setcookie('tryphpCookie2','「name:tryphpCookie2」のクッキーとして保存する文字列データです。', time()+3600);//有効期限は1時間 setcookie('tryphpCookie3','「name:tryphpCookie3」のクッキーとして保存する文字列データです。', time()+(60*60*24)*7, '/code-example/php/', 'wepicks.net', FALSE, TRUE); ?> |
※3つ目の tryphpCookie3 は、サーバー上のクッキーを有効とするパス(/code-example/php/)とドメイン(wepicks.net)を指定します。自身の環境に合わせて書き換えてみて下さい。
クッキー取得の例
登録したクッキーの内容は、スーパーグローバル変数 $_COOKIE で取得します。連想配列のキー名はクッキー名を使用します。
1 2 3 4 5 6 | <!-- サンプルコード --> <?php echo '$_COOKIE[\'tryphpCookie1\']の出力:'.$_COOKIE['tryphpCookie1']."<br>\n"; echo '$_COOKIE[\'tryphpCookie2\']の出力:'.$_COOKIE['tryphpCookie2']."<br>\n"; echo '$_COOKIE[\'tryphpCookie3\']の出力:'.$_COOKIE['tryphpCookie3']."<br>\n"; ?> |
結果は
$_COOKIE['tryphpCookie2']の出力:「name:tryphpCookie2」のクッキーとして保存する文字列データです。
$_COOKIE['tryphpCookie3']の出力:「name:tryphpCookie3」のクッキーとして保存する文字列データです。
となります。
クッキー(Cookie)の制約
- クッキー(Cookie)による保存データはテキストデータのみ
- クッキー(Cookie)をブラウザへ送信する際は、あらゆる出力の前に行う
クッキー(Cookie)により保存することができるのはテキストデータのみです。バイナリデータ(画像などを扱うデータ形式)は保存できません。
また、クッキー(Cookie)はHTTPヘッダーの一部なので、<DOCTYPE~>や<html>を記述する前、echoやprintで出力する前、に送信する必要があります。、つまり、ブラウザに何らかの出力を行う前、空白も含めあらゆる出力よりも前にコールしなければなりません。 この制約は、header()関数 に課されているものと同じです。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <!-- サンプルコード --> <?php //クッキーの名前 $iCkeName = 'tryphpCookieName'; //クッキーが有効なサイト上のパス $sPath = '/'; //クッキーが有効なドメイン $sDomain = 'wepicks.net'; //クッキーがない場合セットする if(!isset($_COOKIE['tryphpCookieName']) && !isset($_POST['cookiedel'])){ //クッキーの値 $sCkeValue = date('Y-m-d H:i:s').'にtryphpで作成したcookieの値です。'; //有効期限は7日間 $iCkeTimeOut = time()+(60*60*24)*7; //クッキーセット setcookie($iCkeName, $sCkeValue, $iCkeTimeOut, $sPath, $sDomain); } //クッキーの削除 if(isset($_POST['cookiedel'])){ //クッキーの値 空に設定 $sCkeValue = ''; //有効期限は7日間 $iCkeTimeOut = time()-1800; //クッキー削除 時間を-にすると削除できる setcookie($iCkeName, $sCkeValue, $iCkeTimeOut, $sPath, $sDomain); //削除後このページにジャンプ クッキーが削除後の状態になる header('Location: https://wepicks.net/code-example/php/3-5-11.php'); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <meta name="robots" content="index"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <?php //クッキー変数がなければ リフレッシュする if(!isset($_COOKIE['tryphpCookieName'])) echo '<meta http-equiv="REFRESH" content="3;URL=https://wepicks.net/code-example/php/3-5-11.php">'; ?> <head> <title>TRYPHP! PHPの変数 $_COOKIE ( クッキー変数 )</title> </head> <body> <h1>PHPの変数 $_COOKIE ( クッキー変数 )</h1> <!-- 説明ページ --> <h3><a href="https://wepicks.net/2011/10/27/phpref-cookie/">→説明はこちら</a></h3> <hr/> <h2>サンプルコード実行</h2> <div style="background-color:#f8f8f8;margin:20px; padding:20px; border:solid #cccccc 1px;"> <!-- // =========================== ここから =========================== --> <h3>クッキー変数呼び出し</h3> <?php //クッキーがない場合 if(!isset($_COOKIE['tryphpCookieName'])){ echo "クッキーはセットされていません。<br>\n"; echo "REFRESHして出力します。3秒後・・・<br>\n"; //クッキーの呼び出し }else{ echo '$_COOKIE[\'tryphpCookieName\']の値は <b>[ '.$_COOKIE['tryphpCookieName']." ]</b> です。<br>\n"; ?> <form action="https://wepicks.net/code-example/php/3-5-11.php" method="post"> <input type="hidden" name="cookiedel" value="cookiedel"> <input type="submit" value="クッキーを削除する"> </form> <?php } ?> <!-- =========================== ここまで =========================== // --> </div> <hr/> </body> </html> |
タグ(=記事関連ワード)
日付
最終更新日:2020年06月20日