
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ランキング
-
Cookieを設定しているかどうか...
-
異なるドメインのサイトでcooki...
-
ブラウザ間でCookieを共有する...
-
テキストBOXの入力制限について
-
文字化け
-
CGI掲示板の文字化け
-
BBSの基本的なファイル操作法?
-
UTF-8で5~6バイトになる文字コ...
-
URLは最高何文字まで可能なので...
-
varchar(M)のMは文字数ですかバ...
-
jis x 0208 について
-
この関数はどのプログラミング...
-
VB6とSQL Serverの桁の扱い方に...
-
全角半角を調べるライブラリ関...
-
CGIからの文字が化ける
-
バイト列とバイナリ列の違いが...
-
文字列の最後の一字を削除
-
改行文字保存時のゴミ
-
COBOLのCOMP形式について
-
文字コードの利点・欠点について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
異なるドメインのサイトでcooki...
-
PHPのCookieが有るか無いかで、...
-
HPでメールアドレス取得
-
Cookieを設定しているかどうか...
-
なんでブラウザでPHPを動かすた...
-
クッキーを使ってお気に入り
-
cookieにカンマ区切りでつめこ...
-
ブラウザ間でCookieを共有する...
-
phpのsetcookie()関数について...
-
退室されずにページを落ちた時...
-
ログイン機能について
-
LWP::Simple;でWebページを取得...
-
JavaScriptとcookieでページ振...
-
同一のwebサイトでクッキー情報...
-
インクルードファイルからのリ...
-
クッキーを連想配列で扱う方法...
-
perl チャット リロード
-
初回アクセス時のみ、注意を表...
-
XML文書の書き方
-
このサイトの二重投稿防止の方...
おすすめ情報