This article mainly introduces the method of PHP determining IP and redirecting to the corresponding city sub-station, example analysis Learned the skills of php parsing URL and jumping, which has certain reference value. Friends who need it can refer to it
The example in this article describes how PHP determines the IP and redirects to the corresponding city sub-station. Share it with everyone for your reference. The specific implementation method is as follows:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
class QQWry{ var $StartIP=0; var $EndIP=0; var $Country=''; var $Local=''; var $CountryFlag=0; //Identifies the Country location // 0x01, followed by 3 bytes for Country offset, no Local // 0x02, followed by 3 bytes for Country offset, followed by Local // Others, Country, Local, and Local have similar compression. Possible multiple references. var $fp; var $FirstStartIp=0; var $LastStartIp=0; var $EndIpOff=0 ; function getStartIp($RecNo){ $offset=$this->FirstStartIp $RecNo * 7 ; @fseek($this->fp,$offset,SEEK_SET) ; $buf=fread($this->fp ,7) ; $this->EndIpOff=ord($buf[4]) (ord($buf[5])*256) (ord($buf[6])*256*256); $this->StartIp=ord($buf[0]) (ord($buf[1])*256) (ord($buf[2])*256*256) (ord($buf[ 3])*256*256*256); return $this->StartIp; } function getEndIp(){ @fseek ( $this->fp , $this->EndIpOff , SEEK_SET ) ; $buf=fread ( $this->fp , 5 ) ; $this->EndIp=ord($buf[0]) (ord($buf[1])*256) (ord($buf[2])*256*256) (ord($buf[3])*256*256*256); $this->CountryFlag=ord ( $buf[4] ) ; return $this->EndIp ; } function getCountry(){ switch ( $this->CountryFlag ) { case 1: case 2: $this->Country=$this->getFlagStr ( $this->EndIpOff 4) ; //echo sprintf('EndIpOffset=(%x)',$this->EndIpOff ); $this->Local=( 1 == $this->CountryFlag )? '' : $this->getFlagStr ( $this->EndIpOff 8); break ; default : $this->Country=$this->getFlagStr ($this->EndIpOff 4); $this->Local=$this->getFlagStr ( ftell ( $this->fp )); } } function getFlagStr ($offset){ $flag=0 ; while(1){ @fseek($this->fp ,$offset,SEEK_SET) ; $flag=ord(fgetc($this->fp ) ) ; if ( $flag == 1 || $flag == 2 ) { $buf=fread ($this->fp , 3 ) ; if ($flag==2){ $this->CountryFlag=2; $this->EndIpOff=$offset - 4 ; } $offset=ord($buf[0]) (ord($buf[1])*256) (ord($buf[2])* 256*256); } else{ break ; } } if($offset<12) return ''; @fseek($this->fp , $offset , SEEK_SET ) ;
return $this->getStr(); } function getStr ( ) { $str='' ; while ( 1 ) { $c=fgetc ( $this->fp ) ; //echo "$cn" ; if(ord($c[0])== 0 ) break ; $str.= $c ; } //echo "$str n"; return $str ; } function qqwry ($dotip='') { if( !is_string($dotip) || $dotip==''){return;} if(preg_match("/^127/",$dotip)){$this->Country="本地网络";return ;} elseif(preg_match("/^192/",$dotip)) {$this->Country="局域网";return ;} $nRet; $ip=$this->IpToInt ( $dotip ); $this->fp= fopen(__QQWRY__, "rb"); if ($this->fp == NULL) { $szLocal= "OpenFileError"; return 1; } @fseek ( $this->fp , 0 , SEEK_SET ); $buf=fread ( $this->fp , 8 ); $this->FirstStartIp=ord($buf[0]) (ord($buf[1])*256) (ord($buf[2])*256*256) (ord($buf[3])*256*256*256); $this->LastStartIp=ord($buf[4]) (ord($buf[5])*256) (ord($buf[6])*256*256) (ord($buf[7])*256*256*256); $RecordCount= floor(($this->LastStartIp - $this->FirstStartIp) / 7); if ($RecordCount <= 1){ $this->Country="FileDataError"; fclose($this->fp) ; return 2 ; } $RangB= 0; $RangE= $RecordCount; // Match ... while ($RangB < $RangE-1) { $RecNo= floor(($RangB $RangE) / 2); $this->getStartIp ( $RecNo ) ; if ( $ip == $this->StartIp ) { $RangB=$RecNo ; break ; } if ($ip>$this->StartIp) $RangB= $RecNo; else $RangE= $RecNo; } $this->getStartIp ( $RangB ) ; $this->getEndIp ( ) ; if ( ( $this->StartIp <= $ip ) && ( $this->EndIp >= $ip ) ){ $nRet=0 ; $this->getCountry ( ) ; //这样不太好..............所以.......... $this->Local=str_replace("area error", "",$this->Local); } else{ $nRet=3 ; $this->Country='Unknown' ; $this->Local='' ; } fclose ( $this->fp ); $this->Country=preg_replace("/(CZ88.NET)|(Innocent Network)/","LAN/Unknown",$this->Country); $this->Local=preg_replace("/(CZ88.NET)|(Innocent Network)/","LAN/Unknown",$this->Local); ///////////////Look at the values 0 and 3 of $nRet above, so comment out the following lines return $nRet ; //return "$this->Country $this->Local";#Just return the location and country directly } function IpToInt($Ip) { $array=explode('.',$Ip); $Int=($array[0] * 256*256*256) ($array[1]*256*256) ($array[2]*256) $array[3]; return $Int; } } ?> |
An example demonstration is as follows:
?
3 4 |
I hope this article will be helpful to everyone’s PHP programming design.
http://www.bkjia.com/PHPjc/973923.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/973923.htmlTechArticleHow to use PHP to determine IP and redirect to the corresponding city substation. This article mainly introduces how PHP determines IP and redirects to it. The method of jumping to the corresponding city sub-station, the example analysis of PHP URL parsing and jumping skills, has a...
|