inet_pton / inet_ntop în PHP

Rețea PHP 5.1+

Transformă o adresă IPv4 sau IPv6 în forma binară (4 sau 16 octeți) și, cu inet_ntop, înapoi în text.

Sintaxă
inet_pton(string $ip): string|false

Ce face inet_pton / inet_ntop

inet_pton primește o adresă scrisă ca text și returnează octeții ei: 4 pentru IPv4, 16 pentru IPv6. Forma binară se salvează compact în baza de date (coloană VARBINARY(16)) și poate fi comparată direct.

inet_ntop face transformarea inversă și scrie adresa IPv6 în forma ei scurtă: 2001:0db8:0000:...:0001 devine 2001:db8::1. Spre deosebire de ip2long, ambele funcții lucrează și cu IPv6.

Parametri

Parametru Descriere
$ip Adresa ca text. La inet_ntop: adresa binară, de 4 sau 16 octeți.

Ce returnează

Adresa în formă binară (sau text, la inet_ntop) ori false dacă adresa este invalidă.

Exemple

Exemplul 1: IPv4 și IPv6 în binar

Octeții nu se pot afișa direct, așa că îi arătăm în hexazecimal cu bin2hex.

<?php
$v4 = inet_pton("192.168.1.10");
$v6 = inet_pton("2001:db8::1");

echo bin2hex($v4) . " (" . strlen($v4) . " octeți)\n";
echo bin2hex($v6) . " (" . strlen($v6) . " octeți)\n";

Rezultat

c0a8010a (4 octeți)
20010db8000000000000000000000001 (16 octeți)

Exemplul 2: Forma scurtă a unei adrese IPv6

Dus și întors prin binar, orice adresă ajunge la aceeași formă. Așa compari corect două adrese IPv6 scrise diferit.

<?php
function normalizeaza(string $ip): string|false
{
    $binar = inet_pton($ip);
    return $binar === false ? false : inet_ntop($binar);
}

var_dump(normalizeaza("2001:0db8:0000:0000:0000:0000:0000:0001"));
var_dump(normalizeaza("2001:DB8::1") === normalizeaza("2001:db8:0::1"));
var_dump(normalizeaza("192.168.1.300"));

Rezultat

string(11) "2001:db8::1"
bool(true)
bool(false)

Greșeli frecvente

  • Salvezi rezultatul în baza de date într-o coloană VARCHAR cu set de caractere UTF-8. Octeții binari se strică. Folosește VARBINARY(16).
  • Afișezi rezultatul lui inet_pton cu echo. Apar caractere ciudate; pentru afișare folosește inet_ntop sau bin2hex.

Comenzi înrudite

  • ip2long / long2ip: Transformă o adresă IPv4 în număr întreg (ip2long) și înapoi (long2ip).
  • bin2hex / hex2bin: bin2hex transformă un text (sau date binare) în cifre hexazecimale, iar hex2bin face inversul.
  • filter_var: Validează sau curăță o valoare: email, număr întreg, URL, adresă IP, valoare booleană.