• 5737阅读
  • 200回复

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

上一主题 下一主题
离线zhangjingyu

只看该作者 168楼 发表于: 2026-04-14 14:46:16 星期二  点亮(0)
继续问:php&#xxx

看起来你在问 PHP 中处理 &#xxx; 这种 HTML/XML 数值字符引用的问题。这类格式通常表示:

&#数字; — 十进制 Unicode 码点

&#x十六进制; — 十六进制 Unicode 码点

例如:你 代表 "你",你 也是 "你"。

3. 反向操作:将 UTF-8 转为 &#xxx;
php
function utf8ToNumericEntities($str) {
    $result = '';
    $len = mb_strlen($str, 'UTF-8');
    for ($i = 0; $i < $len; $i++) {
        $char = mb_substr($str, $i, 1, 'UTF-8');
        $code = mb_ord($char, 'UTF-8');
        if ($code > 127) { // 非 ASCII 才转
            $result .= '&#' . $code . ';';
        } else {
            $result .= $char;
        }
    }
    return $result;
}

这测试时发现这段函数代码报错,似乎没有mb_ord函数:
Call to undefined function mb_ord()
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 169楼 发表于: 2026-04-14 14:49:15 星期二  点亮(0)
给出的答复是:
这个错误说明你的 PHP 环境没有启用 mbstring 扩展,或者 PHP 版本低于 7.2.0(mb_ord() 在 PHP 7.2.0 才引入)。

方案二:使用替代函数(无需 mbstring)
如果无法安装扩展,用以下函数替代 mb_ord() 和 mb_chr():
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 170楼 发表于: 2026-04-14 14:50:01 星期二  点亮(0)
然后就是看到了今天测试成功的代码:
方案三:完整的 UTF-8 与 &#xxx; 互转(不依赖 mbstring)
php
<?php
// 无需 mbstring 的完整解决方案

/**
* 将 UTF-8 字符串转为 &#xxx; 格式
*/
function utf8ToNumericEntities($str) {
    $result = '';
    $len = strlen($str);
    $i = 0;
    
    while ($i < $len) {
        $code = 0;
        $byte = ord($str[$i]);
        
        if ($byte < 0x80) {
            // ASCII 字符
            $result .= $str[$i];
            $i++;
        } elseif ($byte < 0xE0) {
            // 2字节字符
            $code = ((ord($str[$i]) & 0x1F) << 6) | (ord($str[$i+1]) & 0x3F);
            $result .= '&#' . $code . ';';
            $i += 2;
        } elseif ($byte < 0xF0) {
            // 3字节字符
            $code = ((ord($str[$i]) & 0x0F) << 12) |
                    ((ord($str[$i+1]) & 0x3F) << 6) |
                    (ord($str[$i+2]) & 0x3F);
            $result .= '&#' . $code . ';';
            $i += 3;
        } else {
            // 4字节字符
            $code = ((ord($str[$i]) & 0x07) << 18) |
                    ((ord($str[$i+1]) & 0x3F) << 12) |
                    ((ord($str[$i+2]) & 0x3F) << 6) |
                    (ord($str[$i+3]) & 0x3F);
            $result .= '&#' . $code . ';';
            $i += 4;
        }
    }
    
    return $result;
}
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 171楼 发表于: 2026-04-14 14:51:17 星期二  点亮(0)
可后面的反转一直没测试成功,也不知道怎么回事。

方案四:最简单的方法(使用 html_entity_decode)
如果你只需要解析 &#xxx;,不需要反向转换:

php
// 不需要 mbstring,html_entity_decode 通常可用
$str = "你好 World";
$result = html_entity_decode($str, ENT_QUOTES, 'UTF-8');
echo $result; // 你好 World
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 172楼 发表于: 2026-04-14 14:54:12 星期二  点亮(0)
好了,更新过程基本上就是这样。

现在的每次回帖都要向站长之家请求,这样似乎不好。后续,准备把ip地址和归属地保存到一个数据表里,回帖后先查询(建立自己的小数据库),没有结果的再去站长之家查询,这样应该更好些。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 173楼 发表于: 2026-04-15 12:34:24 星期三  点亮(0)
开始今天的工作。
先把论坛数据备份恢复到本地,如果能在本地调试也能快些。
首先来看看,回帖数据表里记录这个ip地址归属的字段数据是什么样的。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 174楼 发表于: 2026-04-15 12:52:17 星期三  点亮(0)
时间长不用,怎么进入本地数据库管理都找不到了,最后直接输的地址才进去。
http://127.0.0.1/phpMyAdmin/index.php

直接以昨天通过函数转换后的形式保存的,
虽然不能直接保存为中文有点儿小遗憾,但看相关说明,其实这样的形式也还不错,浏览器能显示就行呗。数据库(里什么样)我们又不能直接看。
Google了一下,这东西专业名称叫numeric character reference(NCR),直译就是数字字符引用。一个Numeric Character Reference编码是由一个与号(&)跟着一个井号(#),然后跟着这个字符的Unicode编码值,最后跟着一个分号组成的,就像上面的例子一样。
有了数字字符引用,就可以在网页中显示Unicode字符了,不用考虑html文件本身的编码,因为数字字符引用只用到ASCII字符集里的字符。所以,即使在gb2312编码的网页中,也可以用NCR显示埃及的象形文字了。

前两种是 numeric character reference(NCR),数字取值为目标字符的 Unicode code point;以「&#」开头的后接十进制数字,以「&#x」开头的后接十六进制数字。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 175楼 发表于: 2026-04-15 13:17:20 星期三  点亮(0)
刚刚注意到,楼上不显示ip地址来源了,怎么又出问题了吗?
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 176楼 发表于: 2026-04-15 14:02:10 星期三  点亮(0)
就连调试文件都没有任何结果了。本来以为是站长之家那边可能阻止了本站的访问,可调试文件里用的却是另外的网站,结果是没有任何输出。

经过一步步排查,最后大致确认是utf8ToNumericEntities()的位置可能不对。由于这个自定义函数在调试文件和最后实际用的文件common.php中都有保存代码,可能就是这些代码导致的,删除后调试文件就可以运行了。那我们现在要把这个自定义函数的代码换一个位置试试,就是bbscode.php文件里,这个文件里都是一些函数。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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

只看该作者 177楼 发表于: 2026-04-15 14:04:31 星期三  点亮(0)
后台切换为本地方式获取ip地址归属,还得继续调试。
尊重每位祺师,做有价值的祺文化社区!欢迎光临,并感谢您的支持与陪伴!
我希望能通过这个论坛让更多的朋友更多的关爱自己的家人和朋友,不要等到有一天失去后才知道没有好好的珍惜,才知道
拥有的珍贵!亲爱的们,如果你懂得,请把这份关爱传递,让更多的人加入到爱心接力当中,让每个人的心中都洋溢着爱的温馨!

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