Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

[疑难] ██农场赠送或者发送消息打不开或者丢失摆放物件初步分析与解决方法██

[复制链接]
liuzhly 发表于 2009-12-12 23:45:19 | 显示全部楼层 |阅读模式
本帖最后由 liuzhly 于 2009-12-12 23:52 编辑

近期发现,农场很多人收不到信息,或者收不到礼物,查看字段经常丢失或者NULL,经过研究,应该是接受字符串的问题~~

json_encode 有个BUG,或者说程序有BUG没过滤  半角的 逗号 单引号 TAB号 回车 ,导致数据处理出错...

解决办法如下:


找到 if ( $_REQUEST['mod'] == "message" && $_REQUEST['act'] == "sendMessage" && $_REQUEST['type'] == "3" ){

        $message = $_SGLOBAL['db']->result( $_SGLOBAL['db']->query( "SELECT message FROM ".tname( "plug_newfarm" )." where uid=".intval( $_REQUEST['toId'] ) ), 0 );

在其下面添加:
        if($message == ''){exit( );}
        $request_msg = str_replace(array(",","\\\"","\\'","\\","\t","\r\n","\n","\r"),array(';','``','`','|','',' ','',''),$_REQUEST['msg']);
        if($request_msg == ''){exit( );}


紧着着下几行找到

        $message->c[] = "{\"fromId\":\"".$_SGLOBAL['supe_uid']."\",\"sendTime\":".$_SGLOBAL['timestamp'].",\"eDesc\":\"".$_REQUEST['msg']."\",\"status\":0,\"id\":".$_SGLOBAL['timestamp'].",\"name\":\"".$space[name]."\"}";

将其改成:改红色字体(绿色字体可不增加,我是限制用户邮件数量,超过60封,自动删除第一封,放置数据库过大,嘿嘿)
        if(count($message->c) >=59){
                array_splice($message->c,0,1); //删除多余的,保留60封
        }

        $message->c[] = "{\"fromId\":\"".$_SGLOBAL['supe_uid']."\",\"sendTime\":".$_SGLOBAL['timestamp'].",\"eDesc\":\"".$request_msg."\",\"status\":0,\"id\":".$_SGLOBAL['timestamp'].",\"name\":\"".$space[name]."\"}";

将下面的
        $message = str_replace( "\"{", "{", $message );
        $message = str_replace( "}\"", "}", $message );
        $message = str_replace( "\\u", "\\\\u", $message );

3句去掉,改成如下一句话就OK了,增加了修复以前的NULL现象功能(不知道作者怎么想的,用ARRAY多方便?)
        $message = str_replace(array("\"{","}\"","\\u",",null","null"), array("{","}","\\\\u","",""), $message );

        $message = preg_replace('/,\s*([\]}])/m', '$1',$message);//替换掉多余的逗号{"a":1,"b":2,}

上面是短信部分,另外还有赠送礼物部分需要过滤:

找到:
if ( $_REQUEST['mod'] == "message" && $_REQUEST['act'] == "sendMessage" && $_REQUEST['type'] == "5" ){
        $nosegay = $_SGLOBAL['db']->result( $_SGLOBAL['db']->query( "SELECT nosegay FROM ".tname( "plug_newfarm" )." where uid=".$_SGLOBAL['supe_uid'] ), 0 );
        $nosegay = json_decode( $nosegay );
        if ( $nosegay->$_REQUEST['id'] < 1 ){
                exit( );
        }
        $nosegay->$_REQUEST['id'] = $nosegay->$_REQUEST['id'] - 1;
        $message = $_SGLOBAL['db']->result( $_SGLOBAL['db']->query( "SELECT message FROM ".tname( "plug_newfarm" )." where uid=".intval( $_REQUEST['toId'] ) ), 0 );
在其下面添加:

        if($message == ''){exit( );}
        $request_msg = str_replace(array(",","\\\"","\\'","\\","\t","\r\n","\n","\r"),array(';','``','`','|','',' ','',''),$_REQUEST['msg']);

隔几行找到

        $duixiang = "{\"id\":".$_SGLOBAL['timestamp'].",\"formulaId\":".$_REQUEST['id'].",\"friendId\":\"".$_SGLOBAL['supe_uid']."\",\"fName\":\"".$space[name]."\",\"charm\":".$makenosegay[$_REQUEST['id']][charm].",\"validTime\":0,\"msg\":\"".$_REQUEST['msg']."\",\"sendTime\":".$_SGLOBAL['timestamp'].",\"status\":0,\"x\":0,\"y\":0,\"z\":0}";
改成
        $duixiang = "{\"id\":".$_SGLOBAL['timestamp'].",\"formulaId\":".$_REQUEST['id'].",\"friendId\":\"".$_SGLOBAL['supe_uid']."\",\"fName\":\"".$space[name]."\",\"charm\":".$makenosegay[$_REQUEST['id']][charm].",\"validTime\":0,\"msg\":\"".$request_msg."\",\"sendTime\":".$_SGLOBAL['timestamp'].",\"status\":0,\"x\":0,\"y\":0,\"z\":0}";


仍旧替换
        $message = str_replace( "\"{", "{", $message );
        $message = str_replace( "}\"", "}", $message );
        $message = str_replace( "\\u", "\\\\u", $message );
为:

        $message = str_replace(array("\"{","}\"","\\u",",null","null"), array("{","}","\\\\u","",""), $message );        $message = preg_replace('/,\s*([\]}])/m', '$1',$message);//替换掉多余的逗号{"a":1,"b":2,}


这样就可以了,站长可以自己测试一下:发送信息,信息内容:

1,2.3/4\5~6`7!8@9#10$11^12&13*14(15)16-17?18>19<20:21;22"23'24|        25

如果造成用户信息丢失,那么你需要打这个补丁,如果没问题,就无需修改了~~~
回复

使用道具 举报

 楼主| liuzhly 发表于 2009-12-12 23:48:24 | 显示全部楼层
另外,你想让用户的最新信息放在第一位么??就是反排序,那么:

找到  if ( $_REQUEST['mod'] == "message" && $_REQUEST['act'] == "getList" ){
        $message = $_SGLOBAL['db']->result( $_SGLOBAL['db']->query( "SELECT message FROM ".tname( "plug_newfarm" )." where uid=".$_SGLOBAL['supe_uid'] ), 0 );
        $message = json_decode( $message );
在下面增加如下一句就OK!!!
        $message->c = array_reverse($message->c); //翻转数组
回复

使用道具 举报

hs999 发表于 2009-12-13 10:21:51 | 显示全部楼层
感谢分享~~~~~~~
回复

使用道具 举报

海鸥FLY 发表于 2009-12-13 10:37:17 | 显示全部楼层
此帖必火~鉴定完毕,感谢楼主分享~O(∩_∩)O~
回复

使用道具 举报

zhishen 发表于 2009-12-13 10:57:55 | 显示全部楼层
顶啦!!!!!!!不过那些源代码在哪个位置呢???
回复

使用道具 举报

kingtung 发表于 2009-12-13 11:04:27 | 显示全部楼层
保持关注,去排查一下我的农场是否有此问题
回复

使用道具 举报

samfansi1 发表于 2009-12-13 13:05:44 | 显示全部楼层
感谢分享精神
回复

使用道具 举报

patiku 发表于 2009-12-13 15:59:23 | 显示全部楼层
顶~~
楼主真有才!!
回复

使用道具 举报

jinshuang 发表于 2009-12-13 17:28:18 | 显示全部楼层
此帖必火~鉴定完毕
回复

使用道具 举报

316741513 发表于 2009-12-13 18:43:42 | 显示全部楼层
支持下,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-10-23 07:51 , Processed in 0.113760 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表