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

