Bonjour, je bloque sur des fonctions que je n'ai pas utilisé depuis un certain temps, elles ont l'air d'avoir évoluer, peut-être pourriez vous m'aider =)

Je cherche à récupérer pour chaque visite sur mon site, l'adresse IP ainsi que le navigateur du visiteur.
Jusqu'à maintenant, j'utilisais la fonction $_SERVER"REMOTE_ADDR"] , mais quelques problèmes surviennent :

  • 1 : php-manual me dit que cette fonction est obsolète... alors laquelle utiliser ?
  • 2 : la fonction me retourne une adresse en IPV6 ... (en l'occurrence ::1 car je suis en localhost sous mamp)

Auriez vous une solution de rechange ? J'ai beau cherché, je ne trouve pas ... et je voudrais éviter de le faire en JS.

Pour ce qui est du navigateur, et bien je ne trouve simplement aucune fonction permettant de le trouver si ce n'est la fameuse $_SERVER'HTTP_USER_AGENT']...
Mais là encore, je n'arrive pas à retirer du tableau uniquement la valeur que je désire. J'ai cherché du coté de get_browser , mais le manuel me demande de changer un fichier browscape.ini ...

J'espère sincèrement que la communauté Grafikartienne pourra me donner un petit coup de pouce !

Cordialement à tous !

5 réponses


Usermind42
Réponse acceptée
// si le client passe par un proxy transparent
// HTTP_X_FORWARDED_FOR est présent.
if (isset($_SERVER'HTTP_X_FORWARDED_FOR']))
{
    $ip = $_SERVER'HTTP_X_FORWARDED_FOR'];
}
else // sinon on prend l'adresse de l’hôte qui a requête le serveur
{
    $ip = $_SERVER'REMOTE_ADDR'];
}
echo $ip;
// en plus zolie
$ip = isset($_SERVER'HTTP_X_FORWARDED_FOR']) ?
    $_SERVER'HTTP_X_FORWARDED_FOR'] :
    $_SERVER'REMOTE_ADDR'];
echo $ip;

Perso, je n'ai pas vu de problème avec $_SERVER"REMOTE_ADDR"]. Ensuite, c'est normal, qu'en interne, la fonction te donne un IP interne.
Et je ne vois pas de remplaçante ? Peut être du coté JQuery, mais pour stoker facilement cette valeur, la super globale me parait le plus simple !
Pour le coté obsolète, tu ne confonds pas avec les ex. $HTTP_SERVER_VARS.... ?

Bon courage

Salut,

pour le user agent, il va falloir que tu parse la string avec des Regex , en français : que tu découpe la chaîne de caractère avec des Expressions régulières, afin de ressortir le navigateur :

Voici une liste des quelques USER AGENT : http://fr.wikipedia.org/wiki/User-Agent#Navigateurs

Pour ce qui est de l'ip, je rejoins gadsi.

pour l'IP, je te conseillerai d'utiliser cette source qui à mon avis est plus complete:

/**
        Sniff headers for real IP address
            @return string
            @public
    **/
public function IPaddress() {
        $IP = '';
        $cip = (isset($_SERVER'HTTP_CLIENT_IP']) AND $_SERVER'HTTP_CLIENT_IP'] != '') ? $_SERVER'HTTP_CLIENT_IP'] : FALSE;
        $rip = (isset($_SERVER'REMOTE_ADDR']) AND $_SERVER'REMOTE_ADDR'] != '') ? $_SERVER'REMOTE_ADDR'] : FALSE;
        $fip = (isset($_SERVER'HTTP_X_FORWARDED_FOR']) AND $_SERVER'HTTP_X_FORWARDED_FOR'] != '') ? $_SERVER'HTTP_X_FORWARDED_FOR'] : FALSE;
        if ($cip && $rip)   $IP = $cip;
        elseif ($rip) $IP = $rip;
        elseif ($cip) $IP = $cip;
        elseif ($fip) $IP = $fip;
        if (strpos($IP, ',') !== FALSE) $IP = end(explode(',', $IP));
        if ($this->isvalidIp($IP) === false) $IP = '0.0.0.0';
        unset($cip);
        unset($rip);
        unset($fip);
        return $IP;
    }
/**
 * Validation of an IP address.
 *
 * @param string $check The string to test.
 * @param string $type The IP Protocol version to validate against
 * @return boolean Success
 */
public function isvalidIp($ip, $type = null) {
        if(isset($type)) $type = strtolower($type);
        $flags = '';
        // First check if filter_var is available
        if (is_callable('filter_var')){
        switch($type){
            case'ipv4':
            $flags = FILTER_FLAG_IPV4;
            break;
            case'ipv6':
            $flags = FILTER_FLAG_IPV6;
            break;
            default:
            $flags = FILTER_FLAG_IPV4|FILTER_FLAG_IPV6;
            break;
            }
        return (boolean)filter_var($ip, FILTER_VALIDATE_IP, array('flags'=>$flags));            
            }
        if ($type !== 'ipv6' && $type !== 'ipv4')
        {
            if (strpos($ip, ':') !== FALSE)
            {
                $type = 'ipv6';
            }
            elseif (strpos($ip, '.') !== FALSE)
            {
                $type = 'ipv4';
            }
            else
            {
                return FALSE;
            }
        }
        $func = $type.'Validate';
        return $this->$func($ip);
    }
    /**
        Return TRUE if IP address is local or within a private IPv4 range
            @return bool
            @param $addr string
            @public
    **/
public static function privateip($addr=NULL) {
        if (!$addr)
            $addr=$this->IPaddress();
        return preg_match('/^127\.0\.0\.\d{1,3}$/',$addr) ||
            !filter_var($addr,FILTER_VALIDATE_IP,
                FILTER_FLAG_IPV4|FILTER_FLAG_NO_PRIV_RANGE);
    }
    /**
    * Validate IPv4 Address
    *
    * Updated version suggested by Geert De Deckere
    *
    * @access   protected
    * @param    string
    * @return   bool
    */
private function ipv4Validate($ip)
    {
        $ip_segments = explode('.', $ip);
        // Always 4 segments needed
        if (count($ip_segments) !== 4)
        {
            return FALSE;
        }
        // IP can not start with 0
        if ($ip_segments[0][0] == '0')
        {
            return FALSE;
        }
        // Check each segment
        foreach ($ip_segments as $segment)
        {
            // IP segments must be digits and can not be
            // longer than 3 digits or greater then 255
            if ($segment == '' OR preg_match('/^0-9]/', $segment) OR $segment > 255 OR strlen($segment) > 3)
            {
                return FALSE;
            }
        }
        return TRUE;
    }
    // --------------------------------------------------------------------
    /**
    * Validate IPv6 Address
    *
    * @access   protected
    * @param    string
    * @return   bool
    */
private function ipv6Validate($str)
    {
        // 8 groups, separated by :
        // 0-ffff per group
        // one set of consecutive 0 groups can be collapsed to ::
        $groups = 8;
        $collapsed = FALSE;
        $chunks = array_filter(
            preg_split('/(:{1,2})/', $str, NULL, PREG_SPLIT_DELIM_CAPTURE)
        );
        // Rule out easy nonsense
        if (current($chunks) == ':' OR end($chunks) == ':')
        {
            return FALSE;
        }
        // PHP supports IPv4-mapped IPv6 addresses, so we'll expect those as well
        if (strpos(end($chunks), '.') !== FALSE)
        {
            $ipv4 = array_pop($chunks);
            if ( ! $this->ipv4Validate($ipv4))
            {
                return FALSE;
            }
            $groups--;
        }
        while ($seg = array_pop($chunks))
        {
            if ($seg[0] == ':')
            {
                if (--$groups == 0)
                {
                    return FALSE;   // too many groups
                }
                if (strlen($seg) > 2)
                {
                    return FALSE;   // long separator
                }
                if ($seg == '::')
                {
                    if ($collapsed)
                    {
                        return FALSE;   // multiple collapsed
                    }
                    $collapsed = TRUE;
                }
            }
            elseif (preg_match('/^0-9a-f]/i', $seg) OR strlen($seg) > 4)
            {
                return FALSE; // invalid segment
            }
        }
        return $collapsed OR $groups == 1;
    }

Merci pour vos réponses.