LoginSignup
0
0

【PHP/MySQL】クッキーをWebサイトに食べさせる。

Last updated at Posted at 2024-02-25

前回の記事で、SQLを組み込んだホームページを全世界に公開しました。
そのあと、まだ試しておく事が沢山ありますので、順次対応します。
本日はクッキーの設定です。
前回の記事のソースを修正していきます。

1.イメージ

taiju.php、writetaiju.phpの2つのソースを修正します。

image.png

2.実装

「クッキーを読み込んでフォームの名前を設定する from」「クッキーを読み込んでフォームの名前を設定する to」のコメントでくくられた所が修正対象です。

(1).書き込み処理

writetaiju.php
<?php
  // データの受け取り
  $title = $_POST['title'];
  $taiju = $_POST['taiju'];
  $memo = $_POST['memo'];

  // 必須項目チェック(体重が空ではないか?)
  if ($taiju == ''){
    header("Location: taiju.php");  // 空のときtaiju.phpへ移動
    exit();
  }

  // 必須項目チェック(体重は3桁の数字か?
  if (!preg_match("/^[0-9]{3}$/", $taiju)){
    header("Location: taiju.php");  // 書式が違うときtaiju.phpへ移動
    exit();
  }

  // 名前をクッキーにセット 2024/02/25 from
  setcookie('memo',$memo,time() + 60*60*24*30);
  // 名前をクッキーにセット 2024/02/25 to


  // DBに接続:Webサーバー
  $dsn = 'mysql:host=mysql212.phy.lolipop.lan;dbname=*********-test;charset=utf8';
  $user = '*******';
  $password = '********'; // tennisuserに設定したパスワード


  // DBに接続
  //$dsn = 'mysql:host=localhost;dbname=tennis;charset=utf8';
  //$user = 'tennisuser';
  //$password = 'password'; // tennisuserに設定したパスワード

  try {
    // PDOインスタンスの作成
    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    // プリペアドステートメントを作成
    $stmt = $db->prepare("
      INSERT INTO taiju(title,taiju,memo)
      VALUES (:title, :taiju,:memo)"
    );
    // プリペアドステートメントにパラメータを割り当てる
    $stmt->bindParam(':title', $title, PDO::PARAM_STR);
    $stmt->bindParam(':taiju', $taiju, PDO::PARAM_STR);
    $stmt->bindParam(':memo', $memo, PDO::PARAM_STR);
    // クエリの実行
    $stmt->execute();

    // taiju.phpに戻る
    header('Location: taiju.php');
    exit();
  } catch (PDOException $e){
    exit('エラー:' . $e->getMessage());
  }
?>

ここで、DBに登録する値であるmemoを、クッキーにセットします。
有効期限は1か月。秒単位で表現するみたいですね。

  // 名前をクッキーにセット 2024/02/25 from
  setcookie('memo',$memo,time() + 60*60*24*30);
  // 名前をクッキーにセット 2024/02/25 to

(2).読み込み・ページ表示処理

taiju.php
<?php

  // クッキーを読み込んでフォームの名前を設定する from
  if (isset($_COOKIE['memo'])){
    $memo = $_COOKIE['memo'];
  } else {
    $memo = "";
  }
  // クッキーを読み込んでフォームの名前を設定する to


  // 1ページに表示される書き込みの数
  $num = 10;
  $test = 'abcd';

  // DBに接続:Webサーバー
  $dsn = 'mysql:host=mysql212.phy.lolipop.lan;dbname=********-test;charset=utf8';
  $user = '********';
  $password = '*******'; // tennisuserに設定したパスワード

  // DBに接続:ローカル
  //$dsn = 'mysql:host=localhost;dbname=tennis;charset=utf8';
  //$user = 'tennisuser';
  //$password = 'password'; // tennisuserに設定したパスワード


  // GETメソッドで2ページ目以降が指定されているとき
  $page = 1;
  if (isset($_GET['page']) && $_GET['page'] > 1){
    $page = intval($_GET['page']);
  }

  try {
    // PDOインスタンスの生成
    $db = new PDO($dsn, $user, $password);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    // プリペアドステートメントを作成
    $stmt = $db->prepare("SELECT * FROM taiju ORDER BY title DESC LIMIT :page, :num");
    // パラメータを割り当て
    $page = ($page-1) * $num;
    $stmt->bindParam(':page', $page, PDO::PARAM_INT);
    $stmt->bindParam(':num', $num, PDO::PARAM_INT);
    // クエリの実行
    $stmt->execute();
  } catch (PDOException $e){
    exit("エラー:" . $e->getMessage());
  }
?>
<!doctype html>
<html lang="ja" >
  <head>
    <title>体重っち</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
  </head>
  <body>

    <!--
    <?php include('navbar.php'); ?>
    -->

    <main role="main" class="container" style="padding:60px 15px 0">
      <div>
        <!-- ここから「本文」-->

        <h1>体重メモ</h1>
        <form action="writetaiju.php" method="post">


          <div class="form-group">
            <label>日付(YYYYMMDD)</label>
            <!--
            <input type="date" name="title" class="form-control">
    	    -->
            <input type="text" name="title" class="form-control">
          </div>

          <div class="form-group">
            <label>体重</label>
            <input type="text" name="taiju" class="form-control">
          </div>
          <div class="form-group">
            <label>メモ(思った事など)</label>
            <!--
            <input type="text" name="memo" class="form-control">
    	    -->
            <!-- クッキーを読み込んでフォームの名前を設定する from-->
            <input type="text" name="memo" class="form-control" value="<?php echo $memo ?>">
            <!-- クッキーを読み込んでフォームの名前を設定する from-->
          </div>
          <input type="submit" class="btn btn-primary" value="書き込む">
        </form>
        <hr>

<?php while ($row = $stmt->fetch()): ?>
        <div class="card">
          <div class="title-body">
            <!--17:58 2024/02/04 エスケープ対応修正 from -->
            <p class="card-title"><?php echo htmlspecialchars(nl2br($row['title']), ENT_QUOTES, "UTF-8") ?></p>
            <!--<p class="card-title"><?php echo nl2br($row['title']) ?></p>-->
            <!--17:58 2024/02/04 エスケープ対応修正 to -->
          </div>
	</div>
        <div class="card">
          <div class="taiju-body">
            <p class="card-taiju"><?php echo nl2br($row['taiju']) ?></p>
          </div>
        </div>
        <div class="card">
          <div class="memo-body">
            <!--17:58 2024/02/04 エスケープ対応修正 from -->
            <p class="card-memo"><?php echo htmlspecialchars(nl2br($row['memo']), ENT_QUOTES, "UTF-8") ?></p>
            <!--<p class="card-memo"><?php echo nl2br($row['memo']) ?></p>-->
            <!--17:58 2024/02/04 エスケープ対応修正 to -->

          </div>
        </div>
        <hr>
<?php endwhile; ?>

<?php
  // ページ数の表示
  try {
    // プリペアドステートメントの作成
    $stmt = $db->prepare("SELECT COUNT(*) FROM taiju");
    // クエリの実行
    $stmt->execute();
  } catch (PDOException $e){
    exit("エラー:" . $e->getMessage());
  }


  // 書き込みの件数を取得
  $comments = $stmt->fetchColumn();
  // ページ数を計算
  $max_page = ceil($comments / $num);
  // ページングの必要性があれば表示
  if ($max_page >= 1){
    echo '<nav><ul class="pagination">';
    for ($i = 1; $i <= $max_page; $i++){
// ここを修正しないと、更新後に戻ってくるページがtaiju.phpではなくなる。
      echo '<li class="page-item"><a href="taiju.php?page='.$i.'">'.$i.'</a></li>';
    }
    echo '</ul></nav>';
  }
?>

        <!-- 本文ここまで -->
      </div>
    </main>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" crossorigin="anonymous"></script>
    <script>window.jQuery || document.write('<script src="/docs/4.5/assets/js/vendor/jquery-slim.min.js"><\/script>')</script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.bundle.min.js"></script>
  </body>
</html>

ここでクッキーを読み込み、isset関数で変数$memoに値を設定します。

// クッキーを読み込んでフォームの名前を設定する from
 if (isset($_COOKIE['memo'])){
   $memo = $_COOKIE['memo'];
 } else {
   $memo = "";
 }
 // クッキーを読み込んでフォームの名前を設定する to

こちらで、value値にクッキーが設定された$memoを初期表示しています。

        <!--
        <input type="text" name="memo" class="form-control">
	    -->
        <!-- クッキーを読み込んでフォームの名前を設定する from-->
        <input type="text" name="memo" class="form-control" value="<?php echo $memo ?>">
        <!-- クッキーを読み込んでフォームの名前を設定する from-->

3.結果

まず、「cookieメモ」と入力して登録。

image.png

画面を開くと・・

image.png

画面に「cookieメモ」と初期表示。

4.終わりに

思ったより簡単に済んでしまったので、次はセッションの動きを試してみます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0