wie kann ich am einfachsten und am schonensten überprüfen, ob eine bestimmte IP in einer bestimmten IP-Range ist?
Als einfachstes dachte ich mir, ich könnte die IP-Grenzen (der Ranges) in 32-Bit-Zahlen umwandeln und die IP auch und dann ueber einfache größer/kleiner-Beziehungen feststellen, ob ein Fall eintritt:
Richtig.
// User muss gecheckt werden
$ip = abs(ip2long($ip));
Das geht in die Hose. Nehmen wir mal ein 4-bittiges Beispiel:
8421
----
14 1110
-2 1110
2 0010
Wie Du siehst, entspricht die "Adresse" 14 der Binärzahl 1110. Da ip2long() eine vorzeichenbehaftete Zahl ausspuckt, gibt die Funktion die Dezimalzahl -2 zurück. Machst Du daraus jetzt mit abs() einen positiven Wert, erhältst Du 0010, und das wiederum entspricht nicht dem ursprünglichen Wert 1110 (14).
Benutze wie in der PHP-Anleitung angegeben sprintf() mit dem Platzhalter %u. %u interpretiert die übergebenen Daten als vorzeichenlos und gibt dementsprechend für 1110 auch tatsächlich 14 aus.
$query = 'SELECT ip_start, ip_end FROM al_iprange WHERE ('.$ip.' >= ip_start AND '.$ip.' <= ip_end)';
$query = sprintf("SELECT ip_start,ip_end FROM al_iprange WHERE %u>=ip_start AND %u<=ip_end)",$ip);
Ich gehe mal davon aus, daß auch Dezimalzahlen in Deiner Tabelle hast.
Aber irgendwie scheint das nicht zu klappen :(
"Geht nicht", das ist eine Fehlerbeschreibung, wie ich sie liebe :/ So überaus präzise und ausführlich, daß man sich vor Informationen garnicht mehr retten kann.
Ist Dir das Problem nicht wichtig genug, daß Du nichtmal ein paar Beispielzahlen mitliefern konntest?
Gruß,
soenk.e