本帖最后由 shinian315 于 2009-9-8 14:37 编辑
今天公司使用的UCHOME的从1.5升级成2.0后,将后台日志推到首页后发现日志的浏览地址中参数uid的值为0,所以点开后出错,于是查找了下代码,发现了一个1.5版本中日志导入的错误。
首先分析导入日志的文件cp_import.php这个文件,不难发现这段代码:- //开始导入
- $blogarr = array(
- 'uid' => $_SGLOBAL['supe_uid'],
- 'username' => $_SGLOBAL['supe_username'],
- 'subject' => $subject,
- 'pic' => getmessagepic($message),
- 'dateline' => $dateline?$dateline:$_SGLOBAL['timestamp']
- );
- $blogid = inserttable('blog', $blogarr, 1);
-
- //插入内容
- $fieldarr = array(
- 'blogid' => $blogid,
- 'message' => $message,
- 'postip' => getonlineip()
- );
- inserttable('blogfield', $fieldarr);
复制代码 这段代码的作用就是将通过XML分析好的日志记录插入到blog表和blogfield表中。
这是我们来看UCHOME首页按热度读取日志的代码,分析network.php,看下面这段代码:
- include_once(S_ROOT.'./data/data_network.php');
-
- //日志
- $cachefile = S_ROOT.'./data/cache_network_blog.txt';
- if(check_network_cache('blog')) {
- $bloglist = unserialize(sreadfile($cachefile));
- } else {
- $sqlarr = mk_network_sql('blog',
- array('blogid', 'uid'),
- array('hot','viewnum','replynum'),
- array('dateline'),
- array('dateline','viewnum','replynum','hot')
- );
- extract($sqlarr);
-
- //隐私
- $wherearr[] = "main.friend='0'";
-
- //显示数量
- $shownum = 6;
-
- $query = $_SGLOBAL['db']->query("SELECT main.*, field.*
- FROM ".tname('blog')." main
- LEFT JOIN ".tname('blogfield')." field ON field.blogid=main.blogid
- WHERE ".implode(' AND ', $wherearr)."
- ORDER BY main.{$order} $sc LIMIT 0,$shownum");
- $bloglist = array();
- while ($value = $_SGLOBAL['db']->fetch_array($query)) {
- $value['message'] = getstr($value['message'], 86, 0, 0, 0, 0, -1);
- $value['subject'] = getstr($value['subject'], 50, 0, 0, 0, 0, -1);
- $bloglist[] = $value;
- }
- if($_SGLOBAL['network']['blog']['cache']) {
- swritefile($cachefile, serialize($bloglist));
- }
- }
- foreach($bloglist as $key => $value) {
- realname_set($value['uid'], $value['username']);
- $bloglist[$key] = $value;
- }
复制代码 可以看出首页的日志数据室是放在$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表里,这样问题就不会出现了。代码如下:
- //开始导入
- $blogarr = array(
- 'uid' => $_SGLOBAL['supe_uid'],
- 'username' => $_SGLOBAL['supe_username'],
- 'subject' => $subject,
- 'pic' => getmessagepic($message),
- 'dateline' => $dateline?$dateline:$_SGLOBAL['timestamp']
- );
- $blogid = inserttable('blog', $blogarr, 1);
-
- //插入内容
- $fieldarr = array(
- 'blogid' => $blogid,
- 'uid' => $_SGLOBAL['supe_uid'],//就是这句的差别
- 'message' => $message,
- 'postip' => getonlineip()
- );
- inserttable('blogfield', $fieldarr);
复制代码 http://www.trindo.cn |