本帖最后由 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
如果造成用户信息丢失,那么你需要打这个补丁,如果没问题,就无需修改了~~~ |