@Yotsu61

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

SESSIONの中身をCookieに保存したい

解決したいこと

SESSIONの中身をCookieに保存したい

例)
PHPで掲示板サイトを作成していて、ログインしたときにSESSIONの中身をCookieに保存したいのですがCookieが保存されません。
どこがおかしいでしょうか?

該当するソースコード

<?php
require_once(dirname(__FILE__) ."/secret.php");

ini_set("display_errors", "On");
error_reporting(E_ALL);

// データベース接続
$conn = new mysqli(DB_SERVERNAME, DB_USERNAME, DB_PASSWORD, DB_DBNAME);

// 接続確認
if ($conn->connect_error) {
  die("データベース接続エラー: " . $conn->connect_error);
}

// フォーム送信時処理
if (isset($_POST['user_name_post']) && isset($_POST['password_post'])) {
  $username = $_POST['user_name_post'];
  $password = $_POST['password_post'];

  // ユーザー情報取得
  $sql = "SELECT user_id, password FROM users WHERE user_name = ?";
  $stmt = $conn->prepare($sql);
  $stmt->bind_param("s", $username);
  $stmt->execute();
  $result = $stmt->get_result();

  if ($result->num_rows === 1) {
    $user_data = $result->fetch_assoc();
    // パスワード照合
    if (password_verify($password, $user_data['password'])) {
      // ログイン成功
      session_start();
      $_SESSION['user_id'] = $user_data['user_id'];

      // セッションIDをCookieに保存する
      $cookie_params = session_get_cookie_params();
      setcookie(session_name(), session_id(), time() + 3600 * 24 * 7, $cookie_params['path'], $cookie_params['domain'], $cookie_params['secure'], $cookie_params['httponly']);

      header("Location: 42ch.php");
      exit;
    } else {
      // パスワード不一致
      echo "パスワードが間違っています。";
    }
  } else {
    // ユーザーが存在しない
    echo "ユーザー名が存在しません。";
  }
}

// データベース接続を閉じる
$conn->close();

function h($str)
{
  if ($str === null || $str === "") {
    return "";
  }
  return htmlspecialchars($str, ENT_QUOTES,"");
}
?>

<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel=”icon” href=“favicon.ico”>

<title>42ch ログイン</title>

</head>

<body>


<form id="messPost" enctype="multipart/form-data" method="POST">
<textarea name="user_name_post" <?php if (isset($_POST['user_name_post']) && $_POST['user_name_post'] !== "") { ?>value="<?= h($_POST['user_name_post'])?>"<?php } ?> placeholder="ユーザ名を入力して下さい" style="width : 210px; height: 25px; margin: 10px 0 10px 0;"></textarea><br>
<textarea name="password_post" placeholder="パスワードを入力して下さい" style="width : 250px; height: 25px; margin: 10px 0 10px 0;"></textarea>
<br> 
<input type="submit" value="ログイン">
</form>

  

</body>
</html>

解決した方法

$cookie_params = session_get_cookie_params();
             
setcookie("42ch_Cookie", session_id(), time() + 3600 * 24 * 7, $cookie_params['path'], $cookie_params['domain'], $cookie_params['secure'], $cookie_params['httponly']);

Cookieの名前を指定したらできました

遷移先

// セッションIDがCookieに保存されている場合は取得して設定
if (isset($_COOKIE["42ch_Cookie"])) {
    session_id($_COOKIE["42ch_Cookie"]);
}
0 likes

2Answer

質問を拝見して確認したい点がいくつかあります。

  • Cookieが保存されているかどうかは、どのように確認しているのでしょうか?
  • setcookieまで処理が進んでることを確認できていますか?
  • エラーメッセージなどは表示されていませんか?(header関数によるリダイレクトをコメントアウトするとどうでしょうか)
0Like

Comments

  1. @Yotsu61

    Questioner

    回答ありがとうございます。
    Chromeの設定のCookie一覧から探そうとしましたが見つからず、FiddlerでパケットをキャプチャーしてみてもCookieは保存されていなさそうでした。
    setcookieまで処理は進んでいます
    リダイレクトをコメントアウトしてもエラーメッセージは確認できませんでした。

    これはCookieが保存できているんでしょうか?スクリーンショット 2024-03-13 194432.png

  2. chromeブラウザのデベロッパーツールではApplicationタブから確認できます。

    image.png

    setcookie関数のマニュアルを確認し、まずは基本的な形で使用方法を確認してはいかがでしょうか?

    参考

  3. @Yotsu61

    Questioner

    ありがとうございます!やってみます!

コードを読まないでレスしてすみませんが・・・

ブラウザに Cookie を保持させるにはサーバーから応答ヘッダに Set-Cookie: cookiename=xxxxxxx というような設定を含めて渡してやる必要がありますが、それができているでしょうか?

それができているとして、次の要求でブラウザが要求ヘッダにその Cookie を含めてサーバーに送信しているでしょうか?

Fiddler やブラウザの開発者ツールを使って要求・応答をキャプチャして調べてみてください。

参考に、Fiddler を使った場合の具体例の画像を貼っておきます。赤枠部分を見てください。

(1) サーバーから応答ヘッダに Set-Cookie: AspNetCore.Identity.Application=CfDJ8MM... を含めて渡す

Fiddler1.jpg

(2) ブラウザから、次の要求で、その cookie をサーバーに送信

Fiddler2.jpg

0Like

Comments

  1. @Yotsu61

    Questioner

    回答ありがとうございます。
    一応Set-Cookie: cookiename=xxxxxxx というような設定を含めて渡してはいると思うのですが、、
    Fiddlerで確認してみましたが、Cookieは保存されていなさそうでした。
    スクリーンショット 2024-03-13 195134.png

  2. 一応Set-Cookie: cookiename=xxxxxxx というような設定を含めて渡してはいると思うのですが、、

    画像からはそうは見えません。話が通じてますかね?

  3. @Yotsu61

    Questioner

    $cookie_params = session_get_cookie_params();
    setcookie(session_name(), session_id(), time() + 3600 * 24 * 7, $cookie_params['path'], $cookie_params['domain'], $cookie_params['secure'], $cookie_params['httponly']);
    間違ってますか?

  4. @Yotsu61

    Questioner

    ご指摘通りCookieの名前がちゃんと指定されていませんでした。
    ありがとうございました。

  5. 解決したようですが、であれば、このスレッドはクローズ願います

Your answer might help someone💌