Een switch in plaats van if-elseif-else..

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kvdd

kvdd

27/07/2007 18:45:00
Quote Anchor link
Goedeavond allemaal,

Ik probeer deze if-elseif-else code om te zetten naar een switch. Het principe van een switch is mij duidelijk. Maar niet duidelijk genoeg om eruit te komen blijkbaar :-)

Het is overigens een code om het juiste IP van de gebruiker voor mijn neus te krijgen. (Moet later worden ingevoerd in de database)

Eerst de oude code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
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_X_FORWARDED')) {
$IP = getenv('HTTP_X_FORWARDED');
}

elseif (getenv('HTTP_FORWARDED_FOR')) {
$IP = getenv('HTTP_FORWARDED_FOR');
}

elseif (getenv('HTTP_FORWARDED')) {
$IP = getenv('HTTP_FORWARDED');
}

else {
$IP = $_SERVER['REMOTE_ADDR'];
}

echo $IP;
?>


En hier mijn zelf gebakken - niet werkende - switch:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
switch ($ip) {
case
$ip = getenv('HTTP_CLIENT_IP'):
    echo $ip;
    break;
case
$ip = getenv('HTTP_X_FORWARDED_FOR'):
    echo $ip;
    break;
case
$ip = getenv('HTTP_X_FORWARDED'):
    echo $ip;
    break;
case
$ip = getenv('HTTP_FORWARDED_FOR'):
    echo $ip;
    break;
case
$ip = getenv('HTTP_FORWARDED'):
    echo $ip;
    break;
default:

    $ip = getenv('REMOTE_ADDR');
    echo $ip;
    break;
}

?>


Edit: het moet worden ingepast in een grote code, waar snelheid van belang is. Ik zag dat het ook mogelijk is, en veel sneller, om het in een array te plaatsen. Alleen weet ik niet hoe.
Gewijzigd op 01/01/1970 01:00:00 door Kvdd
 
PHP hulp

PHP hulp

30/11/2024 12:23:19
 
Danny K

Danny K

27/07/2007 18:48:00
Quote Anchor link
Vb:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
switch ($ip)
{
   case
getenv('HTTP_CLIENT_IP'):
                                echo $ip;
                                break;
   case
x : zo verder
}
?>


Edit:

Wat jij doet.. Is toewijzen.. ($ip = getenv('iets'))
Linkje voor meer info! Klik!
Gewijzigd op 01/01/1970 01:00:00 door Danny K
 
Kvdd

kvdd

27/07/2007 19:32:00
Quote Anchor link
Danny Koppel schreef op 27.07.2007 18:48:
Vb:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
switch ($ip)
{
   case
getenv('HTTP_CLIENT_IP'):
                                echo $ip;
                                break;
   case
x : zo verder
}
?>


Edit:

Wat jij doet.. Is toewijzen.. ($ip = getenv('iets'))
Linkje voor meer info! Klik!


Dank jewel, maar het probleem is dat dat niet werkte, vandaar dat ik het op een alternative manier geprobeerd heb, en die dus hier poste.

Ik hem em nu zo, en krijg geen enkel ip, met die if-elseif-else (die hier bovenstaat) werkt het goed!

Mijn - niet werkende - code op dit moment:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
switch ($ip) {
case
getenv('HTTP_CLIENT_IP'):
    echo $ip;
    break;
case
getenv('HTTP_X_FORWARDED_FOR'):
    echo $ip;
    break;
case
getenv('HTTP_X_FORWARDED'):
    echo $ip;
    break;
case
getenv('HTTP_FORWARDED_FOR'):
    echo $ip;
    break;
case
getenv('HTTP_FORWARDED'):
    echo $ip;
    break;
default:

    getenv('REMOTE_ADDR');
    echo $ip;
    break;
}

?>
 
Joren de Wit

Joren de Wit

27/07/2007 19:44:00
Quote Anchor link
Dit gaat je zo niet lukken. Een switch() vereist namelijk dat de meegegeven parameter vooraf al een waarde heeft. En dat heeft $ip nu nog niet.

Alles wat achter een case staat is namelijke een mogelijke waarde voor de paramter die meegegeven is aan de switch. Dat is dus een vervanging voor:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if($ip == dit) {}
elseif($ip == dat) {}
else {}
?>
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Kvdd

kvdd

27/07/2007 19:47:00
Quote Anchor link
Dus dit gaat niet werken in een switch?

Het gaat me vooral om snelheid, omdat zoals ik al had aangegeven dit in een enorm grote code moet ingepast worden. En erg vaak gebruikt wordt.

Enig idee?
 
Edwin

Edwin

27/07/2007 19:48:00
Quote Anchor link
kvdd schreef op 27.07.2007 19:32:
Danny Koppel schreef op 27.07.2007 18:48:
Vb:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
switch ($ip)
{
   case
getenv('HTTP_CLIENT_IP'):
                                echo $ip;
                                break;
   case
x : zo verder
}
?>


Edit:

Wat jij doet.. Is toewijzen.. ($ip = getenv('iets'))
Linkje voor meer info! Klik!


Dank jewel, maar het probleem is dat dat niet werkte, vandaar dat ik het op een alternative manier geprobeerd heb, en die dus hier poste.

Ik hem em nu zo, en krijg geen enkel ip, met die if-elseif-else (die hier bovenstaat) werkt het goed!

Mijn - niet werkende - code op dit moment:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
switch ($ip) {
case
getenv('HTTP_CLIENT_IP'):
    echo $ip;
    break;
case
getenv('HTTP_X_FORWARDED_FOR'):
    echo $ip;
    break;
case
getenv('HTTP_X_FORWARDED'):
    echo $ip;
    break;
case
getenv('HTTP_FORWARDED_FOR'):
    echo $ip;
    break;
case
getenv('HTTP_FORWARDED'):
    echo $ip;
    break;
default:

    getenv('REMOTE_ADDR');
    echo $ip;
    break;
}

?>


De code die je daar nu hebt staan is dan ook grote onzin, dan kan je net zo goed het volgende doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo $ip;
?>
Gewijzigd op 01/01/1970 01:00:00 door Edwin
 
Kvdd

kvdd

27/07/2007 19:51:00
Quote Anchor link
Edwin schreef op 27.07.2007 19:48:

De code die je daar nu hebt staan is dan ook grote onzin, dan kan je net zo goed het volgende doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo $ip;
?>


Juist, en dat is nu juist mijn vraag. Hoe los ik dit op de snelste manier op? (dat php weinig rekenkracht nodig heeft om de code uit te voeren.
 
Joren de Wit

Joren de Wit

27/07/2007 19:53:00
Quote Anchor link
Gewoon op de if/elseif/else manier zoals je al had. Misschien handig om dat even in een functie te gooien en het ip-adres daaruit te retourneren.

ps. Een switch statement kun je hier in ieder geval niet gebruiken.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Edwin

Edwin

27/07/2007 19:55:00
Quote Anchor link
De rekenkracht van PHP hoef je geen rekening mee te houden, welke manier je ook gebruikt het zal je script niet significant trager maken. Ik zou het als volgt oplossen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$aOptions
= array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED');
$sIp = $_SERVER['REMOTE_ADDR'];
foreach($aOptions as $sOption){
    if($sResult = getenv($sOption)){
        $sIp = $sResult;
        break;
    }
}

echo $sIp;
?>
 
Gerard M

Gerard M

27/07/2007 20:18:00
Quote Anchor link
Met switch statement kan het ook gewoon:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
function getIP() {
    switch(true) {
        case (
$ip = getenv('HTTP_CLIENT_IP')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_X_FORWARDED_FOR')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_X_FORWARDED')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_FORWARDED_FOR')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_FORWARDED')):
            return $ip;
            break;
        default:
            (
$ip = getenv('REMOTE_ADDR'));
            return $ip;
            break;
    }
}

?>
 
Kvdd

kvdd

27/07/2007 20:29:00
Quote Anchor link
Blanche schreef op 27.07.2007 19:53:
Gewoon op de if/elseif/else manier zoals je al had. Misschien handig om dat even in een functie te gooien en het ip-adres daaruit te retourneren.

ps. Een switch statement kun je hier in ieder geval niet gebruiken.


Ja dat is idd de beste manier, dat vond Edwin ook blijkbaar ;-) Mijn probleem is, dat ik nog niet goed functies kan schrijven, maar binnenkort kijk ik daar wat tutorials op na.

Edwin schreef op 27.07.2007 19:55:
De rekenkracht van PHP hoef je geen rekening mee te houden, welke manier je ook gebruikt het zal je script niet significant trager maken. Ik zou het als volgt oplossen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$aOptions
= array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED');
$sIp = $_SERVER['REMOTE_ADDR'];
foreach($aOptions as $sOption){
    if($sResult = getenv($sOption)){
        $sIp = $sResult;
        break;
    }
}

echo $sIp;
?>


Dat is em, en hij werkt helemaal! Je hebt alleen een optie vergeten: HTTP_X_FORWARDED. Dus de code zou zo moeten zijn nu: (aangepast naar mijn code)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
# get the right user ip even if he is behind a proxy
$options = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED, HTTP_X_FORWARDED');
$ip_user = $_SERVER['REMOTE_ADDR'];
foreach($Options as $Option){
    if($result = getenv($Option)){
        $ip_user = $result;
        break;
    }
}

?>
 
Kvdd

kvdd

27/07/2007 20:34:00
Quote Anchor link
Gerjo schreef op 27.07.2007 20:18:
Met switch statement kan het ook gewoon:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
function getIP() {
    switch(true) {
        case (
$ip = getenv('HTTP_CLIENT_IP')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_X_FORWARDED_FOR')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_X_FORWARDED')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_FORWARDED_FOR')):
            return $ip;
            break;
        case (
$ip = getenv('HTTP_FORWARDED')):
            return $ip;
            break;
        default:
            (
$ip = getenv('REMOTE_ADDR'));
            return $ip;
            break;
    }
}

?>


Als ik $ip echo, dan geeft deze niets weer, maar wel bedankt!
 
Gerard M

Gerard M

27/07/2007 20:41:00
Quote Anchor link
Weet je zeker dat je de functie goed aanroept? $ip is geen global, dus hij heeft alleen een waarde binnen de functie.

correct:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$ip
= getIP();
echo $ip;
?>
Gewijzigd op 01/01/1970 01:00:00 door Gerard M
 
Mark L

Mark L

27/07/2007 20:46:00
Quote Anchor link
Sorry, ik snap de switch functie wel, maar wat is het nut van de switch functie t.o.v. de if-else?
Behalve dan dat je, als je geen break; doet, hij gewoon alles wat eronder staat ook doet.
 
Gerard M

Gerard M

27/07/2007 20:54:00
Quote Anchor link
@Mark
Als je een grootte if/elseif/else situatie heb bied een switch statement meer overzicht.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.