setcookieの位置

このQ&Aのポイント
  • setcookie関数を最初に置いた場合、カウントの数字が1のまま増えない現象が発生します。
  • セッションのサンプルでは、始まりの行でセッションがセットされ、正常にカウントされます。
  • クッキーを最初にセットすると、クッキー自体がセットされずにカウントが1のままになります。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
noname#244856
noname#244856
回答No.2

すごく単純な問題ですが… 原則的にPHPコードは上から順番に実行されますよね。 <?php setcookie("ponpon", $kazu); ← この時点では $kazu は未定義です。未定義の変数の値を使おうとすると E_NOTICE レベルのエラーを発生し、NULLが代入されて自動的に初期化されます。まずこのエラーの発生に気付いていない時点でデバッグ作業に難ありなので、php.iniの設定で error_reporting = E_ALL | E_STRICT display_errors = On とし、全てのエラーを表示するようにしてください。そして isset は未定義に加えてNULLという値に対しても同様にFALSEを返すので、ifブロック後半の $kazu = 1; が実行されます。常にこの処理が行われていただけです。

okdayook
質問者

お礼

お答えありがとうございます。 プログラムは上から処理されていくのですが 空の場合はそのまま下に下って行き 下の部分から自動的に$kazuに値が入ると思っていました。 前は「2K-NT-XP」を使ってPHPを練習していたのですが プログラム自体が古いようで作動しない関数が沢山あるため、 レンタルサーバを使ってPHPの勉強をしています。 レンタルサーバではエラー表示は何も出ないようです。 とにかくありがとうございました。

その他の回答 (1)

回答No.1

第三のパラメータに有効期限を入れてみてください。 例:time()+60*60*24 とか

okdayook
質問者

お礼

質問内容がうまく伝わらなかったようで すみません。 とにかくありがとうございました。

関連するQ&A

  • 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となり 「毎度ありがとうございます」と表示される。 このようにわたしなりに解釈したんですがこのように考えてもよいでしょうか? もしよろしければ見づらい文なんですがお返事お願いします。

    • ベストアンサー
    • 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
  • PHPのセッションIDについて

    PHP5.3.14を使っています。 セッションについて勉強中です。 セッションを使ってページの表示回数をカウントアップするソースと、 そのセッションを破棄するソースの2種類を用意しました。 ※それぞれ、session_id()をecho表示しています。 クッキーを使った状態でこれらを動かすと、 リセットする(リンクを押してリロードする)度にセッションIDが変わるのですが、 クッキーを使わずに定義済み定数SIDを使って動かすと、 カウント値は元に戻るのですが、 リセットしてもセッションIDが変わりません。 どうすれば、新しいセッションIDを発行(SIDの値を更新)できるのでしょうか? よろしくお願いします。 【以下、ソース2種類と、iniファイルの一部です】 ●up.php <?php session_start(); if (empty($_SESSION['count'])) { $_SESSION['count'] = 1; } else { $_SESSION['count']++; } echo ("###".'"'.session_name().'='.session_id().'"'."</br>"); ?> <p> <?php echo $_SESSION['count']; ?> 回目。 </p> <p><a href="up.php">カウントアップ</A> </p> <p> <a href="reset.php">リセット</A> </p> ●reset.php <?php session_start(); echo ("###".'"'.session_name().'='.session_id().'"'."</br>"); echo ("##### ". $_SESSION['count']."回表示しました。</br>"); $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } if(isset($_REQUEST[session_name()])){ $_REQUEST[session_name()]="" ; } session_destroy(); ?> <p> <a href="up.php">初めからカウントする</A> </p> ●php.ini (クッキーを使わずSIDを使うを設定) session.use_trans_sid = 1 session.use_only_cookies=0 session.use_cookies=0

    • 締切済み
    • PHP
  • setcookieが動きません

    $id = $_GET['id']; setcookie('id', $id, time() + 24 * 3600); というスクリプトをphpフォームが付いたindex.htmlの冒頭に書き、 入力内容確認画面のconf.phpに <input type="hidden" name="ap_id" value="<?php echo $_COOKIE['id']; ?>"> と入れています。 一度だけクッキーが取得できたのですが、なぜかそれ以降機能しなくなりました。 PHP初心者なのですが、ぜひ間違いを教えて下さい! 宜しくお願いします。

    • ベストアンサー
    • 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
  • セッションの削除

    例えば www.hoge.com/foo/index.php で session_start(); setcookie("bar",session_id(), time()+3600); として画面遷移を行いながら登録作業を行い、 完了画面regist.php で session_start(); $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000); } session_destroy(); としましたが$_COOKIE["bar"]が初期化されません。 どのようにしたら良いでしょうか? 教えてください。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • セッションの利用

    今,セッションにはまっています. https://www.stackasterisk.jp/tech/php/php03_06.jsp には、セッションのサンプルもいくつかあるので,まずは,簡単なセッションを使った例を拾ってきて試してみたいと思っています.ですが、上のURLにあるサンプルで <? session_start(); if (!isset($count)) $count=0; session_register("count"); $count++; ?> <html> <body> あなたは <?= $count ?> 回目の訪問です。 <a href="<?echo $PHP_SELF ."?PHPSESSID=". $PHPSESSID?>">カウントを増やす</a> </body> </html> をしましたが,再読込やクリックをしてもカウントアップせず,ずっと1のままです.ソースが間違っているかどうかは私には,ハッキリできませんが,おそらく正しいんでしょう.正常にカウントアップされる為には,php.iniなどの設定も必要でしょうか?どうしてカウントアップされないでしょうか?

    • ベストアンサー
    • 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 SESSION変数の削除について

    PHPでブラウザを×で閉じた場合、SESSION変数 の廃棄はどうすればよいのでしょうか? ガーペジコレクション(PHP.INI等の設定)に任せておけばよいのでしょうか? ちなみにログアウトの際は下記のプロシジャを実行しています。 ----------------------------- <?php session_start(); // セッション変数を全て解除する $_SESSION = array(); // セッションを切断するにはセッションクッキーも削除する。 // Note: セッション情報だけでなくセッションを破壊する。 if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // 最終的に、セッションを破壊する session_destroy(); ?> -----------------------------

    • 締切済み
    • PHP
  • cookieが破棄できない【PHP】

    今PHPを習得中なんですが、以下のプログラムでクッキーの破棄ができません。 どこか間違いがあればご指摘お願いします。 <?php session_start(); print <<<____HTML____ <!doctype html> <html> <head> <meta charset="utf-8"> <title>無題ドキュメント</title> </head> <body> ____HTML____; /* -------------------- 処理を分岐 ------------------------ */ if(isset($_POST["do_logout"])){ $key = "do_logout"; } else $key = "do_not_logout"; switch($key){ case "do_not_logout": do_not_logout(); // ログアウトしない break; case "do_logout": do_logout(); // ログアウトする break; } /* --------------------- do_not_logout() ----------------------- */ function do_not_logout(){ header("Location:main.php"); } // do_not_logout() /* ------------------ do_logout() ---------------------- */ function do_logout(){ print "現在のセッション変数<br>"; // 現在のセッション変数 print_r($_SESSION); print "<br><br>"; print "現在のクッキー変数<br>"; // 現在のセッション変数 print($_COOKIE["PHPSESSID"].'<br>'); $_SESSION = array() ; // すべてのセッション変数を初期化 if (isset($_COOKIE["PHPSESSID"])) { // ここでクッキーを破棄 print "ここでクッキーを破棄<br>"; setcookie("PHPSESSID", '', time() - 1800, '/'); } session_destroy() ; // セッションを破棄 $Massage = "ログアウトが完了しました。\nまたのお越しをお待ちしております。\n"; print('セッション変数の確認<br>'); // セッションが破棄されているかの確認 if (!isset($_SESSION["login"])){ print "セッション変数は破棄されています。<br>"; }else{ print"セッション変数は破棄されていません。→{$_SESSION["login"]}<br>"; } print "セッションIDの確認をします。<br>"; // クッキーが破棄されているかの確認 if (!isset($_COOKIE["PHPSESSID"])){ print "クッキーは破棄されています。<br><br>"; }else{ print"クッキーは破棄されていません。→{$_COOKIE["PHPSESSID"]}<br>"; } } // do_logout() echo $Massage; print "<p><a href=\"index.php\">トップページに戻る</a></p>"; ?> </body> </html> /* -------------- 実行結果 (一部)------------------*/ 現在のクッキー変数 **************************d5ee33b19ef197aef ここでクッキーを破棄 Warning: Cannot modify header information - headers already sent by (output started at logout.process.php:18) in logout.process.php on line 81 セッション変数の確認 セッション変数は破棄されています。 セッションIDの確認をします。 クッキーは破棄されていません。→************************d5ee33b19ef197aef

    • ベストアンサー
    • PHP

専門家に質問してみよう