cookieにカンマ区切りでつめこみたい

このQ&Aのポイント
  • phpで500以上の投票ページを作成し、setcookieを使用して二重投稿を防ぐためのcookieを設定しています。
  • 現在は4つのクッキーを利用していますが、1つのクッキーにカンマ区切りでまとめたいと考えています。
  • しかし、その保存方法と取り出し方が分からないため、助けが必要です。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
回答No.1

こんな感じのことを聞いてますか? /* * Vote to the article. * The id of voted article is stored to the cookie. * * @param string $vote_id id of the article to vote. * @return true if successfully voted, false if duplicated vote. */ function vote($vote_id) { $vote_ids = preg_split('/[\s,]+/', $_COOKIE['vote']); // check duplicated vote. foreach ($vote_ids as $id) { if ($id == $vote_id) { return false; } } array_push($vote_ids, $vote_id); setcookie("vote", join(',', $vote_ids)); return true; } これで、vote('123')とやると、cookieには今のに加えて、123が,で追加したものが渡されます。 すでにvoteしていたら返り値はfalseになります。 この方法ですでにわかっている不具合は、次のとおりです。 cookieを消せば何度でも投票できます。cookieのなか見の書き換えも全くチェックしていません。また、cookie1つあたりの最大容量は4096バイトですが、その上限に達しているかもチェックしていません。 ちゃんと作るなら、投票の前にログインをさせて、DBなどで誰が何に投票したか覚えておくことになると思います。

90ss55
質問者

補足

まさにこのような感じを求めておりました。 ありがとうございました。 不具合についてお聞きしたいことがあるのですが、4096バイト上限に達した場合、どのようなことになるのでしょうか? 古いものから上書きしてくれたらありがたいのですが。。。

その他の回答 (1)

回答No.2

> 不具合についてお聞きしたいことがあるのですが、4096バイト上限に達した場合、どのようなことになるのでしょうか? RFC 6265にはどうするべきというのは書いていないと思います。 最低でも4096バイト分を用意しろとは書いていますが、それを超えた場合はcookieそのものを保存しないかもしれません。あるいは、4096バイトを超えたところで切るかもしれません。 しかしながら、4096バイトを超えたら古いものから消すというのを希望しているなら、こういう書き方ができると思います。 /* * Vote to the article. * The id of voted article is stored to the cookie. * * @param string $vote_id id of the article to vote. * @return true if successfully voted, false if duplicated vote. */ function vote($vote_id) { $MAX_LENGTH = 3000; $vote_ids = preg_split('/[\s,]+/', $_COOKIE['vote']); // check duplicated vote. if (in_array($vote_id, $vote_ids)) { return false; } array_unshift($vote_ids, $vote_id); while (strlen(join(',', $vote_ids)) > $MAX_LENGTH) { array_pop($vote_ids); } setcookie("vote", join(',', $vote_ids)); return true; } 4096バイトは日付なども含めたcookie全体なので、かなり安全側に倒して、voteのなか見の文字列だけで3000文字 (バイト) を超えた場合に古いものから消すようにしています。 以前と同じく、cookieの書き換えやcookieの削除には無力ですが。

90ss55
質問者

お礼

すいません。お礼が遅くなってしまいました。 まさに私の求めていたアドバイスでした。 どうもありがとうございました。

関連するQ&A

  • PHPでのCookie

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 form2.phpで一度更新しないと、結果が画面に表示されません。 これをform2.phpを開いた時点で表示されるようにするには、どのように書けばいいのでしょう。 後1つあります。form.phpで 「テスト&1」と書くと「テスト」としか表示されなく、&とそれ以降が記憶されません。 これはなぜでしょうか? お願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php if ($_POST) { $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); } parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • 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
  • JavascriptとCookieについて

    HTML【index.php】でフォームを作り、クリック時にCookieに保存 →別ページ【input.php】で保存したCookieで判断し内容を変更するページを作ろうと思っています。 http://memo.ark-under.net/memo/404 こちらのページを参考に以下のように作ってみたのですが動作しません。 JavascriptとPHPを使えたらどんな方法でも良いので、ご教授お願い致します。 最近勉強を始めた初心者ですので、なるべく簡単に教えていただけると幸いです。 ----------------------------------------------------------------------- ----------------------------------------------------------------------- 【index.php】 <script type="text/javascript"> // クッキー保存 setCookie(クッキー名, クッキーの値, クッキーの有効日数); // function setCookie(c_name,value,expiredays){ // pathの指定 var path = location.pathname; // pathをフォルダ毎に指定する場合のIE対策 var paths = new Array(); paths = path.split("/"); if(paths[paths.length-1] != ""){ paths[paths.length-1] = ""; path = paths.join("/"); } // 有効期限の日付 var extime = new Date().getTime(); var cltime = new Date(extime + (60*60*24*1000*expiredays)); var exdate = cltime.toUTCString(); // クッキーに保存する文字列を生成 var s=""; s += c_name +"="+ escape(value);// 値はエンコードしておく s += "; path="+ path; if(expiredays){ s += "; expires=" +exdate+"; "; }else{ s += "; "; } // クッキーに保存 document.cookie=s; } <form action="input.php" method="post"> ボタン1:<input type="submit" name="input" value="入力" onsubmit="return setCookie('hanteisql','1',7)"> ボタン2:<input type="submit" name="input2" value="入力" onsubmit="return setCookie('hanteisql','1',7)"> </form> ----------------------------------------------------------------------- ----------------------------------------------------------------------- 【input.php】 <?php echo "クッキーは".$_COOKIE["hanteisql"]."です。" ?> -----------------------------------------------------------------------

  • カンマを削除

    IDとNAMEがあり、値は以下になります。 ID NAME 1 西武 2 巨人 3 ソフトバンク そのIDとNAMEを取得し、NAMEについてはカンマ区切りで連結をし、 ID、NAMEはアンカタグを設定します。 NAMEの値をカンマ区切りにしているのですが、NAMEの値の最後にまで カンマが付加されてしまいます。 西武,巨人,ソフトバンク, ←ココ カンマ区切りをrtrimで削除出来ると思ったのですが、うまくいきません。 カンマを削除出来る方法または、他に良い方法があればアドバイス頂けないでしょうか。 以上、よろしくお願い致します。 for($i = 0; $i<10;$i++){ $array[i] = array("ID".[$i] => "NAME".[$i]); } foeach($array as $key => $value){ foreach($value as $id => $name){ <a href="aaa.php?id=$key">$name.","</a> } }

    • ベストアンサー
    • PHP
  • PHPでのクッキー

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 直接form2.phpへ飛ぶと、クッキーの値がなくなってしまいます。 setcokkieが、何の値もないのを上書きしていることは理解できるのですが、これを上書きせず回避?する方法はありますでしょうか? よろしくお願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • 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
  • 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
  • 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
  • PHPで投票カウンタの作成

    PHPで投票カウンタを作成したいと思います。 構造としてはラジオボタンが3つ並んでいて、そのどれかを選び 下にあるOK(ひとつだけ)ボタンをクリックすると、ラジオボタンの横に数値がカウントされるという簡易的なものです。 下記のコードに足りないところやいらないところを教えてください。 ド素人のためご教授願います。 <?php if(isset($_COOKIE["tohyo"])){ $tohyo = $_COOKIE["tohyo"]; $tohyo++; }else{ $tohyo = 0; } setcookie("tohyo", $tohyo, time()+60); ?> <html> <head> <title>投票カウンター</title> </head> <body> <form action="count2.php"> <p> <input type="radio" name="tohyo" value="1"><?php print $value["$kekka"][1]; ?><br> <input type="radio" name="tohyo" value="2"><?php print $value["$kekka"][2]; ?><br> <input type="radio" name="tohyo" value="3"><?php print $value["$kekka"][3]; ?> </p> <input name="submit" type="submit" value="投票"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • PHP cookie受け渡しについて

    php 5.16 apache 2.0 フォーム -------------------------------------------------------------- <form method="POST" action="./php_cookie_tm.php"> E-Mail<br> <input type="text" name="mail" value="<?php print($_COOKIE['form_email']); ?>"><br> <input type="submit" value=" 保存 "> </form> -------------------------------------------------------------- 出力 -------------------------------------------------------------- <?php setcookie("form_email",$_POST['form_email'],time()+(60*60*24*90)); ?> クッキー保存 -------------------------------------------------------------- とすると Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\○○.php:4) in ・・・・・・・ というエラーがでます。 既に発信している?みたいなエラーなのですが・・・・ なぜでるのでしょうか? php.iniの設定?等いろいろみてはいるのですが、原因不明にて すごい困っております。 初心者質問ですいません。

    • ベストアンサー
    • PHP