2015-10-01 2 views
1

Я пытаюсь создать простую систему голосования PHP, в которой пользователю сайта предлагается проголосовать за свою любимую фотографию. Каждый день допускается только один голос.PHP Voting System Redirect Not Working

Когда голосование кастовал PHP скрипт:

====

1 - проверяет пользователей IP-адрес и сравнивает его с текстовым файлом IP Log

2 - если IP-адрес пользователя найден в журнале, он проверяет, был ли последний голос (для этого IP-адреса) отправлен на текущую дату

3 - Если был зарегистрирован IP-адрес пользователя и последний голос был на дата аренды пользователь перенаправляется на страницу, напоминающую им, разрешается только один голос в день

4 - Если IP-адрес пользователя был зарегистрирован, но последний голос был до текущей даты, голосование записывается, и пользователь перенаправлено на благодарность за голосование.

5 - Если IP-адрес пользователя не зарегистрирован, голосование записывается, и пользователь перенаправляется на страницу с благодарностью за голосование.

====

К сожалению, PHP скрипт, я работаю с будет делать 1 из 2 вещей:

1 - Если "перерыв" включается после если/другое заявление ($ logIP == $ ipAddress), скрипт добавляет два голоса и две записи IP в журнал

2 - Если «перерыв» удален, вводится один голос и записывается один IP-адрес. Тем не менее, независимо от голосования и IP записываемые новые избиратели и возвращающие голоса перенаправлены на страницу, напоминающие им только один голос разрешаются каждый день одним и тем же пользователем

Сценарий выглядит следующим образом:

====

// GET USERS VOTE, IP ADDRESS AND TODAYS DATE 
$userVote = $_REQUEST['vote']; 
$ipAddress = $_SERVER["REMOTE_ADDR"]; 
$ipDate = date("Y/m/d"); 
// IF THE USERS VOTE IS NULL, REDIRECT TO ERROR PAGE 
if ($userVote != "") { 
    $userFound = false; 
    $userVoted = false; 
    echo $userFound . " -- " . $userVoted . "<br /><br />"; 
    $file_handle = fopen("ip_log.txt", "r"); 
    // LOOP THROUGH FILE IP ADDRRESSES AND DATES THOSE ADDRESSES WHERE LOGGED 
    while (!feof($file_handle)) { 
     $line_of_text = fgets($file_handle); 
     $parts = explode('||', $line_of_text); 
     $logIP = $parts[0]; 
     $logDate = $parts[1]; 
     // CHECK IF THE LOGGED IP ADDRESS MATCHES THE USERS IP ADDRESS 
     if ($logIP == $ipAddress) { 
      $userFound = true; 
      // CHECK IF THE LOGGED VOTE DATE MATCHES == TODAY FOR THE CURRENT IP ADDRESS BEING CHECKED 
      if ($logDate == $ipDate) { 
       // IP ADDRESS FOUND AND LOGGED DATE == TODAY, RREDIRECT USER TO TRY AGAIN LATER PAGE 
       header("Location: http://www.fotohuis.ca/vote/tryagain.html"); 
       exit; 
      } 
      else { 
       // IP ADDRESS FOUND BUT LOGGED DATE != TODAY, KEEP CHECKING UNTIL EOF 
      } 
     } 
     else { 
      // IP ADDRESS NOT FOUND, KEEP CHECKING UNTIL EOF 
      continue; 
     } 
    } 
    // USER FOUND 
    if ($userFound == true) { 
     // USER FOUND BUT THE LOGGED VOTE DATE != TODAY 
     if ($userVoted == false) { 
      // GET IP ADDRESS LOG CONTENT 
      $filename1 = "ip_log.txt"; 
      $content1 = file($filename1); 
      // INSERT USER IP ADDRESS INTO LOG 
      $insertip = "\r\n" . $ipAddress . "||" . $ipDate; 
      $fp1 = fopen($filename1, "a"); 
      fputs($fp1, $insertip); 
      fclose($fp1); 
      // GET POLL RESULT CONTENT 
      $filename2 = "poll_result.txt"; 
      $content = file($filename2); 
      // PUT VOTE CONTENT INTO ARRAY 
      $array = explode("||", $content[0]); 
      $picOne = $array[0]; 
      $picTwo = $array[1]; 
      $picThree = $array[2]; 
      $picFour = $array[3]; 
      $picFive = $array[4]; 
      $picSix = $array[5]; 
      // CALCULATE VOTE TOTAL 
      if ($userVote == 0) { 
       $picOne = $picOne + 1; 
      } 
      if ($userVote == 1) { 
       $picTwo = $picTwo + 1; 
      } 
      if ($userVote == 2) { 
       $picThree = $picThree + 1; 
      } 
      if ($userVote == 3) { 
       $picFour = $picFour + 1; 
      } 
      if ($userVote == 4) { 
       $picFive = $picFive + 1; 
      } 
      if ($userVote == 5) { 
       $picSix = $picSix + 1; 
      } 
      // INSERT USER VOTE 
      $insertvote = $picOne . "||" . $picTwo . "||" . $picThree . "||" . $picFour . "||" . $picFive . "||" . $picSix; 
      $fp2 = fopen($filename2, "w"); 
      fputs($fp2, $insertvote); 
      fclose($fp2); 
      // /REDIRECT USER TO THANK YOU FOR VOTING PAGE 
      header("Location: http://www.fotohuis.ca/vote/thankyou.html"); 
      exit; 
     } 
     // USER FOUND AND THE LOGGED VOTE DATE == TODAY 
     else { 
      // USER ATTEMPTED TO VOTE 2+ TIMES IN THE SAME DAY, REDIRECT USER TO TRY AGAIN LATER PAGE 
      header("Location: http://www.fotohuis.ca/vote/tryagain.html"); 
      exit; 
     } 
    } 
    // USER NOT FOUND 
    else { 
     // GET IP ADDRESS LOG CONTENT 
     $filename1 = "ip_log.txt"; 
     $content1 = file($filename1); 
     // INSERT USER IP ADDRESS INTO LOG 
     $insertip = "\r\n" . $ipAddress . "||" . $ipDate; 
     $fp1 = fopen($filename1, "a"); 
     fputs($fp1, $insertip); 
     fclose($fp1); 
     // GET POLL RESULT CONTENT 
     $filename2 = "poll_result.txt"; 
     $content2 = file($filename2); 
     // PUT VOTE COUNT INTO ARRAY 
     $array = explode("||", $content2[0]); 
     $picOne = $array[0]; 
     $picTwo = $array[1]; 
     $picThree = $array[2]; 
     $picFour = $array[3]; 
     $picFive = $array[4]; 
     $picSix = $array[5]; 
     // CALCULATE VOTE TOTAL 
     if ($userVote == 0) { 
      $picOne = $picOne + 1; 
     } 
     if ($userVote == 1) { 
      $picTwo = $picTwo + 1; 
     } 
     if ($userVote == 2) { 
      $picThree = $picThree + 1; 
     } 
     if ($userVote == 3) { 
      $picFour = $picFour + 1; 
     } 
     if ($userVote == 4) { 
      $picFive = $picFive + 1; 
     } 
     if ($userVote == 5) { 
      $picSix = $picSix + 1; 
     } 
     // INSERT USER VOTE 
     $insertvote = $picOne . "||" . $picTwo . "||" . $picThree . "||" . $picFour . "||" . $picFive . "||" . $picSix; 
     $fp2 = fopen($filename2, "w"); 
     fputs($fp2, $insertvote); 
     fclose($fp2); 
     // REDIRECT USER TO THANK YOU FOR VOTING PAGE 
     header("Location: http://www.fotohuis.ca/vote/thankyou.html"); 
     exit; 
    } 
    fclose($file_handle); 
} 

====

Любая помощь с этим будет очень цениться, как я был у нее уже неделю без каких-либо прогресса :(

ответ

0

Этот код может быть значительно упрощен, чтобы упростить его понимание и изменение в будущем. Существует также несколько повторяющихся кодов, которые не обязательно должны быть.

Это не проверено, но оно должно работать и дает вам представление о том, как двигаться вперед.

Перед тем, как попробовать, убедитесь, что вы его протестировали или резервное копирование существующих голосов!

<?php 

$userVote = $_REQUEST['vote']; 
$ipAddress = $_SERVER["REMOTE_ADDR"]; 
$ipDate = date("Y/m/d"); 
$ipLogFile = 'ip_log.txt'; 
$resultLogFile = 'poll_result.txt'; 

//IF THE USERS VOTE IS NULL or out of range, REDIRECT TO ERROR PAGE 
if (empty($userVote) || $userVote < 0 || $userVote > 5) { 
    header('Location: errorpage.html'); 
    exit; 
} 

$file_handle = fopen($ipLogFile, "r"); 

//LOOP THROUGH FILE IP ADDRRESSES AND DATES THOSE ADDRESSES WHERE LOGGED   
while (!feof($file_handle)) 
{ 
    $line_of_text = fgets($file_handle); 
    $parts = explode('||', $line_of_text); 
    $logIP = $parts[0]; 
    $logDate = $parts[1]; 

    if ($logIP == $ipAddress && $logDate == $ipDate) { 
     // IP ADDRESS FOUND AND LOGGED DATE == TODAY FOR CURRENT IP 
     header("Location: http://www.fotohuis.ca/vote/tryagain.html"); 
     exit; 
    } 
} 
fclose($file_handle); 

// user has not voted ever, or today 

$insertip = "\r\n".$ipAddress."||".$ipDate; 
file_put_contents($ipLogFile, $insertip, FILE_APPEND); 

//GET POLL RESULT CONTENT 
$fp = fopen($resultLogFile, 'r+'); // open for reading and writing 
flock($fp, LOCK_EX); // lock file so it can't be changed 
$content = fgets($fp); // read contents of file 

//PUT VOTE CONTENT INTO ARRAY 
$array = explode("||", $content); 
// $array[0] = picOne; $array[1] = picTwo; etc 

$array[$userVote] = (int)$array[$userVote] + 1; 

ftruncate($fp); // truncate the file so it is empty 
rewind($fp); // jump to beginning of file 

$insertvote = implode('||', $array); // array to string 0||1||2||3||4||5 
fwrite($fp, $insertvote); // write new vote tally 

flock($fp, LOCK_UN); // unlock file 
fclose($fp); // close file 

///REDIRECT USER TO THANK YOU FOR VOTING PAGE 
header("Location: http://www.fotohuis.ca/vote/thankyou.html"); 
exit; 

Надеюсь, что это поможет!

+0

Спасибо за очистку кода ... делает его намного легче читать.Две вещи, которые я заметил после тестирования: (1) голоса добавляются только во вторую позицию массива и (2) происходит одна и та же ошибка; в частности, пользователь отправляет голосование, цикл while работает, не находит IP/дату, объявления IP/дату, а затем его, как если бы цикл while снова запускался и теперь находит IP/дату и перенаправляет пользователя на уже (это несмотря на то, что ранее не было проголосовано.) --- после принятия голосования пользователь должен быть перенаправлен на страницу с благодарностью. Мысли? –

+0

Произошла ошибка в строке '$ array = explode (" || ", $ content [0]);', которая теперь исправлена ​​в ответе. Цикл работает только один раз, поэтому я не уверен, почему он будет делать то, что вы указали, если у вас больше кода, который здесь не показан. – drew010

+0

Да ... Я играл с кодом и просто понял это. По-прежнему возникает проблема, когда пользователь, который впервые подает голос (или первый раз в день), перенаправляется на страницу «tryagain.html» ... это как если бы перенаправление на страницу «thankyou.html» не было Не обрабатывайтесь!?! –

 Смежные вопросы

  • Нет связанных вопросов^_^