• ベストアンサー

phpのsetcookie()関数について 初心者なんですがわからない点があるのご返答お願いします。

yahoo知恵袋で質問して回答も貰ったんですが その後に確認したいことがあったのですがあちらで質問の補足は200文字までという制限があったのでこちらで質問させてもらっています。 あちらでした質問が ////////////////////////////////ここからyahooでした質問///// phpの勉強をしている初心者のものですが、私の参考にしている本のsampleコードで わからない点があります。 phpの勉強をしている初心者のものですが、私の参考にしている本のsampleコードで わからない点があります。 <?php setcookie("count", true); ?> <html> <head> <title>sample<title> <body> <h2>店内のご案内</h2> <hr> <?php if(!isset($_COOKIE["count"])){ print "はじめてのおこしですね。<br />\n"; } else{ print "毎度ありがとうございます。<br />\n"; } ?> </body> </html> というコードなんですが一回目のアクセスの時にはif文のtrueが実行されて「はじめておこしですね」と 表示されて二回目以降は「毎度ありがとうございます」と表示されると本には書いているのですが 私にはsetcookieの部分で$_COOKIE["count"]にはtrueという値が与えられているからif文の条件である $_COOKIE["count"]に値がないというのはfalseでelseの文の処理がされて「毎度ありがとうございます」 と表示されるか $_COOKIE["count"]の値がtureなのでif文条件式全体がtureになり、「はじめてのおこしですね。」が 表示されるが二回目以降もその表示がされていくか のどちらかになると思うのですが、どのように考えればよいのか教えてください。 ///////////////////////ここまでyahooでした質問です。////////// と質問しそれに回答者が //////////////////////回答者が答えてくれた返答//////////////// クッキーは、ブラウザに記録され、ページにアクセスするときに自分のクッキーをサーバに渡します。 SetCookieの段階では、このクッキーはまだ有効ではありません。 SetCookie()関数はSet-Cookie:ではじまるHTTPヘッダを作ってブラウザに渡すべきクッキーを書き出すだけなのです。 順番としては、 ブラウザがページを読み出す→サーバはクッキーを添えて文書をブラウザに渡す→ブラウザはクッキーを受け取って記録する→ ブラウザが先程受け取ったクッキーを添えてページを読み出す→サーバは受け取ったクッキーがあるのでif(!isset($_COOKIE["count"]))がfalseになり「毎度ありがとうございます。」と表示する。 /////////////////////ここまで回答者の返答/////////////// と答えてくださったんですがその後に聞きたいことがあったのですが 上で書いたとおり制限があったので質問できなかったのでその質問を ここから下に書くのでよければご返答お願いします。 /////////////////////ここから答えてもらいたい質問////////// 自分なりに教えてもらったことを解釈してみたんですが、 一度目のアクセスでは、まずブラウザがページをサーバーに要求しそれに対してサーバーがページとクッキーを渡すが、 このときのブラウザに渡すページは、ブラウザからはクッキーをもらっていないのでクッキーの処理がしていないページになる。 なので一回目のif(!isse($_COOKIE["count"]))は$_COOKIEの値を定義されたページは貰っておらず値がないのでtrueとなり 一回目はサーバーからクッキー受け取ったクッキーを記録するだけにとどまる。 そして二度目のアクセスでは、ページの要求と一度目のアクセスで受け取ったクッキーをサーバーに渡すので、 サーバーは今回はクッキーの処理をしたページをブラウザに渡すのでif(!isset($_COOKIE["count"]))は$_COOKIEの値を定義されたページを貰っているのでflaseとなり 「毎度ありがとうございます」と表示される。 このようにわたしなりに解釈したんですがこのように考えてもよいでしょうか? もしよろしければ見づらい文なんですがお返事お願いします。

  • dwfkk
  • お礼率75% (3/4)
  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

(1)ブラウザにセットされているクッキーデータがサーバーにおくられる (2)setcookieでブラウザ側にクッキーを書かれる の順番ですね なので一度目は、クッキーデータがないのでissetをしてもセットされてません サーバー側にわたされたあとにブラウザのデータは書き換わるので その辺の認識をしたほうがよいですね こんな風にするとデータにラグがあることがわかると思います。 <?php setcookie("count", $_COOKIE["count"]+1); print $_COOKIE["count"]; ?> <script> document.write(document.cookie); </script>

dwfkk
質問者

お礼

回答に書いてあるコードを試してみることでより理解が深まりました。 長文でしたが読んでもらいかつ回答していただきありがとうございます。

その他の回答 (1)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

長かったので流し読みですがそんな感じでしょう。 簡単にいうと、setcookie は $_COOKIE に(その時点で)値をいれる関数ではないということです。

dwfkk
質問者

お礼

自分の解釈であっているか不安だったので確認してもらったことで 安心しました。 長文でしたが読んで貰いかつ回答をしてくださってありがとうございます。

関連するQ&A

  • setcookieの位置

    これは正しいカウンターのサンプルになり 数値は1、2、3、4・・・と増えていきます。 -------------------------------------- <?php if(isset($_COOKIE["ponpon"])){ $kazu = $_COOKIE["ponpon"] + 1; }else{ $kazu = 1; } setcookie("ponpon", $kazu); echo $kazu."回目のアクセスです。"; ?> -------------------------------------- クッキーをはじめにセットするということで 「setcookie("ponpon", $kazu);」の位置を最初に置くと 数値は1のまま変わりません。 -------------------------------------- <?php setcookie("ponpon", $kazu); ← if(isset($_COOKIE["ponpon"])){ $kazu = $_COOKIE["ponpon"] + 1; }else{ $kazu = 1; } echo $kazu."回目のアクセスです。"; ?> -------------------------------------- 理屈からするとクッキー自体はセットされているはずなのですが カウントの数字は1のままなで増えていかないのですが なぜなのでしょうか? 「setcookie("ponpon", $kazu);」を最初の行に置くと クッキー自体がセットされないのでしょうか? ちなみにセッションのサンプルの場合は始まりの行でセットされ きちんと1,2,3,4・・・とカウントされるので どこが違うのか良く分かりません。 -------------------------------------- <?php session_start(); if(isset($_SESSION["kazu"])){ $_SESSION["kazu"]++; }else{ $_SESSION["kazu"] = 1; } echo $_SESSION["kazu"]."回目のアクセスです。"; ?> -------------------------------------- よろしくお願いいたいます。

    • ベストアンサー
    • PHP
  • PHPのsetcookieをjavascriptで取得

    よろしくお願いします 現在、PHPのsetcookieでクッキーを書き込んで その値をJavascriptのdocument.cookieで取得できるのでしょうか? また、PHPの方でsetcookie("○○","名前=値",time()+60*60,"/") というように以下のフォルダで取得可能にした場合 それはjavascriptでも取得可能なのでしょうか? 参考ページなど教えていただけると幸いです よろしくお願いします

    • ベストアンサー
    • PHP
  • setcookie 関数について

    始めまして。 setcookie("TestCookie", "test", time()+3600); を実行した場合、 クライアント側(WindowsXP)の C:\Documents and Settings\user\Local Settings\Temporary Internet Files にクッキーファイルが生成されます。 しかし、 setcookie("TestCookie", "test", 0); を実行した場合は、クッキーファイルが見付かりませんでした。 【質問1】 この現象は、WindowsXP の仕様でしょうか? それとも、setcookie の仕様でしょうか? (OSに関係なく有効時間を0にしたらファイルは生成されない??) 【質問2】 クッキーファイルはみつからなかったですが、クッキーから値は正常に取得できました。これは、クライアント側のメモリにクッキーがいるということなのでしょうか?それとも、どこかにファイルがあるのでしょうか? 以上です。 よろしくご教授くださいm( __ __ )m

    • ベストアンサー
    • PHP
  • $_COOKIEについて

    はじめまして。 PHPを勉強中なのですが$_COOKIEを使った際にエラーになってしまいます。 それが何故なのか分からないのですが、この辺に詳しい方助けて下さい。 ↓↓状況は以下のとおりです。↓↓ ・開発環境:xampp、php、vista ・下記のスクリプトを記述してブラウザで表示すると、「1回目のアクセスです。」とともにエラー表示も出てきてしまう。 <?php if (isset($_COOKIE["count"])) { $count = $_COOKIE["count"] + 1; } else { $count = 1; } setcookie("count", $count); echo "${count}回目のアクセスです。"; ?> ・上記のスクリプトを実行した際のエラー表示は「 Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs(ディレクトリ)php:182) in (エラーの行数) ・ちなみに、練習で作ってるだけなので同じページに、「setcookie」と「$_COOKIE」を使っている。(ただし、クッキー名などは、前に使っているのとは被らないようにしている) 以上です。 やりたい事は、ブラウザにCookieを送り、読み込むたびに「?回目のアクセスです。」の回数を増やしていきたいです。 しかし、これも出来ずに何度読み込みしても「1回目のアクセスです。」とエラー表示しかでません。 この質問で上手く伝わったかわかりませんが、ご見識ある方お力添え下さいませ。

    • ベストアンサー
    • PHP
  • PHP のsetcookie()関数について

    PHP5を使ったHTML文書で、setcookie()関数を使っていますが、以下のようなメッセージが出てきてクッキーに新しいデータを書き込むことが出来ません。 環境はWindows10, IE11です。 PHP使用方法: $fname="mondai10.txt" setcookie("filename", $fname);  // line 38 setcookie("version",3); // line 39 メッセージ: Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\QAmondaiDisplay.php:3) in C:\xampp\htdocs\QAmondaiDisplay.php on line 38 Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\QAmondaiDisplay.php:3) in C:\xampp\htdocs\QAmondaiDisplay.php on line 39 そしてこのクッキーを次のようにJavaScriptで読み込んでいるのですが、表示させてみると書き込んだものとは全く異なるものが表示されます。 JavaSript 使用法: var cookiedata = window.document.cookie; window.document.getElementById("q1").innerHTML =cookiedata;; 実際に表示されるもの: PHPSESSID=57c35633ffc2fe44622ee27e61bf44eb; filename=yasudaShiroexpires=Mon, 08 Oct 2018 21:44:48 GMT そしてこの表示は、最後の時間以外はいつも同じです。 どこに問題があるのでしょうか? 詳しい方、どうか教えてください。

    • ベストアンサー
    • PHP
  • cookieにカンマ区切りでつめこみたい

    phpで500以上の投票ページを作成しています。 それぞれの投票ページで二重投稿を防ぐためにsetcookieで以下のように設定しました。 setcookie('vote['.$voteid.']', $voteid); if (isset($_COOKIE['vote'])) { foreach ($_COOKIE['vote'] as $name => $value) { echo "$name : $value <br />\n"; } } 投票ページを4つ試したところ 102 : 102 320 : 320 558 : 558 600 : 600 このように表示されました。 しかしながら 「1つのサーバから受け取ることが出来るクッキーは最大20個まで、全体でも合計300個までのクッキーしか保持できないことになっています」 とどこかで見かけました。 上記の場合ですと4つのクッキーを利用していることになる(?)ため、できれば 102,320,558,600 というようにカンマ区切りで、1つのクッキーにつめこみたいのですが、その保存方法と取り出し方が分かりません。 どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPで違うサーバーのスクリプトでクッキーを読めますか?

    サーバーAで次のようにクッキーを設定しました。 test.php <? setcookie("TEST","値"); ?> サーバーBで次のようにクッキーを読み込み ました。 test2.php <? $kekka=$HTTP_COOKIE_VARS["TEST"]; print $kekka; ?> 構想は、「値」と表示させることなのですが、 何も表示されませんでした。 上記は、何が間違えているでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • 【PHP】アクセスカウンターが空回りしてしまいます。

    はじめて投稿します。 今まで無料アクセスカウンターをつけていたページを、 PHPにして、自作のアクセスカウンターを乗っける作業を しています。 来訪者にCookieをつけて、期限が切れるまでカウンターを 反応させないようにするつもりです。(ブラウザを閉じるまで) ローカルではうまく動くのですが、サーバに乗せてみると カウンターが空回りしてしまいます。 正直、どう手直ししていいか見当がつきません。 アドバイスをお願いします。 【おそらく問題のロジックの部分】 //$fp=fopen("count.txt","r+"); //$count=fgets($fp,8); //来場者数のファイルを読み取って必要な桁だけ入手。 //if(empty($_COOKIE["aaa"])){ // setcookie("aaa","on"); // $count++; // } //cookieが空の場合のみ、新たにcookieを作り来場者数に1足す。 //rewind($fp); //fputs($fp,$count); //fclose($fp); //ファイルに値を書き込んで閉じる

    • ベストアンサー
    • PHP
  • phpのsessionとcookieについて

    質問は以下に2つです。 プログラムの説明は、pass,idから認証を行い、sessionidを発行します。二度目の以降はsessioidから認証します。 sidpost.phpからpostでIDとパスワードを入力させます。 データベースはid, pass, sidの3つのカラムがあります。 <?PHP require_once'DB.php'; session_name("sid"); session_start(); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $id = $_POST['id']; $pass =$_POST['pass']; $cookie = $_COOKIE['sid']; $sid = session_id(); //データベース参照 //プレースホルダーを使用 //id からpassを参照する //cookie から sidを参照する $data=$sth->fetchRow(DB_FETCHMODE_ASSOC);//参照したデータを$dataの連想配列に格納 //sid保存のプレースホルダー $sth2 = $dbh->prepare('UPDATE accountid SET sid=? WHERE id=? AND pass=?'); //cookieが保存されていない場合 if(!isset($cookie) && isset($pass) && isset($id)){ //idとpassから認証 if($pass === $data['pass']){ $sth2 = $dbh->execute($sth2, array($sid, $id, $pass)); echo "初めてのログインsid登録"; } //sidがある場合cookieとデータベースのsidを比較 }else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } //それ以外は入力フォームにリダイレクト }else{ header("location: ./sidpost.php?error=error"); } $dbh->disconnect(); ?> </body> </html> 上のようなセッション管理のプログラムを書きました。 質問は2つありまして、 ・1つめは、通常セッション管理を行う際の、条件はどのようにするのが一般的ですか? IDとパスワードがデータベースと一致する場合としない場合の2通り、cookieがある場合、ない場合の2通り、もしcookieがある場合は、データベースの値と一致する場合としない場合の2通りが考えられます。一番最適な条件文はどのようにすればよいでしょうか? またその処理はどのようにすればよいのでしょうか。 例えばcookieがあり、データベースと一致しない場合、$_SESSIONの初期化、setcookieでクッキーの削除、session_destroy()するなど。。。なにかよくわからなくなってしまいました。 ・二つ目は、 上のプログラムではじめsession_name('sid')およびsession_start()を宣言し、クライアントとサーバに$sid=session_idを発行しています。なので、$_COOKIE['sid'];の値には session_id()($sid)になっているはずです。 下のほうで、セッションの管理を行う際、 //クッキーがある場合 else if(isset($cookie)){ if($cookie == $data['sid']) echo "sidあり成功"; //クッキーがあり、データベースと一致しない場合,sidを破棄する }else{ echo"あるはずのクッキー" .$COOKIE['sid']."<br>"; $_SESSION=array(); setcookie('sid', '', time()-3600); session_destroy(); echo "ないはずのクックキー".$_COOKIE['sid']; } クッキーがあり、データベースと一致しない場合に、sessionおよび、cookieの破棄をしています。この前後でechoをもちいて$_COOKIE['sid']の値を出力すると、 破棄するの前のechoでクッキーが表示されず、 破棄したあとのechoでクッキーが表示されました。 なぜこのような結果になるのですか、逆では?と思いました。

    • 締切済み
    • PHP
  • 訪問者のクッキーが有効か無効かを調べるには?

    1ページ目にsetcookieで2ページ目にif($_COOKIE)で調べることはできますが 1ページ目で訪問者がクッキーが有効になっているかどうかを調べ、無効になっている場合は無効の人専用のページを表示させてクッキーを有効にするように促したいです。 ご教示頂けると幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう