0

以下のコードをトリガーするスクリプトがあります

スクリプトを 24 時間に 2 回以上実行することを禁止したいと考えています。

このスクリプトで、データベースのユーザー ID に対して最後の訪問時間をテーブルに保存し、時間の計算を行い、24 時間の有効期限までバックアウトするようにしました。

誰かがこれを行う方法を説明できますか? 誰かがこれで私を助けていただければ幸いです。

<?php
//Input correct values into this section
$dbhost = '888888';
$dbuser = '888888';
$dbpass = '888888';
$dbname = '888888';
$dbtable = 'redeem';
$dbtable2 = 'playersthatvoted';
//------------------------------------
$input = 'diamond 12';
$player = $_POST['Player'];
$time = time();
if(!isset($_COOKIE['24Hourvote'])){
   //---- This is the connection
   $conn = mysql_connect ($dbhost, $dbuser, $dbpass) or die ('Error: ' . mysql_error());
   mysql_select_db($dbname);
   $query1 = "INSERT INTO `".$dbname."`.`".$dbtable."` (`player`, `item`) VALUES ('".$player."', '".$input."')";
   $query2 = "INSERT INTO `".$dbname."`.`".$dbtable2."` (`player`, `time`) VALUES ('".$player."', '".$time."')";
   mysql_query($query1);
   mysql_query($query2);
   $query= 'SELECT `player` FROM `playersthatvoted` ASC LIMIT 0, 10 ';
   $result = mysql_query($query);
   mysql_close($conn);
   echo 'Done! Type /redeem in-game to get your diamonds.';
   $ip=@$REMOTE_ADDR;
   setcookie ("24Hourvote",$ip,time()+86400,'/',true,…
} else {
   echo 'You have already voted today! Come back later...'; }
?>

編集:ユーザーが再度投票できるようになるまでの残り時間を表示するようにできますか?

4

2 に答える 2

1

私には、あなたがしなければならないことをすでに知っているように見えます:

このスクリプト で、データベース内のユーザー ID に対して最後の訪問時間をテーブルに保存する必要がありました。次に、時間の計算を行い、24 時間の有効期限までそれらを元に戻します。

そう:

  1. クッキーのことは忘れてください。クライアント側に保存され、操作できます。
  2. 投票を数える前に、現在のユーザーの [lastvisit] フィールドを確認してください。
  3. 設定されていない場合は、投票をカウントし、テーブルの [lastvisit] フィールドを現在の日付に設定します。
  4. 設定されている場合、現在から最後の投票までの期間を計算します。24 時間を超える場合は、投票を数えて、テーブルの [lastvisit] フィールドに現在の日付を設定します。

次の点に注意してください。

  • 操作パラメータ:$_POST['Player'];
  • SQL インジェクション:VALUES ('".$player."', '".$input."')

これらのタスクのいずれかに問題がある場合は、具体的な問題について尋ねてください。

于 2012-01-21T11:10:52.120 に答える
0
<?php
//Input correct values into this section
$dbhost = '888888';
$dbuser = '888888';
$dbpass = '888888';
$dbname = '888888';
$dbtable = 'redeem';
$dbtable2 = 'playersthatvoted';
//------------------------------------
$input = 'diamond 12';
$time = time();
if(!isset($_COOKIE['24Hourvote'])){
       $ip = $_SERVER['REMOTE_ADDR'];
   //---- This is the connection
   $conn = mysql_connect ($dbhost, $dbuser, $dbpass) or die ('Error: ' . mysql_error());
   mysql_select_db($dbname);

      // Escape all user entered data always
      $player = mysql_real_escape_string($_POST['Player']);

   // Select time for this player if available
   $query = "SELECT time FROM playersthatvoted WHERE player = '$player' ORDER BY time DESC LIMIT 0, 1";
   $result = mysql_query($query);

   if(mysql_num_rows($result) != 0)
   {
       $row = mysql_fetch_row($result);
       $last_visit = $row[0];
       $vote_allowed_time = $last_visit + 86400; 

       // Allowed to vote
       if($time > $vote_allowed_time)
       {
           // Do whatever else you need to here ...

           setcookie ("24Hourvote",$ip,time()+86400,'/');
       }
       else
       {
           echo 'This player has already voted today! Come back later...';
       }
   }
   else
   {
       $query1 = "INSERT INTO `".$dbname."`.`".$dbtable."` (`player`, `item`) VALUES ('".$player."', '".$input."')";
       $query2 = "INSERT INTO `".$dbname."`.`".$dbtable2."` (`player`, `time`) VALUES ('".$player."', '".$time."')";
       mysql_query($query1);
       mysql_query($query2);
       $query= 'SELECT `player` FROM `playersthatvoted` ASC LIMIT 0, 10 ';
       $result = mysql_query($query);
       mysql_close($conn);
       echo 'Done! Type /redeem in-game to get your diamonds.';

       setcookie ("24Hourvote",$ip,time()+86400,'/');
   }
} else {
   echo 'You have already voted today! Come back later...'; }
?>

注: ユーザー入力を決して信頼せず、常にデータを検証してエスケープしてください。

かわった:

$player = $_POST['Player'];

に:

$player = mysql_real_escape_string($_POST['Player']);

追加した:

 // Select time for this player if available
 $query = "SELECT time FROM playersthatvoted WHERE player = '$player' ORDER BY time DESC LIMIT 0, 1";
 $result = mysql_query($query);


if($result)
   {
       $row = mysql_fetch_row($result);
       $last_visit = $row[0];
       $vote_allowed_time = $last_visit + 86400; 

       // Allowed to vote
       if($time > $vote_allowed_time)
       {
           // Do whatever else you need to here ...

           setcookie ("24Hourvote",$ip,time()+86400,'/');
       }
       else
       {
           echo 'This player has already voted today! Come back later...';
       }
   }
   else
   {
       ...
   }

アップデート

現状では、誰でもプレイヤー名を入力して投票を試みることができ、必ずしも投票ボタンをクリックしたユーザーと同じであるとは限らないという事実を強調したいと思います。

さらに、IP アドレスはいかなる目的にも使用されていません。これをさらなる許可/セキュリティ チェックに使用することをお勧めします。

于 2012-01-21T12:26:05.847 に答える