Signatur
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
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
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";
}
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";
}
// 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.