[SQL] INET_ATON ()와 PHP의 INET_NTOA ()?
SQLINET_ATON ()와 PHP의 INET_NTOA ()?
내 데이터베이스에 IP 주소를 저장하려면,하지만 나는 또한 내 응용 프로그램 전체를 사용해야합니다. 내가 얻을 내 MySQL의 쿼리에서 INET_ATON ()와 INET_NTOA ()를 사용하여 읽어 32 비트는 문자를 사용하는 것보다 빠르게 데이터베이스를 통해 검색하는 것 같이 내가 원하는 정확히 IP 주소, 중 부호없는 정수 (15) .
문제는 내가 PHP에서 물건의 같은 종류의 작업을 수행하는 함수를 찾을 수있다. 내가 건너 온 유일한 방법은 다음과 같습니다
http://php.net/manual/en/function.ip2long.php
나는 그것을 테스트 그래서 :
$ip = $_SERVER['REMOTE_ADDR'];
echo ip2long($ip);
그리고 그것은 아무것도 출력하지 않습니다. 예에서 그들은 그것이 작동하는 것 같다,하지만 다시 내가 정확히 확인 ip2long ()가 () INET_ATON 같은 일을하는 경우가 아니에요했다.
누군가가이 작업을 수행하는 PHP 함수를 알고 있나요? 또는 데이터베이스에 IP 주소를 저장하는 경우에도 완전히 새로운 솔루션?
감사.
해결법
-
==============================
1.ip2long ()와 long2ip () 함수는 잘 작동합니다.
ip2long ()와 long2ip () 함수는 잘 작동합니다.
참고 : 당신은 IPv4 주소에 대한 사람들을 사용해야합니다 - 메이크업을해야합니다, 귀하의 경우, $ _SERVER [ 'REMOTE_ADDR'는] 실제로 유효한 IPv4 주소 (그리고 일부의 IPv6-물건을) 포함.
구글 IP 주소를 시도 :
var_dump(ip2long('209.85.227.147')); var_dump(long2ip(3512066963));
나는 다음과 같은 출력을 얻을 :
int(3512066963) string(14) "209.85.227.147"
-
==============================
2., ip2long long2ip와 MySQL의 기능 사이의 중요한 차이가있다.
, ip2long long2ip와 MySQL의 기능 사이의 중요한 차이가있다.
PHP ip2long와 부호있는 정수와 long2ip 거래.
http://php.net/manual/en/function.ip2long.php 참조
MySQL의의 INET_ATON ()와 INET_NTOA () 부호없는 정수 처리
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton 참조
다음은 둘 사이에 작업하는 데 사용할 수있는 몇 가지 기능은 다음과 같습니다.
당신은 MySQL 데이터베이스에 삽입 한 경우, INET_ATON ()를 사용하여 IP, 당신은 다음을 사용하여 PHP에서 다시 변환 할 수 있습니다 :
long2ip(sprintf("%d", $ip_address));
그리고 당신이 사용하는 PHP에서 데이터베이스에 저장하기 위해 변환 할 수 있습니다 :
sprintf("%u", ip2long($ip_address));
(또한 중요하지가 MAX_INT보다 더 큰 경우의 수를 포장하여이 힘 원인 문제로 INT에 $의 IP_ADDRESS를 입력 캐스팅. 당신이 그것을 캐스팅해야하는 경우, 긴 또는 float로 캐스팅)
-
==============================
3.당신은 기본 기능을 MySQL은 무엇의가 있음을, PHP 내부가 처리 할 필요가 없습니다. 이 예제를 참조하십시오 :
당신은 기본 기능을 MySQL은 무엇의가 있음을, 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은 그들의 simpliest 식으로 다시 바이너리로 변환하고 있기 때문에, 다른 형식으로 IPv6 주소를 평가하는 것을 방지 할 수 있음을 알 수있다.
이 질문은 이미 더 이년보다가 알고 있지만,이 정보가 건너 다른 사람을 위해 도움이 될 수 있도록합니다.
HTH
시스코 Zarabozo
-
==============================
4.IPv4 및 IPv6 지원 사용 inet_pton ()와 inet_ntop ()의 경우, 이들은 해당하는 MySQL의 기능 PHP 이후 availiable 5.1+ 정확하게 모방이다.
IPv4 및 IPv6 지원 사용 inet_pton ()와 inet_ntop ()의 경우, 이들은 해당하는 MySQL의 기능 PHP 이후 availiable 5.1+ 정확하게 모방이다.
그렇지 않으면 단지 ip2long ()와 long2ip ()를 사용합니다.
-
==============================
5.여기에 PHP 대체 기능 (간단한 복사 / 프로그램에 붙여 넣기) -
여기에 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))); }
-
==============================
6.ip2long INET_ATON가 동일하다 ().
ip2long INET_ATON가 동일하다 ().
ip2long는 IPv4 만 작동합니다. 나는 시스템이 루프백을 위해 IPv6을 사용하여 의심. REMOTE_ADDR를 인쇄 해 봅니다.
from https://stackoverflow.com/questions/2754340/inet-aton-and-inet-ntoa-in-php by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 에 "연관 테이블"(대다 관계)에 대한 적절한 이름 기능 [폐쇄] (0) | 2020.06.26 |
---|---|
[SQL] 여러 행에 테이블 반환 함수를 실행? (0) | 2020.06.26 |
[SQL] 인덱스 및 다중 열 기본 키 (0) | 2020.06.26 |
[SQL] 자바에서 타임 스탬프의 시간 부분을 재설정 (0) | 2020.06.26 |
[SQL] 이미 데이터가있는 MySQL 데이터베이스 필드에 데이터를 추가 (0) | 2020.06.26 |