• 5766阅读
  • 200回复

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

上一主题 下一主题
离线BI4IVE

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

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

只看该作者 189楼 发表于: 2026-04-18 22:29:25 星期六  点亮(0)
刚刚想到更新数据表的语句似乎不对,不是更新,而应该是插入。前面的报错信息中所有字段的数据都没有问题,为什么不能写入数据表?原因就在这,不是更新某一条数据,而是插入新数据。嗯,这样应该对了。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 190楼 发表于: 2026-04-19 14:39:14 星期日  点亮(0)
以为把“$db -> update("UPDATE pw_ipdatabase set uid='$winduid',name='$windid',tid='$tid',timestamp='$timestamp',date='$date',onlineip='$onlineip',ipfrom='$str5'");”括号里面的“update”改为“insert into”就能解决问题。结果,忙了一个多小时,却提示这行代码错误:“Fatal error: Call to a member function update() on a non-object in D:\phpStudy\PHPTutorial\WWW\require\common.php on line 2609”

最后,向deepseek提问,才恍然大悟,还是语法不对!

这个错误是因为 update() 方法通常用于执行 UPDATE 语句,而你传入的是一个 INSERT 语句。

根据你的代码,应该使用 insert() 或 query() 方法:

解决方案:

使用 insert() 方法(推荐):

php
$db -> insert("INSERT INTO pw_ipdatabase SET uid='$winduid',name='$windid',tid='$tid',timestamp='$timestamp',date='$date',onlineip='$onlineip',ipfrom='$str5'");
使用 query() 方法:

php
$db -> query("INSERT INTO pw_ipdatabase SET uid='$winduid',name='$windid',tid='$tid',timestamp='$timestamp',date='$date',onlineip='$onlineip',ipfrom='$str5'");
如果确实需要 UPDATE,改为正确的 UPDATE 语法:

php
$db -> update("UPDATE pw_ipdatabase SET uid='$winduid',name='$windid',tid='$tid',timestamp='$timestamp',date='$date',onlineip='$onlineip',ipfrom='$str5' WHERE 条件");
另外注意安全风险:
你的代码存在 SQL 注入漏洞,建议使用参数化查询或转义函数:

php
$uid = intval($winduid); // 假设是数字
$name = $db->escape($windid);
// ... 对其他变量也做相应处理
$db -> insert("INSERT INTO pw_ipdatabase SET uid='$uid',name='$name',...");
请根据你的实际需求(插入新记录还是更新现有记录)选择合适的解决方案。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 191楼 发表于: 2026-04-19 14:43:50 星期日  点亮(0)
过程是这样的:最近一直在用联想笔记本调试论坛,也一直用得好好的,今天连续三次尝试都没有开机,不知道怎么了。只好换到新笔记本。

由于本地论坛环境可能不同,还有后台设置什么的,捣鼓了半天才算把本地论坛弄好。然后就是测试,可还是一直没能写入数据。最后,把此次修改需要用到的文件,全部更新一遍,才出现报错信息。可一时半会儿都没研究明白到底怎么回事,最后只好问deepseek.也许就能解决问题了呢。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 192楼 发表于: 2026-04-19 14:51:09 星期日  点亮(0)
继续报错,信息如下:
Fatal error: Call to undefined method DB::insert() in D:\phpStudy\PHPTutorial\WWW\require\common.php on line 2608
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 193楼 发表于: 2026-04-19 14:52:02 星期日  点亮(0)
看到错误提示,说明 DB 类中没有 insert() 方法。根据你之前使用的是 update() 方法,这个数据库类可能只提供了有限的几个方法。

解决方案:

直接使用 query() 方法(最通用):
$db -> query("INSERT INTO pw_ipdatabase SET uid='$winduid',name='$windid',tid='$tid',timestamp='$timestamp',date='$date',onlineip='$onlineip',ipfrom='$str5'");

继续使用 update() 但改成正确的 UPDATE 语句(如果确实要更新数据):
$db -> update("UPDATE pw_ipdatabase SET uid='$winduid',name='$windid',tid='$tid',timestamp='$timestamp',date='$date',onlineip='$onlineip',ipfrom='$str5' WHERE id=某个值");

检查该 DB 类支持哪些方法,可以查看:
// 查看类中定义了哪些方法
$methods = get_class_methods($db);
print_r($methods);

最可能的解决方案:
根据常见的 PHP 数据库封装类,通常会有 query() 方法来执行任意 SQL 语句。将你的代码改为:
$db -> query("INSERT INTO pw_ipdatabase SET uid='$winduid',name='$windid',tid='$tid',timestamp='$timestamp',date='$date',onlineip='$onlineip',ipfrom='$str5'");
如果 query() 方法也不存在,可能需要检查 $db 对象的初始化是否正确,或者查看该框架的文档了解正确的数据库操作方法。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

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

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

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

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

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

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

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

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

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

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

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

我们应该知道:岁月如梭!其实生命,是很短暂,也是很脆弱的东西…… 设置自己的帖子签名请点这里!
离线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自增字段,也就可以正常写入数据了。到此,数据表算是搞定了。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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