2010-03-02 13 views
12

Come formeresti una query su un database MySQL tramite PHP per trovare se un indirizzo IP rientra tra due numeri in due campi diversi?Trova se il numero è tra due numeri in campi diversi in un database MySQL

rappresentazione numerica dell'indirizzo IP per trovare Formato

1265631252 

Database:

IP FROM  IP TO  REGISTRY ASSIGNED CTRY CNTRY COUNTRY 
"1265631232","1265893375","arin","1152835200","US","USA","United States" 
"1265893376","1265958911","arin","1149120000","US","USA","United States" 
"1265958912","1266024447","arin","1149120000","US","USA","United States" 
"1266024448","1266089983","arin","1162425600","US","USA","United States" 
+0

forse un approccio "divide et impera" potrebbe funzionare meglio? dividere l'indirizzo ip in 4 campi di smallint (byte), inserire questi campi in un indice (questa parte è importante), quindi interrogare quei campi in condizioni separate come (o indirizzo 127.0.0.1 o regolare per un intervallo): where (fld1 > = 127) e (fld1 <= 127) e (fld2> = 0) e (fld2 <= 0) e (fld3> = 0) e (fld3 <= 0) e (fld4> = 1) e (fld4 < = 1). L'ho provato, è solo un'idea da provare. –

risposta

32

Una query come questa:

SELECT * FROM your_table WHERE 1265631252 BETWEEN `IP FROM` AND `IP TO`; 

restituirà la riga (s) per il quale il numero fornito è compreso tra IP FROM e IP TO.

+2

Nel mio test (MySQL), eseguendo ricerche di indirizzi IP simili, questa versione "tra" era 2x come lenta (160-170 msec) come questa versione (80-83 msec) "select * from your_table dove ip_from <= 1265631252 e ip_to > = 1265631252; ". La chiave primaria su ip_from e l'indice univoco creato su ip_to erano a posto al momento del test. –

1

Che dire qualcosa di simile:

select * 
from your_table 
where ip_from <= '1265631252' 
    and ip_to >= '1265631252' 

vale a dire ottenere tutte le linee per le quali '1265631252' è tra il ip_from e ip_to?

3

Se si dispone già dell'equivalente DWORD dell'indirizzo IP, lo response from Jordan farà il trucco.

SELECT * FROM your_table WHERE 1265631252 BETWEEN `IP FROM` AND `IP TO`; 

se è necessario, prima di eseguire la query, calcolare l'equivalente DWORD dell'indirizzo IP è possibile effettuare le seguenti operazioni.

dato un indirizzo IP a nella forma part1.part2.part3.part4 poi l'equivalente DWORD può essere calcolato con la formula:

dword(a) = ((a.part1 * 256 + a.part2) * 256 + a.part3) * 256 + a.part4 

e quindi è possibile utilizzare dword(a) risultato nella query SQL.

Iniziare con un indirizzo IP come 206.191.158.55.

((206 * 256 + 191) * 256 + 158) * 256 + 55 

L'equivalente dword dell'indirizzo IP sarà il risultato. In questo caso 3468664375.

Vedere di più su DWORD equivalente di indirizzi IP here.

Problemi correlati