Nueva pregunta

Pregunta:

Fecha: 12-10-2016 17:39:10 (En Español)

Obtener nombre y código de país ISO2 de nuestros visitantes con PHP[Resuelta]

Hola a todos, en esta oportunidad quería compartirles una clase que he desarrollado para obtener el nombre y código de país ISO2 de los visitantes de nuestro sistema web.



La clase básicamente hace uso de un servicio web provisto por http://www.geoplugin.net, aquí pueden ver los terminos y condiciones de uso: http://www.geoplugin.com/aup

Sin más, aquí el código de la clase "GeoPlugin.class.php":
<?php

class GeoPlugin {

    private $mGeoData = array();

    public function __construct($pIPv4 = FALSE) {
        if($pIPv4 === FALSE){
            $pIPv4 = self::getIP();
        }
        $this->mGeoData = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $pIPv4));
    }

    public function getPaisNombre() {
        if (isset($this->mGeoData['geoplugin_status']) && !empty($this->mGeoData['geoplugin_status']) && $this->mGeoData['geoplugin_status'] = '200') {
            return $this->mGeoData['geoplugin_countryName'];
        } else {
            return FALSE;
        }
    }

    public function getPaisISO2() {
        if (isset($this->mGeoData['geoplugin_status']) && !empty($this->mGeoData['geoplugin_status']) && $this->mGeoData['geoplugin_status'] = '200') {
            return $this->mGeoData['geoplugin_countryCode'];
        } else {
            return FALSE;
        }
    }

    public static function getPaisISO2ByIP($ip) {
        $plugin = new GeoPlugin($ip);
        $iso2 = $plugin->getPaisISO2();
        if ($iso2) {
            return $iso2;
        } else {
            return FALSE;
        }
    }

    public static function getIP() {
        $ip = FALSE;
        if (getenv('HTTP_CLIENT_IP')) {
            $ip = getenv('HTTP_CLIENT_IP');
        } elseif (getenv('HTTP_X_FORWARDED_FOR')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_VIA')) {
            $ip = getenv('HTTP_VIA');
        } elseif (getenv('HTTP_USERAGENT_VIA')) {
            $ip = getenv('HTTP_USERAGENT_VIA');
        } elseif (getenv('HTTP_X_FORWARDED')) {
            $ip = getenv('HTTP_X_FORWARDED');
        } elseif (getenv('HTTP_X_CLUSTER_CLIENT_IP')) {
            $ip = getenv('HTTP_X_CLUSTER_CLIENT_IP');
        } elseif (getenv('HTTP_FORWARDED_FOR')) {
            $ip = getenv('HTTP_FORWARDED_FOR');
        } elseif (getenv('HTTP_FORWARDED')) {
            $ip = getenv('HTTP_FORWARDED');
        } elseif (getenv('HTTP_PROXY_CONNECTION')) {
            $ip = getenv('HTTP_PROXY_CONNECTION');
        } elseif (getenv('HTTP_XPROXY_CONNECTION')) {
            $ip = getenv('HTTP_XPROXY_CONNECTION');
        } elseif (getenv('HTTP_PC_REMOTE_ADDR')) {
            $ip = getenv('HTTP_PC_REMOTE_ADDR');
        } else {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }

}


Aquí un ejemplo de uso "index.php":
<?php require_once 'GeoPlugin.class.php'; ?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        $geoObj = new GeoPlugin();
        echo 'País ISO: ', $geoObj->getPaisISO2();
        echo '<br/>';
        echo 'País nombre: ', $geoObj->getPaisNombre();
        ?>
    </body>
</html>


Aquí la demo online

Creo que el código se explica por si solo, ante cualquier inconveniente no duden en consultar.

Saludos a todos y buen código!
Etiquetas: Aporte - Clase PHP - Demo - Geolocalización - PHP - PHP Avanzado - Plugin Votos: 5 - Respuestas: 1 - Vistas: 20 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 07-03-2017 07:35:30 Fer, muy buen aporte.

    Te paso el código un poco diferente corrigiendo un error que tienes en la lógica de las líneas 15 y 23 donde en lugar de hacer una comparación con 200 estás realizando una asignación.

    De igual manera removí las sentencias else pues no me gustan y hay quienes las consideran innecesarias jejeje

    <?php
    
    class GeoPlugin
    {
        private $mGeoData = [];
    
        public function __construct($pIPv4 = null)
        {
            if ($pIPv4 === null) {
                $pIPv4 = self::getIP();
            }
            $this->mGeoData = self::getData($pIPv4);
        }
    
        public static function getIP()
        {
            $ip      = $_SERVER['REMOTE_ADDR'];
            $envVars = [
                'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_VIA', 'HTTP_USERAGENT_VIA', 'HTTP_X_FORWARDED',
                'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'HTTP_PROXY_CONNECTION',
                'HTTP_PC_REMOTE_ADDR',
            ];
    
            foreach ($envVars as $envVar) {
                if (getenv($envVar)) {
                    $ip = getenv($envVar);
                    break;
                }
            }
    
            return $ip;
        }
    
        public static function getData($ip)
        {
            return unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $ip));
        }
    
        public static function getPaisISO2ByIP($ip)
        {
            $plugin = new self($ip);
            $iso2   = $plugin->getPaisISO2();
            if (!$iso2) {
                return false;
            }
    
            return $iso2;
        }
    
        public function getPaisISO2()
        {
            if (!isset($this->mGeoData['geoplugin_status']) ||
                empty($this->mGeoData['geoplugin_status']) ||
                $this->mGeoData['geoplugin_status'] !== 200
            ) {
                return false;
            }
    
            return $this->mGeoData['geoplugin_countryCode'];
        }
    
        public function getPaisNombre()
        {
            if (!isset($this->mGeoData['geoplugin_status']) ||
                empty($this->mGeoData['geoplugin_status']) ||
                $this->mGeoData['geoplugin_status'] !== 200
            ) {
                return false;
            }
    
            return $this->mGeoData['geoplugin_countryName'];
        }
    }
    


    saludos!
      Votos: 2 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com