Souvent, nous devons créer une liste noire d'IP ou une liste blanche d'IP pour restreindre les visiteurs. Une solution très courante consiste à restreindre toutes les IP dans le même segment IP. , nous devons alors savoir si l'adresse IP de l'invité appartient à la plage IP. Cet article enregistre uniquement la méthode.
En fait, il existe un autre scénario d'application dans cet article, c'est-à-dire que les adresses IP stockées dans la base de données sont généralement de type varchar. Si le type INT est utilisé pour enregistrer l'IP, la base de données peut être optimisée. . Bien sûr, ici Ceci n'est expliqué que pour IP4.
Pour déterminer si une IP appartient à un certain segment IP, l'idée est de convertir l'IP en une valeur de type int puis de la comparer. PHP a des fonctions intégrées pour échanger des valeurs IP et numériques : ip2long($ip_addr) et long2ip($long).
Dans ip2long($ip_addr), si $ip_addr n'est pas une adresse IP valide, false sera renvoyé. Si c'est une adresse IP valide, elle sera convertie en un type long signé. Parfois, l'adresse IP. est converti. La longueur longue signée peut être dépassée, ce qui entraîne un nombre négatif. Le
type long est de 4 octets, sa plage signée est : 2147483647 ~ -2147483648, la plage non signée est : 4294967295 ~ 0
Et la plus grande adresse IP4 est : 255.255, la correspondante. La valeur est : 4294967295, elle peut donc être convertie en une valeur non signée. L'IP correspondant à la valeur 2147483647 est : 127.255.255.255,
long2ip(2147483647), il n'y aura donc pas de nombres négatifs pour les adresses IP comprises entre 0.0.0.0 et 127.255.255.255, et entre 128.0. Plage 0,0 et 255.255.255. Il y aura des nombres négatifs à l'intérieur.
Le code suivant donne un exemple complet et correct pour déterminer si une adresse IP spécifiée appartient à un certain segment IP.
$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:不包含正负号的十进制数 }
Pour plus de connaissances sur PHP, veuillez visiter le Site Web PHP chinois !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!