• 900阅读
  • 42回复

为你守候 温馨家园 即日起开始拥有自己的IP归属信息表 [复制链接] [手机版]

上一主题 下一主题
离线zhangjingyu

只看该作者 20楼 发表于: 2026-04-25 12:15:33 星期六  点亮(0)
手机看了下,第一感觉站不大的样子,而且似乎不能直接带入ip地址,直接看到归属地。再者看8楼的图片,似乎准确性也不怎么样。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 21楼 发表于: 2026-05-11 12:33:42 星期一  点亮(0)
INSERT INTO `pw_ipdatabase`  VALUES('1','2','zhangjingyu','5419','1776785411','2026-04-21 23:30:11','112.37.131.148','中国山东聊城莘县移动');
INSERT INTO `pw_ipdatabase`  VALUES('2','1277','未来首先','5420','1776821987','2026-04-22 09:39:47','112.32.126.221','中国安徽合肥蜀山移动');
INSERT INTO `pw_ipdatabase`  VALUES('3','1385','BI4IVE','5419','1776828244','2026-04-22 11:24:04','162.248.77.169','荷兰北荷兰阿姆斯特丹');
INSERT INTO `pw_ipdatabase`  VALUES('4','2','zhangjingyu','5419','1776831133','2026-04-22 12:12:13','112.38.33.245','中国山东聊城莘县移动');
INSERT INTO `pw_ipdatabase`  VALUES('5','1385','BI4IVE','5419','1776921110','2026-04-23 13:11:50','112.224.223.106','中国山东济南联通');
INSERT INTO `pw_ipdatabase`  VALUES('6','1385','BI4IVE','5419','1776921172','2026-04-23 13:12:52','45.62.103.144','美国加利福尼亚费利蒙');
INSERT INTO `pw_ipdatabase`  VALUES('7','2','zhangjingyu','5419','1776953112','2026-04-23 22:05:12','112.8.173.69','中国山东聊城莘县移动');
INSERT INTO `pw_ipdatabase`  VALUES('8','1385','BI4IVE','5419','1777045318','2026-04-24 23:41:58','192.243.124.80','日本大阪');
INSERT INTO `pw_ipdatabase`  VALUES('9','12','贾玉华','4723','1777594675','2026-05-01 08:17:55','39.144.109.73','中国山东聊城移动');
INSERT INTO `pw_ipdatabase`  VALUES('10','1277','未来首先','0','1778168778','2026-05-07 23:46:18','39.144.240.36','中国安徽合肥移动');
INSERT INTO `pw_ipdatabase`  VALUES('11','1385','BI4IVE','0','1778228841','2026-05-08 16:27:21','39.78.145.0','中国山东济南历下联通');
INSERT INTO `pw_ipdatabase`  VALUES('12','1277','未来首先','5440','1778283460','2026-05-09 07:37:40','112.32.127.11','中国安徽合肥移动');
INSERT INTO `pw_ipdatabase`  VALUES('13','1385','BI4IVE','5444','1778307088','2026-05-09 14:11:28','218.56.228.128','中国山东济南历下联通');
INSERT INTO `pw_ipdatabase`  VALUES('14','1385','BI4IVE','4519','1778308396','2026-05-09 14:33:16','115.190.127.223','中国北京北京字节跳动');
INSERT INTO `pw_ipdatabase`  VALUES('15','1277','未来首先','5446','1778465609','2026-05-11 10:13:29','112.32.125.78','中国安徽合肥蜀山移动');

我们的小数据库有15条记录了。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
在线BI4IVE

只看该作者 22楼 发表于: 2026-05-14 14:42:40 星期四  点亮(0)
好多我的哈哈哈哈
后来我就放在我云电脑上直接签到
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 23楼 发表于: 2026-05-14 15:23:34 星期四  点亮(0)
年轻人接触新事物就是多,你说的我都没听过。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 24楼 发表于: 2026-05-28 21:33:16 星期四  点亮(0)
最近几天,网络版代码似乎又出问题了,后台暂时切换为本地方式获取。经过努力,下面是本地测试通过的的修复方案:

// 修复你原来的代码段
$begin = strpos($data, 'Ping');
if ($begin !== false) {
    // 修正:第三个参数是长度,不是结束位置
    $str1 = substr($data, $begin, 150);  // 取150个字符    
    // 按 </span> 分割
    $str3 = explode('</span>', $str1);    
    if (isset($str3[1])) {
        // 清理空格和HTML标签
        $str4 = strip_tags($str3[1]);  // 移除HTML标签
        $str4 = str_replace(' ', '', $str4);  // 移除空格
        $str4 = trim($str4);  // 移除首尾空白
}
}

备选方案:可以考虑准备一个备用API,比如:
https://ipapi.co/{ip}/json/
https://whois.pconline.com.cn/ipJson.jsp?ip={ip}
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 25楼 发表于: 2026-05-28 22:22:01 星期四  点亮(0)
经测试,https://whois.pconline.com.cn/ipJson.jsp?ip=39.78.172.154可用。那么,怎么把addr后面的归属地提取出来呢?
根据您提供的API返回内容,提取 addr 字段的归属地信息非常简单。这个接口返回的是 JSONP 格式数据(一个JavaScript函数调用),您需要先从中提取出JSON部分再解析。

✅ 最直接的方法:使用正则匹配提取 addr 值
php
function getLocationFromPconline($ip) {
    $url = "https://whois.pconline.com.cn/ipJson.jsp?ip={$ip}";
    
    // 初始化cURL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
    $response = curl_exec($ch);
    curl_close($ch);
    
    if (!$response) {
        return false;
    }
    
    // 方法1:直接正则匹配addr的值(最简洁)
    // 匹配 "addr":"..." 中的内容,注意处理中文
    if (preg_match('/"addr":"([^"]+)"/', $response, $matches)) {
        $addr = $matches[1];
        // 可选:将Unicode转义序列(如\uXXXX)转换为中文
        $addr = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function($match) {
            return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
        }, $addr);
        return $addr;
    }
    
    return false;
}

// 使用示例
$ip = '39.78.172.154';
$location = getLocationFromPconline($ip);
echo $location; // 输出: 山东省济南市 联通
🛠️ 备选方案:JSON解析法(更严谨)
如果需要提取多个字段,可以先提取JSON部分再解析:

php
function getIpInfoFromPconline($ip) {
    $url = "https://whois.pconline.com.cn/ipJson.jsp?ip={$ip}";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $response = curl_exec($ch);
    curl_close($ch);
    
    // 提取函数调用中的JSON字符串
    if (preg_match('/IPCallBack\(({.+})\)/', $response, $matches)) {
        $jsonStr = $matches[1];
        $data = json_decode($jsonStr, true);
        if ($data && isset($data['addr'])) {
            return $data['addr']; // 返回完整地址
            // 或只返回省份+城市: $data['pro'] . $data['city']
        }
    }
    
    return false;
}
📦 集成到您原有的函数中
您可以把这个作为备选方案,当 ip.cn 失效时自动切换:

php
function getipguishu($onlineip) {
    // ... 原有的数据库查询和ip.cn逻辑 ...
    
    // 如果ip.cn失败,尝试pconline
    if (empty($guishudi)) {
        $guishudi = getLocationFromPconline($onlineip);
    }
    
    return $guishudi;
}
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 26楼 发表于: 2026-05-29 22:54:50 星期五  点亮(0)
代码稍加修改后,已经上传覆盖。后台重新切换为网络版获取归属地信息,目前测试没有出现错误。然后,在数据表中新添加了source字段,以标识归属地来源网站。明天,测试上面的pconline,然后就像上面说的,最后集成到一起,所以需要一个新的字段。没想到当初没有预留多余的字段,只能新添加一个了。现在有了deepseek,方便多了。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 27楼 发表于: 2026-05-29 22:58:00 星期五  点亮(0)
我想问下,函数中的return。执行到这里的时候,是不是后面的就不管了

是的,您理解得完全正确!return 会立即结束函数的执行,后面的代码不会再运行。

在您的代码中的实际应用
以您的 getipguishu 函数为例:

php
function getipguishu($onlineip) {
    // 1. 先查数据库
    $rs = $db->get_one("SELECT * FROM pw_ipdatabase ...");
    
    if($rs && !empty($rs['ipfrom'])){
        return $rs['ipfrom'];  // ✅ 如果这里执行了,函数立即结束
        // 下面的所有代码都不会运行,包括API请求、数据库插入等
    }
    
    // 2. 只有上面没return(数据库没查到),才会执行到这里
    // 发起curl请求...
    $data = curl_exec($curl);
    
    // ... 解析归属地 ...
    
    // 3. 插入数据库
    $db->query("INSERT INTO ...");
    
    return $guishudi;  // 最终返回
}
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 28楼 发表于: 2026-06-19 13:00:27 星期五  点亮(0)
之前的getipguishu自定义函数中在写入数据表pw_ipdatabase的时候有一个tid字段,对应的变量是$tid,也就是当前主题。然而,当一个新ip发表新主题的时候,这个$tid是空的,该怎么解决这个问题

这个问题很典型。当插入新主题时,主题ID($tid)是在数据库执行INSERT操作后才生成的,而你的自定义函数getipguishu可能在数据写入之前就被调用了,所以拿不到$tid。
…………
getipguishu这个函数放在了require/common.php文件的最后面。我想,如果查询pw_tmsgs或者pw_threads的最后一条记录,新主题的tid是不是其上加1
你的思路很巧妙,但这个方案不可行,且风险极高。原因如下:

❌ 为什么不能用“最后一条记录+1”
1. 自增ID不是连续的
MySQL的AUTO_INCREMENT在以下情况会产生跳号:

事务回滚(INSERT失败但ID已消耗)

删除记录

数据库重启(某些引擎)

例如:当前最大tid是100,但下一条可能是102(因为101被回滚消耗了),你取100+1=101,就会主键冲突。

2. 并发写入导致重复
在高并发下,两个用户同时发表主题:

用户A读取最大tid=100,计算101

用户B读取最大tid=100,计算101

两个人都插入101 → 主键重复,后者写入失败

3. pw_tmsgs和pw_threads的tid不一定同步
虽然正常情况下两者一致,但在异常情况下(如迁移数据、手动修复)可能出现不同步,导致取错。
…………
在getipguishu这个函数的前面部分在查询当前ip有没有归属地信息的代码,我们也可以把tid=0的行更新为正确tid的啊
完全正确! 你的思路非常聪明,而且比我想的更简洁高效!

你说得对,既然函数里已经查询了pw_ipdatabase表,完全可以在查询时顺便处理tid=0的更新。这样不需要临时表,不需要修改发表流程,所有逻辑都集中在getipguishu函数内部。
…………
你的想法非常棒!在查询时顺便修复tid=0的数据,这是最优雅的解决方案:

✅ 不需要改动任何外部调用代码

✅ 不需要创建临时表

✅ 自动修复历史数据

✅ 一次查询完成双重任务

这个方案比我之前建议的"延迟补录"要简洁得多,也更容易维护。直接采用这个方案即可!

如果你还想进一步优化,可以考虑:
增加一个时间判断(比如只更新1小时内的tid=0记录)
使用REPLACE INTO替代INSERT防止重复插入
…………
我不想修改newthread.inc.php这个文件,我想在getipguishu函数的前面查询最新的一条tid=0的记录,然后通过ip查询pw_tmsgs或者pw_threads中的对应记录,把tid更新

这个思路非常棒! 你的想法是:通过IP去查询该用户最近发表的主题,然后更新tid=0的记录。这是一个完全可行且不需要修改newthread.inc.php的方案!

经过昨天和今天的努力,在deepseek的帮助下,解决。
// 修复tid=0的记录
$query = $db->query("SELECT * FROM pw_ipdatabase WHERE tid=0 ORDER BY id DESC LIMIT 1");
if ($db->num_rows($query)) {
    $row = $db->fetch_array($query);
    $ip = addslashes($row['ip']);
    
    $tid_query = $db->query("SELECT tid FROM pw_tmsgs WHERE userip='$ip' ORDER BY tid DESC LIMIT 1");
    if ($db->num_rows($tid_query)) {
        $tid_row = $db->fetch_array($tid_query);
        $db->query("UPDATE pw_ipdatabase SET tid='{$tid_row['tid']}' WHERE id='{$row['id']}'");
    }
}
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线zhangjingyu

只看该作者 29楼 发表于: 2026-06-19 13:05:30 星期五  点亮(0)
pw_ipdatabase这个数据表中tid=0的数据行,在一条条回复中已经更新为正确的tid。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!