**[[質問箱4/306]] [#x02fade8]
#author("2018-03-11T20:11:28+09:00;2008-05-12T00:39:02+09:00","","")
**[[質問箱/4306]] [#x02fade8]
|RIGHT:70|LEFT:410|c
|~カテゴリ||
|~サマリ|voteの連続投票を制限したい|
|~バージョン|1.4.7|
|~投稿者|[[いっつ]]|
|~状態|質問|
|~投稿日|&new{2008-05-11 (日) 15:29:08};|
***質問 [#v85dd03e]
 voteを使ってアンケートを採っていますが、同一IPアドレスから連続で投票されてしまいます。~
 同一IPアドレスからは1時間に1回とかの制限を付けたいのですが、何か方法はありませんか。~
 一つのページにvoteは複数あるので、それぞれのアンケートに1回ずつなら連続してできる必要があります。~

***解決 [#sb01be87]
 以下のパッチを作って解決しました。~
 はじめてPHPをさわったので、おかしなところがあったら指摘をお願いします。
 *** vote.inc.php.org    2006-10-22 05:40:26.000000000 +0900
 --- vote.inc.php        2008-05-11 17:39:23.000000000 +0900
 ***************
 *** 8,19 ****
   {
         global $vars, $script, $cols,$rows;
         global $_title_collided, $_msg_collided, $_title_updated;
 !       global $_vote_plugin_votes;
 
         if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
 
         $postdata_old  = get_source($vars['refer']);
 
         $vote_no = 0;
         $title = $body = $postdata = $postdata_input = $vote_str = '';
         $matches = array();
 --- 8,20 ----
   {
         global $vars, $script, $cols,$rows;
         global $_title_collided, $_msg_collided, $_title_updated;
 !       global $_vote_plugin_votes, $_vote_plugin_continue;
 
         if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
 
         $postdata_old  = get_source($vars['refer']);
 
 +       $vote_err = 0;
         $vote_no = 0;
         $title = $body = $postdata = $postdata_input = $vote_str = '';
         $matches = array();
 ***************
 *** 34,41 ****
                                 $cnt = $matches[2];
                         }
                         $e_arg = encode($arg);
 !                       if (! empty($vars['vote_' . $e_arg]) && $vars['vote_' . $e_arg] == $_vote_plugin_votes)
 !                               ++$cnt;
 
                         $votes[] = $arg . '[' . $cnt . ']';
                 }
 --- 35,48 ----
                                 $cnt = $matches[2];
                         }
                         $e_arg = encode($arg);
 !                       if (! empty($vars['vote_' . $e_arg]) && $vars['vote_' . $e_arg] == $_vote_plugin_votes) {
 !                               if(local_vote_ipcheck($vote_no)){
 !                                       ++$cnt;
 !                               }
 !                               else{
 !                                       $vote_err = 1;
 !                               }
 !                       }
 
                         $votes[] = $arg . '[' . $cnt . ']';
                 }
 ***************
 *** 45,50 ****
 --- 52,61 ----
                 $postdata      .= $vote_str;
         }
 
 +       if($vote_err == 1){
 +               return array('msg'=>$_vote_plugin_continue);
 +       }
 +
         if (md5(@join('', get_source($vars['refer']))) != $vars['digest']) {
                 $title = $_title_collided;
 
 ***************
 *** 147,150 ****
 --- 158,199 ----
 
         return $body;
   }
 +
 + function local_vote_ipcheck($vote_no)
 + {
 +       $vote_keeptime = 86400; // IIPアドレスを保存する秒数
 +
 +       global $vars;
 +
 +       $ipcheck = 1;
 +       $file = PLUGIN_DIR . 'vote/' . encode($vars['refer']);
 +       $fp = fopen($file, file_exists($file) ? 'r+' : 'w+')
 +               or die("vote.inc.php: Cannot open $file");
 +       set_file_buffer($fp, 0);
 +       flock($fp, LOCK_EX);
 +       rewind($fp);
 +       $list = array();
 +       while(!feof($fp)){
 +               $line = fgets($fp, 256);
 +               $tok = split(',', rtrim($line));
 +               if($tok[0] < UTIME - $vote_keeptime){
 +                       continue;
 +               }
 +               if(strcmp($tok[1], $_SERVER['REMOTE_ADDR']) == 0
 +               && $tok[2] == $vote_no){
 +                       $ipcheck = 0;
 +               }
 +               else{
 +                       array_push($list, $line);
 +               }
 +       }
 +       array_push($list, UTIME.",".$_SERVER['REMOTE_ADDR'].",$vote_no\n");
 +       rewind($fp);
 +       ftruncate($fp, 0);
 +       foreach ($list as $line){
 +               fputs($fp, $line);
 +       }
 +       fclose($fp);
 +       return $ipcheck;
 + }
   ?>

 *** ja.lng.php.org  2008-05-11 17:46:22.000000000 +0900
 --- ja.lng.php  2008-05-11 17:41:08.000000000 +0900
 ***************
 *** 437,442 ****
 --- 437,443 ----
   // vote.inc.php
   $_vote_plugin_choice = '選択肢';
   $_vote_plugin_votes  = '投票';
 + $_vote_plugin_continue = '連続投票はできません。';
 
   ///////////////////////////////////////
   // yetlist.inc.php
 

***回答 [#x3661298]
- [[自作プラグイン/votex.inc.php]] --  &new{2008-05-12 (月) 00:38:24};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.020 sec.

SourceForge