IPによるユーザーの場所の特定とヒットカウンターの作成

こんにちは、カブラフチャン! サイトを作成した後、いくつかのサービス(qooなど)からヒットカウンターを追加し、JSで機能しました。 そして頻繁に更新されます。 サイトに実際に何人の訪問者がいるかを見ることができませんでした。 また、人々がどのIPアドレスから来ているのか、このIPがどの国に属しているのかを知りたいと思いました。 自転車を作らないように、フォーラムを散歩することにしました。 SxGeoについてなど、さまざまな情報を見つけました。 国と都市の両方をすぐに見つけることができるので、このオプションが好きでした。 私はPHPを学び始めたばかりで、おそらくそのような人がたくさんいるので、この記事を投稿することにしました。 国と都市を決定するコードの一部ではなく、完全に機能するコードです。 それでは始めましょう。









最初に、訪問者に関するデータが入力されるデータベースにテーブルを作成する必要があります。 id以外のすべてのフィールドがあり、varchar 255型に進み、utf8_general_ciを比較します。id型int 10属性UNSIGNEDおよびもちろんA / Iです。 次に、データベースへの接続のパラメーターを書き留める構成ファイルを作成します。 そして最後に、sypexgeo.net WebサイトのリンクからSxGeo.phpとSxGeoCity.datを両方のファイル( 1つと 2つ )にダウンロードします。







55行目のSxGeo.phpでライブラリにアクセスする場合、ファイル名をSxGeo.datからSxGeoCity.datに置き換える必要があります。 準備作業はすべて終了しました。







stats.phpファイル(選択したファイルの名前)を作成し、そのファイルでデータベースとの接続を確立します。







<?php include_once ('config.php'); include_once ('SxGeo.php'); $mysqli = new mysqli($server, $user, $pswd, $db); if ($mysqli->connect_errno) { printf("  : %s\n", $mysqli->connect_error); exit();} $mysqli -> select_db($db) or die ("  $db"); if (!$mysqli->set_charset("utf8")) { printf("     utf8: %s\n", $mysqli->error); exit();}
      
      





ここで、getRealIpAddr()関数を使用して、IPクライアントを取得します。







 public function getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) //  IP { $ip=$_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip=$_SERVER['REMOTE_ADDR']; } return $ip;}
      
      





次に、ボットが訪問するようになったかどうかを確認します。







 if (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexBot')) {$visitor='YandexBot';} //   elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')) {$visitor='Googlebot';} else { $visitor=$_SERVER['HTTP_USER_AGENT']; }
      
      





getRealIpAddr()の値を$ ipに渡します。







 $ip = getRealIpAddr();
      
      





次に、SxGeoオブジェクトを作成し、都市、国、地域を定義します。







 $SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); $result = $SxGeo->getCityFull($ip);
      
      





var_export()関数を使用して、どのデータ配列が返されるかを確認することができます。私が提案するもの以外に、何か他のものが必要になる場合があります。 どうぞ この配列から、国、地域、都市の値を選択します。 スペースを解放するには、SxGeoオブジェクトを削除します。







 $city = $result["city"]["name_ru"]; $region = $result["region"]["name_ru"]; $country = $result["country"]["name_ru"]; unset($SxGeo);
      
      





次に、訪問したサイトの日付、時刻、およびページを決定します。







 $date = date("H:i:s dmY"); //      $host = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; //   
      
      





SQLステートメントで使用するために文字列の特殊文字をエスケープし、データをテーブルに入れます。







 $ip = $mysqli->real_escape_string($ip); $date = $mysqli->real_escape_string($date); $host = $mysqli->real_escape_string($host); $region = $mysqli->real_escape_string($region); $country = $mysqli->real_escape_string($country); $city = $mysqli->real_escape_string($city); $visitor = $mysqli->real_escape_string($visitor); if ($query = $mysqli -> query("INSERT INTO `pre_visitors` (date, visitor, ip, country, region, city, host) VALUES ('".$date."', '".$visitor."', '".$ip."', '".$country."', '".$region."', '".$city."', '".$host."')")){ //printf("%d  .\n", $mysqli->affected_rows); } else{ printf("Errorcode: %d\n", $mysqli->errno); };
      
      





セットアップ時間の確認をオンにできますが、その必要性はわかりません。 次に、ヒットカウンターの値を取得する必要があります。 divの最初のカウンターが次の値を挿入した同じサイトからカウンターの形式を取りました。







1.初めてログインした人、または別のIPアドレスからログインした人:







 if ($result1 = $mysqli -> query("SELECT * FROM `pre_visitors` WHERE (visitor NOT RLIKE 'bot') GROUP BY ip ORDER BY 'id'")){ //printf("%d  .\n", $result->affected_rows); } $res1 = $result1 -> num_rows;
      
      





2.ビューの総数について:







 if ($result = $mysqli -> query("SELECT MAX(id) AS id FROM `pre_visitors` ORDER BY id")){ //printf("%d  .\n", $result->affected_rows); } $res = $result -> fetch_array();
      
      





さて、データベースへの接続を閉じます。







 $mysqli -> close(); ?>
      
      





ところで、stats.phpファイルをindex.phpに接続することを忘れないでください。 次に、テーブルを視覚化します。 seestats.phpファイルを作成し、データベースに接続します。







 <?php include_once ('core/config_class.php'); $mysqli = new mysqli($server, $user, $pswd, $db) or die("    MySQL."); $mysqli -> select_db($db) or die("    ."); ?>
      
      





すべてを画面に表示するための小さなHTMLです。 また、表示される行数の選択も追加しました。







 <html> <head> <style type='text/css'> td.zz {PADDING-LEFT: 3px; FONT-SIZE: 9pt; PADDING-TOP: 2px; FONT-FAMILY: Arial; } </style> </head> <body> <center> <form action="seestats.php" method="get"> <select name="visualcount"> <option value="10" selected></option> <option value="50">50</option> <option value="100">100</option> <option value="250">250</option> <option value="500">500</option> <option value="1000">1000</option> </select> <input type="button" value=""> </form>
      
      





次に、フォームを処理し、ボットと重複したIPアドレスを除くテーブルのすべてのフィールドを要求し、MAX idを要求してテーブルを終了します。







 <?php $lastid = isset ($_GET['visualcount']) ? ($_GET['visualcount']) : '10'; if ($query = $mysqli->query("SELECT * FROM `pre_visitors` WHERE (visitor NOT RLIKE 'bot') GROUP BY ip ORDER BY 'id' DESC LIMIT $lastid")){ //printf("%d  .\n", $mysqli->affected_rows); } else{ printf("Errorcode: %d\n", $mysqli->errno); }; if ($result = $mysqli -> query("SELECT MAX(id) AS id FROM `pre_visitors` ORDER BY id")){ //printf("%d  .\n", $result->affected_rows); } $num_rows = $query -> num_rows; $res = $result -> fetch_array(); ?>
      
      





使用可能なテーブル、スタイル、サイズを作成します。







 <table width="680" cellspacing="1" cellpadding="1" border="0" STYLE="table-layout:fixed"> <tr align = "center" bgcolor="#eeeeee"> <td class="zz" width="30"><b>№ /</b></td> <td class="zz" width="90"><b>  </b></td> <td class="zz" width="500"><b>  </b></td> <td class="zz" width="100"><b>IP/</b></td> <td class="zz" width="100"><b></b></td> <td class="zz" width="100"><b></b></td> <td class="zz" width="100"><b></b></td> <td class="zz" width="110"><b> URL</b></td> </tr>
      
      





ループを介して、テーブルに入力し、データベース接続を閉じます。







 <?php while($row = $query -> fetch_array()){ echo '<tr bgcolor="#eeeeee"><td class="zz">'.$row['id'].'</td>'; echo '<td class="zz">'.$row['date'].'</td>'; echo '<td class="zz">'.$row['visitor'].'</td>'; echo '<td class="zz">'.$row['ip'].'</td>'; echo '<td align = "center" class="zz">'.$row['country'].'</td>'; echo '<td align = "center" class="zz">'.$row['region'].'</td>'; echo '<td align = "center" class="zz">'.$row['city'].'</td>'; echo '<td class="zz">'.$row['host'].'</td></tr>'; } echo '<tr bgcolor="#eeeeee"><td class="zz" colspan = "3" ><b>  </b></td>'; echo '<td align = "center"><b>'.$num_rows.'</b></td>'; echo '<td class="zz" colspan = "3" ><b>  </b></td>'; echo '<td align = "center"><b>'.$res['id'].'</b></td></tr>'; echo '</table>'; echo '</center>'; echo '</body></html>'; $mysqli -> close(); ?>
      
      





残念なのは、実際のクライアントではなく、IPプロキシサーバーを受け取ることです。

ご清聴ありがとうございました!








All Articles