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

 找回密码
 立即注册
搜索

[分享] UCHOME导入的日志UID缺失问题

[复制链接]
shinian315 发表于 2009-9-8 14:31:05 | 显示全部楼层 |阅读模式
本帖最后由 shinian315 于 2009-9-8 14:37 编辑

今天公司使用的UCHOME的从1.5升级成2.0后,将后台日志推到首页后发现日志的浏览地址中参数uid的值为0,所以点开后出错,于是查找了下代码,发现了一个1.5版本中日志导入的错误。

首先分析导入日志的文件cp_import.php这个文件,不难发现这段代码:
  1. //开始导入   
  2. $blogarr = array(   
  3.     'uid' => $_SGLOBAL['supe_uid'],   
  4.     'username' => $_SGLOBAL['supe_username'],   
  5.     'subject' => $subject,   
  6.     'pic' => getmessagepic($message),   
  7.     'dateline' => $dateline?$dateline:$_SGLOBAL['timestamp']   
  8. );   
  9. $blogid = inserttable('blog', $blogarr, 1);   
  10.                
  11. //插入内容   
  12. $fieldarr = array(   
  13.     'blogid' => $blogid,   
  14.     'message' => $message,   
  15.     'postip' => getonlineip()   
  16.             );   
  17. inserttable('blogfield', $fieldarr);   
复制代码
这段代码的作用就是将通过XML分析好的日志记录插入到blog表和blogfield表中。

这是我们来看UCHOME首页按热度读取日志的代码,分析network.php,看下面这段代码:

  1. include_once(S_ROOT.'./data/data_network.php');   
  2.    
  3.     //日志   
  4.     $cachefile = S_ROOT.'./data/cache_network_blog.txt';   
  5.     if(check_network_cache('blog')) {   
  6.     $bloglist = unserialize(sreadfile($cachefile));   
  7.     } else {   
  8.     $sqlarr = mk_network_sql('blog',   
  9.         array('blogid', 'uid'),   
  10.         array('hot','viewnum','replynum'),   
  11.         array('dateline'),   
  12.         array('dateline','viewnum','replynum','hot')   
  13.     );   
  14.     extract($sqlarr);   
  15.    
  16.     //隐私   
  17.     $wherearr[] = "main.friend='0'";   
  18.         
  19.     //显示数量   
  20.     $shownum = 6;   
  21.         
  22.     $query = $_SGLOBAL['db']->query("SELECT main.*, field.*   
  23.         FROM ".tname('blog')." main   
  24.         LEFT JOIN ".tname('blogfield')." field ON field.blogid=main.blogid   
  25.         WHERE ".implode(' AND ', $wherearr)."   
  26.         ORDER BY main.{$order} $sc LIMIT 0,$shownum");   
  27.     $bloglist = array();   
  28.     while ($value = $_SGLOBAL['db']->fetch_array($query)) {   
  29.         $value['message'] = getstr($value['message'], 86, 0, 0, 0, 0, -1);   
  30.         $value['subject'] = getstr($value['subject'], 50, 0, 0, 0, 0, -1);   
  31.         $bloglist[] = $value;   
  32.     }   
  33.     if($_SGLOBAL['network']['blog']['cache']) {   
  34.         swritefile($cachefile, serialize($bloglist));   
  35.     }   
  36. }   
  37. foreach($bloglist as $key => $value) {   
  38.     realname_set($value['uid'], $value['username']);   
  39.     $bloglist[$key] = $value;   
  40. }
复制代码
可以看出首页的日志数据室是放在$bloglist里的,然后存放在/data/cache_network_blog.txt里,我们可以将SQL语句输出出来会看到它的原理就是blog表和blogfield表的联合查询,通过blogid关联,但是它们含有相同的字段uid,问题就出在uid上。

上面我们分析的日志导入时同时向blog表和blogfield表插入了记录,但是我们细心点可以发现,blog表里插入了uid,而blogfield表里没有插入uid,导致了批量导入的日志在blogfield表里的uid字段值都为0.

接着读取的时候,联合查询的结果是读出了2个uid字段,第一个uid值(blog表里的)正确,但是第二个uid值(blogfield表里的)全部为0,所以$bloglist数组里存放的肯定是后一个uid的值,就会全部变成0,然后存入到/data/cache_network_blog.txt里,显示出来后,这些日志的链接中参数uid的值就都是0,问题就出现了。

注:此问题已经在2.0的版本中解决

版本2.0中,在日志插入环节将uid的值同时插入到了blogfield表里,这样问题就不会出现了。代码如下:

  1. //开始导入   
  2. $blogarr = array(   
  3.     'uid' => $_SGLOBAL['supe_uid'],   
  4.     'username' => $_SGLOBAL['supe_username'],   
  5.     'subject' => $subject,   
  6.     'pic' => getmessagepic($message),   
  7.     'dateline' => $dateline?$dateline:$_SGLOBAL['timestamp']   
  8. );   
  9. $blogid = inserttable('blog', $blogarr, 1);   
  10.                
  11. //插入内容   
  12. $fieldarr = array(   
  13.     'blogid' => $blogid,   
  14.     'uid' => $_SGLOBAL['supe_uid'],//就是这句的差别   
  15.     'message' => $message,   
  16.     'postip' => getonlineip()   
  17. );   
  18. inserttable('blogfield', $fieldarr);
复制代码
http://www.trindo.cn
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-9 19:11 , Processed in 0.075980 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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