【问题标题】:PHP Voting System Redirect Not WorkingPHP投票系统重定向不起作用
【发布时间】:2015-12-28 22:02:02
【问题描述】:

我正在尝试构建一个简单的 PHP 投票系统,要求网站用户对他们最喜欢的照片进行投票。每天只允许投一票。

投票后,PHP 脚本将:

====

1 -- 检查用户 IP 地址并将其与 IP 日志文本文件进行比较

2 -- 如果在日志中找到用户 IP 地址,它会检查是否在当前日期提交了最后一次投票(针对该 IP 地址)

3 -- 如果记录了用户的 IP 地址并且最后一次投票是在当前日期,则用户被重定向到页面,提醒他们每天只允许一次投票

4 -- 如果记录了用户的 IP 地址,但最后一次投票早于当前日期,则记录投票并将用户重定向到感谢投票页面

5 -- 如果未记录用户 IP 地址,则记录投票并将用户重定向到感谢您的投票页面。

====

不幸的是,我正在使用的 PHP 脚本会做两件事中的一件:

1 -- 如果在 if/else 语句 ($logIP == $ipAddress) 之后包含“中断”,则脚本会在日志中添加两个投票和两个 IP 条目

2 -- 如果“break”被删除,则输入一票并记录一个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);
}

====

任何帮助都将不胜感激,因为我已经做了一个星期了,但没有任何进展:(

【问题讨论】:

    标签: php redirect voting vote


    【解决方案1】:

    这段代码可以大大简化,方便日后理解和修改。还有一些不需要重复的代码。

    这是未经测试的,但它应该可以工作,并让您了解如何前进。

    在您尝试之前,请务必对其进行测试或备份您现有的投票数!!!

    <?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;
    

    希望有帮助!

    【讨论】:

    • 感谢您清理代码...使其更易于阅读。测试后我注意到两件事:(1)投票只添加到数组的第二个位置,以及(2)出现同样的错误;具体来说,用户提交投票,while 循环运行,没有找到 IP/日期,广告 IP/日期,然后好像 while 循环再次运行,现在找到 IP/日期并将用户重定向到已经投票页面(尽管之前没有投票。)---一旦投票被接受,用户应该被重定向到感谢页面。想法?
    • $array = explode("||", $content[0]); 行存在错误,现在已在答案中更正。该循环只运行一次,所以我不确定它为什么会按照您的指示执行,除非您有更多未在此处显示的代码。
    • 是的......我正在玩弄代码,只是想通了。仍然存在第一次(或一天中第一次)投票的用户被转发到“tryagain.html”页面的问题......好像重定向到“thankyou.html”页面没有'没有得到处理!?!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多