Start · Sprachen · PHP · Referenz · inet_pton

inet_pton

Funktion

Konvertiert eine IPv4- oder IPv6-Adresse im menschenlesbaren Format in ihre binäre <code>in_addr</code>-Darstellung.

seit PHP 5.1.0 Kategorie: http

Signatur

inet_pton(string $ip): string|false

Beschreibung

inet_pton() wandelt eine als Zeichenkette vorliegende IPv4- oder IPv6-Adresse in die entsprechende binäre in_addr-Darstellung um. Diese komprimierte, netzwerk-bytegeordnete Binärform wird beispielsweise für den direkten Vergleich von IP-Adressen in Datenbanken oder für Low-Level-Netzwerkoperationen benötigt.

Die Funktion unterstützt sowohl dotted-decimal IPv4-Adressen (192.168.0.1) als auch vollständige und abgekürzte IPv6-Schreibweisen (2001:db8::1). Die zurückgegebene Binärzeichenkette hat für IPv4 eine Länge von 4 Byte und für IPv6 eine Länge von 16 Byte.

Typische Anwendungsfälle sind das Speichern von IP-Adressen in platzsparender Binärform in Datenbanken (z. B. als BINARY(4) oder BINARY(16)), das Sortieren und Vergleichen von IP-Adressen sowie die Prüfung, ob eine Adresse in einem bestimmten Subnetz liegt. Die Umkehroperation übernimmt inet_ntop().

Im Gegensatz zu ip2long() unterstützt inet_pton() auch IPv6-Adressen und ist daher für moderne, dual-stack-fähige Anwendungen die bevorzugte Wahl.

Parameter

Name Typ Default Beschreibung
$ip Pflicht string Eine gültige IPv4-Adresse in dotted-decimal-Schreibweise (z. B. 192.0.2.1) oder eine gültige IPv6-Adresse (z. B. 2001:db8::1).

Rückgabewert

Typ
string|false
Beschreibung
Gibt die binäre in_addr-Darstellung als Zeichenkette zurück (4 Byte für IPv4, 16 Byte für IPv6). Bei einer ungültigen IP-Adresse wird false zurückgegeben.

Beispiele

IPv4-Adresse in Binärform und zurück

<?php
$ip = '192.168.1.100';
$binary = inet_pton($ip);

echo 'Länge: ' . strlen($binary) . ' Byte' . PHP_EOL;
echo 'Hex:   ' . bin2hex($binary) . PHP_EOL;
echo 'Zurück: ' . inet_ntop($binary) . PHP_EOL;
Länge: 4 Byte Hex: c0a80164 Zurück: 192.168.1.100

IPv6-Adresse in Binärform speichern und vergleichen

<?php
$ipv6 = '2001:db8::1';
$binary = inet_pton($ipv6);

echo 'Länge: ' . strlen($binary) . ' Byte' . PHP_EOL;
echo 'Hex:   ' . bin2hex($binary) . PHP_EOL;
echo 'Zurück: ' . inet_ntop($binary) . PHP_EOL;

// Zwei IPv6-Adressen vergleichen (expanded vs. compressed)
$a = inet_pton('2001:0db8:0000:0000:0000:0000:0000:0001');
$b = inet_pton('2001:db8::1');
echo 'Gleich: ' . ($a === $b ? 'Ja' : 'Nein') . PHP_EOL;
Länge: 16 Byte Hex: 20010db8000000000000000000000001 Zurück: 2001:db8::1 Gleich: Ja

IP-Adressen platzsparend in MySQL speichern

<?php
// Setzt eine PDO-Verbindung $pdo voraus
// Tabelle: CREATE TABLE visitors (id INT, ip VARBINARY(16));

$rawIp = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
$binaryIp = inet_pton($rawIp);

if ($binaryIp === false) {
    throw new InvalidArgumentException('Ungültige IP-Adresse');
}

$stmt = $pdo->prepare('INSERT INTO visitors (ip) VALUES (:ip)');
$stmt->execute([':ip' => $binaryIp]);

// Auslesen und zurückkonvertieren
$row = $pdo->query('SELECT ip FROM visitors LIMIT 1')->fetch();
echo inet_ntop($row['ip']);

// Wichtig · Fallstricke

Rückgabewert prüfen: Da false bei ungültiger Eingabe zurückgegeben wird, sollte der Rückgabewert immer mit === false überprüft werden, bevor die Binärzeichenkette weiterverwendet wird.

Portabilität: Die Funktion erfordert, dass die zugrundeliegende C-Bibliothek inet_pton unterstützt. Unter Windows war dies vor PHP 5.3 nicht immer der Fall. Ab PHP 5.3 steht sie plattformübergreifend zur Verfügung.

Kein Hostname-Lookup: inet_pton() akzeptiert ausschließlich numerische IP-Adressen. Hostnamen wie example.com werden nicht aufgelöst — hierfür muss gethostbyname() vorangestellt werden.