PHP에서 IP를 정수로 변환하는 방법

藏色散人
풀어 주다: 2023-03-13 15:48:02
원래의
1755명이 탐색했습니다.

PHP에서 IP를 정수로 변환하는 방법: 1. PHP 샘플 파일을 생성합니다. 2. "ip2long($ip);" 메소드를 통해 IP 주소를 정수로 변환합니다.

PHP에서 IP를 정수로 변환하는 방법

이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

PHP를 사용하여 IP를 정수로 변환하는 방법은 무엇입니까?

PHP에서 IP 주소와 정수의 상호 변환에 대한 자세한 설명

이 글에서는 주로 PHP에서 IP 주소와 정수의 상호 변환에 대한 자세한 설명을 소개합니다. ip2long과 long2ip, 그리고 그 사용 BUG 소개, 그리고 마지막으로 제가 작성한 두 가지 알고리즘이 제공됩니다. 필요한 친구들이 참고할 수 있습니다

IP를 정수 저장소로 변환하는 것은 데이터베이스 최적화의 주요 추세입니다. 특히, 테이블의 데이터 양이 많거나, 특정 IP 세그먼트의 데이터를 쿼리하려는 경우에는 문자열 인덱스가 정수 인덱스보다 더 많은 리소스를 소비합니다. 이 기사의 범위에 포함되지 않습니다.

시스템 함수 ip2long 및 long2ip
PHP에는 IP 주소를 정수로 변환할 수 있는 ip2long 함수가 내장되어 있습니다.

코드는 다음과 같습니다:

$ip = '210.110.11.49';echo ip2long($ip);
로그인 후 복사

출력:

-764540111
로그인 후 복사

우리가 얻는 결과는 부호 있는 정수이기 때문에 출력 정수는 음수 부호를 갖습니다. 부호 있는 정수의 최대값은 2147483647입니다. 결과를 부호 없는 값으로 변환하려면

3530427185
로그인 후 복사

long2ip를 사용하여 정수를 다시 IP 주소로 변환

$ip = '210.110.11.49';$ip_int = ip2long($ip);echo $ip."<br />";echo $ip_int."<br />";echo long2ip($ip_int);
로그인 후 복사

출력:

210.110.011.49
-764540623
210.110.9.49
로그인 후 복사

변환 결과가 일치하지 않습니다. 첫 번째 숫자 앞에 선행 0을 추가하려고 합니다. ip를 입력한 다음

$ip = '021.110.11.49';$ip_int = ip2long($ip);echo $ip."<br />";echo $ip_int."<br />";echo long2ip($ip_int);
로그인 후 복사

출력을 살펴보세요.

021.110.11.49
292424497
17.110.11.49
로그인 후 복사

변환 결과가 모두 잘못되었습니다. 위의 예는 모두 앞에 0이 추가되어 변환 결과에 오류가 발생하고 관련 반전 결과가 원래 변환된 IP와 일치하지 않기 때문입니다.

변환 원리

현재 두 가지 알고리즘이 있습니다.
첫 번째, 첫 번째 섹션에 256의 세제곱을 곱하고, 두 번째 섹션에 256의 제곱을 곱하고, 세 번째 섹션에 256을 곱하고, 최종 합계

$ip = '0210.110.11.49'; 
function ipToInt($ip){    $iparr = explode('.',$ip);    $num = 0;    for($i=0;$i<count($iparr);$i++){        $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));
    }    return $num;
} 
echo  $ip.'<br />';$ip_int = ipToInt($ip);echo $ip_int.'<br />';echo long2ip($ip_int);
로그인 후 복사

출력:

0210.110.11.49
3530427185
210.110.11.49
로그인 후 복사

두 번째, 비트 연산자 사용

$ip = '0210.110.11.49'; 
function ipToInt($ip){    $iparr = explode('.',$ip);    return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));
} 
echo  $ip.'<br />';$ip_int = ipToInt($ip);echo $ip_int.'<br />';echo long2ip($ip_int);
로그인 후 복사

출력:

0210.110.11.49
-764540111
210.110.11.49
로그인 후 복사

IP가 합법적인지 감지

먼저, 직접 감지를 통과

function check_ip($ip){    $iparr = explode('.',$ip);    foreach($iparr as $v){ if($v>255) return false; }    return true;
} 
echo '210.285.11.49,';var_dump(check_ip('210.285.11.49'));echo '<br />';echo '210.205.11.49,';var_dump(check_ip('210.205.11.49'));
[code]

输出:
[code]210.285.11.49,bool(false)210.205.11.49,bool(true)
로그인 후 복사

두 번째, ip2long을 사용하여 return

function check_ip($ip){    if(ip2long($ip)) return true;    return false;
} 
echo '210.285.11.49,';var_dump(check_ip('210.285.11.49'));echo '<br />';echo '210.205.11.49,';var_dump(check_ip('210.205.11.49'));
로그인 후 복사

출력:

210.285.11.49,bool(false)210.205.11.49,bool(true)
로그인 후 복사

Postscript

많은 사람들이 ip 쓰기 라이브러리에 int 유형 필드를 저장하기 위해 ip2long 변환을 사용합니다. 그러나 다른 시스템 플랫폼에서는 ip2long 함수로 얻은 값이 다릅니다. 결과적으로 데이터베이스에서 데이터를 읽어 IP를 역전할 때 long2ip를 사용하여 얻은 IP가 원래 IP와 일치하지 않는 경우 mysql 시스템 함수 INET_ATON 및 INET_NTOA를 사용하여 문제를 해결할 수 있습니다. , 처리를 위해 bigint 유형을 사용하거나 함수를 직접 작성하세요.

추천 학습: "

PHP 비디오 튜토리얼"

위 내용은 PHP에서 IP를 정수로 변환하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿