PHP 的 ip2long() 回傳有號整數,在 32 位系統上 IP 地址大於 127.255.255.255 時會轉為負數。本文提供兩種取得無號十進制 IP 數值的正確方法。
<?php
$ip = '200.100.50.25';
echo ip2long($ip); // 32 位系統輸出:-932641775 (負數)
?>
sprintf("%u") 格式化輸出利用 %u 無號十進制格式化,直接取得正確正整數。
<?php
$ip = '200.100.50.25';
$unsigned = sprintf("%u", ip2long($ip));
echo $unsigned; // 3362325521 (正確無號值)
?>
bindec(decbin())先轉二進制字串(保留 32 位),再轉回十進制,繞過有號限制。
<?php
$ip = '200.100.50.25';
$unsigned = bindec(decbin(ip2long($ip)));
echo $unsigned; // 3362325521
?>
<?php
function ipToUnsignedInt($ip) {
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return false;
}
// PHP 7+ 可直接用 sprintf,效能較好
return sprintf("%u", ip2long($ip));
}
// 反向轉換
function unsignedIntToIp($int) {
return long2ip($int); // long2ip 自動處理無號整數
}
// 測試
$ip = '200.100.50.25';
$uint = ipToUnsignedInt($ip);
echo "IP: $ip\n";
echo "無號整數: $uint\n";
echo "反向還原: " . unsignedIntToIp($uint) . "\n";
?>
INT UNSIGNED 欄位儲存 sprintf("%u", ip2long($ip))BIGINT 或 INET 原生類型WHERE ip_int BETWEEN ipToUnsignedInt('192.168.1.1') AND ipToUnsignedInt('192.168.1.255')INET 類型或 CIDR 運算子sprintf("%u", ...) 約比 bindec(decbin()) 快 2-3 倍,建議優先使用。