Affichage d'adresse IP

Eléphant du PHP | 68 Messages

10 janv. 2007, 19:00

Salut,

Bonne et Heureuse année 2007 à tous.

Je souhaite recuperer l'adresse IP des machines des personnes qui se connectent à mon site web.

Quelle focntion PHP dois-je utiliser??

Merci pour votre aide!
Marino TEKI
In God I trust

Mammouth du PHP | 843 Messages

10 janv. 2007, 19:17

une simple recherche sur le forum et tu serai tomber sur ceci:
// on prend l'ip de la meilleure manière qu'il soit
function get_ip() 
{
    if (isset($_SERVER['HTTP_CLIENT_IP']))
    { 
        $ip = $_SERVER['HTTP_CLIENT_IP']; 
    }
    elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
    { 
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    }
    else 
    { 
        $ip = $_SERVER['REMOTE_ADDR']; 
    }
    return $ip;
} 
enjoy ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 68 Messages

10 janv. 2007, 19:27

Merci infinement sa marche!
Marino TEKI
In God I trust

Mammouth du PHP | 843 Messages

10 janv. 2007, 20:59

mais de rien :wink:
@++
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

ViPHP
ViPHP | 3607 Messages

10 janv. 2007, 21:39

je sais plus trop pour quelles raisons ni où je l'ai lu, mais il me semble que pour avoir l'ip complète, il faut faire ça:
// on prend l'ip de la meilleure manière qu'il soit
function get_ip() 
{
    if (isset($_SERVER['HTTP_CLIENT_IP']))
    { 
        $ip = $_SERVER['HTTP_CLIENT_IP']; 
    }
    elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
    { 
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    }
    else 
    { 
        $ip = $_SERVER['REMOTE_ADDR']; 
    }
    $ip=long2ip(ip2long($ip));
    return $ip;
}

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

10 janv. 2007, 21:55

En voici l'équivalent :
function get_ip() 
{ return (isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']));
}

Mammouth du PHP | 1885 Messages

11 janv. 2007, 03:07

Pourquoi une seule ligne de commande? C'est moins lisible et je suis certain que ça prend le même temps à interpréter.

En révisant nos vieilles architectures, nous avons vu plein d'entrées cron dites "one line" et c'est impossible à déchiffrer ou maintenir.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

11 janv. 2007, 11:15

Une simple question de goûts et de couleurs...

Personnellement,, je décode sans difficulté les instructions à base d'opérateurs ternaires
tandis que les articulations infinies de test "if", "elseif", "else else elseif" :langue:
qui prennent 15 lignes pour une simple attribution de valeur me brouillent un peu la vue.

Je proposais donc cette écriture comme alternative possible et totalement identique.
Juste pour info.

Après, chacun choisit...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 janv. 2007, 11:21

Euh :oops: ... si je puis me permettre .... 8-|
Note : Il est recommandé de ne pas "empiler" les expressions ternaires. Le comportement de PHP lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction n'est pas évident
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

11 janv. 2007, 11:32

Le comportement de PHP lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction n'est pas évident
Je ne connaissais pas cette mise en garde. :shock:

Cela dit, je n'ai jamais observé le moindre dysfonctionnement. :pouce:

Et je me suis pourtant amusé à aller jusqu'à 4 niveaux !
(mais ça, c'était juste par jeu, pour m'entraîner...) :ordi:

Pour l'avoir utilisé, réutilisé, torturé,... je suis donc plus confiant que php.net
dans le bon fonctionnement de l'opérateur ternaire. ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 janv. 2007, 11:34

Je ne peut qu'appuyer Albat sur le comportement de l'opérateur ternaire :pouce:

Même si je ne les imbrique jamais, je n'ai jamais observé de dysfonctionnement et si les parenthèses sont bien placée, il n'y a aucune raison.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

11 janv. 2007, 11:41

si les parenthèses sont bien placée
ce qui n'est pas forcément le plus simple à respecter... |*()

4 niveaux... y a quand même des fois où j'abuse... :-*

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 janv. 2007, 11:46

Puisque le sujet est résolu, je me permet un HS.

Quand tu fait 4 niveau, est-ce que tu indentes les opérateurs ou est-ce que tu écrits tout sur une ligne ?

Parce qu'en fait, j'arrive pas à trouver la lisibilité :oops:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

11 janv. 2007, 12:02

Pour être tout à fait sincère, j'ai pas fait ça de tête, d'un seul jet... :oops: :-*

J'ai commencé en les indentant, en effet.
Puis, une fois l'écriture finalisée, testée, validée, je l'ai résumée en une seule ligne.

:idea: le truc : commencer par le dernier test, bien sûr. ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 janv. 2007, 12:09

Tu pourrais faire quelque chose dans ce goût là :
($test) ? true : 
  (($test) ? true : 
  (($test) ? true : 
  (($test) ? true : false)));
C'est à mon sens un peu plus lisible que de tout mettre sur une ligne :)

Personnellement j'aime pas l'imbrication des ternaires, je préfère donc le if/elseif/else, mais j'aime pas les accolades inutiles, même si certains en ont besoin pour lire leur code, pour moi, une bonne indentation suffit.

Donc entre la version une ligne et la version expand, j'utiliserais une structure intermédiaire :
function get_ip()  { 
    if (isset($_SERVER['HTTP_CLIENT_IP'])) 
        $ip = $_SERVER['HTTP_CLIENT_IP'];  
    elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];  
    else  
        $ip = $_SERVER['REMOTE_ADDR'];  

    return long2ip(ip2long($ip)); 
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...