source

PHP에서 INET_ATON()과 INET_NTOA()?

manycodes 2023. 9. 23. 22:49
반응형

PHP에서 INET_ATON()과 INET_NTOA()?

IP 주소를 데이터베이스에 저장하고 싶지만 애플리케이션 전체에서 사용해야 합니다.사용법을 읽었습니다.INET_ATON()그리고.INET_NTOA()IP 주소에서 32비트 비부호 정수를 가져오기 위한 MySQL 쿼리에서, char(15)를 사용하는 것보다 데이터베이스를 통한 검색을 더 빠르게 할 수 있기 때문에 정확히 제가 원하는 것입니다.

문제는 PHP에서 같은 종류의 작업을 수행하는 기능을 찾을 수 없다는 것입니다.제가 발견한 것은

http://php.net/manual/en/function.ip2long.php

그래서 테스트를 해봤습니다.

$ip = $_SERVER['REMOTE_ADDR'];
echo ip2long($ip);

그리고 아무것도 출력하지 않습니다.예를 들어 그들이 준 것처럼 보이지만, 다시 한번 나는 확실하지 않습니다.ip2long()와 같은 일을 합니다.INET_ATON().

이것을 할 PHP 기능을 아는 사람이 있습니까?아니면 IP 주소를 데이터베이스에 저장하는 완전히 새로운 솔루션이라도?

감사해요.

사이에 중요한 차이가 있습니다.ip2long,long2ipMySQL 기능을 제공합니다.

PHP의ip2long그리고.long2ip부호가 있는 정수를 다루다

http://php.net/manual/en/function.ip2long.php 참조

"PHP의 정수형은 부호화되어 있고 많은 IP 주소가 32비트 아키텍처에서 음의 정수를 초래하기 때문에 서명되지 않은 IP 주소의 문자열 표현을 얻으려면 sprintf() 또는 printf()의 '%u' 형식을 사용해야 합니다."

MySQL의INET_ATON()그리고.INET_NTOA()부호 없는 정수를 다루다

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton 참조

"INET_ATON()에서 생성된 값을 저장하기 위해서는 INT가 아닌 INT UNSIGNED 열을 사용하여 서명합니다.서명된 열을 사용하면 첫 번째 옥텟이 127보다 큰 IP 주소에 해당하는 값을 올바르게 저장할 수 없습니다."

다음은 둘 사이에서 작업할 때 사용할 수 있는 몇 가지 기능입니다.

MySQL 데이터베이스에 삽입한 경우 다음을 사용하는 IPINET_ATON(), 다음을 사용하여 PHP로 다시 변환할 수 있습니다.

long2ip(sprintf("%d", $ip_address));

그리고 이것을 이용하여 PHP에서 데이터베이스에 저장하도록 변환할 수 있습니다.

sprintf("%u", ip2long($ip_address));

(또한 중요한 것은, 타이핑하지 않는 것입니다.$ip_address로.int만약 그 숫자가 더 클 경우, 그 숫자를 감싸서 문제를 일으킬 수 있기 때문입니다.MAX_INT. 만약 당신이 그것을 캐스팅해야 한다면, 그것을 a에 캐스팅하세요.long아니면float)

와 기능은 정상적으로 작동할 것입니다.

참고: IPv4 주소의 경우 해당 주소를 사용해야 합니다. 즉, 사용자의 경우,$_SERVER['REMOTE_ADDR']는 실제로 유효한 IPv4 주소를 포함하고 있으며 일부 IPv6-stuff는 포함하고 있지 않습니다).


중: Google IP중:

var_dump(ip2long('209.85.227.147'));
var_dump(long2ip(3512066963));

출력은 다음과 같습니다.

int(3512066963)
string(14) "209.85.227.147" 

그것이 MySQL 네이티브 기능인 PHP 내부의 PHP 내부에서 다룰 필요는 없습니다.다음 예를 참조하십시오.

create table iptable (
    ip int(32) unsigned not null,
    comment varchar(32) not null
);

insert into iptable (ip, comment) values (inet_aton('10.0.0.3'), 'This is 10.0.0.3');

select * from iptable;

+-----------+------------------+
| ip        | comment          |
+-----------+------------------+
| 167772163 | This is 10.0.0.3 |
+-----------+------------------+

select inet_ntoa(ip) as ip, comment from iptable;

+----------+------------------+
| ip       | comment          |
+----------+------------------+
| 10.0.0.3 | This is 10.0.0.3 |
+----------+------------------+

동일한 필드에서 ipv4와 ipv6를 모두 처리하고 Mysql 5.6 이상을 사용하는 경우 varbinary(16)와 inet6_aton 및 inet6_ntoa의 함수를 사용할 수 있습니다.이것은 PHP 내부의 이진 데이터를 다루지 않고 MySQL 함수를 사용해야 하는 이유를 보여주는 더 좋은 예입니다.

create table iptable2 (
    ip varbinary(16) not null,
    comment varchar(32) not null
);

insert into iptable2 (ip, comment) values
    (inet6_aton('192.168.1.254'), 'This is router 192.168.1.254'),
    (inet6_aton('::1'), 'This is ipv6 localhost ::1'),
    (inet6_aton('FE80:0000:0000:0000:0202:B3FF:FE1E:8329'), 'This is some large ipv6 example')
;

select * from iptable2;
+------------------+---------------------------------+
| ip               | comment                         |
+------------------+---------------------------------+
| +¿?¦             | This is router 192.168.1.254    |
|                ? | This is ipv6 localhost ::1      |
| ¦Ç      ??¦ ¦?â) | This is some large ipv6 example |
+------------------+---------------------------------+

select inet6_ntoa(ip) as ip, comment from iptable2;
+--------------------------+---------------------------------+
| ip                       | comment                         |
+--------------------------+---------------------------------+
| 192.168.1.254            | This is router 192.168.1.254    |
| ::1                      | This is ipv6 localhost ::1      |
| fe80::202:b3ff:fe1e:8329 | This is some large ipv6 example |
+--------------------------+---------------------------------+

이렇게 하면 MySQL이 ipv6 주소를 이진으로 변환하고 간단한 표현식으로 다시 변환하므로 ipv6 주소를 다른 형식으로 평가할 필요가 없음을 알 수 있습니다.

이 질문이 벌써 2년이 넘었다는 것을 알고 있지만, 이 정보가 다른 사람들에게 유용하도록 하고 싶습니다.

HTH

프란시스코 자라보조

IPv4 및 IPv6 지원의 경우 PHP 5.1+부터 사용할 수 있으며 동등한 MySQL 기능을 정확히 모방합니다.

않으면 ip2long()그리고.long2ip().

여기 PHP 대체 기능(프로그램에서 간단한 복사/붙여넣기) -

function inet_aton($ip)
{
    $ip = trim($ip);
    if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) return 0;
    return sprintf("%u", ip2long($ip));  
}


function inet_ntoa($num)
{
    $num = trim($num);
    if ($num == "0") return "0.0.0.0";
    return long2ip(-(4294967295 - ($num - 1))); 
}

ip2long은 inet_aton과 같습니다.

ip2long은 IPv4에서만 작동합니다.시스템이 IPv6를 루프백에 사용하고 있는 것 같습니다.REMOTE_ADDR을 인쇄해 보십시오.

언급URL : https://stackoverflow.com/questions/2754340/inet-aton-and-inet-ntoa-in-php

반응형