数据库member:
id ip
1 110.251.123.139
2 120.7.251.196
3 183.67.34.189
4
……因为需要,数据库中必须记录了完整的IP但现在要取表中IP段前二位与现有黑名单IP的前二段(如118.15或183.67)比对是否相同请高手帮写出代码,谢谢!
id ip
1 110.251.123.139
2 120.7.251.196
3 183.67.34.189
4
……因为需要,数据库中必须记录了完整的IP但现在要取表中IP段前二位与现有黑名单IP的前二段(如118.15或183.67)比对是否相同请高手帮写出代码,谢谢!
$r25=$obj_db->simplequery($q25);
$tx_list25="";
while ($a25=$obj_db->fetchrow($r25,DB_FETCHMODE_ASSOC))
{
$a25ip=explode(".",$a25[ip]);
$arr25ip="$a25ip[0].$a25ip[1]";//取IP前二位
$tx_list25.="$arr25ip,";
}
$tx_list25=substr($tx_list25,0,-1);
$bhei = array("$tx_list25");//数据库中的IP前二段
$new_array = array(127.0,192.168);//比对数据库中IP的前二段是否与这二个IP段相同
$sj=0;
foreach($new_array as $item)
{
if(in_array($item,$bhei))
{
$sj=1;
break;
}}echo "$sj";//$sj=1,有相同的IP段,$sj=0,没有相同的IP段
=======================请高手帮忙修正错误,或者用更简洁的代码达到效果,谢谢!
mysql 手册中有
SUBSTRING_INDEX(str,delim,count)
返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串。如果 count 是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符:
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'这个函数是多字节安全的。
至少要写作
select * from member where ip like '118.15.%';
select * from member where SUBSTRING_INDEX(ip, '.', 2) in ('118.15', '183.67');
-----------------------------------------------
这个就不错了,如果ip字段建有索引,这条语句除非118.15.*的条目太多,基本会做索引扫描
like '..%' 可以