Php 将MySQL中的ip地址范围与开始和结束ip地址进行比较

Php 将MySQL中的ip地址范围与开始和结束ip地址进行比较,php,mysql,ip-address,Php,Mysql,Ip Address,我有一个MySQL表,存储IP范围。它的设置方式是将起始地址存储为long,结束地址(以及id和其他一些数据)。 现在我有用户通过输入开始和结束ip地址来添加范围,我想检查新范围是否已经(部分)在数据库中 我知道我可以在两个不同的列之间进行查询,但这似乎不适用于两个不同的列,而且我也不知道如何传递一个范围来比较它。 可以在PHP中循环执行,但如果范围为132.0.0.0-199.0.0.0,则会产生大量查询。以下内容如何: SELECT * FROM addresses WHERE (s

我有一个MySQL表,存储IP范围。它的设置方式是将起始地址存储为long,结束地址(以及id和其他一些数据)。 现在我有用户通过输入开始和结束ip地址来添加范围,我想检查新范围是否已经(部分)在数据库中

我知道我可以在两个不同的列之间进行查询,但这似乎不适用于两个不同的列,而且我也不知道如何传递一个范围来比较它。
可以在PHP中循环执行,但如果范围为132.0.0.0-199.0.0.0,则会产生大量查询。

以下内容如何:

SELECT * FROM addresses WHERE
    (start < $new_start AND end > $new_start) OR
    (start > $new_end AND end < $new_end);
从地址中选择*
(开始<$new\u开始和结束>$new\u开始)或
(开始>$new\u结束和结束<$new\u结束);

这将为您提供与新地址重叠的所有现有地址。

类似于:

SELECT * FROM addresses WHERE
    (start < $new_start AND end > $new_start) OR
    (start > $new_end AND end < $new_end);
从地址中选择*
(开始<$new\u开始和结束>$new\u开始)或
(开始>$new\u结束和结束<$new\u结束);

这将为您提供与新地址重叠的所有现有地址。

起始地址和结束地址都是长的?那么,为什么不将您要查找的IP转换为一个长的do
WHERE start\u address=$myip

对于一个范围,只需在where子句中执行三次

WHERE (start_address <= $startAddress AND end_address >= $startAddress) 
   OR (start_address <= $endAddress AND end_address >= $endAddress) 
   OR (start_address >= $startAddress AND end_address <= $endAddress)
WHERE(起始地址=$startAddress)
或(起始地址=$endAddress)

或者(开始地址>=$startAddress和结束地址开始地址和结束地址都是长地址?那么为什么不将您要查找的IP转换为长地址并执行
,其中开始地址=$myip

对于一个范围,只需在where子句中执行三次

WHERE (start_address <= $startAddress AND end_address >= $startAddress) 
   OR (start_address <= $endAddress AND end_address >= $endAddress) 
   OR (start_address >= $startAddress AND end_address <= $endAddress)
WHERE(起始地址=$startAddress)
或(起始地址=$endAddress)

或者(开始地址>=$startAddress和结束地址当你说你把地址存储为
long
时,我假设你的意思是你已经将它们存储为(比如)10.1.2.3将存储为0x0a010203。在这种情况下,要查找地址是否已经存在,你可以:

SELECT ...
FROM ipranges
WHERE (<NEWADDR> >= startaddr)
    AND (<NEWADDR> <= endaddr)
选择。。。
从ipranges
其中(>=startaddr)

而且(当你说你把地址存储为
long
时,我假设你的意思是你已经将它们存储为(比如)10.1.2.3将存储为0x0a010203。在这种情况下,要确定地址是否已经存在,你可以:

SELECT ...
FROM ipranges
WHERE (<NEWADDR> >= startaddr)
    AND (<NEWADDR> <= endaddr)
选择。。。
从ipranges
其中(>=startaddr)

和(如何将IP地址范围存储为十进制,这样您就可以使用BETWEEN进行简单检查


4294967295-4294967040->FFFFFFFF 00-FFFFFFFF->255.255.255.0-255.255.255.255

如何将IP地址范围存储为十进制,这样您就可以使用中间值进行简单检查


4294967295-4294967040->FFFFFFFF 00-FFFFFFFF->255.255.255.0-255.255.255.255

实际上不需要三种情况-更容易检查范围不重叠的情况(即新范围比现有范围完全低或完全高),然后使用
NOT
反转结果:-)实际上,您不需要三种情况-更容易检查范围不重叠的情况(即新范围比现有范围完全低或完全高),然后使用
NOT
反转结果:-)如果新范围完全围绕旧范围怎么办?例如,如果旧范围是(start=99,end=100)而新范围是($new\u start=1,$new\u end=200)?我不认为您的查询会返回这样的结果:-(因此这是一个简单的附加子句:`或者(start>=$new\u start and end)如果新范围完全围绕旧范围怎么办?例如,如果旧范围是(start=99,end=100),而新范围是($new\u start=1,$new\u end=200)?我不认为您的查询会返回这样的结果:-(因此它是一个简单的附加子句:`OR)(开始>=$new\u开始和结束重叠逻辑有点让我不知所措,现在看来,对我来说很有意义,谢谢你的帮助。我已经想到了一个很好的PHP循环,它效率不太低,但速度更快。当然,重叠逻辑有点让我不知所措,现在对我来说很有意义,谢谢你的帮助。我已经想过了在PHP中有一个很好的循环,虽然效率不算太低,但速度当然要快得多