首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP ip2long() 負數問題解決:無號整數轉換兩種方法

     編輯:PHP 相關知識

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";
?>

補充:資料庫儲存建議

  • MySQL:INT UNSIGNED 欄位儲存 sprintf("%u", ip2long($ip))
  • PostgreSQL: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 倍,建議優先使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved