アプリ版:「スタンプのみでお礼する」機能のリリースについて

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つのクッキーにつめこみたいのですが、その保存方法と取り出し方が分かりません。

どうぞよろしくお願い致します。

A 回答 (2件)

こんな感じのことを聞いてますか?


/*
* 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などで誰が何に投票したか覚えておくことになると思います。

この回答への補足

まさにこのような感じを求めておりました。
ありがとうございました。

不具合についてお聞きしたいことがあるのですが、4096バイト上限に達した場合、どのようなことになるのでしょうか?

古いものから上書きしてくれたらありがたいのですが。。。

補足日時:2012/04/22 02:03
    • good
    • 0

> 不具合についてお聞きしたいことがあるのですが、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の削除には無力ですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/05/06 12:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!