Page 1 sur 2
Affichage d'adresse IP
Posté : 10 janv. 2007, 19:00
par vares2
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!
Posté : 10 janv. 2007, 19:17
par BeRoots
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

Merci
Posté : 10 janv. 2007, 19:27
par vares2
Merci infinement sa marche!
Posté : 10 janv. 2007, 20:59
par BeRoots
mais de rien
@++
Posté : 10 janv. 2007, 21:39
par jojolapine
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;
}
Posté : 10 janv. 2007, 21:55
par albat
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']));
}
Posté : 11 janv. 2007, 03:07
par Xenon_54
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.
Posté : 11 janv. 2007, 11:15
par albat
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"

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...
Posté : 11 janv. 2007, 11:21
par zeus
Euh

... si je puis me permettre ....
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
Posté : 11 janv. 2007, 11:32
par albat
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.
Cela dit, je n'ai
jamais observé le moindre dysfonctionnement.
Et je me suis pourtant amusé à aller jusqu'à 4 niveaux !
(mais ça, c'était juste par jeu, pour m'entraîner...)
Pour l'avoir utilisé, réutilisé, torturé,... je suis donc plus confiant que php.net
dans le bon fonctionnement de l'opérateur ternaire.

Posté : 11 janv. 2007, 11:34
par zeus
Je ne peut qu'appuyer
Albat sur le comportement de l'opérateur ternaire
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.
Posté : 11 janv. 2007, 11:41
par albat
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... 
Posté : 11 janv. 2007, 11:46
par zeus
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é

Posté : 11 janv. 2007, 12:02
par albat
Pour être tout à fait sincère, j'ai pas fait ça de tête, d'un seul jet...
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.

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

Posté : 11 janv. 2007, 12:09
par Ryle
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));
}