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