2016-08-05 2 views
0

私は、IPがページを訪れることができる設定された時間枠内で何回カウントし、その時間枠内でダウンロードカウンタに当たるかをカウントするカウンタをPHPで作成しようとしています。IPヒット数をカウントしようとするとセッションが機能しないのはなぜですか?

私は自分のコードに障害ところがあると考えているので、私はクッキーとセッションで多くの経験を持っていません。私がやっていることよりも良い実装についてのアドバイスがあれば助言してください。

コード:

$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をリダイレクトしますか?


EDIT:

いくつかの読書と私は私がやろうとしていますかを説明願って編集を行ったコメントと答えからの支援を行った後。さらに調査した結果、私は全体で走っ:

をコードに私を導いた:今

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;もはや増加します。

+0

上記には、 'session_start();という連続した行があります。 $ counter = $ _SESSION ['promo_number']; ' - $ _SESSION ['promo_number'];は定義されています??それは意味をなさないと思われます – RamRaider

+0

これは私の問題がどこにあるかでなければなりません。私はまだセッションについて研究しており、セッションへのいくつかのQ&Aアプローチのテストを終了しました。 –

+0

また、ループのすべての反復で新しいセッションを開始すべきではありません。すべてのページの一番上で十分です〜ですが、if($ counter == $ downloadHits && file_exists($) jsonFile)){'はセッション変数を破棄しません... – RamRaider

答えて

0

セッションタグの下で少し時間を過ごした後にそれを考え出します。これら二つの質問は便利だった:私は「didnのために、私は上記の次の人の役に立てば幸い

session_start(); 
$jsonFile   = 'foobar.json'; 
$jsonArray   = json_decode(file_get_contents($jsonFile), true); 
$theIP    = $_SERVER['REMOTE_ADDR']; 
$addMin    = 1; // set value for testing purposes 
$addHour   = 0; // set value for testing purposes 
$targetedHits  = 5; // set value for testing purposes 
$timeLater   = time() + ($addMin*60) + ($addHour*60*60); 
if (empty($_SESSION['count'])) { 
    $_SESSION['expire'] = $timeLater; 
} 
if (!empty($theIP) && !empty($jsonArray)) { 
    // look for the $theIP 
    if (in_array($theIP,array_column($jsonArray,'ip'))) { 
     $_SESSION['count'] = 0; 
     session_destroy(); 
     echo 'IP found in json'; 
     exit; 
    } 
    if (time() < $_SESSION['expire']) { 
     echo 'below the time '; 
     $_SESSION['count'] = isset($_SESSION['count'])? $_SESSION['count'] + 1 : 1; 
     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)); 
      unset($_SESSION['count']); 
      session_destroy(); 
      exit; 
     }  
    } elseif (time() > $_SESSION['expire']) { 
     echo 'nuking session and counter'; 
     $_SESSION['count'] = 0; 
     unset($_SESSION['expire']); 
    } 
} 
echo '<pre>'; 
var_dump($_SESSION); 
echo '</pre>'; 

:コードに私を導いた

セッションについて何か本当に知っていることはありません。そして、これを今晩働かせる冒険となっています。

+0

この解決策では、一度IPがブラックリストに追加されると、セットは' $ _SESSION ['expire' ] '。これはあなたが意図したものですか? – BeetleJuice

+0

はい。私は将来それを削除するコードを追加します。 –

1

Darth_Vaderあなたはほとんどあります。あなたのスクリプトにはいくつかの問題があります。あなたはそれを取得する方法がありませんので、

  • は後で
  • あなたは後半スクリプトでセッションを開始し、セッション中に、カウントを保存することはありません。このことはあなたがあなたのJSONファイルを読み込み、二回不必要にそれをデコードするとすぐにアップし、より高いか忘れて何かをエコーとして破ると
  • まで$_SESSION高い使用しようとしますので、貧しい人々の練習で、無駄にシステムメモリ
  • に変更を保存しませんあなたは私の変更

適切にあなたが成功し、ダウンロードした後 session_unset()session_destroy()を呼び出し、そのカウントは、あなたがそれを保存しようとしていた場合であっても失われることになりJSONに
  • します

    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 
    

    ハッピーコーディング。

  • 関連する問題