
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つのクッキーにつめこみたいのですが、その保存方法と取り出し方が分かりません。
どうぞよろしくお願い致します。
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などで誰が何に投票したか覚えておくことになると思います。
この回答への補足
まさにこのような感じを求めておりました。
ありがとうございました。
不具合についてお聞きしたいことがあるのですが、4096バイト上限に達した場合、どのようなことになるのでしょうか?
古いものから上書きしてくれたらありがたいのですが。。。
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の削除には無力ですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのCookieが有るか無いかで、...
-
printfの%eで指数部分の桁数を...
-
バイナリとBCDコード
-
COBOLのCOMP形式について
-
PNGを24bppBMPに変換したいので...
-
cprintf()関数で2バイト文字を...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
VB.NET LeftBの代用
-
Javaで日本語1文字のバイト数
-
'dataType' 引数を Null にする...
-
COBOL PICTUREで X,S,Vの意味
-
VB6で漢字の1バイト目か2バイト...
-
ピクセル,dpiから容量(バイト...
-
utf-8でメールを送信すると件名...
-
任意のアルファベットの2進表...
-
POSTメソッドの最大容量について
-
10個の実数に対する降順ソート...
-
DataGridViewの特定列に入力さ...
-
Line Inputにて改行があっても...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのCookieが有るか無いかで、...
-
cookieにカンマ区切りでつめこ...
-
なんでブラウザでPHPを動かすた...
-
クッキーを連想配列で扱う方法...
-
異なるドメインのサイトでcooki...
-
ブラウザ間でCookieを共有する...
-
COleDateTime とtime_t
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
stable diffusionのエラー
-
Excel 1セル当りの文字数が2...
-
「1TB」のHDDに日本語は何字入...
-
DataGridViewの特定列に入力さ...
-
ピクセル,dpiから容量(バイト...
-
Excel VBA メール作成について ...
-
バイト列とバイナリ列の違いが...
-
エクセルシート名の制限を変更...
-
ListView重複データ削除
おすすめ情報