当我尝试计算IP点击数时,为什么我的会话无法正常工作?

时间:2016-08-05 22:27:52

标签: php json session ip

我试图在PHP中创建一个计数器,该计数器将计算IP在一定时间范围内可以访问页面的次数,以及当它在该时间范围内点击下载计数器时它重定向。我推荐的方法是在参考几个Q& As后用会话做这个:

我也看了看:

我对cookie和会话没有太多经验,所以我相信这是我的代码中的错误。如果您对我的工作有更好的实施建议,请告知。

代码:

$jsonFile       = 'foobar.json';
$theJSON        = file_get_contents($jsonFile);  
$jsonArray      = json_decode($theJSON, true);
$theIP          = "123.123.123"; // $_SERVER['REMOTE_ADDR']
$thisTime       = date("H:i");
$addMin         = 1; // set value for testing purposes
$addHour        = 0; // set value for testing purposes
$downloadHits   = 5; // set value for testing purposes
$timeLater      = date("H:i", strtotime($thisTime)+(($addMin*60)+($addHour*60*60)));


if (!empty($theIP) && !empty($jsonArray)) {
    foreach ($jsonArray as $value) {
        if (in_array($theIP, $value, true)) {
            echo "yes"; // header('Location: https://www.url/darthvader.com');
            exit();
        } else {
            if ($thisTime <= $timeLater) { // where my issue starts
                echo $timeLater; // for testing
                session_start();
                $counter = $_SESSION['promo_number'];
                $counter++;
                if ($counter == $downloadHits && file_exists($jsonFile)) {
                    $currentData = file_get_contents($jsonFile);  
                    $currentArray = json_decode($currentData, true); 
                    $theStuff = array(  
                        'ip'    => "123.123.123", // $_SERVER['REMOTE_ADDR']  
                        'date'  => date("H:i"),
                        'time'  => date("m.d.y")
                    );
                    $currentData[] = $theStuff;  
                    $finishData = json_encode($currentData);
                } else {
                    echo 'bar'; // for testing
                    session_unset();
                    session_destroy();
                }
            }
        }
    }
} else {
    echo '<span style="color:red; font-weight:bold;">empty file</span>';
}

我要做的是计算IP在一定时间内访问帖子的时间,如果它点击该计数重定向IP。我知道IP可以被欺骗,我并不担心,此外我更愿意使用数据库。那么如何正确设置会话以计算命中数,如果IP在设置计数中命中帖子,它会重定向IP?

修改

在做了一些阅读以及评论和回答的帮助后,我做了一个编辑,希望能解释我想要做的事情。经过进一步的研究,我碰到了:

这让我得到了代码:

session_start();
$jsonFile           = 'foobar.json';
$jsonArray          = json_decode(file_get_contents($jsonFile), true);
$theIP              = $_SERVER['REMOTE_ADDR'];
$addMin             = 2; // set value for testing purposes
$addHour            = 0; // set value for testing purposes
$targetedHits       = 1; // set value for testing purposes
$timeLater          = time() + ($addMin*60) + ($addHour*60*60);
$_SESSION['expire'] = $timeLater;

if (!empty($theIP) && !empty($jsonArray)) {
    //look for the $theIP
    if (in_array($theIP,array_column($jsonArray,'ip'))) {
        echo 'IP found in json';
        exit;
    }
    // look at the time the session was set, add to counter or delete session
    if ($_SESSION['count'] = isset($_SESSION['count']) && time() < $_SESSION['expire'] ) {
        echo 'adding to count';
        $_SESSION['count'] + 1;
        // limit reached. Add IP to blacklist
        if ($_SESSION['count'] > $targetedHits) {
            echo 'session count reached max';
            $jsonArray[]=[
                'ip'    => $theIP,
                'date'  => date("H:i"),
                'time'  => date("m.d.y")
            ];
            // save changes
            file_put_contents($jsonFile,json_encode($jsonArray));
            session_destroy();
            exit;
        }       
    } elseif (time() > $_SESSION['expire']) {
        echo 'nuking session and counter';
        session_destroy();
    } else {
        echo 'setting count to 1';
        $_SESSION['count'] = 1;
    }
}
echo '<pre>';
var_dump($_SESSION);
echo '</pre>';

但遗憾的是现在$_SESSION['count'] + 1;不再增加。

2 个答案:

答案 0 :(得分:1)

Darth_Vader你几乎就在那里。您的脚本存在一些问题。

  • 您永远不会在会话中保存计数,因此您无法在以后检索
  • 您在脚本后期开始会话。这是不好的做法,因为一旦你回应更高的东西或忘记并且尝试使用更高的$_SESSION
  • ,它就会破裂
  • 您阅读了JSON文件并不必要地解码了两次,浪费了系统内存
  • 您永远不会保存对JSON所做的更改
  • 成功下载后即可致电session_unset()session_destroy(),因此即使您尝试正确保存,计数也会丢失

我的修改:

session_start();    
$jsonFile       = 'foobar.json';
$jsonArray = json_decode(file_get_contents($jsonFile), true);
$theIP          = $_SERVER['REMOTE_ADDR'];
$thisTime       = time();
$addMin         = 1; // set value for testing purposes
$addHour        = 0; // set value for testing purposes
$downloadHits   = 5; // set value for testing purposes
$timeLater      = $thisTime + ($addMin*60) + ($addHour*60*60);    
if(empty($theIP)){
    echo 'empty file';
    exit;
}
//look for the $theIP in the 'ip' column
if(in_array($theIP,array_column($jsonArray,'ip'))){
    echo 'IP found in json';
    exit;
}    
if($thisTime > $timeLater){//not sure what you want to do here
    exit;
}
//increment the count, or set it to 1 to begin
$_SESSION['count'] = isset($_SESSION['count'])? $_SESSION['count']+1 : 1;

if($_SESSION['count']>=$downloadHits){//limit reached. Add IP to blacklist
    $jsonArray[]=[
        'ip'    => $theIP,
        'date'  => date("H:i"),
        'time'  => date("m.d.y")
    ];
    //save changes
    file_put_contents($jsonFile,json_encode($jsonArray));
    exit;
}        
echo 'good to go!'; //allow the download

快乐的编码。

答案 1 :(得分:0)

在会话标记下花了一些时间后想出来。这两个问题很有帮助:

导致我编写代码:

createItemContent

我希望上面的内容对下一个人有所帮助,因为我对会话一无所知,今天晚上一起来这是一次冒险。