Chapter07 データの引き継ぎ

概要と目標 受け取ったデータを、
引き継ぎ出来るようになろう。

ユーザーが送信したデータは、受け取ったそのページでしか使えない。
ユーザーが送信したデータを他のページにも引き継ぎ出来るようになりましょう。

今回のゴール

RERUN

リダイレクト 別ページにジャンプする。

別ページにジャンプさせる場合は、header関数を使用する。
このheader関数は、リダイレクトするための関数ではなく、HTTPヘッダを送信する為の関数。
なお、全ての画面出力より先に記述する必要がある。
また、リダイレクト処理の後は exit関数 を使って、その後の処理を終了しておくとよい。

header関数 ・・・ クッキーに情報を保存する関数
header(ヘッダ文字列)

ヘッダ文字列:リダイレクトの場合は、「'Location: URL'」の形式で記述する。

詳細はPHPマニュアルを参照

exit関数 ・・・ 処理を終了する関数
exit(終了時のメッセージ)
          省略可

詳細はPHPマニュアルを参照

リダイレクトをやってみよう。

  1. 「chapter07」 › 「redirect」フォルダ内の「index.php」をテキストエディタで開く
  2. 下記のリダイレクトの処理を記述
chapter07/redirect/index.php
<?php
  // jump.htmlにリダイレクト
  header('Location: jump.html');
  // 処理の終了
  exit();
?>
  1. 上書き保存
  2. ブラウザで「chapter07」 › 「redirect」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter07/redirect/
ブラウザでの表示例

RERUN

HTTPはステートレス 1度受け取った情報は、
すぐ、忘れちゃう。

HTTPはリクエストとレスポンスから成り立っている。
WEBサーバでは状態を管理することは出来ない。

HTTPはステートレス
  1. HTTPはリクエストとレスポンス HTTPはリクエストとレスポンス。
  2. 1回目のリクエスト 1回目のリクエスト
  3. 1回目のレスポンス 1回目のレスポンス
  4. 2回目のリクエスト 2回目のリクエスト
  5. 2回目のレスポンス 2回目のレスポンス

情報の引き継ぎ どこかにデータを付けて、引き継ぐ。

複数のリクエスト間で情報を引き継ぐ方法は、以下の方法などがある。

  • URLのパラメータに引き継ぎたい情報を付ける
  • input要素のhiddenフィールドに引き継ぎたい情報を付ける
  • Cookieに引き継ぎたい情報を付ける
  • Sessionに引き継ぎたい情報を付ける

Cookieとは 引き継ぎたい情報を
ブラウザに保存する仕組み。

クッキーとは、サーバー側で引き継ぎたい情報を
クライアント側(ブラウザ)で保存する仕組みのこと。
会員証のようなもの。

クッキーとは
  1. HTTPはリクエストとレスポンス HTTPはリクエストとレスポンス。
  2. 1回目のリクエスト 1回目のリクエスト
  3. 1回目のレスポンス 1回目のレスポンス
  4. 2回目のリクエスト 2回目のリクエスト
  5. 2回目のレスポンス 2回目のレスポンス

Cookieの保存と削除 クッキーは、setcookie関数で保存。

クッキーは、setcookie関数を用いて保存や削除を行う。
setcookie関数は、全ての画面出力より先に記述する必要がある。

setcookie関数 ・・・ クッキーに情報を保存する関数
setcookie(クッキー名, 保存する値, 有効期限)
                          省略可

有効期限は、1970年1月1日からの経過ミリ秒で指定。省略した場合は、ブラウザを閉じるまでになる。
過去の日付にすると即削除できる。

詳細はPHPマニュアルを参照

time関数 ・・・ 1970年 1月1日からの経過ミリ秒返す関数
time()

詳細はPHPマニュアルを参照

クッキーにユーザー名を保存してみよう。

  1. 「chapter07」 › 「cookie」フォルダ内の「index.php」をテキストエディタで開く
  2. h1要素の下に、入力フォームを作成
chapter07/cookie/index.php
<form action="receive.php" method="post">
  <dl>
    <dt><label for="name">ユーザー名</label></dt>
    <dd>
      <input type="text" name="name" id="name">
    </dd>
    <dt><label for="password">パスワード</label></dt>
    <dd>
      <input type="password" name="password" id="password">
    </dd>
  </dl>
  <p><label><input type="checkbox" name="save" value="on" checked> ユーザー名を保存する</label></p>
  <p><input type="submit" value="ログイン"></p>
</form>
  1. 上書き保存
  2. 「chapter07」 › 「cookie」フォルダ内の「receive.php」をテキストエディタで開く
  3. ファイルの冒頭に、「ユーザー名を保存する」が「on」なら、クッキーにユーザ名を保存し、
    そうじゃなかったら、クッキーのユーザー名を削除する処理を記述
chapter07/cookie/receive.php
<?php
  // クッキーの保存と削除
  if ( isset($_POST['save']) && $_POST['save'] == 'on' ) {
    // クッキーの name に $_POST['name'] の値を 14日間保存
    setcookie('name', $_POST['name'], time() + 60 * 60 * 24 * 14); // 14日間(60秒 * 60分 * 24時間 * 14日)
    $msg = 'ユーザ名を保存しました。';
  } else {
    // クッキーの name の 値を削除 ・・・ 有効期限を過去にする
    setcookie('name', '', time() - 3600);
    $msg = 'ユーザ名を保存しませんでした。';
  }
?>
  1. h1要素の下に、メッセージを出力
chapter07/cookie/receive.php
<p><?php echo $msg; ?></p>
  1. 上書き保存
  2. ブラウザで「chapter07」 › 「cookie」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter07/cookie/
ブラウザでの表示例

RERUN

クッキーの読み込み クッキーにアクセスするための、
スーパーグローバル変数がある。

クッキーの読み込みはスーパーグローバル変数の $_COOKIE を用いる。

$_COOKIE ・・・ クッキーにアクセスするスーパーグローバル変数
$_COOKIE[クッキー名]

クッキーに保存した
ユーザー名を取得してみよう。

  1. 「chapter07」 › 「cookie」フォルダ内の「index.php」をテキストエディタで開く
  2. ファイルの冒頭に、クッキーにユーザー名が存在すれば変数に代入する処理を記述
chapter07/cookie/index.php
<?php
  $name = ''; // ユーザー名の初期値

  if ( isset($_COOKIE['name']) ) {
    // クッキーにユーザー名が保存されていれば変数を上書き
    $name = $_COOKIE['name'];
  }
?>
  1. ユーザー名の input要素に、value属性で初期値を追加
chapter07/cookie/index.php
<form action="receive.php" method="post">
  <dl>
    <dt><label for="name">ユーザー名</label></dt>
    <dd>
      <input type="text" name="name" id="name" value="<?php echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');?>">
    </dd>
    <dt><label for="password">パスワード</label></dt>
    <dd>
      <input type="password" name="password" id="password">
    </dd>
  </dl>
  <p><label><input type="checkbox" name="save" value="on" checked> ユーザー名を保存する</label></p>
  <p><input type="submit" value="ログイン"></p>
</form>
  1. 上書き保存
  2. ブラウザで「chapter07」 › 「redirect」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter07/cookie/
ブラウザでの表示例

RERUN

クッキーのセキュリティ
Cookieはセキュリティに考慮して利用しましょう。setcookie関数の第4引数以降にはセキュリティに関数する引数があります。
setcookie関数 ・・・ クッキーに情報を保存する関数
setcookie(クッキー名, 保存する値, 有効期限, ディレクトリ, ドメイン, セキュア接続のみ, HTTPのみの接続)
                                                省略可

詳細はPHPマニュアルを参照

  • ディレクトリ: ここに指定したディレクトリ配下のみ有効 (省略時はクッキーを設定したディレクトリ)
  • ドメイン: ここに指定したドメイン配下のみ有効
  • セキュア接続のみ: SSL接続のみ有効
  • HTTPのみの接続: JavaScriptなどからのアクセス不可
// dummy.com の php-lessonss ディレクト配下にSSL接続のみ有効。(JavaScriptなどからのアクセス不可)
setcookie('name', $_POST['name'], time() + 60 * 60 * 24 * 14, '/php-lessons/', 'dummy.com', true, true);

Sessionとは 引き継ぎたい情報を、
サーバー側で保存する仕組み。

引き継ぎたい情報を、サーバー側で保存する仕組み。

セッションとは
  1. HTTPはリクエストとレスポンス HTTPはリクエストとレスポンス。
  2. 1回目のリクエスト 1回目のリクエスト
  3. 1回目のレスポンス 1回目のレスポンス
  4. 2回目のリクエスト 2回目のリクエスト
  5. 2回目のレスポンス 2回目のレスポンス

Sessionの開始 セッションを使う時は、
セッションを開始する。

セッションを利用する全てのページは、session_start関数でセッションを開始する。
session_start関数は、全ての出力に関する記述より先に記述する必要がある。

session_start関数 ・・・ セッションを開始する関数
session_start()

詳細はPHPマニュアルを参照

セッションを開始してみよう。

  1. 「chapter07」 › 「session」フォルダ内の「index.php」をテキストエディタで開く
  2. h1要素の下に、入力フォームを作成
chapter07/session/index.php
<form action="receive.php" method="post">
  <dl>
    <dt><label for="name">ユーザー名</label></dt>
    <dd>
      <input type="text" name="name" id="name">
    </dd>
    <dt><label for="password">パスワード</label></dt>
    <dd>
      <input type="password" name="password" id="password">
    </dd>
  </dl>
  <p><input type="submit" value="ログイン"></p>
</form>
  1. 上書き保存
  2. 「chapter07」 › 「session」フォルダ内の「receive.php」をテキストエディタで開く
  3. ファイルの冒頭でセッションを開始する
chapter07/session/receive.php
<?php
  // セッションの開始
  session_start();
?>

Sessionの読み書き セッションにアクセスするための、
スーパーグローバル変数がある。

セッションの読み書きはスーパーグローバル変数の $_SESSION を用いる。

$_SESSION ・・・ セッションにアクセスするスーパーグローバル変数
$_SESSION[キー]

セッションにデータを保存してみよう。

  1. 「chapter07」 › 「session」フォルダ内の「receive.php」をテキストエディタで開く
  2. セッションの開始処理の下に、ログイン用のユーザー名とパスワードを変数に代入しておく
chapter07/session/receive.php
<?php
  // セッションの開始
  session_start();

  // ログインユーザーを変数で管理
  $name = 'dummy'; // お好きなユーザー名に変更
  $password = 'dummy'; // お好きなパスワードに変更
?>
  1. ?>の手前で、ログインのチェックを行い、ログインに成功したらセッションにユーザー名を保存
chapter07/session/receive.php
<?php
  // セッションの開始
  session_start();

  // ログインユーザーを変数で管理
  $name = 'dummy'; // お好きなユーザー名に変更
  $password = 'dummy'; // お好きなパスワードに変更

  // ログインに成功したらセッションに保存
  if ( $_POST['name'] == $name && $_POST['password'] == $password  ) {

    // セッションにユーザ名を格納
    $_SESSION['name'] = $_POST['name'];

    $msg = 'ようこそ' . $_SESSION['name'] . 'さん';

  } else {
    // ログイン失敗
    $msg = 'ログイン出来ませんでした。';
  }
?>
  1. h1要素の下に、メッセージを出力
chapter07/session/receive.php
<p><?php echo htmlspecialchars($msg, ENT_QUOTES, 'UTF-8'); ?></p>
  1. 上書き保存

セッションのデータを使ってみよう。

セッションは、他のページからもそのセッションに保存されたデータを利用することが出来る。

  1. 「chapter07」 › 「session」フォルダ内の「mypage.php」をテキストエディタで開く
  2. ファイルの冒頭にで、セッションを開始し、
    セッションにデータが無ければリダイレクトさせる
chapter07/session/mypage.php
<?php
  // セッションの開始
  session_start();

  // ログインチェック
  if ( !isset($_SESSION['name']) || empty($_SESSION['name']) ) {
    // ログインしていない

    // ログインフォームへリダイレクト
    header('Location: ./');
    exit;
  }
?>
  1. h2要素の下に、セッションの中身を表示
chapter07/session/mypage.php
<dl>
  <dt>ユーザー名</dt>
  <dd>
    <?php echo htmlspecialchars($_SESSION['name'], ENT_QUOTES, 'UTF-8'); ?>
  </dd>
</dl>
  1. 上書き保存
  2. ブラウザで「chapter07」 › 「session」フォルダ内の「index.php」にアクセスし、ログインに成功した時、ユーザー名がセッションに保存されていることを確認
    http://localhost/php-lessons/chapter07/session/
ブラウザでの表示例

RERUN

Sessionの破棄 セッション破棄する時は、
きちんと消そう。

セッションの破棄は session_destroy関数 を用いる。
ただし、$_SESSIONのデータや、クッキにー保存されているセッションIDは、
削除されない
ので予め削除しておく必要がある。
なお、セッションIDが保存されている、クッキーの部屋名は、
session_name関数で知ることができる。

session_destroy関数 ・・・ セッションを破棄する関数
session_destroy()

詳細はPHPマニュアルを参照

session_name関数 ・・・ セッション名を取得・設定する関数
session_name(設定するセッション名)
                  省略可

詳細はPHPマニュアルを参照

セッションのデータを消してみよう。

  1. 「chapter07」 › 「session」フォルダ内の「logout.php」をテキストエディタで開く
  2. 下記のセッションを破棄する一連の処理を記述
chapter07/session/logout.php
<?php
  // セッションの開始
  session_start();

  // セッションの初期化で、値を削除
  $_SESSION = array();

  // クッキーのセッションIDを削除
  setcookie(session_name(), '', time() - 3600);

  // セッションの破壊
  session_destroy();

  header('Location: ./');
  exit();
?>
  1. 上書き保存
  2. ブラウザで「chapter07」 › 「session」フォルダ内の「index.php」にアクセスし、ログアウトできるか確認
    http://localhost/php-lessons/chapter07/session/
ブラウザでの表示例

RERUN

練習問題ブラウザを閉じるまで有効な、
自分のアクセスカウンタ。

「training」フォルダ内の「index.php」と「reset.php」を開き
下記の問題を解いて下さい。

ブラウザでの完成例

RERUN

「index.php」の問題

    • リンク先: "reset.php"

「reset.php」の問題

解答例
chapter07/training/index.php
<?php
// セッションの開始
session_start();

// カウンターの初期値
$counter = 0;
if ( isset($_SESSION['count']) ) {
  // セッションに データがあれば セッションのデータを代入
  $counter = $_SESSION['count'];
}

// カウンターのカウントアップ
 $counter++;

 // セッションに保存
 $_SESSION['count'] = $counter;

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>練習問題7</title>
</head>
<body>
  <h1>アクセスカウンタ</h1>
  <p>あなたはこのページを <?php echo htmlspecialchars($counter, ENT_QUOTES, 'UTF-8'); ?>回見ています。</p>

  <p><a href="reset.php">カウンターのリセット</a></p>

解答例は全問題のチェックボックスが on になるとご覧いただけます。

chapter07/training/reset.php
<?php
  // セッションの開始
  session_start();

  // セッションの初期化で、値を削除
  $_SESSION = array();

  // クッキーのセッションIDを削除
  setcookie(session_name(), '', time() - 3600);

  // セッションの破壊
  session_destroy();

  header('Location: ./');
  exit();
?>

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめ データはどこかに付けて引き継ぐ。

HTTPはステートレス。受け取ったそのページでしか使えない。
他のページでも受け取ったデータを使う場合は、どこかにデータを付けて引き継ぐ必要がある。

  • HTTPはステートレス。
  • Cookieや、Sessionに保存してデータを引き継ぐ。
  • 別ページにジャンプする場合は、リダイレクトする。