変数名の自動生成(投票の多重投稿防止)

このQ&Aのポイント
  • 投票システムを作っていますが、多重投稿を防ぐためにクッキーに値を保存しようと考えました。
  • 投票するアイテムが複数あり、1番目のアイテムに投票した場合は、同じアイテムには連続して投稿はできないけれど、他のアイテムには投票できると、要するに投票されたアイテムもクッキーに保存しておきたいのです。
  • 変数名自体を作る方法や他の方法で多重投稿を防止する方法を教えてください。
回答を見る
  • ベストアンサー

変数名の自動生成(投票の多重投稿防止)

投票システムを作っていますが、多重投稿を防ぐためにクッキーに値を保存しようと考えました。(それほど厳密な多重投稿防止ではないので) 投票するアイテムが複数あり、1番目のアイテムに投票した場合は、同じアイテムには連続して投稿はできないけれど、他のアイテムには投票できると、要するに投票されたアイテムもクッキーに保存しておきたいのです。 今、 setcookie("ABC","vote".$id."=1",time()+90*24*60*60); として、id1に投票した場合はvote1という変数に1が保存されるようになっています。 で、2番目、3番目のアイテムに投票された場合や、投票時にすでに投票されているかどうかチェックするときにクッキーの情報を呼び出すわけですが、変数名自体を自動生成させるのはどうすればいいのでしょうか。 例えば、id1に投票があったかどうかチェックする場合に if(isset($ABC)){ parse_str($ABC); if(isset("$vote".$id)){ ・・・ とは書けないですよね? 変数名自体を作る方法を教えてください。 また、このような状態で多重投稿を防ぎたい場合に、もっと簡単な方法はないでしょうか。 (クッキーを使わない方法でも結構です) あわせて教えて頂けると嬉しいです。 よろしくお願いいたします。

  • umioyo
  • お礼率78% (172/220)
  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

そしたら、可変変数を使えばよいのでは。 //$vote1 = 99; $id = 1; $vote = "vote$id"; print isset($$vote);

参考URL:
http://php.s3.to/man/language.variables.variable.html
umioyo
質問者

お礼

なるほど。 可変変数というもの自体を扱ったことがなかったので勉強になりました。 まだ完全に理解していませんが、いろいろ調べてみます。 ありがとうございました。

その他の回答 (1)

回答No.1

ひとつの変数で、複数のアイテムを扱えばよいのでは。 アイテム3つだとしたら、 0が投票してない、1が投票したという意味だとして、 1番目と3番目に投票しているなら、、 101 とか、あるいは単純に OXO とかでも、いいかも。 特定のアイテムについてチェックするときは substr で簡単に取り出せますよね。

umioyo
質問者

補足

ご回答ありがとうございます。 アイテム数が、最低でも1万件ありますので・・・ この方法はちょっと・・・他によい方法はないでしょうか。

関連するQ&A

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

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

    • ベストアンサー
    • PHP
  • 「isset」の用法について

    「isset」は変数の存在を判定する関数ということですが 以下の場合だと同じ意味になると思うのですが それであれば「isset」を使わないほうがシンプルになると思います。 「isset」を使うにあたって何か特別な意味や 用法があるのでしょうか? ----------------------- if(isset($abc){ echo $abc; } と if($abc){ echo $abc; } は同じだと思うのですが。。。 ----------------------- よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 特定カラム値が規定値以上になった場合発動するトリガ

    MySQLのトリガについて教えてください。 投票システムを作っています。 テーブル名 abc ( abc1_id(プライマリ) , abc2_vote_volume(INT) ) テーブル名 def ( def1_id(プライマリ) , def2_vote_volume(INT) ) があります。 テーブル名 abc にある abc2_vote_volume(INT)にはユーザーが1票づつ投票します。 abc2_vote_volume(INT)が49までのうちは何も起こらず、 abc2_vote_volume(INT)が50を超えたら「テーブル名 def 」に全てをコピーしていくトリガの作成を考えました。 私が考えたのは下記の表現なのですが、エラーとなります。 FOR AS IF UPDATE 49<NEW.adc2_vote_volume が見るからに怪しいのですが、改定方法が分かりません。 詳しい方、ご教授頂けますようお願いいたします。 DELIMITER // CREATE TRIGGER a_ref AFTER UPDATE ON abc FOR AS IF UPDATE 49<NEW.adc2_vote_volume INSERT INTO def SET def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume ON DUPLICATE KEY UPDATE def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume; END; // DELIMITER

    • ベストアンサー
    • MySQL
  • 変数名をプログラムで変える

    変数名$keyにある数字を一文字ずつ$w1、$w2・・・に入れていきたいと考えています。 if (isset($key)){ for($i=1;$i<strlen($key);$i++){ $w[$i]=substr($key,$i-1,1); } 変数w1、w2をfor文の中で変化させていきたいのですが、どのようにすればいいのでしょうか。 上記の$w[$i]ではだめでした。(配列になっちゃうのかな) 例えば$key=5432の場合、 $w1=5; $w2=4; $w3=3; $w4=2; としたいのです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • if文でisset

    isset()などを使わずに下記のように変数だけで条件を指定するとまずいですか? isset()などをつかった場合の違いはなんでしょうか? if($_SESSION['id']){ print "hoge"; }

    • ベストアンサー
    • PHP
  • 遅いクエリーを改善するため他の書き方を教えて欲しい

    mysqlで特定のクエリーが遅いのですが、どのようにしたら改善されるでしょうか。 問題のクエリは下記になります。 mysql_query("select i.id AS id,i.name AS iname,i.price AS iprice,v.id AS vid,v.vote AS vvote,SUM(IF(v.vote='10',1,0)) AS totalvote from item AS i LEFT JOIN vote AS v ON i.id=v.id GROUP BY i.id order by totalvote desc;",$conn); 「itemテーブルのid」と「voteテーブルのid」と「voteテーブルのvote」にはindexを作成しています。 ウェブサイトから商品に対して投票できるようにしています。 投票は1(最低点)から10(最高点)までになっています。 最高点のみの投票数を合計して、その合計投票数が大きい順に商品をソートできるようにしています。 SUM(IF(v.vote='10',1,0)) AS totalvote がいけないのかなと思っているのですが、他にどのようなクエリの書き方があるでしょうか。 どなたかアドバイス頂けると幸いです。よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • PHPで携帯の二重投稿防止の作り方

    ども初めまして、匠と申します。よろしくお願いします。 質問は記述の仕方です。(使う関数や考え方)    9/1までに、携帯でも二重投稿防止の投票ホームを作りたいと思っています。  仕様は ・一人一日一回まで投票できる。 これのみです。  PCのほうは、クッキーでそのような仕組みを作ったのですが、携帯は携帯個別認識番号なるものを抜き出して、DBに登録しようと考えています。 以下はプログラムです。if文の条件部分がどのように書いたらいいのか迷っています。 //DB登録されている個別認識番号と一致するか if(送られてきた認識番号がDBに登録されていなかったら){ $sql = "insert into block (`ip`, `time`) values('$ip', '$now_time')"; // データを取り出す $sql = "SELECT * FROM touhyou "; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); while( $rec = mysql_fetch_array( $res, MYSQL_ASSOC ) ){ $r_a=$rec['a']; } //更新 switch ($post_vote) { case "aに投票する": $r_a= $r_a+1; $sql = "update touhyou set a= $r_a"; mysql_query($sql, $conn); break; default :echo"dame"; } exit; } else{ if(現在の時刻と前回訪問から24時間過ぎているを調べる){ 認識番号はそのままで時間ののところだけ更新; 投票; } else{echo "一日一回しか投票できません"; } }  長々と読んでいただきありがとうございます。 是非、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • セッション変数のセキュリティ

    プログラム初心者です セッション変数の安全性について教えてください ログインしているかをセッション変数で判定しています。セッションidは使っていません 質問1 悪意をもったハッカーがセッション変数を取得することはできますか?それともセッション変数はクッキーと違い安全なんでしょうか? 質問2 セッション変数の保持時間は決まっていますか? session_start(); if(!isset($_SESSION['id'])){ header('Location: login.php'); exit(); } よろしくお願いします

    • ベストアンサー
    • PHP
  • COOKIEを使った二重投稿禁止する方法

    COOKIEを利用して二重投票を禁止するようにしたいと思っています。 $id=12; //スレッドID if(isset($_COOKIE[$id])){ print("連続投票です。"); exit; }else{ setcookie($id , "vete_flg" , time()+$3600*24*7); } 上記のようにしているのですが、COOKIEにきちんと記録されず、 print_r($_COOKIE)を見たところ、上記と同じように設定した 新規投稿スレッドのCOOKIE「Array ( [entry] => entry_flg ) 」 が表示されてしまいます。 どうすれば用途別にCOOKIEを切り分けて二重投稿等を禁止できるのか、 その方法を教えてください。m(_ _)mペコリ

    • ベストアンサー
    • PHP
  • エラーがでます

    php初心者です XANPPで見てみたら、エラーがでました 変数チェックにissetを使っていないと気が付いたのですが そこで下記のようにしたのですが、POSTに何もなかった場合は$idの中身は、何もないですよね? 何も中身がない$idがechoのところで出現してもエラーにならないのですか? if (isset($_POST['id'])){ $id=$_POST['id']; } echo $id; よろしくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう