• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cookieにカンマ区切りでつめこみたい)

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

このQ&Aのポイント
  • phpで500以上の投票ページを作成し、setcookieを使用して二重投稿を防ぐためのcookieを設定しています。
  • 現在は4つのクッキーを利用していますが、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

専門家に質問してみよう