首页| 版块| 我的| 发帖| 消息
主题:为你守候 温馨家园 即日起开始拥有自己的IP归属信息表
zhangjingyu 
“if($rs && !empty($rs['ipfrom'])){
        return $rs['ipfrom']; 这个判断还是很疑惑,如果归属地是空的,这个判断应该是不成立的的,按说不应该返回空的归属地啊”(引用内容)
你说得太对了!我重新仔细分析一下这个判断逻辑:

你的理解完全正确!
php
if($rs && !empty($rs['ipfrom'])){
    return $rs['ipfrom'];
}
当 $rs['ipfrom'] 为空字符串 '' 时:

empty('') 返回 true

!empty('') 返回 false

所以 if 条件不成立,不会执行 return

所以理论上,这个判断确实不应该返回空的归属地。

那为什么你看到的却是返回了空?
既然判断逻辑没问题,那只有两种可能:

可能性1:你看到的"空"不是从这行代码返回的
检查一下这个函数后面还有没有其他 return:

php
function getIpGuishu($onlineip) {
    // ... 前面的代码
    $rs = $db->get_one("SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '$kw' ORDER BY id DESC LIMIT 1");
    
    if($rs && !empty($rs['ipfrom'])){
        return $rs['ipfrom'];  // ← 这里没返回
    }
    
    // 继续执行获取归属地的逻辑
    $guishu = getFromThirdParty($onlineip);
    
    if($guishu) {
        return $guishu;  // ← 可能这里返回了空?
    }
    
    // 如果所有方法都失败,最后可能返回了空
    return '';  // ← 或者这里直接返回空字符串?
}
可能性2:数据表里存的不是"空",而是其他被 empty() 判定为真的值
empty() 会判定以下值为 true:

"" (空字符串)

0 (整数0)

"0" (字符串0)

NULL

false

[] (空数组)

如果数据表里存的是 "0"(字符串0),比如某个地区代码是0:

empty("0") 返回 true

!empty("0") 返回 false

不会执行 return,但后续逻辑可能返回了 "0"

快速验证方法
在你代码里加一行调试:

php
$rs = $db->get_one("SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '$kw' ORDER BY id DESC LIMIT 1");

// 调试代码开始
error_log("=== 调试信息 ===");
error_log("查询结果: " . print_r($rs, true));
error_log("ipfrom 值: '" . $rs['ipfrom'] . "'");
error_log("ipfrom 类型: " . gettype($rs['ipfrom']));
error_log("empty判断: " . (empty($rs['ipfrom']) ? 'true' : 'false'));
// 调试代码结束

$guishu = $rs['ipfrom'];
if($rs && !empty($guishu)){
    return $guishu;
}
然后查看 error_log,看看 ipfrom 到底是什么值。

我怀疑的真实情况
根据你之前的描述,我猜测最可能的是这个流程:

php
$rs = $db->get_one("SELECT * FROM pw_ipdatabase WHERE onlineip LIKE '$kw' ORDER BY id DESC LIMIT 1");

$guishu = $rs['ipfrom'];  // ← 这里赋值了空字符串

if($rs && !empty($guishu)){
    return $guishu;  // ← 条件不成立,跳过
}

// 下面继续执行获取归属地的代码
// ... 可能调用第三方API,但API失败了,返回了空
// ... 或者没有任何 else/默认值,函数最后隐式返回了 null

// 最终返回了空/null给调用方
建议的完整写法
php
function getIpGuishu($onlineip) {
    // 1. 查询数据库
    $newip = preg_replace('/\.\d+$/'
zhangjingyu回帖于2026-06-27 20:39[查看电脑版]
下一页 (1/3)
下一楼»:…………
总结
你的 if($rs && !empty($guishu)) 判断完全没有问题。

..
«上一楼:“ip的查询应该是没有问题的,前面的代码还有    $newip = preg_repla ..

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