質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

897閲覧

1度の実行でクッキーを保存させたい

chapp

総合スコア233

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/09/08 16:09

お世話になります。PHPにてCOOKIEを用いて、アクセスしたページの訪問履歴を残したいと考えています。

以下は現在のソースです。$DataNo はページを呼び出すパラメータであり、このデータを半角スペースで区切りCOOKIEに保存する流れです。(最大20件までの登録で21件目からは古いデータを削除しています)

if(isset($_COOKIE["watch"])){ $watch_data = $_COOKIE["watch"]; $watch_array = explode(" ", $watch_data); $key = array_search($DataNo, $watch_array); if(is_numeric($key)){ array_splice($watch_array, $key, 1); } if(count($watch_array) >= 20){ array_splice($watch_array, 0, 1); } $watch_array[] = $DataNo; $watch_data = implode(" ", $watch_array); } else{ $watch_data = $DataNo; } setcookie("watch", $watch_data, time() + 60*60*24*30);

ここで質問なのですが、現在、試行錯誤を繰り返していますが、上記ソースの後、

echo $_COOKIE["watch"];

と登録されたクッキーを確認しようとしても、アクセス直後のデータ(パラメータ)は保存されません。リロードして初めて保存($_COOKIE["watch"]に保存?)されている状況なのですが、1度のアクセスで保存させるにはどのようにしたら良いのでしょうか?

お忙しい中恐縮ですが、アドバイスのほど頂戴できれば幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

多分ですが、cookie の仕組みを誤解しています。
Cookie とは、ブラウザに記録されたデータを、ブラウザ-サーバ間で共有する仕組みです。
ブラウザからサーバにリクエストする時に、ブラウザに保存されている Cookie をサーバに通達し、サーバはブラウザに記録したい内容を Set-Cookie としてレスポンスします。

初回のアクセスでは、ブラウザからサーバに送る cookie がありません。
そのため、$_COOKIE の中身は空で

と登録されたクッキーを確認しようとしても、アクセス直後のデータ(パラメータ)は保存されません。リロードして初めて保存($_COOKIE["watch"]に保存?)されている状況なのですが、1度のアクセスで保存させるにはどのようにしたら良いのでしょうか?

といった現象が起こります。

何がしたいかによりますが、一般的には変数の初期化時に Cookie の有無によって初期値を制御し、その初期化後の変数を利用することで、意図した動作をさせることになると思います。

コードはちゃんと見ていませんが、それっぽい条件分岐もあるので、途中まではできているのではないでしょうか?

あと、余談ですが Cookie の挙動の検証は、ブラウザの開発ツールでヘッダを見るのが簡単で適切です。
使い方を覚えると便利です。

頑張ってください。

投稿2018/09/08 22:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2018/09/08 23:56

te2jiさん 朝早くからの回答、ありがとうございます。 仰るように、誤解していた・・というより仕組みを理解していなかったと思います。 この度の皆さまのご回答を拝見し、晴れ間が見えたような心境です。 貴重なアドバイスをありがとうございました。感謝いたします。
guest

0

ベストアンサー

「1度のアクセスで保存させるにはどのようにしたら良いのでしょうか?」との質問ですが、現在のソースで既にそのようになっています。

まず、cookieに関わるブラウザとサーバー+PHPの挙動を説明します。
cookieはブラウザに保存されています。ブラウザは、サーバーにリクエストを送信する度に、HTTPヘッダーにcookieを含めて送ります。サーバーはリクエストがあるごとに、送られてきたcookieをスーパーグローバル変数$_COOKIEに格納します。$_COOKIEには、リクエスト時点でのcookieが格納されていることに注意してください。
サーバーからブラウザへのレスポンスは、PHPのコードが全て実行されたあとに行われます。setcookieは、レスポンスのHTTPヘッダーに含めるcookieを設定する関数です。setcookie関数が実行されても、すぐにcookieが送信されるわけではないし、$_COOKIEにcookieが追加されるわけでもありません。

質問では、リロードすると$_COOKIE['watch']がセットされている、ということでした。すなわち、アクセスの直後にはブラウザにcookieがセットされている、ということですから、1度のアクセスでcookieがちゃんと保存されていることになります。

投稿2018/09/08 22:54

carrotRakko

総合スコア77

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2018/09/09 00:03

carrotRakkoさん 朝早くからのご回答、ありがとうございます。 分かりやすい順を追っての挙動説明をありがとうございます。「なうほど」とばかり、読んでいて思わず声が出てしまいました。 te2jiさんへのお返事でも書きましたが、仕組みを理解していなかったためだと知らされました。 貴重なアドバイスをありがとうございました。感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問