Newsgroup: it.comp.www.php
Titolo: Paese di provenienza

Ciao a tutti,
sono nuovo in questo NG, più che altro sono sempre stato un lettore.
Sapete se c'è un modo in PHP per ricavare il paese di provenienza di un 
utente che accede ad un sito?
sono 2 giorni che cerco su google e altri motori ma non sono riuscito a 
trovarenulla che non mi porti ad un contatore di accessi e statistiche a 
pagamento.
A me serve assegnare una variabile diversa a seconda del paese dell'utente.
Vi ringrazio anticipatamente per aver almeno letto la mia richiesta.
Andrea Vidili
www.andrex.it
 

non so se funziona e cmq hai bisogno di mysql con delle tabelle che
contengano le regioni associate a intervalli di ip
---------------------------------------- bbIPtoCountry.class.php
-----------------------------------------
<?
    /*
        bbIPtoCountry Class
        Get Country name by IP address
        Author : K.Bogac Bokeer
        Email : 
bbo...@yahoo.com
        Classname : bbIPtoCountry
        Version : 1.2
        Date : 2004-04-25 @12:56
 
        Database Structure
        ==================
        CREATE TABLE `$tbl_ips` (
            `ip_from` int(10) unsigned NOT NULL default '0',
            `ip_to` int(10) unsigned NOT NULL default '0',
            `countryid` int(10) unsigned NOT NULL default '0'
        ) TYPE=MyISAM;
        CREATE TABLE `$tbl_countries` (
            `id` int(10) unsigned NOT NULL auto_increment,
            `code2` char(2) NOT NULL default '',
            `code3` char(3) NOT NULL default '',
            `country` varchar(64) NOT NULL default '',
            PRIMARY KEY (`id`),
            UNIQUE KEY `unqAll` (`code2`,`code3`,`country`)
        ) TYPE=MyISAM;
    */
    class bbIPtoCountry {
        var $_classname = 'bbIPtoCountry';
        var $_classversion = '1.2';
        var $_classdate = '2004-04-25 12:56';
        var $server = 'localhost'; // Database Server Name/IP address
        var $dbname = ''; // Database Name
        var $username = ''; // Database User Name
        var $password = ''; // Database Password
        var $tbl_countries = 'ipcountries';
        var $tbl_ips = 'ip2country';
        var $datafile = 'ip-to-country.csv'; // IP to Country base filename, need
for updates
        var $ip = '';
        var $ip_from = '';
        var $ip_to = '';
        var $code2 = '';
        var $code3 = '';
        var $country = '';
 
        var $error = '';
        var $_db = false;
        function bbIPtoCountry($ip='') {
 
            if ( !empty($ip) )
                $this->GetCountryCode($ip);
        }
        function GetCountryCode($ip='') {
            if ( !empty($ip) ) {
                $this->ip = $ip;
                return $this->GetInfo();
            }
        }
 
 
        function GetInfo($field='code2') {
            if ( !$this->_connectdb() ) return false;
 
            $this->error = '';
            $qry = 'SELECT INET_NTOA(IP.ip_from) AS ip_from, INET_NTOA(IP.ip_to) AS
ip_to, C.code2, C.code3, C.country'.
                   ' FROM '.$this->tbl_ips.' IP INNER JOIN '.$this->tbl_countries.' C ON
IP.countryid=C.id'.
                   " WHERE ip_from<=INET_ATON('".$this->ip."') AND
ip_to>=INET_ATON('".$this->ip."') ORDER BY ip_from, ip_to";
            $res = @mysql_query($qry, $this->_db);
            if ( !$res ) {
                $this->error = 'Database Error #'.__LINE__.': '.mysql_error();
                return false;
            }
            $info = mysql_fetch_array($res);
            /*if ( !$this->magic_quotes )
                $info['country'] = stripslashes($info['country']);*/
            $this->ip_from = $info['ip_from'];
            $this->ip_to = $info['ip_to'];
            $this->code2 = $info['code2'];
            $this->code3 = $info['code3'];
            $this->country = $info['country'];
 
 
            if ( isset($info[$field]) )
                $info = $info[$field];
            return $info;
        }
 
        function updateDatas($filename='') {
 
            $this->error = '';
            if ( empty($filename) || !file_exists($filename) )
                $filename = $this->datafile;
 
            if ( !file_exists($filename) || !is_readable($filename) ) {
                $this->error = 'Could not read file';
                return false;
            }
            set_time_limit(180);
 
            if ( !$this->_connectdb() ) return false;
            $hFile = fopen($filename, 'r');
            if ( !$hFile ) {
                $this->error = 'Could not open data file';
                return false;
            }
 
            @mysql_query("TRUNCATE TABLE `$this->tbl_countries`", $this->_db);
            @mysql_query("TRUNCATE TABLE `$this->tbl_ips`", $this->_db);
 
            $count = 0;
 
            while ( list($from, $to, $code2, $code3, $country) = fgetcsv($hFile, 1024,
',', '"') ) {
 
                $country = ucwords(strtolower($country));
                $country = mysql_escape_string($country);
                // Check Country
                $sql = "SELECT id FROM $this->tbl_countries WHERE (code2='$code2') AND
(code3='$code3') AND (country='$country')";
                $ct = @mysql_query($sql, $this->_db);
                if ( !$ct ) {
                    $this->error = 'Database Error #'.__LINE__.': '.$sql.' => '.mysql_error();
                    continue;
                }
                if ( mysql_num_rows($ct)>0 ) {
                    // Country Exists, get id
                    $id = mysql_result($ct, 0);
                } else {
                    // Country Not exists, add it
                    $ct = @mysql_query("INSERT INTO $this->tbl_countries (code2, code3, country)
VALUES ('$code2', '$code3', '$country')", $this->_db);
                    if ( !$ct ) {
                        $this->error = 'Database Error #'.__LINE__.': '.mysql_error();
                        continue;
                    }
 
                    // Added, get id
                    $id = mysql_insert_id($this->_db);
                }
                @mysql_free_result($ct);
                // Add IP Ranges for country
                $ip = mysql_query("INSERT INTO $this->tbl_ips (ip_from, ip_to, countryid)
VALUES ($from, $to, $id)", $this->_db);
                if ( !$ip ) {
                    $this->error = 'Database Error #'.__LINE__.': '.mysql_error();
                    continue;
                }
                @mysql_free_result($ip);
 
                $count++;
            }
            fclose($hFile);
 
            return $count;
        }
        function _connectdb() {
            if ( $this->_db ) return $this->_db;
 
            $this->_db = @mysql_connect($this->server, $this->username,
$this->password);
            if ( !$this->_db ) {
                $this->error = 'Database Error #'.__LINE__.': '.mysql_error();
                return false;
            }
            if ( !mysql_select_db($this->dbname, $this->_db) ) {
                $this->error = 'Database Error #'.__LINE__.': '.mysql_error();
                return false;
            }
            return $this->_db;
        }
    }
?>
--------------------------------------------------------------------------------------------------------------------
---------------------- esempio.php
--------------------------------------------------------------------------
<?
    require_once("bbIPtoCountry.class.php");
    // call this script with 'update' get-variable
    // for update database from ip-to-country CSV file.
    if ( isset($_GET['update']) )
        UpdateDB();
    $ip = $_GET['ip'];
    getIPInfo($ip);
?>
<form name="iptocountry" method="get" action="<?=$_SERVER['SCRIPT_NAME']?>">
   IP Adresi: <input type="text" value="<?=$ip?>" name="ip">
</form>
<?
    function getIPInfo($ip) {
 
        if ( empty($ip) ) return false;
        $ipc = new bbIPtoCountry($ip);
 
        if ( empty($ipc->error) ) {
            echo "&nbsp;&nbsp;$ipc->code2, $ipc->code3, $ipc->country<br>\n";
            echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$ipc->ip_from." - ".$ipc->ip_to."\n";
            echo "<br><br>\n\n";
        }
        if ( !empty($ipc->error) )
            echo '<br><font color="#770000">'.$ipc->error.'</font><br>';
    }
 
    function UpdateDB() {
        $ipc = new bbIPtoCountry();
        $count = $ipc->updateDatas();
        if ( empty($ipc->error) ) {
            // echo "$count items.<br>\n";
            Header('Location: '.$_SERVER['SCRIPT_NAME']);
            exit;
        }
        echo '<br><font color="#770000">'.$ipc->error.'</font>';
        exit;
    }
?>
--------------------------------------------------------------------------------------------------------------------
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


	Released under the GNU General Public License
	Original class: detect_language 0.1 04/02/2002
	Modified class: detect_language 0.2 04/20/2002
			(contribution of Harald Ponce de Leon)
	contributor: Thanks to
			Harald Ponce de Leon
			(osCommerce, Open Source E-Commerce Solutions)
 
http://www.oscommerce.com
	description: A class to detect prefered language
		     of the Internet browser of the visitor.
*/
  class detect_language {
	var $available_languages, $accepted_language, $detected_language;
	// Constructor
	function detect_language() {
	  $this->available_languages = array(
		'bg' => array('bg|bulgarian', 'bulgarian-win1251'),
		'ca' => array('ca|catalan', 'catala'),
		'cs-iso' => array('cs|czech', 'czech-iso'),
		'cs-win1250' => array('cs|czech', 'czech-win1250'),
		'da' => array('da|danish', 'danish'),
		'de' => array('de([-_][[:alpha:]]{2})?|german', 'german'),
		'en' => array('en([-_][[:alpha:]]{2})?|english', 'english'),
		'es' => array('es([-_][[:alpha:]]{2})?|spanish', 'spanish'),
		'fr' => array('fr([-_][[:alpha:]]{2})?|french', 'french'),
		'it' => array('it|italian', 'italian'),
		'ja' => array('ja|japanese', 'japanese'),
		'ko' => array('ko|korean', 'korean'),
		'nl' => array('nl([-_][[:alpha:]]{2})?|dutch', 'dutch'),
		'no' => array('no|norwegian', 'norwegian'),
		'pl' => array('pl|polish', 'polish'),
		'pt-br' => array('pt[-_]br|brazilian portuguese', 'brazilian_portuguese'),
		'pt' => array('pt([-_][[:alpha:]]{2})?|portuguese', 'portuguese'),
		'ru-koi8r' => array('ru|russian', 'russian-koi8'),
		'ru-win1251' => array('ru|russian', 'russian-win1251'),
		'se' => array('se|swedish', 'swedish'),
		'sk' => array('sk|slovak', 'slovak-iso'),
		'th' => array('th|thai', 'thai'),
		'zh-tw' => array('zh[-_]tw|chinese traditional', 'chinese_big5'),
		'zh' => array('zh|chinese simplified', 'chinese_gb')
	  );
	  $this->accepted_language = explode(',', getenv('HTTP_ACCEPT_LANGUAGE'));
	  $this->detected_language = $this->getLanguage();
	}
	/*
	  getLanguage
	  -----------
	  function that look for prefered language by browser.
	  Input: -
	  Output: language detected or default language (en).
	*/
	function getLanguage() {
	  if (empty($this->detected_language)) {
		$this->detected_language = 'en';
		$cnt = 0;
		while ($cnt < sizeof($this->accepted_language)) {
		  reset($this->available_languages);
		  while (list($key, $value) = each($this->available_languages)) {
			if ((eregi('^(' . $value[0] . ')(;q=[0-9]\\.[0-9])?$',
$this->accepted_language[$cnt]))) {
			  $this->detected_language = $key;
			  break 2;
			}
		  }
		  $cnt++;
		}
	  }
	  return $this->detected_language;
	}
  }
?>
-------------------------------------------
----- esempio.php ------------------
<html>
<body>
<?php
  include "language.class.php";
  $dl = new detect_language;
  echo "Prefered language of this browser is ".$dl->detected_language;
?>
</body>
<html>



In realtà l'unico 'valido' sistema che conosco è proprio a pagamento e 
probabilmente è quello stesso sito che hai trovato.
Comunque non esiste un sistema per PHP di capire effettivamente il paese 
di provenienza. Gli unici strumenti che hai a disposizione sono la 
selezione della lingua del browser (decisamente poco affidabile) e l'IP 
del client. Gli IP, come probabilmente saprai, vengono assegnati da enti 
internazionali a svariate società, le quali sono più o meno localizzate 
sul territorio. Proprio in base a questa localizzazione si basa lo 
strumento GeoIP, che consiste in un enorme DB con la localizzazione dei 
vari ISP e relativo API.
Tieni presente comunque che esiste una versione di tale DB gratuita: 
http://www.maxmind.com/app/geoip_country
 con evidenti limitazioni di 
tipo commerciale.

 forse questo č un po' piů semplice da realizzare, trova la lingua del


 contengano le regioni associate a intervalli di ip
Decisamente manca il DB.

Ciao,
grazie. Sono andato a dare un occhiata sul sito che mi hai suggerito.
Sto facendo alcune prove e sembrerebbe poter andare bene per quello che mi 
serve.
ciao
Andrea Vidili
www.andrex.it

andrex wrote:

un'pò di link..
http://www.hostip.info/
http://redvip.homelinux.net/varios/www.ipindex.net/
ftp://ftp.ripe.net/ripe/dbase/
 **ripe.db.gz**
http://ip-to-country.webhosting.info/
-- 
www.iuz-lab.info