[PHP] IP's omzetten naar landen*

Pagina: 1
Acties:
  • 172 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Spamajor
  • Registratie: Oktober 2000
  • Laatst online: 17-09 21:14
Hoofdstuk control structures =!
Waar ik al een tijdje mee bezig ben is het volgende. Een banner op mijn website waar de vlaggetjes van de landen die e.g. vandaag langs zijn gekomen worden geprint. De logs worden door IIS in een de db gestopt. Nu heb ik een geoip database in een andere tabel gestopt en lees in de verschillende ips uit.
[php]
code:
1
2
3
$sql="SELECT DISTINCT ClientHost FROM inetlog WHERE ClientHost NOT LIKE '192.168%'";
$addr = $db->sql_query($sql);
$addr = $db->sql_fetchrow($addr);

Nu krijg ik dus mooi een lijstje met unieke ip's, alles mooi natuurlijk alleen moet ik die dus vertalen naar
numerieke ip's:
[php]
code:
1
2
3
4
$ipnum = sprintf("%u", ip2long($addr));
$sql= "SELECT vlag FROM landen WHERE ${ipnum} BETWEEN start AND einde";
$land = $db->sql_query($sql);
$landvlag = $db->sql_fetchrow($land);

Nu wil ik dat $landvlag een lijstje met landafkortingen word. Welke structuur kan ik hiervoor het beste voor gebruiken? Als ik dit in een loop gooi reset ie die landvlag steeds weer. Ik heb geen idee .....

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Kijk eens naar array's. Het klinkt tenminste dat je daar naartoe zal moeten.
Maar dat is zonder te weten wat je precies wil gaan doen met de data die je ophaald.

Acties:
  • 0 Henk 'm!

  • Spamajor
  • Registratie: Oktober 2000
  • Laatst online: 17-09 21:14
code:
1
2
3
4
5
$afstand = 25;
$vlagbestand = "../images/icon/flags/".$land[0].".png";
$vlag = imagecreatefrompng("$vlagbestand");
imagealphablending($vlag, true);
imagecopy($blank, $vlag, $srcWidth-$afstand, 10, 0, 0, 14, 14);

Ik wilde in een bestaande banner alle landvlaggetjes printen die deze dag waren langsgekomen. Een beetje wereldburger gevoel :)

Dus uit die querry komt een twee letterig land afkorting als resultaat welke ik als bestandnaam opvraag. Dan de afstand per vlag veranderen zodat een leuke balk ontstaat. Niets echt een kritische bedrijftoepassing :) Zie mijn website voor banner met 1 vlaggetje, die is willekeurig gekozen uit de langsgekomen ip's van deze dag.

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Je kan bijvoorbeeld je landcodes verzamelen in een array door het volgende uit te voeren voor elk ip-adres.
PHP:
1
2
3
4
5
$ipnum = sprintf("%u", ip2long($addr));
$sql= "SELECT vlag FROM landen WHERE ${ipnum} BETWEEN start AND einde";
$land = $db->sql_query($sql);
$landvlag = $db->sql_fetchrow($land);
$vlaggen[$landvlag] = 1;


Op deze manier krijg je een array met de landcodes als sleutels. Hierdoor komt elke landcode maar 1 keer in je array terecht. Je kan hier ook tellen hoevaak een landcode voorkomt, zodat je daarmee kan gaan sorteren als je wilt.

Om je banner dan te vullen kun je met foreach door je array heen, bv:
PHP:
1
2
3
4
foreach ($vlaggen as $landcode => $dummy)
{
    // en hier dan je code om de vlag op de juiste plaats te tekenen.
}

Acties:
  • 0 Henk 'm!

  • Spamajor
  • Registratie: Oktober 2000
  • Laatst online: 17-09 21:14
aah, dit stuurt me al aardig in de richting, ik krijg namelijk al een zwartgedrukte banner en cputijd van 5> sec. Alleen krijg ik nog wel 1 ding wat ik er niet uit krijg. Eerst even de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ip = array('64.4.32.7', '69.72.176.188');

foreach ($ip as $nummer => $dummy)   { 
$ipnum = sprintf("%u", ip2long($nummer));
$sql= "SELECT vlag FROM landen WHERE ${ipnum} BETWEEN start AND einde";
$result = $db->sql_query($sql);
$land[] = $db->sql_fetchrow($result); 
}

foreach ($land as $landcode => $dummy)   { 
        $afstand2 = $afstand+$afstand2;
        $vlagbestand = "../images/icon/flags/".$landcode.".png"; 
        $vlag = imagecreatefrompng("$vlagbestand");
        imagealphablending($vlag, true);
        imagecopy($blank, $vlag, $srcWidth-$afstand2, 10, 0, 0, 14, 14);
        imagettftext($blank, 8, 0, $srcWidth-$afstand2, $srcHeight-44, $wit, "c:/windows/fonts/trebuc.TTF",  "Land: ".$landcode);
}

Voor de ip's heb ik even hotmail als voorbeeld erin gestopt. Het resultaat hiervan is dat ik nu een lijstje met getallen krijg 0 1 2 3 voor elk ip dat ie vind. Het aantal ip's klopt dus al wel er gaat alleen nog wat fout in het omzetten naar een landcode. Even de banner al voorbeeld

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Je moet echt eens kijken naar de werking van arrays en foreach.

Als ik je loop door ip's even neem:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$ip = array('64.4.32.7', '69.72.176.188');

foreach ($ip as $nummer => $dummy)   { 
    // $nummer is nu de index van het ipnummer in het array, dus 0, 1, ...
    // $dummy is nu het ipnummer zelf. Dus $dummy == $ip[$nummer]
}

foreach ($ip as $nummer)   { 
    // $nummer is nu het ipnummer zelf.
    // De index in het array is nu niet beschikbaar.
}

Hiermee moet je toch wel verder moeten kunnen komen.

  • Spamajor
  • Registratie: Oktober 2000
  • Laatst online: 17-09 21:14
Nou het is gelukt hoor, alleen wel met een wat andere methode. Wanneer ik per ip een querry uitvoerde duurde het teneerste minstens een minuut met 150> unike ip's dus ik moest dit plan sowieso droppen, en ik kreeg op een of andere manier maar 2 dezelfde landcodes uit dit array.

Maar ik heb het nu als volgd aangepakt. Ik pak het ip van de gebruiker. Doorloop de querry om het de landcode te weten en dan de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$addr = $_SERVER['REMOTE_ADDR'];
$ipnum = sprintf("%u", ip2long($addr));
$sql= "SELECT vlag FROM landen WHERE ${ipnum} BETWEEN start AND einde";
$land = $db->sql_query($sql);
$land = $db->sql_fetchrow($land);

$sql="INSERT INTO Stats (Landen, Maand) VALUES ('$land[0]', '$maand')";
$query = $db->sql_query($sql);

$sql = "SELECT DISTINCT Landen FROM Stats WHERE maand = '$maand'";
$query = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($query))
{
    $result[] = "$row[0]";
}


En het resultaat: O-) Om het balkje met landen even te vullen .... Groetjes
Afbeeldingslocatie: http://www.spamajor.com/fotoos/header.php?img=.jpg

[ Voor 8% gewijzigd door Spamajor op 15-09-2005 16:38 . Reden: Code -> Php ]


  • Spamajor
  • Registratie: Oktober 2000
  • Laatst online: 17-09 21:14
Hmm, er zit een gat in die vlaggen !?

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Landen waarvoor je geen vlag hebt, of een lege landcode ?

[ Voor 25% gewijzigd door TheRookie op 15-09-2005 11:47 . Reden: nog een reden ]


  • Spamajor
  • Registratie: Oktober 2000
  • Laatst online: 17-09 21:14
Ah, ik zag het al, de stap die de afstand bepaald was 2egraads. Foutje
Pagina: 1