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

 找回密码
 立即注册
搜索

[已答复] 那位高手能帮忙分析下SS发布资讯时tag入库的函数?

[复制链接]
cctext 发表于 2009-8-14 05:39:49 | 显示全部楼层 |阅读模式
那位高手能帮忙分析下SS发布资讯时tag入库的函数?

admin_spacenews.php
最后面有一堆是关于TAG的,不过对SS整个数据库操作的函数调用不熟悉。。
自己的PHP也不过关,没能把整个的流程搞清楚。。。

先谢谢啦
回复

使用道具 举报

lidq.jingwu 发表于 2009-8-14 09:33:33 | 显示全部楼层
对tag的处理分为两种:1、单个tag。2、相关tag
单个tag是直接从页面传来的参数中截取的。
相关tag是经过字符串函数的相关处理后,再进行序列化,然后才是进数据库的。
处理tag的函数主要有以下三个:

  1. //获取相关TAG
  2. function postgetincludetags($message, $tagnamearr) {
  3.         global $_SGLOBAL;
  4.        
  5.         $postincludetags = '';
  6.         if(!file_exists(S_ROOT.'./data/system/tag.cache.php')) {
  7.                 include_once(S_ROOT.'./include/cron/tagcontent.php');
  8.         }
  9.         @include_once(S_ROOT.'./data/system/tag.cache.php');
  10.         if(empty($_SGLOBAL['tagcontent'])) $_SGLOBAL['tagcontent'] = '';
  11.         $tagtext = implode('|', $tagnamearr).'|'.$_SGLOBAL['tagcontent'];
  12.         $postincludetags = getincluetags($message, $tagtext);
  13.         return $postincludetags;
  14. }

  15. //获取内容中包含的TAG
  16. function getincluetags($text, $tagtext) {
  17.         $resultarr = array();
  18.         $tagtext = str_replace('/', '\/', $tagtext);
  19.         preg_match_all("/($tagtext)/", $text, $matches);
  20.         if(!empty($matches[1]) && is_array($matches[1])) {
  21.                 foreach ($matches[1] as $value) {
  22.                         if(strlen($value)>2) $resultarr[$value] = $value;
  23.                 }
  24.         }
  25.         return implode("\t", $resultarr);
  26. }

  27. //信息TAG关联处理
  28. function postspacetag($op, $type, $itemid, $tagarr) {
  29.         global $_SGLOBAL;

  30.         $colnumname = "space{$type}num";
  31.         $deletetagidarr = $addtagidarr = $spacetagidarr = array();
  32.         if($op == 'add') {
  33.                 if(!empty($tagarr['existsid'])) {
  34.                         $addtagidarr = $tagarr['existsid'];
  35.                         $_SGLOBAL['db']->query('UPDATE '.tname('tags').' SET '.$colnumname.'='.$colnumname.'+1 WHERE tagid IN ('.simplode($tagarr['existsid']).')');
  36.                 }
  37.         } else {
  38.                 $query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('spacetags').' WHERE itemid=\''.$itemid.'\'');
  39.                 while ($spacetag = $_SGLOBAL['db']->fetch_array($query)) {
  40.                         if(!empty($tagarr['existsid']) && in_array($spacetag['tagid'], $tagarr['existsid'])) {
  41.                                 $spacetagidarr[] = $spacetag['tagid'];
  42.                         } else {
  43.                                 $deletetagidarr[] = $spacetag['tagid'];
  44.                         }
  45.                 }
  46.                 foreach ($tagarr['existsid'] as $etagid) {
  47.                         if(!empty($spacetagidarr) && in_array($etagid, $spacetagidarr)) {
  48.                         } else {
  49.                                 $addtagidarr[] = $etagid;
  50.                         }
  51.                 }
  52.                 if(!empty($deletetagidarr)) {
  53.                         $_SGLOBAL['db']->query('DELETE FROM '.tname('spacetags').' WHERE itemid='.$itemid.' AND tagid IN ('.simplode($deletetagidarr).')');
  54.                         $_SGLOBAL['db']->query('UPDATE '.tname('tags').' SET  '.$colnumname.'='.$colnumname.'-1 WHERE tagid IN ('.simplode($deletetagidarr).')');
  55.                 }
  56.                 if(!empty($addtagidarr)) {
  57.                         $_SGLOBAL['db']->query('UPDATE '.tname('tags').' SET '.$colnumname.'='.$colnumname.'+1 WHERE tagid IN ('.simplode($addtagidarr).')');
  58.                 }
  59.         }
  60.         //TAG
  61.         if(!empty($tagarr['nonename'])) {
  62.                 foreach ($tagarr['nonename'] as $posttagname) {
  63.                         $insertsqlarr = array(
  64.                                 'tagname' => $posttagname,
  65.                                 'uid' => $_SGLOBAL['supe_uid'],
  66.                                 'username' => $_SGLOBAL['supe_username'],
  67.                                 'dateline' => $_SGLOBAL['timestamp'],
  68.                                 $colnumname => 1
  69.                         );
  70.                         $addtagidarr[] = inserttable('tags', $insertsqlarr, 1);                       
  71.                 }
  72.         }
  73.         if(!empty($addtagidarr)) {
  74.                 $insertstr = $comma = '';
  75.                 foreach ($addtagidarr as $tagid) {
  76.                         $insertstr .= $comma.'(\''.$itemid.'\',\''.$tagid.'\',\''.$_SGLOBAL['timestamp'].'\',\''.$type.'\')';
  77.                         $comma = ',';
  78.                 }
  79.                 $_SGLOBAL['db']->query('REPLACE INTO '.tname('spacetags').' (itemid, tagid, dateline, type) VALUES '.$insertstr);
  80.         }
  81. }

复制代码
回复

使用道具 举报

 楼主| cctext 发表于 2009-8-14 15:01:28 | 显示全部楼层
那请问
$_SGLOBAL['db']->query()
的函数主体在哪里?
因为如果新加的Tag的话要同时写supe_tags,supe_spacetags两个关联的表,上面几个函数都是单独写的,怎么做到关联呢?没看到SELECT LAST_INSERT_ID(),mysql_insert_id()之类的,那他怎么实现更新两个关联表的?
$_SGLOBAL['db']->query()的主体函数翻不到在哪里。。要不就是我看不懂,菜啊。。

另外如果想在自己新建的一个页面(非SS系统相关页面)中调用$_SGLOBAL的函数/参数该怎么调用?include config.php?
回复

使用道具 举报

lidq.jingwu 发表于 2009-8-14 15:08:24 | 显示全部楼层
对数据库操作的主体函数是封装在类里面的,在class/db_mysql.class.php文件中。
上面的几个函数是单独写的,在每个函数中都有参数,数据就是通过这些参数来传递的。
如果某些数据找不找,那就是在全局变量里面了。

如果是执行相应的php程序,那么要包含common.php文件。
如果只是加载一个模板文件,用 include template();
回复

使用道具 举报

 楼主| cctext 发表于 2009-8-14 15:36:02 | 显示全部楼层
谢谢~谢谢~
我先找找看~
有问题再来~
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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