Sau khi đọc các bình luận và nghiên cứu một chút, tôi đã tìm ra câu trả lời và nó rất đơn giản.
Trên hệ thống 32-bit ip2long()
trả về số nguyên âm và số nguyên dương nhưng INET_NTOA()
chỉ hoạt động với số nguyên dương. Vì vậy, bạn có hai tùy chọn để khắc phục điều đó:
- Thay đổi mã PHP của bạn:
$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));
- Thay đổi truy vấn SQL của bạn:
... AND ip = " . ip2long($_SERVER['REMOTE_ADDR']) . " ...
Bạn có thể xác minh sự thật này theo cách này:
$ip = $_SERVER['REMOTE_ADDR'];
$int = ip2long($ip);
var_dump($ip, $int, sprintf('%u', $int));
Điều này tạo ra kết quả sau:
string '192.168.1.120' (length=13)
int -1062731400
string '3232235896' (length=10)
Sau đó, truy cập MySQL:
mysql> SELECT '192.168.1.120', INET_NTOA(-1062731400), INET_NTOA(3232235896)
+---------------+------------------------+-----------------------+
| 192.168.1.120 | INET_NTOA(-1062731400) | INET_NTOA(3232235896) |
+---------------+------------------------+-----------------------+
| 192.168.1.120 | NULL | 192.168.1.120 |
+---------------+------------------------+-----------------------+
1 row in set (0.00 sec)