Возникли проблемы с добавлением 24-часовой системы голосования? - PullRequest
0 голосов
/ 21 января 2012

Существует скрипт, который запускает приведенный ниже код

Я хочу запретить выполнение скрипта чаще, чем один раз в сутки.

Я хотел, чтобы этот скрипт сохранял время последнего посещения всоставьте таблицу с идентификатором пользователя в базе данных, затем выполните расчет времени и верните их обратно до истечения 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...'; }
?>

РЕДАКТИРОВАТЬ: и я мог бы сделать так, чтобы он отображал время, оставшееся до того, как пользователь может проголосовать снова?

Ответы [ 2 ]

1 голос
/ 21 января 2012

Мне кажется, вы уже знаете, что должны делать:

Я хотел, чтобы этот скрипт сохранял время последнего посещения в таблице для идентификатора пользователя вбазы данных. Затем выполните расчет времени и верните их обратно до истечения 24-часового срока.

Итак:

  1. Забудьте о куки.Он хранится на стороне клиента и им можно манипулировать.
  2. Перед подсчетом голосов проверьте поле [lastvisit] текущего пользователя.
  3. Если не установлено, подсчитайте голоса и установите [lastvisit]поле в вашей таблице на текущую дату.
  4. Если установлено, рассчитайте промежуток времени между текущим и последним голосованием.Если значение превышает 24 часа, подсчитайте количество голосов и установите в поле [lastvisit] в вашей таблице текущую дату.

Имейте в виду:

  • Управляемые параметры: $_POST['Player'];
  • SQL-инъекции: VALUES ('".$player."', '".$input."')

Если у вас возникли проблемы с одной из этих задач, спросите о конкретной проблеме.

0 голосов
/ 21 января 2012
<?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
   {
       ...
   }

UPDATE

Я хотел бы подчеркнуть тот факт, что любой может ввести имя игрока и попытаться проголосовать за него, и это не обязательно означает, что тот же пользователь нажимает кнопку голосования.

Кроме того, IP-адрес не используется ни для каких целей, может быть целесообразно использовать его для дальнейших проверок разрешений / безопасности.

...