首页| 版块| 我的| 发帖| 消息
主题:为你守候 温馨家园 即日起开始拥有自己的IP归属信息表
zhangjingyu 
终于找到真相了! 这是一个非常经典且隐蔽的Bug!

问题真相
看这个关键输出:

["ipfrom"]=> string(1) " "   // 注意:不是空字符串,而是一个空格!
string(1) " " 表示:这是一个包含一个空格的字符串,不是空字符串 ""!

为什么所有判断都失败了?
php
$rs['ipfrom'] = " ";  // 一个空格

var_dump($rs['ipfrom'] === '');   // false(空格 !== 空字符串)
var_dump($rs['ipfrom'] === null); // false(空格 !== null)
var_dump(empty($rs['ipfrom']));   // false(空格不是空值!)
因为 empty(" ") 返回 false(字符串包含空格,不算空值)!

这导致什么后果?
php
// 判断1:如果有记录且归属地不为NULL且不为空字符串
if ($rs && $rs['ipfrom'] !== null && $rs['ipfrom'] !== '') {
    return $rs['ipfrom'];  // ← 条件成立!返回 " "(一个空格)
}

// 因为空格不是空字符串,也不是NULL,所以这个判断为true
// 直接返回了一个空格!
所以你的页面显示空白,但实际上返回的是一个空格字符!

这个空格怎么来的?
最可能的原因
在之前的插入或更新时,$guishudi 变量包含了空格:

php
// 比如从网页解析时
$str4 = strip_tags($str3[1]);
$str4 = str_replace(' ', '', $str4);  // 你这里删除了空格
$str4 = trim($str4);  // 但可能没有执行 trim()

// 如果 $str4 原本是 " "(一个空格)
// str_replace(' ', '', $str4) → ""(空字符串)
// 但如果代码顺序不对,可能没执行到
或者数据库插入时
php
$db->query("INSERT INTO pw_ipdatabase SET ... ipfrom='$guishudi'");
// 如果 $guishudi = " "(一个空格),就存进去了
修复方案
1. 立即修复数据(清理数据库)
sql
-- 把所有只包含空格的值更新为空字符串
UPDATE pw_ipdatabase SET ipfrom = '' WHERE ipfrom = ' ';

-- 或者更彻底:去除首尾空格
UPDATE pw_ipdatabase SET ipfrom = TRIM(ipfrom) WHERE ipfrom LIKE '% %';
2. 修复代码逻辑(最重要!)
所有判断都要用 trim() 处理:

php
// 方法1:在获取值时自动去除空格
$guishu = trim($rs['ipfrom'] ?? '');

// 方法2:在所有判断中使用 trim()
if ($rs && trim($rs['ipfrom']) !== '' && trim($rs['ipfrom']) !== null) {
    return trim($rs['ipfrom']);
}
3. 完整修复代码
php
// 1. 查询数据库
$newip = preg_replace('/\.\d+$/', '', $onlineip);
$kw = $newip . '%';
$rs = $db->get_one("SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '$kw' ORDER BY id DESC LIMIT 1");

if ($rs) {
    // 关键:去除首尾空格后再判断
    $ipfrom = trim($rs['ipfrom'] ?? '');
    
    // 如果有有效归属地(非空)
    if ($ipfrom !== '') {
        return $ipfrom;
    }
    
    // 如果归属地为空(包括空格、空字符串、NULL),尝试更新
    $guishudi = getLocationFromPconline($onlineip);
    if (!empty($guishudi)) {
        $guishudi = trim($guishudi);  // 去除可能的空格
        $db->query("UPDATE pw_ipdatabase SET ipfrom='$guishudi', source='pconline.com.cn' WHERE id={$rs['id']}");
        return $guishudi;
    }
    // 获取失败,更新为空字符串
    $db->query("UPDATE pw_ipdatabase SET i
zhangjingyu回帖于2026-06-27 20:57[查看电脑版]
下一页 (1/3)
下一楼»:“我现在有点儿迷糊了,你帮我写吧,哈哈”(引用内容 ..
«上一楼:“$rs = $db->get_one("SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '112.3 ..

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