• 5754阅读
  • 200回复

关于帖子阅读页显示的ip地址来源(SQL 语句) [复制链接] [手机版]

上一主题 下一主题
离线zhangjingyu

只看楼主 正序阅读 使用道具 绿 楼主  发表于: 2020-07-26 19:43:36 星期日
位置:帖子阅读页楼层的最上面,如:
楼主  发表于: 2020-07-17 23:31:23 IP:112.38.62.197(后台阅读页设置“显示帖子IP来源”功能关闭时前台显示的样子)
或者:
楼主  发表于: 2020-07-17 23:31:23 来自:江苏省 移动(后台阅读页设置“显示帖子IP来源”功能开启时前台显示的样子)

点击上面的“IP:112.38.62.197”或者“来自:江苏省 移动”都会有一个弹出框提示“IP:112.38.62.197 - 来自:江苏省 移动”(下面还有一个“禁止此ip”的管理链接)。


然而,这个ip地址来源显示得并不准确。因为ip地址段经常的会有变化,有回收,再分配等,具体怎么个流程不知道。总之,变是永远的不变。

前两天,顾兄在帖子中回复我说:
9楼 发表于: 2020-07-20 23:12:39  点亮(0) 来自:江苏省 移动  编辑
“用着用着就忘了用”,正常。

你到江苏了也不说下。
http://www.vtu425.com/read.php?tid=2824&ds=1&page=2#36294

于是,我也继续回复到:
“10楼 发表于: 2020-07-21 09:12:11  点亮(0) 来自:江苏省 移动  编辑
彼此,彼此。  

“10楼ip地址112.28.189.156来自安徽省合肥市 移动
论坛这个让ip地址显示为具体(大致)位置的功能,好多年前修改的(不记得怎么改的了),数据库不准确。

“显示不准确,鸡肋都不算。”

于是,后台关闭了“显示帖子IP来源”功能,只显示ip地址。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 置顶 (来自143楼) 发表于: 2025-12-21 20:11:24 星期日  点亮(0)
—— 管理操作 •  zhangjingyu 执行 帖内置顶 操作 (2026-04-01 20:57) ——
1.后台添加“IP归属选择”开关,网络方式为从chinaz.com查询获得地理位置信息,本地方式为从本地数据库文件中查询。

2.在require/common.php文件里添加自定义函数,数据的处理都在这里:
    function getipguishu($onlineip) {//2025.12.21
    $getUrl = 'https://ip.tool.chinaz.com/'.$onlineip;
    $curl = curl_init(); // 初始化curl
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_URL, $getUrl); // 抓取指定网页
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl不直接输出到屏幕
    curl_setopt($curl, CURLOPT_HEADER, 0); // 设置header
    $data = curl_exec($curl); // 运行curl
    curl_close($curl);

    $begin=strpos($data,'items-center');
    $end=$begin+100;
    $str=substr($data,$begin,$end);//截取页面

    $encode = mb_detect_encoding($str, array('ASCII','UTF-8','GB2312','GBK','BIG5'));
    $string =mb_convert_encoding($str,'GBK',$encode);//使用iconv函数转码在空间论坛无效

    $begin2=strpos($string,'ipAddress');
    $end2=$begin2+100;
    $str2=substr($string,$begin2,$end2);//再次截取页面
    $str3=explode('>',$str2);
    $str4=explode('<',trim($str3[1]));
    $wulidizhi=trim($str4[0]);
    $guishu=str_replace('-','',$wulidizhi);
        return $guishu;
}

3.修改文件
lib/forum/topicpost.class.php pw_tmsgs
lib/forum/replypost.class.php pw_posts
lib/forum/postmodify.class.php pw_posts

(1)添加变量:global $db_cvtime, $db_ptable, $onlineip, $db_plist,$db_ipguishu;
(2)获取数据:$guishu=getipguishu($onlineip);//2025.12.21
(3)根据后台开关,判断用网络还是本地方式更新数据
//$ipfrom = $ipTable->getIpFrom($onlineip);
$ipfrom = $db_ipguishu ? $guishu : $ipTable->getIpFrom($onlineip);
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 置顶 (来自17楼) 发表于: 2020-07-28 09:25:00 星期二  点亮(0)
回复13楼 zhangjingyu 的帖子
—— 管理操作 •  zhangjingyu 执行 帖内置顶 操作 (2020-07-28 09:35) ——
zhangjingyu 刚刚打开本地的数据库管理软件,帖子回复表pw_posts里面确实有ipfrom字段,里面记录着的当然就是ip地址来源(归属)了。竟然真有这个字段!自己确实疏忽了!疏忽了问题产生的原因,疏忽了对ip地址库的维护! (2020-07-28 09:06)   
上传个截图吧。

主题内容表pw_tmsgs也有同样的ipfrom字段,所以之前的错误数据(指已经“记录在案”的ip地址来源)无法更改了。

ip地址库文件重命名为ipdata.dat(20200725版本)已经上传到ipdata目录。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

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

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

只看该作者 199楼 发表于: 2026-04-20 22:32:29 星期一  点亮(0)
$newip = preg_replace('/\.\d+$/', '', $onlineip);//去掉ip地址最后面的点和数字
$kw=$newip.'%';//构造查询数据表关键字,百分号为通配符
$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;
}else{

common.php文件终于修改得差不多了,经过本地测试,应该基本达到了我的要求。明天继续测试。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 198楼 发表于: 2026-04-20 21:10:18 星期一  点亮(0)
用正则表达式去掉ip地址最后面的点和数字

你可以用下面的正则表达式来匹配 IP 地址末尾的 .<数字>,然后替换为空字符串。
正则表达式:
\.\d+$

\. 匹配一个点
\d+ 匹配一个或多个数字
$ 匹配字符串结尾

在 PHP 中,你可以使用 preg_replace 函数来实现相同的功能。

PHP 代码示例:
<?php
$ip = "192.168.1.100";
$new_ip = preg_replace('/\.\d+$/', '', $ip);
echo $new_ip;  // 输出: 192.168.1
?>
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 197楼 发表于: 2026-04-20 20:30:31 星期一  点亮(0)
如果表已有主键,先删除原主键再添加
ALTER TABLE `pw_ipdatabase` DROP PRIMARY KEY, ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
执行这条sql语句,成功修改数据表添加id自增字段,也就可以正常写入数据了。到此,数据表算是搞定了。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 196楼 发表于: 2026-04-19 15:09:58 星期日  点亮(0)
还需要添加一个自增字段,否则第二条数据写进时就报错,有空儿再研究吧,时间不多了。
今天也算有收获,终于能写进数据了。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 195楼 发表于: 2026-04-19 15:06:50 星期日  点亮(0)
现在这样虽然可以写入数据了,可继续写进,还是会报错,要怎么增加一个自增字段呢
你遇到的问题是:每次执行都会报错,很可能是因为表结构中没有设置主键或自增字段,导致重复插入时出现问题。

解决方案:添加自增主键字段
方法1:修改现有表结构(推荐)
添加一个自增的id字段作为主键
ALTER TABLE `pw_ipdatabase` ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

如果表已有主键,先删除原主键再添加
ALTER TABLE `pw_ipdatabase` DROP PRIMARY KEY, ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

方法2:如果已有主键字段但不是自增
修改现有字段为自增
ALTER TABLE `pw_ipdatabase` MODIFY COLUMN `id` INT NOT NULL AUTO_INCREMENT;

或者修改其他字段为主键自增,比如使用uid作为主键(如果uid唯一)
ALTER TABLE `pw_ipdatabase` MODIFY COLUMN `uid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

方法3:通过PHP代码检查并创建表
php
// 检查表是否存在,不存在则创建(包含自增ID)
$db->query("CREATE TABLE IF NOT EXISTS `pw_ipdatabase` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `uid` VARCHAR(50) DEFAULT NULL,
    `name` VARCHAR(100) DEFAULT NULL,
    `tid` VARCHAR(50) DEFAULT NULL,
    `timestamp` VARCHAR(20) DEFAULT NULL,
    `date` VARCHAR(20) DEFAULT NULL,
    `onlineip` VARCHAR(50) DEFAULT NULL,
    `ipfrom` VARCHAR(200) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8");
执行修改后的插入代码

php
// 添加自增字段后,原来的INSERT语句无需修改,自增ID会自动生成
$db->query("INSERT INTO pw_ipdatabase SET
    uid='$winduid',
    name='$windid',
    tid='$tid',
    timestamp='$timestamp',
    date='$date',
    onlineip='$onlineip',
    ipfrom='$str5'");
注意事项
执行ALTER TABLE前建议备份数据

如果表中已有数据,添加自增字段后会自动填充ID值

如果还是报错,请提供具体的错误信息,我可以帮你进一步分析

执行上述SQL语句后,每次插入新记录就会自动生成唯一的ID,不会再报重复或主键冲突的错误了。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 194楼 发表于: 2026-04-19 14:53:54 星期日  点亮(0)
谢谢,终于解决了!

太好了!很高兴能帮到你!🎉

总结一下最终的解决方案:

将 update() 或 insert() 改为了 query() 方法来执行 INSERT 语句

如果后续在使用这个数据库类时遇到其他问题,可以:

查看该类还提供了哪些方法(如 get_one()、get_all() 等)

注意 SQL 语句的安全性问题,建议对变量进行过滤或转义

考虑使用预处理语句防止 SQL 注入

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

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