首页| 版块| 我的| 发帖| 消息
主题:为你守候 温馨家园 即日起开始拥有自己的IP归属信息表
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+$
zhangjingyu回帖于2026-06-27 20:54[查看电脑版]
下一页 (1/3)
下一楼»:“$rs = $db->get_one("SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '112.3 ..
«上一楼:“`ipfrom` mediumtext NOT NULL,是这个原因吗?”(引用内& ..

查看全部回帖(42)
«返回主帖