免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: teczm
打印 上一主题 下一主题

[字符串]?字符串比较问题--ip段比较 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-05-23 12:08 |只看该作者
为什么入库检查不行呢?

三位补足方法的确不错,但是在写入文件时,还需要一个预处理

比如:
$ip1=a.b.c.d;
$ip2=w.x.y.z;
.... //比较语句
fwrite($fp,$ip1);
....

写入到/etc/rc.conf时

ifconfig_rl0="inet 192.168.007.001 netmask 255.255.255.0"
ifconfig_rl0_alias0="inet 192.168.007.015 netmask 255.255.255.255"

reboot后 rl0上第2个ip会出错.

所以还需要一个处理来去掉数字前的0。

当ip是字符串格式时,去0的操作还是比较麻烦的,so ,我觉得不如在mysql中采用如下格式存储ip地址
id  int
ipa int  //1-255
ipb int  //1-255
ipc int //1-255
ipd int //1-255

新ip输入时,逐项比较ipa ipb ipc 字段,大家觉得可行否?

[ 本帖最后由 teczm 于 2006-5-23 12:15 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2006-05-23 12:14 |只看该作者
刚才光讲原理了,忘了PHP本身有函数来做这个IP TO LONG的转换~~

ip2long
long2ip

具体使用看看手册~~~

举个例子~~

if (ip2long("192.168.1.1")  > ip2long("192.168.0.0") && ip2long("192.168.1.1")  < ip2long("192.169.0.0"))
  echo "192.168.1.1 is in 192.168.0.0";

当然上面的程序不需要调用这么多次的ip2long,我就不多说了~~

好处就是integer操作,在数据库上建立索引速度快,如果在数据库中比较,只是数值比较,很简单~~

不少论坛和IP查询程序使用的就是这个方式~~

论坛徽章:
0
13 [报告]
发表于 2006-05-23 12:21 |只看该作者
en
但是这个方法归根到底还是要先解决取得ip段的问题啊

论坛徽章:
0
14 [报告]
发表于 2006-05-23 12:29 |只看该作者
晕~~不取得IP段你怎么比较?
取得IP段也容易~~

for($i = 0; $i <= 255; $i++)
{
   $a[] = ip2long("$i.0.0.0"); //A类地址
}

A类地址如上,如果需要B类,C类的话循环嵌套即可~~
--------------------------
不太清楚的就是楼主比较IP地址做什么用?

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
15 [报告]
发表于 2006-05-23 12:43 |只看该作者
原帖由 teczm 于 2006-5-23 12:08 发表
为什么入库检查不行呢?

三位补足方法的确不错,但是在写入文件时,还需要一个预处理

比如:

写入到/etc/rc.conf时

ifconfig_rl0="inet 192.168.007.001 netmask 255.255.255.0"
ifconfig_ ...



去掉数字前的0,这个工作是无比简单的事情啊。

论坛徽章:
0
16 [报告]
发表于 2006-05-23 13:37 |只看该作者
那么 输入的时候先要补足0,然后比较,然后去掉不必要的0,然后写入文件   这个步骤似乎有点麻烦吧 . :)

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
17 [报告]
发表于 2006-05-23 13:41 |只看该作者
原帖由 teczm 于 2006-5-23 13:37 发表
那么 输入的时候先要补足0,然后比较,然后去掉不必要的0,然后写入文件   这个步骤似乎有点麻烦吧 . :)



这个,这个,这个和ip2long long2ip不是类似的啊,有什么麻烦的呢?
一个双向的过程

论坛徽章:
0
18 [报告]
发表于 2006-05-23 17:17 |只看该作者
  1. /**
  2. * 返回ip按指定掩码的网段地址
  3. **/
  4. if(! function_exists('sonnet')):
  5. function sonnet($ip, $mask=22) {
  6.   if(long2ip(ip2long($ip)) != $ip)
  7.     return false;
  8.   if(is_numeric($mask))
  9.     $mask = bindec(str_pad(decbin(pow(2, $mask)-1), 32, '0'));
  10.   else
  11.     $mask = ip2long($mask);
  12.   return long2ip(ip2long($ip) & $mask);
  13. }
  14. endif;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP