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
,long2ip
MySQL 기능을 제공합니다.
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
'source' 카테고리의 다른 글
WooCommerce 내 JetPack의 댓글 구독 상자 위치 변경 (0) | 2023.09.23 |
---|---|
주문한 목록이 CSS로 1.1, 1.2, 1.3(단, 1, 2, 3, ...)과 같은 결과를 낼 수 있습니까? (0) | 2023.09.23 |
CSS나 자바스크립트로 텍스트 선택을 비활성화하려면 어떻게 해야 합니까? (0) | 2023.09.23 |
SQL 개발자에서 tnsnames.ora를 찾을 수 있는 위치? (0) | 2023.09.18 |
하이픈을 낙타 케이스로 변환(camelCase) (0) | 2023.09.18 |