-3

この関数は、管理のためにオンラインになっているユーザーを保存することを目的としています。を使用して、IP アドレスをデータベースに保存しますip2long。たとえば、2130706433. 私はPHPを学んでいて、文字列などを渡す方法がわかりません

これが私のコードです。

<?php

require "connect.php";
require "functions.php";

// We don't want web bots scewing our stats:
if(is_bot()) die();



$stringIp = $_SERVER['REMOTE_ADDR'];
$intIp = ip2long($stringIp);


// Checking wheter the visitor is already marked as being online:
$inDB = mysql_query("SELECT 1 FROM tz_who_is_online WHERE ip=".$intIp);

if(!mysql_num_rows($inDB))
{
    // This user is not in the database, so we must fetch
    // the geoip data and insert it into the online table:

    if($_COOKIE['geoData'])
    {
        // A "geoData" cookie has been previously set by the script, so we will use it


        list($city,$countryName,$countryAbbrev) = explode('|',mysql_real_escape_string(strip_tags($_COOKIE['geoData'])));
    }
    else
    {


        $xml = file_get_contents('http://api.hostip.info/?ip='.$stringIp);

        $city = get_tag('gml:name',$xml);
        $city = $city[1];

        $countryName = get_tag('countryName',$xml);
        $countryName = $countryName[0];

        $countryAbbrev = get_tag('countryAbbrev',$xml);
        $countryAbbrev = $countryAbbrev[0];


        setcookie('geoData',$city.'|'.$countryName.'|'.$countryAbbrev, time()+60*60*24*30,'/');
    }

    $countryName = str_replace('(Unknown Country?)','UNKNOWN',$countryName);

    // In case the Hostip API fails:

    if (!$countryName)
    {
        $countryName='UNKNOWN';
        $countryAbbrev='XX';
        $city='(Unknown City?)';
    }

    mysql_query("   INSERT INTO tz_who_is_online (ip,city,country,countrycode)
                    VALUES(".$intIp.",'".$city."','".$countryName."','".$countryAbbrev."')");
}
else
{
    // If the visitor is already online, just update the dt value of the row:
    mysql_query("UPDATE tz_who_is_online SET dt=NOW() WHERE ip=".$intIp);
}

// Removing entries not updated in the last 10 minutes:
mysql_query("DELETE FROM tz_who_is_online WHERE dt<SUBTIME(NOW(),'0 0:10:0')");

// Counting all the online visitors:
list($totalOnline) = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM tz_who_is_online"));

// Outputting the number as plain text:
echo $totalOnline;

?>

そして、ここに私の関数コードがあります

 <?php


function get_tag($tag,$xml)
{
    preg_match_all('/<'.$tag.'>(.*)<\/'.$tag.'>$/imU',$xml,$match);
    return $match[1];
}

function is_bot()
{
    /* This function will check whether the visitor is a search engine robot */

    $botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
    "looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
    "Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
    "crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
    "msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
    "Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
    "Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
    "Butterfly","Twitturls","Me.dium","Twiceler");

    foreach($botlist as $bot)
    {
        if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
        return true;    // Is a bot
    }

    return false;   // Not a bot
}
?>

この小さなスクリプトの使い方を理解するのを手伝ってくれませんか?

4

2 に答える 2

1

あなたが何をしようとしているのかわからないのですが、もう一度質問を説明していただけますか?

私が収集したものから、IP を数値としてではなく、文字列 (IPv4 または IPv6 形式) として保存したいと考えています。実際には、いくつかの理由から、この形式で保存することをお勧めします。

  • 少ないストレージスペースを使用
  • IP に基づいて原産国を検索するなど、他の IP データベースと照合するための簡単な検索が可能
  • はるかに効率的なインデックスを作成できます。整数のインデックスは、文字列のインデックスよりも常に高速です
于 2013-01-14T16:24:49.573 に答える
0
$stringIp = $_SERVER['REMOTE_ADDR'];  // real IP address
$intIp = ip2long($stringIp);  //IP address converted to long int

$intIp の代わりに $stringIp をデータベースに挿入するだけですが、チェックが正しいものを探していることを確認する必要があります。以下の行を変更する必要があります。

$inDB = mysql_query("SELECT 1 FROM tz_who_is_online WHERE ip=".$stringIp);

そして、挿入クエリも:

mysql_query("   INSERT INTO tz_who_is_online (ip,city,country,countrycode)
                  VALUES(".$stringIp.",'".$city."','".$countryName."','".$countryAbbrev."')");



mysql_query("UPDATE tz_who_is_online SET dt=NOW() WHERE ip=".$stringIp);

これを機能させるには、データベースを現在の列タイプから varchar に変更する必要がある可能性があることに注意してください。そうしないと、挿入/更新エラーが発生します。

于 2013-01-14T16:26:58.247 に答える