Een switch in plaats van if-elseif-else..
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
?>
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}
?>
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
Danny Koppel schreef op 27.07.2007 18:48:
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}
?>
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;
}
?>
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:
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
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?
kvdd schreef op 27.07.2007 19:32:
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:
Danny Koppel schreef op 27.07.2007 18:48:
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}
?>
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:
Gewijzigd op 01/01/1970 01:00:00 door Edwin
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:
De code die je daar nu hebt staan is dan ook grote onzin, dan kan je net zo goed het volgende doen:
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.
ps. Een switch statement kun je hier in ieder geval niet gebruiken.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Code (php)
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
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;
}
}
?>
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;
}
}
?>
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.
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:
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)
1
2
3
4
5
6
7
8
9
10
11
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;
}
}
?>
# 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;
}
}
?>
Gerjo schreef op 27.07.2007 20:18:
Met switch statement kan het ook gewoon:
Code (php)
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
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;
}
}
?>
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!
Behalve dan dat je, als je geen break; doet, hij gewoon alles wat eronder staat ook doet.
Als je een grootte if/elseif/else situatie heb bied een switch statement meer overzicht.