복붙노트

[SQL] INET_ATON ()와 PHP의 INET_NTOA ()?

SQL

INET_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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.ip2long INET_ATON가 동일하다 ().

    ip2long INET_ATON가 동일하다 ().

    ip2long는 IPv4 만 작동합니다. 나는 시스템이 루프백을 위해 IPv6을 사용하여 의심. REMOTE_ADDR를 인쇄 해 봅니다.

  7. from https://stackoverflow.com/questions/2754340/inet-aton-and-inet-ntoa-in-php by cc-by-sa and MIT license