[PHP/MySQL] switch funktioniert irgendwie nicht richtig

chef5983

Member
ID: 51499
L
8 Mai 2006
12
1
ich bin z.z. am testen an einem ländercheck script aber irgendwie habe ich einen denkfehler drin.

das problem ist das alles wird richtig aus der tabelle ausgelesen aber mit der schleife switch läuft das irgend wie nicht. wenn nun ein user mit der ip aus deutschland auf die seite kommt wird zwar vom script GERMANY ausgegeben auber von der schleife nicht erkannt.

was ist falsch?

PHP:
$ip = $_SERVER['REMOTE_ADDR'];

    $country_query  = "SELECT * FROM iptoc ".
         "WHERE IP_FROM<=inet_aton('$ip') ".
          "AND IP_TO>=inet_aton('$ip') ";

    $country_exec = mysql_query($country_query);

    $ccode_array = mysql_fetch_array($country_exec);

    $land=$ccode_array['land'];


	switch ($land){
		case "CHINA":	
			echo "CHINA";
			echo 'IP:' .$ip. '<br>';
			echo '$land:'.$land. '<br>';
		break;
		case "GERMANY":	
			echo "GERMANY";
			echo 'IP:' .$ip. '<br>';
			echo '$land:'.$land. '<br>';
		break;		
		default:echo "Fehler Land <br>";
			echo 'IP:' .$ip. '<br>';
			echo '$land:'.$land. '<br>';

	}
 
Achso. Naja, aber wenn GERMANY ausgegeben wird, kommt er doch in den richtigen case-Block. Insofern muss er doch die switch-Anweisung korrekt ausführen?
 
es wird immer "Fehler Land" ausgegeben.

wenn ich das aber so mache klapt alles super $land = "GERMANY";

kann das mit der einstellung des feldes im mysql zusammen hängen? da ist z.z. tinytext eingestellt
 
dann wird wohl GERMANY nicht in der ersten Zeile der Spalte `land` stehen
also die Abfrage falsch sein

Klappt die Abfrage mit PHPMyAdmin?

bei denk ich immer an biete :ugly:

rein vom logischen her, würde ich ja die <= und => Zeichen vertauschen, aber wenn das sorum in der DB steht ;)
 
Zuletzt bearbeitet:
Lautet die Funktion, die du suchst nicht inet_pton? Desweiteren übergibst du nicht das Resultat der Funktion, sondern einen String an den Query. Sie wird damit auch gar nicht ausgeführt.

edit: Ahh, sehe gerade, dass inet_aton in MySQL existiert. Dann vergiss, was ich gesagt habe.
 
Zuletzt bearbeitet:
PHP:
$ip = $_SERVER['REMOTE_ADDR'];

    $country_query  = "SELECT * FROM iptoc WHERE IP_FROM <= inet_aton('".$ip."') AND IP_TO >= inet_aton('".$ip."')";

    $ccode_array = mysql_fetch_array(mysql_query($country_query));

    switch ($ccode_array['land'])
    {
        case 'CHINA':    
            echo "CHINA";
            echo 'IP:' .$ip. '<br>';
            echo 'Land:'.$ccode_array['land']. '<br>';
        break;
        case 'GERMANY':    
            echo "GERMANY";
            echo 'IP:' .$ip. '<br>';
            echo 'Land:'.$ccode_array['land']. '<br>';
        break;        
        default:
            echo "Fehler Land <br>";
            echo 'IP:' .$ip. '<br>';
            echo 'Land:'.empty($ccode_array['land']) ? 'n / A' : $ccode_array['land'].'<br>';
    }

versuch es mal so dann müsste es eigentlich klappen

*edit* habs nochmal bissl geändert den default finde ich trotzdem komisch
 
Zuletzt bearbeitet:
die script ausgabe ist zwar jetzt anders aber am ergebnis hat sich noch nicht geändert.

man öffnet die seite, die ip wird ausgelesen und das richtige land wird aus der tabelle gesucht soweit läuft alles richtig.
aber sobald man mit der switch anweisung beginnt bzw geht auch bei einer if schleife nicht.

beim letzten wird mit meiner ip bei case ausgegeben
Fehler Land
IP:221.4.188.210
n / A

und wenn ich auserhalb der case anweisung echo $ccode_array['land']; einfüge wird ohne probleme GERMANY ausgegeben.



p.s. das mit dem war "Brauche Hilfe",
 
dan schreib es in dem case aus

case $ccode_array['land'] == "GERMANY"

usw müsste gehen

wenn das auch net klappt schreib mal auserhalb der switch var_dump($ccode_array['land']);
 
Tada, da ist doch der Fehler. Das Leerzeichen am Ende von $land macht Dir 'nen Strich durch die Rechnung.

Ausgehend von Deinem Originalcode dürfte folgende Änderung an Zeile 11 zur Lösung führen:
PHP:
$land= chop($ccode_array['land']);
 
genau das war der fehler ich danke dir sehr. ich wäre bestimmt noch daran verzweifelt.

ich hatte das gestern schon mal mit var_dump geprüft.
 
Zuletzt bearbeitet:
Wenn ich Dir noch 'nen kleinen Tip zu Deinem Query geben darf:
Code:
SELECT *
FROM iptoc
WHERE INET_ATON('$ip') BETWEEN ip_from AND ip_to
Dies dürfte die bessere Variante des Queries sein, da die Umwandlung der IP nur einmal stattfindet.

Die SELECT *-Geschichte lass ich jetzt mal aussen vor, da steht anderweitig genug drüber.