18893


現在以下のようにプログラムを組んでいますが、一度ページをリロードすると、列が2つ増えてしまいます。これは何故でしょうか？  
詳しい方、ご教示下さい。よろしくお願いいたします。

テーブルの構造は以下になっています。

  * id
  * page_id
  * ip
  * created

以下はソースコードの一部です。

[code]

    $ip = $_SERVER["REMOTE_ADDR"];
    $sql2 = "SELECT * FROM pv_counts WHERE ip =" . $ip .
            " AND created > current_timestamp - interval 30 minute";
    $within_threeminutes = $dbh->prepare($sql2);
    $within_threeminutes->execute();
    $within_threeminutes_count = $within_threeminutes->fetch();
    
    if($within_threeminutes_count == false){
      $sql = "insert into `pv_counts` 
                (`page_id`, `ip`, `created`) 
              values 
                (:page_id, :ip, now())";
      $insert_pv = $dbh->prepare($sql);
      $params = array(
        ":page_id" => "index",
        ":ip" => $ip
      );
      $insert_pv->execute($params);
    }
    
[/code]

追記：やりたい事としましては、30分以内に同じipでのアクセスがないかを確認して、無い場合はdbにinsertするといったものです。

データベースをみると、10.0.1.206,10.0.0.208といった自分のipではないものが増えています。  
サーバーはAWSを使用しています。

var_dump($_SERVER["REMOTE_ADDR"]);  
の実行結果が自分のipアドレスではなく、上記の10.0.0.208になっています。


CC BY-SA 3.0
2015-09-16T07:17:01.490
16683
2015-12-16T10:11:28.463
2015-09-17T04:19:01.347
8619
8619
question
php mysql pdo
PHP＋MYSQLでpvのカウント


まずは`var_dump()` やファイル出力(`file_put_contents()` など)を用いてデバッグするのが良いかと思います。

insertする直前に`var_dump()` や`file_put_contents()`などを記載して何回出力されたかを確認して  
・複数回出力された場合：insert部分が回数分呼び出されている  
・1回のみ出力された場合：insert部分の呼び出しは1回のみ  
ということがわかるのでデバッグできるようになるかと思います。  
※file_put_contentsを使うときは追記モードにて使用してください。

追記：  
外部からのアクセスがある可能性があるので、まず自分のみアクセス出来る状況を作って試してみてください。  
例えば、ベーシック認証をかけてしまうのもアリかと思います。


CC BY-SA 3.0
2015-09-17T03:39:51.930
16700
2015-09-17T04:02:14.003
2015-09-17T04:02:14.003
7641
7641
16683
answer


> データベースをみると、10.0.1.206,10.0.0.208といった自分のipではないものが増えています。  
>  サーバーはAWSを使用しています。

IPの範囲がプライベートIP ということから推測しますと、AWS VPC 内の別の EC2 インスタンスもしくは ELB ヘルスチェックの送信元 IP
だと思います。

ELB ヘルスチェック によるアクセスの場合、User-Agent が `ELB-HealthChecker/1.0` のような値になっていると思います。

また、Amazon Route53 のヘルスチェックを使っている場合は User-Agent が `Amazon Route 53 Health Check
Service` のような値になります。

これらは監視用に定期的にアクセスが来ますので pv の集計から除外すればよろしいかと思います。

仮に 送信元が別のEC2インスタンスの場合は、インスタンスのプライベートIPから送信元を割り出して、何をしているか調査されるといいと思います。


CC BY-SA 3.0
2015-11-16T09:38:42.067
18893
2015-11-16T09:38:42.067
5008
16683
answer