Start · Sprachen · PHP · Referenz · ip2long

ip2long

Funktion

Konvertiert eine IPv4-Adresse im Punkt-Format (z. B. <code>192.168.1.1</code>) in einen vorzeichenbehafteten Integer-Wert.

seit PHP 4.0.0 Kategorie: http

Signatur

ip2long(string $ip): int|false

Beschreibung

ip2long() wandelt eine IPv4-Adresse in Punkt-Schreibweise (z. B. 192.168.1.1) in einen ganzzahligen Wert um. Dieser Integer-Wert entspricht der 32-Bit-Netzwerkdarstellung der IP-Adresse und ist nützlich, wenn IP-Adressen in Datenbanken gespeichert oder effizient verglichen werden sollen.

Das Speichern von IP-Adressen als Integer in einer Datenbank ist sowohl speichereffizienter als auch schneller beim Sortieren und Vergleichen als die Speicherung als Zeichenkette. Zusammen mit der Umkehrfunktion long2ip() lassen sich IP-Adressen verlustfrei konvertieren.

Auf 32-Bit-Systemen können IP-Adressen im oberen Bereich (z. B. 255.255.255.255) als negative Zahlen zurückgegeben werden, da PHP auf diesen Systemen nur vorzeichenbehaftete 32-Bit-Integer kennt. Auf 64-Bit-Systemen sind alle Rückgabewerte nicht-negativ. Um plattformunabhängig zu arbeiten, empfiehlt sich der Einsatz von sprintf('%u', ip2long($ip)) für die vorzeichenlose Darstellung.

Die Funktion unterstützt auch verkürzte IP-Formate wie 192.168 oder reine Integer-Eingaben, was jedoch in der Praxis selten genutzt wird und zu Verwirrungen führen kann.

Parameter

Name Typ Default Beschreibung
$ip Pflicht string Eine IPv4-Adresse in Punkt-Schreibweise, z. B. "192.168.1.1". Ungültige Adressen führen zur Rückgabe von false.

Rückgabewert

Typ
int|false
Beschreibung
Gibt den Integer-Wert der IP-Adresse zurück. Auf 64-Bit-Systemen ist dieser immer nicht-negativ. Auf 32-Bit-Systemen kann er negativ sein. Bei einer ungültigen IP-Adresse wird false zurückgegeben.

Beispiele

Einfache IP-Konvertierung

<?php
$ip = '192.168.1.100';
$long = ip2long($ip);
echo $long; // Integer-Darstellung
echo PHP_EOL;
echo long2ip($long); // Rückkonvertierung
3232235876 192.168.1.100

IP-Adressen in einer MySQL-Datenbank speichern und suchen

<?php
// IP als Integer in der Datenbank speichern
$userIp = $_SERVER['REMOTE_ADDR'];
$ipLong = ip2long($userIp);

if ($ipLong === false) {
    echo 'Ungültige IP-Adresse';
} else {
    // Beispiel: PDO-Insert
    // $stmt = $pdo->prepare('INSERT INTO logins (ip_int) VALUES (:ip)');
    // $stmt->execute([':ip' => $ipLong]);
    echo "Gespeicherter Wert: $ipLong";
}
Gespeicherter Wert: (Integer-Wert der aktuellen IP)

Prüfung, ob eine IP in einem Subnetz liegt

<?php
function ipInSubnet(string $ip, string $subnet, string $mask): bool {
    return (ip2long($ip) & ip2long($mask)) === (ip2long($subnet) & ip2long($mask));
}

$ip     = '192.168.1.50';
$subnet = '192.168.1.0';
$mask   = '255.255.255.0';

if (ipInSubnet($ip, $subnet, $mask)) {
    echo "$ip liegt im Subnetz $subnet/$mask";
} else {
    echo "$ip liegt NICHT im Subnetz";
}
192.168.1.50 liegt im Subnetz 192.168.1.0/255.255.255.0

// Wichtig · Fallstricke

32-Bit vs. 64-Bit: Auf 32-Bit-Systemen werden IP-Adressen > 127.255.255.255 als negative Integer dargestellt. Um eine vorzeichenlose Darstellung zu erhalten, verwende sprintf('%u', ip2long($ip)).

IPv6 wird nicht unterstützt: ip2long() funktioniert ausschließlich mit IPv4-Adressen. Für IPv6 sollte inet_pton() verwendet werden, das beide Protokolle unterstützt.

Validierung: Die Funktion akzeptiert verkürzte Notationen wie 192.168 als gültig. Zur strikten Validierung einer IPv4-Adresse eignet sich filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) besser.