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で質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHPで訪問回数を表示するカウンタを作成したい 3 2023/05/27 07:09
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- Chrome(クローム) Cookieを削除 他サイトでの自動ログインなどの設定も削除されますか パソコン クロームです 1 2022/09/10 21:47
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのCookieが有るか無いかで、...
-
cookieにカンマ区切りでつめこ...
-
なんでブラウザでPHPを動かすた...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
バイナリとBCDコード
-
stable diffusionのエラー
-
エクセルシート名の制限を変更...
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
Excel VBA メール作成について ...
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
-
ビットスワップとバイトスワッ...
-
1KBが1024byteな理由
-
ピクセル,dpiから容量(バイト...
-
ビットデータのチェック方法
-
SQLで1バイト、2バイト混在...
-
VBAでUnicodeしか存在しない文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
なんでブラウザでPHPを動かすた...
-
異なるドメインのサイトでcooki...
-
PHPのCookieが有るか無いかで、...
-
cURLでcookieを送受信する方法...
-
COleDateTime とtime_t
-
javascriptでcookieを削除するには
-
初回アクセス時のみ、注意を表...
-
【PHP】アクセスカウンターが空...
-
JavaScriptで保存したクッキー...
-
Javascriptのmodalを一度だけ表示
-
ログインに関するフラグについて
-
ゲームノベルのような分岐のあ...
-
インクルードファイルからのリ...
-
クッキーを連想配列で扱う方法...
-
cookieにカンマ区切りでつめこ...
-
クッキーがセットされない
-
Cookieを設定しているかどうか...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
Excel VBA メール作成について ...
おすすめ情報