While vs If...

Mammouth du PHP | 985 Messages

24 août 2009, 11:58

Bonjour,
Je voudrais déjà préciser que je ne suis pas développeur de formation, mais autodidacte.
Mon code est donc très basique, mais j'arrive malgré tout toujours à mes fins.
Pour résumer, j'utilise les fonctions et les if, elseif et else au maximum, ca fonctionne mais j'aimerais maintenant améliorer un peu mon code...
Dans ma page ipinfo, pour le fun surtout, il y a une petite détection de proxys, le code était presque écrit de cette manière:
$c_ip = $_SERVER['REMOTE_ADDR']; // Adresse Ip du Client
$p1_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];  // Ne doit jamais retourner de valeur
$p2_ip = $_SERVER["HTTP_X_FORWARDED"]; // Idem
$p3_ip = $_SERVER["HTTP_VIA"]; // Idem
$p4_ip = $_SERVER["HTTP_CLIENT_IP"]; // Idem
$r5_ip = $autre1;  // Doit toujours retourner une valeur
$p6_ip = $autre2; // Idem
if (!empty($p1_ip) && $p1_ip != $c_ip) { // 1: Je veux continuer les tests tant que je ne trouve pas une valeur non égale à l'IP
$proxy  = $pr1_ip;
} 
elseif (!empty($p2_ip) && $p2_ip != $c_ip) { // Idem
$proxy = $pr2_ip;
} 
elseif (!empty($p3_ip) && $p3_ip != $cl_ip) { // Idem
$proxy = $pr3_ip;
} 
elseif (!empty($p4_ip) && $p4_ip != $c_ip) { // Idem
$proxy = $pr4_ip;
} 
elseif (!empty($p1_ip) || !empty($p2_ip) || !empty($p3_ip) || !empty($p4_ip)) { // 2: maintenant je récupère les valeurs si sont égales a l'IP
$proxy  = 'Oui';
}
elseif (empty($p5_ip) || empty($p6_ip)) { //3: Maintenant je vérifie si les valeurs sont vides 
$proxy  = 'Oui';
}
else { // Si aucunes valeurs trouvées alors $proxy  n' a aucune valeur
$proxy  = "";
}
if (!empty($proxy )) { // Si $proxy a une valeur
echo '<p><span class="soul">Adresse Ip:</span> <span class="moyen-g">' . $cl_ip . '</span></p>
<span class="soul">Proxy possible:</span> <span class="moyen-g">' . htmlentities(utf8_decode($proxy )) . '</span>';
}
else { //Sinon
echo '<p><span class="soul">Adresse Ip:</span> <span class="moyen-g">' . $cl_ip . '</span></p>';
}
Je viens de créer une fonction avec une boucle while, mais j'aimerais être certain, que l'exécution du code soit plus rapide ou au moins aussi Safe:
function detect_proxy() {
$p_ip = array($_SERVER["HTTP_X_FORWARDED_FOR"], $_SERVER["HTTP_X_FORWARDED"], $_SERVER["HTTP_VIA"], $_SERVER["HTTP_CLIENT_IP"]);
$p1_ip = $autre1;
$p2_ip = $autre2;
$c_ip = $_SERVER['REMOTE_ADDR'];
$proxy = ''; 

 if (empty($p1_ip) || empty($p2_ip)) {
     $proxy = 'Oui';
 }
 while ((list(, $value) = each($p_ip))) {
    if(!empty($value)){
          if($value != $c_ip){
             $proxy = $value;
             break; // un break ici pour que $p_ip ne soit pas ré-écrasé par une valeur égale à l'ip
            }
            else {
             $proxy = 'Oui';
             }
     }
 }
 return $proxy;
}
$resultat = detect_proxy();
if (!empty($resultat)) { // Si $proxy a une valeur
echo '<p><span class="soul">Adresse Ip:</span> <span class="moyen-g">' . $cl_ip . '</span></p>
<span class="soul">Proxy possible:</span> <span class="moyen-g">' . htmlentities(utf8_decode($resultat)) . '</span>';
}
else { //Sinon
echo '<p><span class="soul">Adresse Ip:</span> <span class="moyen-g">' . $cl_ip . '</span></p>';
}
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Mammouth du PHP | 985 Messages

24 août 2009, 17:58

Désolé, j'avais posté trop vite et mis par erreur quasiment le même echo final pour les deux scripts.
Corrigé et Up car aucunes réponses.
J'attend votre aide, vos conseils avisés et rectifications...
Merci par avance
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

24 août 2009, 18:01

vu le code en terme de rapidité, je pense pas que se soit perceptible ! mais en lecture perso je préfère avec la boucle
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Eléphant du PHP | 369 Messages

24 août 2009, 19:48

Salut,
Bonjour,
Je voudrais déjà préciser que je ne suis pas développeur de formation, mais autodidacte.
Mon code est donc très basique, mais j'arrive malgré tout toujours à mes fins.
Pour résumer, j'utilise les fonctions et les if, elseif et else au maximum, ca fonctionne mais j'aimerais maintenant améliorer un peu mon code...
Dans ma page ipinfo, pour le fun surtout, il y a une petite détection de proxys, le code était presque écrit de cette manière:
[...]
Je viens de créer une fonction avec une boucle while, mais j'aimerais être certain, que l'exécution du code soit plus rapide ou au moins aussi Safe:
@Cobaye : +1 ;)

Sinon tu as aussi quelques alternatives qui sont:
// L'usage de foreach lié à un flag de recherche

foreach($item AS $key => $value)
{
   if (bfWork) break;
}

// ou encore un while générique

while($bfWork)
{
   $bfWork = ($res) ? true : false;
}
En même temps c'est pas ce que tu demandes mais... on sait jamais ;)

@+ bon code ;)

Mammouth du PHP | 985 Messages

24 août 2009, 20:01

Salut,
En même temps c'est pas ce que tu demandes mais... on sait jamais ;)
@+ bon code ;)
Si si, je demandais des avis et idées, merci je vais étudier cela, merci aussi à Cobaye
Bon on va dire que c'est résolu alors :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.