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: 19 años, 6 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)) < 0 ){ 
    
$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($handle, 1000 , ",")) !== 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!