Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/02/2011, 08:26
Avatar de Italico76
Italico76
 
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
[APORTE] clase de GeoLocalizacion

Basandome en las tablas en formato CSV que publica MaxMind, hice esta clase para detectar pais.

Se caracteriza por ser muy rapida

Cuando no encuentra referencia para esa IP, doit() devuelve FALSE

Código PHP:
<?php
include "../../my/config.php";

// datos de Copyright (C) 2007 MaxMind LLC
// Autor: Pablo Bozzolo (2011)

$loc= new geo();
$loc->host  $db_info['host'];
$loc->user  $db_info['user'];
$loc->pass  $db_info['pass'];
//$loc->IPremote();
$loc->ip '148.210.232.247';
$out $loc->doit();

var_dump($out);
echo 
$loc->country;
  
class 
Geo {
  private 
$con;    
  private 
$data = array(
                   
// DB DATA
                  
'host','user','pass',  
           
// GEO 
                  
'ip'=>null'locId'=>null,'country'=>null,'region'=>null,'city'=>null,
                  
'postalCode'=>null,'latitude'=>null,'longitude'=>null,
          
'metroCode'=>null,'areaCode'=>null);
    
  public function 
Geo(){    
  }  
    
  public function 
__set($name$value) {
      
//echo "Estableciendo '$name' a '$value'\n";
      
$this->data[$name] = $value;
  }

  public function 
__get($name) {
      
//echo "Consultando '$name'\n";
      
if (array_key_exists($name$this->data)) {
          return 
$this->data[$name];
      }

        
      
$trace debug_backtrace();
      
trigger_error(
          
'Propiedad indefinida mediante __get(): ' $name .
          
' en ' $trace[0]['file'] .
          
' en la línea ' $trace[0]['line'],
          
E_USER_NOTICE);
      return 
null;
  }

  
/**  Desde PHP 5.1.0  */
  
public function __isset($name) {
      
//echo "¿Está definido '$name'?\n";
      
return isset($this->data[$name]);
  }

  
/**  Desde PHP 5.1.0  */
  
public function __unset($name) {
      
//echo "Eliminando '$name'\n";
      
unset($this->data[$name]);
  }
    
  
  
// NO uso Singleton!  
  
private function connect(){
   
$this->con    mysql_connect($this->host,$this->user,$this->pass) or die ('Error conectando a mysql');
   
mysql_select_db('videosbu_geo') or die ('Error seleccionando base'); 
  }  
    
  public function 
IPremote(){
    
$this->ip =  $_SERVER['REMOTE_ADDR'];    
  }
  
  public function 
doit(){
    
$this->connect();    
    
$ipv4 toIPv4($this->ip);
    
    
$sql  "
    SELECT cl.country, cl.region, cl.city, cl.postalCode, cl.latitude, cl.longitude, cl.metroCode, cl.areaCode FROM CityLocation cl 
    INNER JOIN 
    (SELECT locId FROM CityBlocks WHERE  ($ipv4 > startIpNum AND $ipv4 < endIpNum) ORDER BY startIpNum DESC LIMIT 1) 
    t1 ON cl.locid = t1.locId"
;    
    
$res       mysql_query($sql) OR die(mysql_error());
    
$cant_rows mysql_num_rows($res);
    
    if (
$cant_rows==1){
      
$row mysql_fetch_assoc($res);
      
      
$this->country    =$row['country'];
      
$this->region     =$row['region'];
      
$this->city       =$row['city'];
      
$this->postalCode =$row['postalCode'];
      
$this->latitude   =$row['latitude'];
      
$this->longitude  =$row['longitude'];
      
$this->metroCode  =$row['metroCode'];
      
$this->areaCode   =$row['areaCode'];            
      
      
// retorno exito
      
return true;
    }else{
      
// no hay resultados
      
return false
    }    
    
    
    
  }
  
  
// end class
  

function toIPv4 ($dotted){
  if (( 
$lngIP ip2long $dotted)) < ){ 
    
$lngIP += 4294967296 ;
  }
  return 
$lngIP;
}

?>

Para importar los CSV, lo mejor es usar algo asi:

Código PHP:
<?php
/*  cargo datos de conexion  */

$con mysql_connect($dbhost,$dbuser,$dbpass) or die ('Error conectando a mysql');
mysql_select_db($dbname) or die ('Error seleccionando base');

if ((
$handle fopen("2.csv""r")) !== FALSE) {
    while ((
$data fgetcsv($handle1000 ",")) !== FALSE) {
             if (
strlen($data[1])==0$data[1]='';
         if (
strlen($data[2])==0$data[2]='';
         if (
strlen($data[3])==0$data[3]='';
         if (
strlen($data[4])==0$data[4]='';           
         if (
$data[5]==0)         $data[5]=0;  
         if (
$data[6]==0)         $data[6]=0;  
         if (
$data[7]==0)         $data[7]=0;  
         if (
$data[8]==0)         $data[8]=0;           
         
         
$sql "INSERT INTO `citylocation` (locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode) VALUES
({$data[0]},'{$data[1]}','{$data[2]}','{$data[3]}','{$data[4]}',{$data[5]},{$data[6]},{$data[7]},{$data[8]});"
;
            
             
mysql_query ($sql);
        
    }
    
fclose($handle);
}
?>
__________________
Salu2!