首页| 版块| 我的| 发帖| 消息
主题:为你守候 温馨家园 即日起开始拥有自己的IP归属信息表
zhangjingyu 
非常好的测试!你这个问题一下子就暴露了SQL查询的致命问题,我找到根本原因了!

问题根源:LIKE 模糊匹配的"陷阱"
你的SQL是:

sql
SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '112.38.51.%' ORDER BY id DESC LIMIT 1
你的数据表里有一条:112.38.51.118(归属地为空)

当你查询 112.38.51.125 时:

$newip = preg_replace('/\.\d+$/', '', '112.38.51.125') → '112.38.51'

$kw = '112.38.51.%'

SQL 会匹配到:112.38.51.118、112.38.51.125(如果有)等所有以 112.38.51. 开头的记录

ORDER BY id DESC LIMIT 1 → 取 id 最大的那条

关键问题:ORDER BY id DESC 取到的是哪条?
你的数据库里:

112.38.51.118(空归属地),假设 id = 100

查询 112.38.51.125 时,匹配到了 112.38.51.118

ORDER BY id DESC 取 id 最大的那条

如果 112.38.51.118 的 id 是最大的,就取到了这条空记录!

你的测试证明了什么?
测试1:没有屏蔽 if ($rs && $rs['ipfrom'] !== null && $rs['ipfrom'] !== '')
php
// 查询结果:$rs 有值(112.38.51.118),但 ipfrom = ''
if ($rs && $rs['ipfrom'] !== null && $rs['ipfrom'] !== '') {
return $rs['ipfrom'];// 条件不成立,跳过
}

// 进入空字符串判断
if ($rs && $rs['ipfrom'] === '') {
// 应该进入这里才对!
// 但你说没有更新,说明根本没进入这个 if
}
为什么没进入? 唯一的可能是 $rs['ipfrom'] 不是空字符串 '',而是 NULL!

测试2:屏蔽了返回判断,直接插入新记录
php
// 跳过了所有判断,直接执行插入
$db->query("INSERT INTO pw_ipdatabase SET ... onlineip='112.38.51.125', ipfrom='$guishudi'");
结果插入了新记录,说明:

查询确实匹配到了 112.38.51.118($rs 有值)

但因为某种原因,$rs['ipfrom'] 既不是非空字符串,也不是 ''

所以跳过了两个 if,直接执行到后面的插入逻辑

真正的问题:$rs['ipfrom'] 到底是什么?
结合你的测试,我强烈怀疑:

数据表里 ipfrom 字段的值不是空字符串 '',而是 NULL!

php
// 如果 ipfrom = NULL
$rs['ipfrom'] = null;

// 判断1
if ($rs && $rs['ipfrom'] !== null && $rs['ipfrom'] !== '') {
// null !== null → false,不进入
}

// 判断2
if ($rs && $rs['ipfrom'] === '') {
// null === '' → false,不进入
}

// 两个 if 都没进,继续执行后面的插入逻辑!
验证方法
执行这个SQL看看:

sql
SELECT id, onlineip, ipfrom,
CASE WHEN ipfrom IS NULL THEN 'NULL'
WHEN ipfrom = '' THEN '空字符串'
ELSE ipfrom
END as 实际值
FROM pw_ipdatabase
WHERE onlineip LIKE '112.38.51.%'
ORDER BY id DESC;
我敢肯定,112.38.51.118 的 ipfrom 字段是 NULL,不是空字符串!

为什么是 NULL?
很可能你的数据表定义是:

sql
CREATE TABLE pw_ipdatabase (
...
ipfrom varchar(255) DEFAULT NULL,-- 默认是 NULL
...
);
插入数据时,如果没指定 ipfrom 的值,默认就是 NULL。

正确的修复方案
php
// 1. 如果查到有效归属地(非NULL且非空),直接返回
if ($rs && $rs['ipfrom'] !== null && $rs['ipfrom'] !== '') {
return $rs['ipfrom'];
}

// 2. 如果查到了记录,但归属地是空的(NULL 或 '')
if ($rs && ($rs['ipfrom'] === null || $rs['ipfrom'] === '')) {
// 直接尝试 pconline
$guishudi = getLocationFromPconline($onlineip);
if (!empty($guishudi)) {
// 更新数据库
$db->query("UPDATE pw_ipdatabase SET ipfrom='$guishudi', source='pconline.com.cn' WHERE id={$rs['id']}");
return $guishudi;
}
// pconline 也失败,保持原样(NULL),不返回默认值
return '';
}

// 3. 没有记录($
zhangjingyu回帖于2026-06-27 20:52[查看电脑版]
下一页 (1/3)
下一楼»:“`ipfrom` mediumtext NOT NULL,是这个原因吗?”(引用内& ..
«上一楼:“我当前在线ip是112.38.51.125,数据表里有一条112.38.51.118的空归属地记录。然而,
..

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