WHERE abfrage Probleme, bei grösser kleiner
WHERE abfrage Probleme, bei grösser kleiner
am 18.07.2006 12:27:31 von Tammi Muckler
Ich habe für mich ein grosses Problem, für einen Profi ist es wahrscheinlich
zum Lachen
Ich möchte eine Abfrage mache wo ich eine Ip auslese,
sie soll zwischen den Werten
ipstart und ipende liegen.
Doch meine funktioniert nicht.
$sql = "SELECT * FROM aip WHERE ipstart >= '$ip' AND ipende <= '$ip'";
Kann mir jemand einen Tipp geben.
Tammi
Re: WHERE abfrage Probleme, bei grösserkleiner
am 18.07.2006 12:34:19 von Sven Paulus
Tammi Muckler wrote:
> Ich habe für mich ein grosses Problem, für einen Profi ist es wahrsc=
heinlich=20
> zum Lachen
> Ich möchte eine Abfrage mache wo ich eine Ip auslese,
> sie soll zwischen den Werten
> ipstart und ipende liegen.
> Doch meine funktioniert nicht.
> $sql =3D "SELECT * FROM aip WHERE ipstart >=3D '$ip' AND ipende <=3D=
'$ip'";
Naja, es wird zeichenweise der ASCII-Wert verglichen, was aber bei
IP-Adressen nicht passt, da die einzelnen Felder nicht mit fuehrenden
Nullen versehen sind, z.B.
(none)> select if('10.100.1.1' >=3D '10.11.1.1',1,0);
+-------------------------------------+
| if('10.100.1.1' >=3D '10.11.1.1',1,0) |
+-------------------------------------+
| 0 |
+-------------------------------------+
1 row in set (0.00 sec)
"10" ist kleine "11", die zweite Null von "100" wird gar nicht mehr
fuer den Vergleich zu Rate gezogen.
Abhilfe: Wandele die IPs jeweils in einen 32-bit unsigned integer
(erste Position mal 256^3, zweite mal 256^2, etc.), speichere und
vergleiche dann jeweils diesen Wert.
Re: WHERE abfrage Probleme, bei grösserkleiner
am 18.07.2006 13:43:10 von Thomas Rachel
Tammi Muckler wrote:
> SELECT * FROM aip WHERE ipstart >= '$ip' AND ipende <= '$ip'
Kanns sein, daà die Bedingungen da falschrum sind? $ip sollte doch zwischen
ipstart und ipende liegen, also '$ip' >= ipstart and '$ip' <= ipende.
Was Sven geschrieben hat, stimmt natürlich auch - MySQL hat für diese
Umwandlungen übrigens extra die Funktionen INET_ATON und INET_NTOA, leider
weià ich nicht, seit welcher Version.
Thomas
Re: WHERE abfrage Probleme, bei grösser kleiner
am 18.07.2006 13:44:56 von Wolfram Kraus
On 18.07.2006 12:34, Sven Paulus wrote:
> Tammi Muckler wrote:
>> Ich habe für mich ein grosses Problem, für einen Profi ist es wahrscheinlich
>> zum Lachen
>> Ich möchte eine Abfrage mache wo ich eine Ip auslese,
>> sie soll zwischen den Werten
>> ipstart und ipende liegen.
>> Doch meine funktioniert nicht.
>> $sql = "SELECT * FROM aip WHERE ipstart >= '$ip' AND ipende <= '$ip'";
>
> Naja, es wird zeichenweise der ASCII-Wert verglichen, was aber bei
> IP-Adressen nicht passt, da die einzelnen Felder nicht mit fuehrenden
> Nullen versehen sind, z.B.
>
> (none)> select if('10.100.1.1' >= '10.11.1.1',1,0);
> +-------------------------------------+
> | if('10.100.1.1' >= '10.11.1.1',1,0) |
> +-------------------------------------+
> | 0 |
> +-------------------------------------+
> 1 row in set (0.00 sec)
>
> "10" ist kleine "11", die zweite Null von "100" wird gar nicht mehr
> fuer den Vergleich zu Rate gezogen.
>
> Abhilfe: Wandele die IPs jeweils in einen 32-bit unsigned integer
> (erste Position mal 256^3, zweite mal 256^2, etc.), speichere und
> vergleiche dann jeweils diesen Wert.
Ist nicht nötig, man kann auch INET_ATON verwenden, siehe:
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functio ns.html
HTH,
Wolfram
Re: WHERE abfrage Probleme, bei grösser kleiner
am 18.07.2006 13:53:16 von Tammi Muckler
Ich denke so ähnlich müsste es gehen, nur geht es leider nicht
$sql = mysql_query "SELECT * FROM aip where ipstart <= inet_aton('$ip')
and ipende >= inet_aton('$ip')";
"Wolfram Kraus" schrieb im Newsbeitrag
news:e9ihjo$477$1@ork-un.noris.net...
On 18.07.2006 12:34, Sven Paulus wrote:
> Tammi Muckler wrote:
>> Ich habe für mich ein grosses Problem, für einen Profi ist es
>> wahrscheinlich
>> zum Lachen
>> Ich möchte eine Abfrage mache wo ich eine Ip auslese,
>> sie soll zwischen den Werten
>> ipstart und ipende liegen.
>> Doch meine funktioniert nicht.
>> $sql = "SELECT * FROM aip WHERE ipstart >= '$ip' AND ipende <=
>> '$ip'";
>
> Naja, es wird zeichenweise der ASCII-Wert verglichen, was aber bei
> IP-Adressen nicht passt, da die einzelnen Felder nicht mit fuehrenden
> Nullen versehen sind, z.B.
>
> (none)> select if('10.100.1.1' >= '10.11.1.1',1,0);
> +-------------------------------------+
> | if('10.100.1.1' >= '10.11.1.1',1,0) |
> +-------------------------------------+
> | 0 |
> +-------------------------------------+
> 1 row in set (0.00 sec)
>
> "10" ist kleine "11", die zweite Null von "100" wird gar nicht mehr
> fuer den Vergleich zu Rate gezogen.
>
> Abhilfe: Wandele die IPs jeweils in einen 32-bit unsigned integer
> (erste Position mal 256^3, zweite mal 256^2, etc.), speichere und
> vergleiche dann jeweils diesen Wert.
Ist nicht nötig, man kann auch INET_ATON verwenden, siehe:
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functio ns.html
HTH,
Wolfram
Re: WHERE abfrage Probleme, bei grösserkleiner
am 18.07.2006 14:09:13 von Thomas Rachel
Tammi Muckler wrote TOFU[1]:
> Ich denke so ähnlich müsste es gehen, nur geht es leider nicht
>
> $sql = mysql_query "SELECT * FROM aip where ipstart <= inet_aton('$ip')
> and ipende >= inet_aton('$ip')";
Es geht nicht. Aha. Und wie äuÃert sich das? Fehlermeldung? Kein Ergebnis?
Ich vermute mal, daà Du in der Datenbank die IP-Adressen auch als String
liegen hast -> die (also ipstart und ipende) müÃtest Du entweder auch durch
inet_aton schieben oder sie vorher konvertieren (wenn das geht, weil es
etwa die einzige Stelle ist, wo überhaupot drauf zugegriffen wird -
ansonsten müÃte das alles geändert werden.)
Welche Sprache ist das drumrum? Egal- ist hier nicht ontopic. Sollte es aber
PHP sein, könnten da noch ein paar Klammern drumrum fehlen.
> "Wolfram Kraus" schrieb im Newsbeitrag
> news:e9ihjo$477$1@ork-un.noris.net...
[1] Bitte, bitte, kein TOFU. -> http://learn.to/quote
Thomas
Re: WHERE abfrage Probleme, bei grösserkleiner
am 18.07.2006 14:20:10 von Lorenz Haas
Tammi Muckler wrote:
> Ich denke so ähnlich müsste es gehen, nur geht es leider nicht
>
> $sql = mysql_query "SELECT * FROM aip where ipstart <= inet_aton('$ip')
> and ipende >= inet_aton('$ip')";
Hi,
von welchem Format sind denn `ipstart` und `ipende`?
Lorenz
Re: WHERE abfrage Probleme, bei grösserkleiner
am 19.07.2006 12:05:22 von Frank Kirschner
Thomas Rachel wrote on 18 Jul 2006:
> Tammi Muckler wrote:
>
>> SELECT * FROM aip WHERE ipstart >= '$ip' AND ipende <= '$ip'
>
> Kanns sein, daß die Bedingungen da falschrum sind? $ip sollte doch
> zwischen ipstart und ipende liegen, also '$ip' >= ipstart and '$ip' <=
> ipende.
>
>
> Was Sven geschrieben hat, stimmt natürlich auch - MySQL hat für diese
> Umwandlungen übrigens extra die Funktionen INET_ATON und INET_NTOA,
> leider weiß ich nicht, seit welcher Version.
Im Referenzbuch steht diese ab Version 5.1
HTH
Frank
Re: WHERE abfrage Probleme, bei grösserkleiner
am 19.07.2006 13:08:13 von Thomas Rachel
Frank Kirschner wrote:
>> Was Sven geschrieben hat, stimmt natürlich auch - MySQL hat für diese
>> Umwandlungen übrigens extra die Funktionen INET_ATON und INET_NTOA,
>> leider weià ich nicht, seit welcher Version.
>
>
> Im Referenzbuch steht diese ab Version 5.1
Ich habe hier 4.1.10a, da gehts schon. In 4.0.15-Max gehts ebenfalls.
Thomas
Re: WHERE abfrage Probleme, bei � kleiner
am 19.07.2006 22:16:03 von Dominik Echterbruch
Thomas Rachel wrote:
>
>>>Was Sven geschrieben hat, stimmt natürlich auch - MySQL hat für diese
>>>Umwandlungen übrigens extra die Funktionen INET_ATON und INET_NTOA,
>>>leider weiß ich nicht, seit welcher Version.
>>
>>Im Referenzbuch steht diese ab Version 5.1
>
> Ich habe hier 4.1.10a, da gehts schon. In 4.0.15-Max gehts ebenfalls.
Und die 3.23.x nicht zu vergessen... Diese Funktionen sind schon so alt,
daà es mich immer wieder wundert, warum sie keiner verwendet.
GrüÃe,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal