zhangjingyu
“$rs = $db->get_one("SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '$kw' ORDER BY id DESC LIMIT 1");
// 调试输出
var_dump($rs); // 看看返回的是什么类型
var_dump($rs['ipfrom']); // 看看值是什么
var_dump($rs['ipfrom'] === ''); // 看看判断结果
var_dump($rs['ipfrom'] === null); // 看看是不是NULL
var_dump(empty($rs['ipfrom'])); // 看看empty判断 这几行代码运行后的结果是:bool(false) NULL bool(false) bool(true) bool(true)”(引用内容)
破案了! 问题非常明确!
调试结果分析
php
var_dump($rs); // bool(false) ← 查询没找到任何记录!
var_dump($rs['ipfrom']); // NULL ← 因为 $rs 是 false,所以访问失败
var_dump($rs['ipfrom'] === ''); // bool(false) ← 比较失败
var_dump($rs['ipfrom'] === null); // bool(true) ← NULL === null 为 true
var_dump(empty($rs['ipfrom'])); // bool(true) ← 空值判断为 true
关键发现:$rs = bool(false),查询没有返回任何记录!
为什么查不到 112.38.51.118?
你的SQL是:
sql
SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '112.38.51.%' ORDER BY id DESC LIMIT 1
理论上应该匹配到 112.38.51.118,但查不到,可能的原因:
可能性1:数据库里根本没有以 112.38.51. 开头的记录
你说数据表里有 112.38.51.118,但可能:
这条记录被删除了
或者 onlineip 字段存的是其他格式(比如 112.38.51.118 带空格?)
可能性2:$kw 的值不对
php
$newip = preg_replace('/\.\d+$/', '', $onlineip);
// $onlineip = '112.38.51.125'
// $newip = '112.38.51'
// $kw = '112.38.51.%'
这个逻辑没问题。
但如果你当前IP不是 112.38.51.125,而是其他IP,那 $kw 就是其他值。
可能性3:字符集或编码问题
$kw 可能有隐藏字符,或者数据库里的 onlineip 有特殊字符。
快速验证
直接在数据库里执行:
sql
-- 1. 看看 112.38.51.118 到底在不在
SELECT * FROM pw_ipdatabase WHERE onlineip = '112.38.51.118';
-- 2. 看看所有 112.38.51 开头的记录
SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '112.38.51.%';
-- 3. 看看这条记录的 id 是多少
SELECT id, onlineip, ipfrom FROM pw_ipdatabase WHERE onlineip = '112.38.51.118';
-- 4. 检查是否有空格或其他隐藏字符
SELECT id, onlineip, LENGTH(onlineip) as len, CHAR_LENGTH(onlineip) as char_len
FROM pw_ipdatabase WHERE onlineip LIKE '%112.38.51.118%';
为什么屏蔽判断后能插入新记录?
因为 $rs = false,所以所有的 if($rs && ...) 判断都跳过了,直接执行到后面的插入逻辑:
php
// 所有判断都失败
if ($rs && $rs['ipfrom'] !== null && $rs['ipfrom'] !== '') { } // false,跳过
if ($rs && $rs['ipfrom'] === '') { } // false,跳过
// 继续执行
// ... 获取归属地
// ... 插入新记录
$db->query("INSERT INTO pw_ipdatabase SET ... onlineip='112.38.51.125' ...");
问题的真正原因
数据表里 112.38.51.118 可能根本不在 pw_ipdatabase 表中!
你说"数据表里有一条112.38.51.118的空归属地记录",但:
可能这条记录在另一个表里
可能被误删了
可能 onlineip 字段值不是 112.38.51.118,而是 112.38.51.118(带空格)或其他格式
完整的修复方案
既然 $rs = false,说明数据库里没有匹配的记录,那就应该直接获取归属地并插入。
但要注意:插入前先检查是否已存在该IP,防止重复插入。
php
// 1. 查询数据库(加上精确匹配优先)
$newip = preg_replace('/\.\d+$

