Seite 1 von 1

MySQL: Liegt 88.198.43.39 zw. 88.198.14.147-88.198.255.255??

Verfasst: 28.02.2007, 14:30
von Airport1
Es geht um eine bestehende DB mit IPRange Eintraegen:
z.B. ist ein Datensatz:

entry - entryend
88.198.14.147 88.198.255.255

Nun moechte ich herausfinden ob eine IP, z.B. "88.198.43.39" dazw. liegt. In Meta-Sprache quasi:

WHERE '$search' >= entry AND '$search' <= entryend

Das klappt natuerlich so einfach nicht. Daher suche ich hierfuer eine Idee, fuer eine Art "natuerlicheREn" String-Vergleich, sofern moeglich.

Natuerlich koennte man pfuschen, und alles als in der DB auch als LONG Werte ablegen, oder erst alle Datensaetze auslesen und in einer Schleife in LONG Werte als Array jedesmal konvertieren, aber es ist und bleibt Pfusch.

Hat jemand hierfuer eine Idee? Vielleicht jedes Oktett mit SUBSTR und der entsprech. 16er Potenz ausmultiplizieren? Oder gehts viel viel einfacher??

Verfasst:
von

Verfasst: 28.02.2007, 14:47
von SISTRIX
Komische Datenbankstruktur hast du da. Wieso nicht mit "normaler" CIDR-Notation arbeiten?

Gruß Johannes

Verfasst: 28.02.2007, 15:14
von twitch
In MySQL wird das meiner Meinung nach leider nicht funktionieren.

Lösung:
PHP-Schnippsel...Ungestestet:

Code: Alles auswählen

if &#40;ip2str&#40;$start&#41; <= ip2str&#40;$ip&#41;
    AND
    ip2str&#40;$ip&#41; <= ip2str&#40;$ende&#41;&#41;
...

function ip2str&#40;$ip&#41; &#123;
    $ip = preg_replace&#40;"/&#40;\d&#123;1,3&#125;&#41;\.?/e",
                       'sprintf&#40;"%03d", \1&#41;',
                        $ip&#41;;
    return &#40;string&#41;$ip;
&#125;
Statt if() versuch mal strcmp()...

Verfasst: 28.02.2007, 18:14
von bull
Natuerlich koennte man pfuschen, und alles als in der DB auch als LONG Werte ablegen
Ist kein Pfusch, sondern wahrscheinlich die sinnvollste Methode.
Spart außerdem Speicher, IPs nur als "LONG" in der DB zu halten ;)

Verfasst: 28.02.2007, 18:19
von Airport1
Hm, des isch fei wahr, sind dann je nur 4 byte gegenueber max. 15 byte, jedesmal.
Aber mi reizt halt a weng ob des ned au so gohd. mal no abwarde ob jemand mit ner super idee daher kommd ,)

Verfasst: 28.02.2007, 18:52
von Pompom
Wend zoahln zoahln sind, sollst fei oach de zoahln oas zoahln behanddln.

Verfasst: 28.02.2007, 20:20
von net(t)worker
hmm... schau dir mal

SUBSTRING_INDEX()

an, damit könnteste ne ip an den punkten trennen und die zahlen einzeln vergleichen...

wäre theoretisch also in mysql lösbar, aber ob es sinn macht ist ne andere frage

Verfasst: 01.03.2007, 17:51
von Hasenhuf
Ich würde die DB ändern und die Spalte in zwei Spalten "von" "bis" aufteilen.

Verfasst: 01.03.2007, 18:15
von Airport1
? es sind bereits zwei spalten. habe jetzt doch die iplongs in der db..
neben der platzersparnis spart man auch noch zeit:
da ein reiner zahlenvergleich immer schneller ist als strings zu vergleichen ;)

Verfasst: 04.03.2007, 15:30
von Hasenhuf
Ach so, WHERE '$search' >= entry AND '$search' <= entryend funktioniert nur wegen der Punkte und Stellen nicht. Warum speicherst Du die IPs nicht ohne Punkte und füllst die ein- und zweistelligen Blöcke nicht mit Nullen auf?

PS: Was sind "iplongs"?

Verfasst: 04.03.2007, 16:01
von net(t)worker
schau dir mal hier an wie ip adressen aufgebaut sind:
https://de.wikipedia.org/wiki/IP-Adresse

die schreibweise mit den 4 Zahlengruppen und den Punkten ist ja nur weil wir uns mit dem Binär-, Oktal- und Hexadezimalsystem ein klein wenig schwer tun... ;-)

so lässt sich eine IP Adresse auch in den verschiedensten Zahlensystemen als eine Zahl darstellen, also auch als reine Integer, und so mit dann auch simpel in einem Vergleich verwenden...

Verfasst: 04.03.2007, 16:03
von Southmedia