문제

MySQL 데이터베이스에 IP를 PHP와 함께 저장하는 가장 모범 사례는 무엇입니까? IP2Long이라는 기능이 있지만 이것은 IPv4에 대한 것입니다. 그러나 IPv6은 어떻습니까?

IPv6 IP에 대한 PHP 기능을 알고 있지만 PHP <버전 5.3으로 Windows에서는 작동하지 않습니다.

도움이 되었습니까?

해결책

점선 DECIMAL IPv4 주소는 최대 크기의 32 비트로 정수로 변환 할 수 있습니다. IPv6 주소는 128 비트입니다. 128 비트는 PHP INT에 맞지 않기 때문에 PHP에서 작업하는 데 어려움이 있습니다.

IPv6 주소를 연결하고 사용하려면 문제를 저장하고 텍스트로 저장하십시오. Netmasks를 적용하고 서브넷을 계산하려면 변환해야합니다.

다른 팁

knittl 바이너리 (16) 대신 varbinary (16)를 사용하여 user196009 대신 더 가까웠습니다. 대답했다 관련 질문에서. 그것은 나를 위해 작동합니다. 어떻게?

IP 저장 :

<?php
  $query = "insert into stats(vis_ip, id_stat) values('" . inet_pton('66.102.7.104') . "', '1')"; // google's IP address
  // using a PDO wrapper. http://www.phpclasses.org/package/5206-PHP-Execute-database-queries-from-parameters-using-PDO.html
  include_once 'db.php';
  $c = new DB();
  $visit = $c->getResults($query); // stored as binary
?>

IP 검색 :

<?php
  $query = "SELECT `vis_ip` FROM `stats` WHERE `id_stat`=1";
  // PDO wrapper
  include_once 'db.php';
  $c = new DB();
  $stats = $c->getRow($query);
  echo inet_ntop($stats->vis_ip); // outputs 66.102.7.104
?> 

IPv6 주소와 함께 작동해야합니다 (IPv4 연결이 있습니다). 나는 전문가가 아니기 때문에 Varbinary 길이가 정확한 지 아직 모르겠지만, 내가 말한 방법은 저에게 효과적입니다.

PHP 버전/호스트에서 'IPv6 지원'이 활성화되어 있는지 확인하려면 :

<?php
  phpinfo(INFO_GENERAL); // http://php.net/manual/es/function.phpinfo.php
?> 

PHP 기능이 있습니다 inet_pton, IP 주소 문자열을 이진 표현으로 바꿉니다 (IPv4 및 IPv6 모두). 그런 다음 저장할 수 있습니다 binary(16) MySQL 데이터베이스에서.

인간 읽기 가능한 주소를 다시 얻으려면 사용하십시오 inet_ntop

주목하십시오 MySQL (5.6) 이제 지원합니다 IPv6 주소, 보다 inet6_aton ().

두 번째 의견에 ip2long 함수 설명서는 호출 된 함수가 있습니다 ip2long6 ~을 위한 IPv6 (아래에 더 많은 것이 있습니다).

당신은 그것을 문자열로 보관할 수 있습니다. CHAR 나는 생각한다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top