Oft müssen wir eine IP-Blacklist oder IP-Whitelist erstellen, um Besucher einzuschränken Dann müssen wir wissen, ob die Besucher-IP zum IP-Bereich gehört. In diesem Artikel wird nur die Methode beschrieben.
Tatsächlich gibt es in diesem Artikel ein anderes Anwendungsszenario: Die in der Datenbank gespeicherten IP-Adressen sind normalerweise vom Typ varchar. Wenn zum Speichern der IP der Typ INT verwendet wird, kann die Datenbank optimiert werden . Dies wird hier natürlich nur für IP4 erklärt.
Um festzustellen, ob eine IP zu einem bestimmten IP-Segment gehört, besteht die Idee darin, die IP in einen Wert vom Typ int umzuwandeln und ihn dann zu vergleichen. PHP verfügt über integrierte Funktionen zum Austausch von IP- und numerischen Werten: ip2long($ip_addr) und long2ip($long).
Wenn $ip_addr keine gültige IP-Adresse ist, wird „false“ zurückgegeben. Wenn es sich um eine gültige IP-Adresse handelt, wird sie manchmal in einen signierten langen Typ konvertiert wird konvertiert. Die vorzeichenbehaftete lange Länge kann überschritten werden, was zu einer negativen Zahl führt. Der
lange Typ ist 4 Bytes, sein vorzeichenbehafteter Bereich ist: 2147483647 ~ -2147483648, der vorzeichenlose Bereich ist: 4294967295 ~ 0
Und die größte IP4-Adresse ist: 255.255.255, die entsprechende Der Wert lautet: 4294967295 und kann daher in einen vorzeichenlosen Wert umgewandelt werden. Die IP, die dem Wert 2147483647 entspricht, lautet: 127.255.255.255,
long2ip(2147483647), daher gibt es keine negativen Zahlen für IP-Adressen im Bereich von 0.0.0.0 bis 127.255.255.255, obwohl dies der Fall sein wird Keine negativen Zahlen im Bereich von 128.0.0.0 bis 255.255.255. Es werden negative Zahlen darin vorhanden sein.
Der folgende Code gibt ein vollständiges und korrektes Beispiel für die Bestimmung, ob eine angegebene IP zu einem bestimmten IP-Segment gehört.
$start_ip = "42.236.184.1"; $end_ip = "42.236.184.255"; $ip = "42.236.184.128"; check_ip($ip,$start_ip,$end_ip); function check_ip($ip,$start_ip,$end_ip) { $ip = get_ip2long($ip); $start_ip = get_ip2long($start_ip); $end_ip = get_ip2long($end_ip); if($ip >= $start_ip && $ip <= $end_ip) { return true; } return false; } // decbin() 十进制转二进制 // bindec() 二进制转十进制。函数将一个二进制数转换成 integer。可转换的最大的数为 31 位 1 或者说十进制的 2147483647。PHP 4.1.0 开始,该函数可以处理大数值,这种情况下,它会返回 float 类型。 function get_ip2long($ip) { return bindec(decbin(ip2long($ip))); //方法二:return sprintf('%u',ip2long($ip)); //%u:不包含正负号的十进制数 }
Weitere PHP-bezogene Kenntnisse finden Sie auf der PHP-Chinese-Website!
Das obige ist der detaillierte Inhalt vonPHP ermittelt, ob eine IP4 zu einem bestimmten IP-Segment gehört. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!