PDA

View Full Version : [PHP]Nazione?


Pro7on
12-12-2006, 10:31
cioa vorrei riuscire a tirar fuori la nazione dei visitatori del mio sito in modo da mettere ip e la bandiera:

adesso con $_SERVER nn funziona perfettamente, allora mi pare che ci sono dei range ip predefinite per ogni nazione, chi mi saprebbe aiutare

Thx ;)

ianaz
12-12-2006, 10:33
Avevo trovato una classe che ti faceva proprio questa cosa :D

tramite ip ti tirava fuori la nazione con la bandiera, era su phpclasses.net...

Ora non ho tempo, stasera se non hai risolto cerco ;)

Pro7on
12-12-2006, 10:36
Avevo trovato una classe che ti faceva proprio questa cosa :D

tramite ip ti tirava fuori la nazione con la bandiera, era su phpclasses.net...

Ora non ho tempo, stasera se non hai risolto cerco ;)


thx provo a vedere ;)

andbin
12-12-2006, 10:47
cioa vorrei riuscire a tirar fuori la nazione dei visitatori del mio sito in modo da mettere ip e la bandiera:

adesso con $_SERVER nn funziona perfettamente, allora mi pare che ci sono dei range ip predefinite per ogni nazione, chi mi saprebbe aiutareIl fatto è che non c'è una relazione diretta tra IP/hostname del client e la nazione di provenienza. Qualunque cosa tu possa usare per ottenerla (una classe apposita, una libreria specifica, ecc...) c'è comunque da fare una "query" da qualche parte su qualche servizio online per avere questa informazione.
Spero di non sbagliarmi ovviamente. ;)

Pro7on
12-12-2006, 10:50
Il fatto è che non c'è una relazione diretta tra IP/hostname del client e la nazione di provenienza. Qualunque cosa tu possa usare per ottenerla (una classe apposita, una libreria specifica, ecc...) c'è comunque da fare una "query" da qualche parte su qualche servizio online per avere questa informazione.
Spero di non sbagliarmi ovviamente. ;)


a chi faccio la query?

ianaz
12-12-2006, 11:18
Il fatto è che non c'è una relazione diretta tra IP/hostname del client e la nazione di provenienza. Qualunque cosa tu possa usare per ottenerla (una classe apposita, una libreria specifica, ecc...) c'è comunque da fare una "query" da qualche parte su qualche servizio online per avere questa informazione.
Spero di non sbagliarmi ovviamente. ;)
Se non sbaglio infatti faceva una richiesta esterna...

vizzz
12-12-2006, 13:12
ad un server whois.
sotto linux: whois [ip]
ti da tante belle informazioni tra cui il nome del provider
link utili:
http://www.ripe.net
http://cqcounter.com/whois/

Pro7on
12-12-2006, 14:36
ad un server whois.
sotto linux: whois [ip]
ti da tante belle informazioni tra cui il nome del provider
link utili:
http://www.ripe.net
http://cqcounter.com/whois/

si ma come formulo una query per un sito esterno, e poi ogni qual volta che richiedi un whois ti chiede di inserire il codice scritto in una img affianco per evitare appunto che altri creino script automatici :?:?:?

vizzz
12-12-2006, 14:51
quello era un esempio dei risultati che puoi ottenere, se hai la possibilità di chiamare il comando whois da php....hai risolto, ti basta solo fare il parse di quello che ti restituisce

Pro7on
12-12-2006, 15:51
quello era un esempio dei risultati che puoi ottenere, se hai la possibilità di chiamare il comando whois da php....hai risolto, ti basta solo fare il parse di quello che ti restituisce

??? :doh: :mc: :confused: nn ho capito molto sorry per la mia ignoranza, ma potresti farmi n'esempio?

vizzz
12-12-2006, 16:11
usando il comando passthru:

$cmd = "whois ".$ip;
$str = passthru($cmd);

ora in $str hai il risultato del comando whois, ti resta "solo" da fare il parse per estrapolare la nazione.
ti consiglio inoltre di controllare i parametri del comando whois per fare sempre l'interrogazione sullo stesso server whois in modo da avere sempre lo stessa formattazione in output (server whois diversi hanno risultati diversi, in fatto di formattazione dati).
non me ne intendo di regexp, ma forse con una regexp ben fatta non deve essere troppo difficile trovare la nazione.
altrimenti mi viene in mente adesso, nelle variabili di sistema di php viene mostrata la versione di browser ecc, e anche la lingua del browser.

andbin
12-12-2006, 16:31
Faccio solo presente che facendo un 'whois' bisogna anche prestare attenzione a quale server whois fare la richiesta!

Se faccio:
whois 83.210.47.50
(l'indirizzo è puramente a caso)

mi elenca una serie di dati per dirmi che il blocco 83.0.0.0 - 83.255.255.255 è allocato al RIPE e ... basta!

Se invece faccio:
whois -h whois.ripe.net 83.210.47.50

allora ho i dati completi del blocco 83.210.0.0 - 83.210.255.255 e viene indicato anche il 'country'.

Pro7on
12-12-2006, 18:10
Faccio solo presente che facendo un 'whois' bisogna anche prestare attenzione a quale server whois fare la richiesta!

Se faccio:
whois 83.210.47.50
(l'indirizzo è puramente a caso)

mi elenca una serie di dati per dirmi che il blocco 83.0.0.0 - 83.255.255.255 è allocato al RIPE e ... basta!

Se invece faccio:
whois -h whois.ripe.net 83.210.47.50

allora ho i dati completi del blocco 83.210.0.0 - 83.210.255.255 e viene indicato anche il 'country'.


;) thXxxx!!! provo e faccio sapere :sofico:

beppegrillo
12-12-2006, 18:28
magari c'è qualcuno che mette a disposizione webservices proprio per questo, altrimenti procedi con la via manuale :)

*Prova a vedere come lo fa phpstats.

ianaz
12-12-2006, 18:56
Ecco la classe che ti dicevo:



<?php

class ip2country
{
var $countries_list; //Percorso lista degli stati
var $flags_dir; //Directory con le bandiere
var $_COUNTRIES; //Array con la lista degli stati

function ip2country($cl,$fd,$ip=false)
{
$this->countries_list=$cl;
$this->flags_dir=$fd;

$this->readCountries() or die ("Unable to read the countries");

if ((bool)$ip) return $this->parseIP($ip);
}

function parseIP($ip)
{
$DATABASE = "whois.ripe.net";
$info = '' ;
$sk=fsockopen($DATABASE, 43, $errno, $errstr, 30) or die ("Unable to connect to the server");
fputs ($sk, $ip ."\r\n") or die ("Unable to send data to the server");
while (!feof($sk))
{
$info.= fgets ($sk, 2048);
}

if (preg_match( '/^\x20*country\x20*:\x20*(\w{2})/im',$info,$arr ))
{
$found=false;
for($i=0;$i<count($this->_COUNTRIES);$i++)
{
$c=$this->_COUNTRIES[$i];
if (trim($c[0]) == trim($arr[1])) return $c;
}
return array("??","","");
}
else array("??","","");

}

function readCountries()
{
if (file_exists($this->countries_list))
{
$handle = file($this->countries_list) or die("Unable to open the countries's file list");
foreach($handle as $row)
{
list($iso,$name,$flag) = explode(";",$row);
$this->_COUNTRIES[]=array($iso,$name,$this->flags_dir.$flag);
}

return true;
}
else return false;
}
}
?>

vizzz
12-12-2006, 19:07
ottima...accede direttamente al server whois e c'è già la regexp per estrarre la nazione.

Pro7on
12-12-2006, 19:32
Ecco la classe che ti dicevo:



<?php
.............
}
else return false;
}
}
?>



Ti lovvo tantissimo ianaz ;) thx , ora nn posso finire ma domani faccio e godo :D


Thx CiauZzz :D :D

ianaz
12-12-2006, 20:10
Ti lovvo tantissimo ianaz ;) thx , ora nn posso finire ma domani faccio e godo :D


Thx CiauZzz :D :D
ahaha sei anche svizzero :P

rotfl

Pro7on
13-12-2006, 09:38
na domanda, come istanzio un ogetto.....

tipo in java: nClasse c = new nClasse();

in php ?? :muro:

Pro7on
13-12-2006, 09:46
haaa ecco sono riuscito finalmente


...
...
$ipTemp = $_SERVER['REMOTE_ADDR'];
$myCountrie= new ip2country();
$myCountrie->parseIP($ipTemp);
$risultato = $myCountrie->readCountries();
echo"$risultato";

...
...


adesso manca solo da istanziare qualche variabile all'interno della classe e sono aposto :D

Pro7on
13-12-2006, 11:16
niente da fare sono in un vicolo ceco : (

ma na cosa per far partire il costruttore ho bisogno del nome paese e del e il percorso per la flags, ma allora come minchia faccio a interrogare sto ip per capire da dov'è..:(

ianaz
13-12-2006, 11:44
Il percorso delle flags...nel file che ho scaricato c'erano pure le bandiere...

Pro7on
13-12-2006, 12:01
hahhahahahhaha

http://www.ip2location.com/

loro c'e l afanno xò nn mettono a disposizione il source :(


uffa mi sto incacchiando di brutto per sta cosa ....

ianaz
13-12-2006, 12:30
Ma la classe li non ti funziona?

A me funzionava perfettamente, mi dava automaticamente la bandiera