Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。
1、登出discuz后台,再次设计插件 2、使用变量 2、使用变量
common/common.css 是一个通用的css文件。 common/module.css 是某个功能模块使用的css文件。 module.css中,利用特殊语法: /** 标识 **/ css
1、如何保证主题被回复时业务代码被执行。 2、获得主题,主题发布者,贴子等信息。 3、discuz发送email邮件。 discuz使用嵌入点(钩子)来处理代码的执行时机。 当用户开启插件开发者模式时
如果涉及到页面的展示,模板,提示信息,通常会 1、建立好需要的文字的翻译 在disucz的data/plugindata目录创建一个插件所使用的语言文件,命名方式为: 插件标识符.lang.php,如
1、获取用户提交数据 discuz通过$_GET来获取全部数据,包括($_GET,$_POST)。 else if($_GET['pluginop'] == 'set'
1、discuz目录下template为模板目录 模板套系 discuz每套模板,支持不同的风格,而多个风格组成一套套系。 推荐使用复制的方法创建新的风格 (*默认的公共页面静态资源,存储在discu
通过discuz的sendmail()来发送邮件 //引入发送邮件的函数文件 include libfile('function/mail'); //设置收件人地址,标题,内容发送邮件
discuz目录结构 discuz的代码也是符合mvc的架构思想 http://www.xxx.com/home.php?mod=spacecp&ac=avatar home.php 表示的一
class dbstuff {var $querynum = 0;var $link;var $charset;var $sqls = array(); //自己添加,存储所有执行的sql语句 uican 2009-12-09/*** 连接数据库** @param string $dbhost* @param string $dbuser* @param string $dbpw* @param string $dbname* @param int $pconnect 0为非持久连接 1为持久连接* @param bool $halt*/function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE) {if($pconnect) {if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {$halt && $this->halt('Can not connect to MySQL server');}} else {if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw, 1)) {$halt && $this->halt('Can not connect to MySQL server');}}if($this->version() > '4.1') {if($this->charset) {@mysql_query("SET character_set_connection=$this->charset, character_set_results=$this->charset, character_set_client=binary", $this->link);}if($this->version() > '5.0.1') {@mysql_query("SET sql_mode=''", $this->link);}}//选择数据库if($dbname) {@mysql_select_db($dbname, $this->link);}}/*** 选择数据库** @param string $dbname* @return bool*/function select_db($dbname) {return mysql_select_db($dbname, $this->link);}/*** 获取查询的数组** @param object $query* @param string $result_type MYSQL_ASSOC 只得到关联索引,MYSQL_NUM 只得到数字索* @return array*/function fetch_array($query, $result_type = MYSQL_ASSOC) {return mysql_fetch_array($query, $result_type);}/*** 执行一条sql语句** @param string $sql* @param string $type 如果$type为UNBUFFERED:则执行mysql_unbuffered_query();他与mysql_query的区别是,执行后不获取和缓存结果的行* @return object*/function query($sql, $type = '') {if(D_BUG) {global $_SGLOBAL;$sqlstarttime = $sqlendttime = 0;$mtime = explode(' ', microtime());$sqlstarttime = number_format(($mtime[1] + $mtime[0] - $_SGLOBAL['supe_starttime']), 6) * 1000;}$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?'mysql_unbuffered_query' : 'mysql_query';if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {$this->halt('MySQL Query Error', $sql);}if(D_BUG) {$mtime = explode(' ', microtime());$sqlendttime = number_format(($mtime[1] + $mtime[0] - $_SGLOBAL['supe_starttime']), 6) * 1000;$sqltime = round(($sqlendttime - $sqlstarttime), 3);$explain = array();$info = mysql_info();if($query && preg_match("/^(select )/i", $sql)) {$explain = mysql_fetch_assoc(mysql_query('EXPLAIN '.$sql, $this->link));}$_SGLOBAL['debug_query'][] = array('sql'=>$sql, 'time'=>$sqltime, 'info'=>$info, 'explain'=>$explain);}$this->querynum++;$this->sqls[] = $this->querynum.' '.$sql.'<br/>';return $query;}/*** 取得前一次操作影响的记录数** @return int*/function affected_rows() {return mysql_affected_rows($this->link);}/*** 返回mysql 操作产生的错误信息** @return string*/function error() {return (($this->link) ? mysql_error($this->link) : mysql_error());}/*** 返回mysql 操作参数的错误信息的编号** @return int*/function errno() {return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());}/*** 取得指定结果集** @param object $query* @param int $row* @return string*/function result($query, $row) {$query = @mysql_result($query, $row);return $query;}/*** 取得结果集的行数** @param object $query* @return int*/function num_rows($query) {$query = mysql_num_rows($query);return $query;}/*** 取得结果集的字段数** @param object $query* @return int*/function num_fields($query) {return mysql_num_fields($query);}/*** 释放结果内存** @param object $query* @return bool*/function free_result($query) {return mysql_free_result($query);}/*** 取得上一步插入的id** @return int*/function insert_id() {return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);}/*** 从查询结果中取一条记录** @param object $query* @return array*/function fetch_row($query) {$query = mysql_fetch_row($query);return $query;}/*** 从查询结果中获取列信息** @param object $query* @return array*/function fetch_fields($query) {return mysql_fetch_field($query);}/*** Enter 获取mysql 数据库版本** @return string*/function version() {return mysql_get_server_info($this->link);}/*** 关闭数据库** @return bool*/function close() {return mysql_close($this->link);}/*** 错误提示** @param string $message* @param string $sql*/function halt($message = '', $sql = '') {$dberror = $this->error();$dberrno = $this->errno();$help_link = "http://faq.comsenz.com/?type=mysql&dberrno=".rawurlencode($dberrno)."&dberror=".rawurlencode($dberror);echo "<div position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;padding:0.5em;"><b>MySQL Error</b><br><b>Message</b>: $message<br><b>SQL</b>: $sql<br><b>Error</b>: $dberror<br><b>Errno.</b>: $dberrno<br><a href="$help_link" target="_blank">Click here to seek help.</a></div>";exit();}}
Uchome中的$_SGLOBAL:各类全局信息$_SGLOBAL: Array([timestamp] => 1254829664 //程序开始执行的时间[supe_starttime] => 1254829664.1719[db] => dbstuff Object //数据库对象([querynum] => 3 //查询的次数[link] => Resource id #7 //数据库连接[charset] => utf8 // 数据库字符)[app] => Array([1] => Array([name] => Discuz![url] => http://localhost/bbs[type] => DISCUZ[open] => 1[icon] => discuz)[2] => Array([name] => 个人家园[url] => http://localhost/home[type] => UCHOME[open] => 0[icon] => uchome))[userapp] => Array()[ad] => Array()[supe_uid] => 1 //当前用户id[supe_username] => admin //用户名[inajax] => 0[ajaxmenuid] =>[refer] => http://localhost/home/space.php?do=mtag[session] => Array([uid] => 1[username] => admin[password] => 8ae86ee69cba169f8691011ea3c5691f[lastactivity] => 1254829662[ip] => 127000000)[username] => admin[my_menu] => Array()[my_userapp] => Array()[my_menu_more] => 0[appmenu] => Array([name] => uican[url] => http://localhost/bbs[type] => DISCUZ[open] => 1[icon] => discuz)[appmenus] => Array()[member] => Array //登陆用户的所有信息 space表和spacefiled 表复合查询([uid] => 1[sex] => 0[email] =>[emailcheck] => 0[qq] =>[msn] =>[birthyear] => 0[birthmonth] => 0[birthday] => 0[blood] =>[marry] => 0[birthprovince] =>[birthcity] =>[resideprovince] =>[residecity] =>[note] =>[spacenote] =>[authstr] =>[theme] =>[nocss] => 0[menunum] => 0[css][/css] =>[privacy] => Array([view] => Array([index] => 0[profile] => 0[friend] => 0[wall] => 0[feed] => 0[doing] => 0[blog] => 0[album] => 0[share] => 0[mtag] => 0)[feed] => Array([doing] => 1[blog] => 1[album] => 1[upload] => 1[share] => 1[thread] => 1[post] => 1[mtag] => 1[friend] => 1[comment] => 1[trace] => 1))[friend] =>[feedfriend] =>[sendmail] =>[groupid] => 1[credit] => 0[username] => admin[name] =>[namestatus] => 0[domain] =>[viewnum] => 0[notenum] => 0[friendnum] => 0[dateline] => 1245599521[updatetime] => 0[lastsearch] => 0[lastpost] => 0[lastlogin] => 1254829560[lastsend] => 0[attachsize] => 0[addsize] => 0[flag] => 1 //空间是否被锁定 -1为锁定[newpm] => 0[avatar] => 0 //是否上传过头像[ip] => 127000000[mood] => 0[self] => 1[friends] => Array())[space_1_uid] => Array([uid] => 1[sex] => 1[email] =>[emailcheck] => 0[qq] =>[msn] =>[birthyear] => 0[birthmonth] => 0[birthday] => 0[blood] =>[marry] => 0[birthprovince] =>[birthcity] =>[resideprovince] =>[residecity] =>[note] =>[spacenote] =>[authstr] =>[theme] => t10[nocss] => 0[menunum] => 0[css][/css] =>[privacy] => Array([view] => Array([index] => 0[profile] => 0[friend] => 0[wall] => 0[feed] => 0[doing] => 0[blog] => 0[album] => 0[share] => 0[mtag] => 0)[feed] => Array([doing] => 1[blog] => 1[album] => 1[upload] => 1[share] => 1[thread] => 1[post] => 1[mtag] => 1[friend] => 1[comment] => 1[trace] => 1))[friend] =>[feedfriend] =>[sendmail] =>[groupid] => 1[credit] => 0[username] => admin[name] => 晴枫[namestatus] => 1[domain] =>[viewnum] => 0[notenum] => 0[friendnum] => 0[dateline] => 1245599521[updatetime] => 0[lastsearch] => 0[lastpost] => 0[lastlogin] => 1254831926[lastsend] => 0[attachsize] => 0[addsize] => 0[flag] => 1[newpm] => 0[avatar] => 0[ip] => 127000000[mood] => 0[self] => 1[friends] => Array())[profield] => Array([1] => Array([fieldid] => 1[title] => 自由联盟[note] =>[formtype] => text[inputnum] => 100[choice] =>[mtagminnum] => 0[manualmoderator] => 0[manualmember] => 1[displayorder] => 0)[2] => Array([fieldid] => 2[title] => 地区联盟[note] =>[formtype] => text[inputnum] => 100[choice] =>[mtagminnum] => 0[manualmoderator] => 0[manualmember] => 1[displayorder] => 0))[usergroup] => Array([1] => Array([gid] => 1[grouptitle] => 站点管理员[system] => -1[creditlower] => 0[maxfriendnum] => 0[maxattachsize] => 0[allowhtml] => 1[allowcomment] => 1[searchinterval] => 0[postinterval] => 0[allowblog] => 1[allowdoing] => 1[allowupload] => 1[allowshare] => 1[allowmtag] => 1[allowthread] => 1[allowpost] => 1[allowcss] => 1[allowpoke] => 1[allowfriend] => 1[allowtrace] => 1[edittrail] => 0[domainlength] => 1[closeignore] => 1[seccode] => 0[color] => red[icon] => image/group/admin.gif[manageconfig] => 1[managenetwork] => 1[manageprofilefield] => 1[manageprofield] => 1[manageusergroup] => 1[managefeed] => 1[manageshare] => 1[managedoing] => 1[manageblog] => 1[managetag] => 1[managetagtpl] => 0[managealbum] => 1[managecomment] => 1[managemtag] => 1[managethread] => 1[managespace] => 1[managecensor] => 1[managead] => 1[managesitefeed] => 1[manage
$_SCOOKIE:Cookie信息 $_SCOOKIE: Array([loginuser] => admin[checkpm] => 1[synfriend] => 1[sendmail] => 1[auth] => 61087Cgwu3hoB35cDmXGpe3juvbjJQC2e+wlWJ7...)$_SN:昵称信息 $_SN: Array([1] => uican)
$_SCONFIG:个人空间配置$_SCONFIG: Array$_SCONFIG: Array([sitename] => 开心happy社区[sitelogo] => image/logo.gif[template] => default[adminemail] => admin@admin.com[onlinehold] => 1800[timeoffset] => 8[maxpage] => 50[starcredit] => 100[starlevelnum] => 5[cachemode] => database[cachegrade] => 0[allowcache] => 1[allowdomain] => 0[allowrewrite] => 0[allowwatermark] => 0[allowftp] => 0[holddomain] => www|*blog*|*space*|x[mtagminnum] => 5[feedday] => 15[feedmaxnum] => 50[feedfilternum] => 10[importnum] => 100[singlesent] => 50[groupnum] => 8[closeregister] => 0[closeinvite] => 0[close] => 0 //站点是否关闭[networkpublic] => 1[networkpage] => 1[networkupdate] => 300[seccode_register] => 1[uc_tagrelated] => 1[manualmoderator] => 1[linkguide] => 1[showall] => 1[sendmailday] => 0[realname] => 0[namecheck] => 0[namechange] => 0[name_allowfriend] => 1[name_allowpoke] => 1[name_allowdoing] => 1[name_allowblog] => 1[name_allowalbum] => 1[name_allowthread] => 1[name_allowshare] => 1[name_allowcomment] => 1[name_allowpost] => 1[showallfriendnum] => 10[feedtargetblank] => 1[feedread] => 1[feedhotnum] => 3[feedhotday] => 2[feedhotmin] => 3 //定义的最少热度[uc_tagrelatedtime] => 86400[privacy] => Array([view] => Array([index] => 0[profile] => 0[friend] => 0[wall] => 0[feed] => 0[doing] => 0[blog] => 0[album] => 0[share] => 0[mtag] => 0)[feed] => Array([doing] => 1[blog] => 1[album] => 1[upload] => 1[share] => 1[thread] => 1[post] => 1[mtag] => 1[friend] => 1[comment] => 1[trace] => 1))[cronnextrun] => 1254829800[my_status] => 0 //uc应用是否打开[sitekey] => 2a37854626AdS662[siteallurl] => http://localhost/home/[licensed] => 0[debuginfo] => 0[miibeian] =>[headercharset] => 0[avatarreal] => 0[uc_dir] =>[my_ip] =>[closereason] =>[feeddefaultfilter] => all[my_closecheckupdate] => 0[spacebarusername] =>[defaultfusername] =>[domainroot] =>[ftpurl] =>[login_action] => 1812d4b322672381d1dc7396a8a52ef7[register_action] => 0d7f87d7c19770cac7d20679586b362f)
$_SC:系统全局配置$_SBLOCK:未知$_SCONFIG:站点配置信息(跟数据表uchome_config挂钩)$_SCOOKIE:Cookie信息$_SGLOBAL:各类全局信息$_SN:昵称信息$_TPL:未知$_SC:系统全局配置查看源代码打印帮助01$_SC: Array02(03  [dbhost] => localhost04  [dbuser] => root05  [dbpw] => root06  [dbcharset] => utf807  [pconnect] => 008  [dbname] => uchome09  [tablepre] => uchome_   //数据库表前缀10  [charset] => utf-811  [gzipcompress] => 012  [cookiepre] => uchome_13  [cookiedomain] =>14  [cookiepath] => /15  [attachdir] => ./attachment/16  [attachurl] => attachment/17  [siteurl] => http://localhost/uchome/18  [tplrefresh] => 019  [founder] => 120  [allowedittpl] => 021)
 代码  1 代码   2 <?php  3 /*  4     [UCenter Home] (C) 2007-2008 Comsenz Inc.  5     $Id: common.php 13217 2009-9-25 ymaozi http://www.codedesign.cn  6 */  7   8 @define('IN_UCHOME', TRUE);  //定义IN_UCHOME  9 define('D_BUG', '0');  //定义错误等级 10  11 D_BUG?error_reporting(7):error_reporting(0); 12 set_magic_quotes_runtime(0);  //关闭自动转义功能 13  14 $_SGLOBAL = $_SCONFIG = $_SBLOCK = $_TPL = $_SCOOKIE = $_SN = $space = array(); 15  16 //程序目录 17 define('S_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);   //定义程序的根目录 18  19 //基本文件 20 include_once(S_ROOT.'./ver.php');    //导入uchome的一些版本信息 21 if(!@include_once(S_ROOT.'./config.php')) {  //判断是否存在网站配置文件,不存在的话,安装网站 22     header("Location: install/index.php");//安装 23     exit(); 24 } 25 include_once(S_ROOT.'./source/function_common.php');  //引入公共函数文件 26  27 //时间 28 $mtime = explode(' ', microtime());   //将当前的时间,微秒与年/月/日 时/分/秒 分隔开 29 $_SGLOBAL['timestamp'] = $mtime[1]; //取得当前的年/月/日 时/分/钞 30 $_SGLOBAL['supe_starttime'] = $_SGLOBAL['timestamp'] + $mtime[0];  //年/月/日 时/分/钞 + 微秒 31  32 //GPC过滤 33 $magic_quote = get_magic_quotes_gpc();  //是否开启了自动转义功能 34 if(empty($magic_quote)) {    //如果没有开启则手动对提交的$_POST,$_GET进行转义 35     $_GET = saddslashes($_GET); 36     $_POST = saddslashes($_POST); 37 } 38  39 //本站URL 40 if(empty($_SC['siteurl'])) $_SC['siteurl'] = getsiteurl(); 41  42 //链接数据库 43 dbconnect(); 44  45 //缓存文件 46 if(!@include_once(S_ROOT.'./data/data_config.php')) { //是否存在网站初始化信息的缓存 47     include_once(S_ROOT.'./source/function_cache.php'); //如果不存在,则引入处理缓存的文件 48     config_cache();   //创建缓存文件 49     include_once(S_ROOT.'./data/data_config.php');  //将缓存文件引入 50 } 51 foreach (array('app', 'userapp', 'ad', 'magic') as $value) { 52     @include_once(S_ROOT.'./data/data_'.$value.'.php');    //导入app,userapp,ad,magic配置文件 53 } 54  55 //COOKIE 56 $prelength = strlen($_SC['cookiepre']);   //获取COOKIE前缀长度 57 foreach($_COOKIE as $key => $val) { 58     if(substr($key, 0, $prelength) == $_SC['cookiepre']) { 59         $_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val; 60     } 61 } 62  63 //启用GIP 64 if ($_SC['gzipcompress'] &amp;amp;&amp;amp; function_exists('ob_gzhandler')) { 65     ob_start('ob_gzhandler'); 66 } else { 67     ob_start(); 68 } 69  70 //初始化 71 $_SGLOBAL['supe_uid'] = 0; 72 $_SGLOBAL['supe_username'] = '';   //将用户的uid与username设置为空 73 $_SGLOBAL['inajax'] = empty($_GET['inajax'])?0:intval($_GET['inajax']);   //是否采用ajax 74 $_SGLOBAL['mobile'] = empty($_GET['mobile'])?'':trim($_GET['mobile']);   //获取$_GET提交的手机号 75 $_SGLOBAL['ajaxmenuid'] = empty($_GET['ajaxmenuid'])?'':$_GET['ajaxmenuid']; 76 $_SGLOBAL['refer'] = empty($_SERVER['HTTP_REFERER'])?'':$_SERVER['HTTP_REFERER'];  //获取上一页面的url 77 if(empty($_GET['m_timestamp']) || $_SGLOBAL['mobile'] != md5($_GET['m_timestamp']."t".$_SCONFIG['sitekey'])) $_SGLOBAL['mobile'] = ''; 78  79 //登录注册防灌水机 80 if(empty($_SCONFIG['login_action'])) $_SCONFIG['login_action'] = md5('login'.md5($_SCONFIG['sitekey'])); 81 if(empty($_SCONFIG['register_action'])) $_SCONFIG['register_action'] = md5('register'.md5($_SCONFIG['sitekey'])); 82  83 //整站风格 84 if(empty($_SCONFIG['template'])) { //如果没有设置网站的风格则采用default中的 85     $_SCONFIG['template'] = 'default'; 86 } 87 if($_SCOOKIE['mytemplate']) { 88     $_SCOOKIE['mytemplate'] = str_replace('.','',trim($_SCOOKIE['mytemplate'])); 89     if(file_exists(S_ROOT.'./template/'.$_SCOOKIE['mytemplate'].'/style.css')) { 90         $_SCONFIG['template'] = $_SCOOKIE['mytemplate']; 91     } else { 92         ssetcookie('mytemplate', '', 365000); 93     } 94 } 95  96 //url:http://u.codedesign.cn/space.php?do=home 97 //$_SERVER['REQUEST_URI']得到的:space.php?do=home 98 //$_SERVER['PHP_SELF'] 得到的:space.php 99 //$_SERVER['QUERY_STRING'] :     do=home100 //处理REQUEST_URI101 if(!isset($_SERVER['REQUEST_URI'])) {102     $_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'];103     if(isset($_SERVER['QUERY_STRING'])) $_SERVER['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];104 }105 if($_SERVER['REQUEST_URI']) {106     $temp = urldecode($_SERVER['REQUEST_URI']);107     if(strexists($temp, '<') || strexists($temp, '"')) {108         $_GET = shtmlspecialchars($_GET);//XSS109     }110 } 111 112 //判断用户登录状态113 checkauth(); //判断是否登录114 $_SGLOBAL['uhash'] = md5($_SGLOBAL['supe_uid']."t".substr($_SGLOBAL['timestamp'], 0, 6)); //将用户的uid与当前时间的前六位进行md5加密115 116 //用户菜单117 getuserapp();118
view sourceprint?01.<?php02./*03.    [UCenter Home] (C) 2007-2008 Comsenz Inc.04.    $Id: function_common.php 2009-10-20 21:12:0005.    @author ymaozi06.    @copyright http://www.codedesign.cn/07.    @uchome源码交流QQ群:8340026308.*/09.  10.if(!defined('IN_UCHOME')) {11.    exit('Access Denied');12.}13./**14. * SQL ADDSLASHES 对sql的一些字符进行转义15. * @param string or array $string16. * @return string or array17. */18.function saddslashes($string) {19.    if(is_array($string)) { //如果转入的是数组则对数组中的value进行递归转义20.        foreach($string as $key => $val) {21.            $string[$key] = saddslashes($val);22.        }23.    } else {24.        $string = addslashes($string); //对单引号(')、双引号(")、反斜线()与 NUL(NULL 字符),进行转义25.    }26.    return $string;27.}28.  29./**30. * 取消HTML代码31. * @param string or array $string32. * @return string or array33. */34.function shtmlspecialchars($string) {35.    if(is_array($string)) {36.        foreach($string as $key => $val) {37.            $string[$key] = shtmlspecialchars($val);38.        }39.    } else {40.        $string = preg_replace('/&((#(d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\1',41.            str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string));//将传入的html中的&,",<,>,进行替换42.    }43.    return $string;44.}view sourceprint?001./**002. * 清空cookie与一些判断用户登录的信息003. */004.function clearcookie() {005.    global $_SGLOBAL;006.  007.    obclean(); //清除缓存008.    ssetcookie('auth', '', -86400 * 365); //设置cookie名为auth的过期009.    $_SGLOBAL['supe_uid'] = 0;010.    $_SGLOBAL['supe_username'] = '';011.    $_SGLOBAL['member'] = array(); //将这些全局变量清空012.}013.  014.//cookie设置015./**016. * 设置cookie017. * @param   string  cookie名018. * @param   string  cookie值019. * @param   int     cookie存储时间020. * @return void021. */022.function ssetcookie($var, $value, $life=0) {023.    global $_SGLOBAL, $_SC, $_SERVER;024.    setcookie($_SC['cookiepre'].$var, $value, $life?($_SGLOBAL['timestamp']+$life):0, $_SC['cookiepath'], $_SC['cookiedomain'], $_SERVER['SERVER_PORT']==443?1:0);025.}026.  027.//028./**029. * 创建数据库连接对象030. */031.function dbconnect() {032.    global $_SGLOBAL, $_SC;033.  034.    include_once(S_ROOT.'./source/class_mysql.php'); //引入数据库操作类035.  036.    if(empty($_SGLOBAL['db'])) { //如果没有创建数据库对象,则创建037.        $_SGLOBAL['db'] = new dbstuff;038.        $_SGLOBAL['db']->charset = $_SC['dbcharset'];039.        $_SGLOBAL['db']->connect($_SC['dbhost'], $_SC['dbuser'], $_SC['dbpw'], $_SC['dbname'], $_SC['pconnect']);040.    }041.}042.  043.//获取在线IP044.function getonlineip($format=0) {045.    global $_SGLOBAL;046.  047.    if(empty($_SGLOBAL['onlineip'])) {048.        if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {049.            //如果存在客户端ip,并通过strcasecmp(),比较不等于unknown,则获取客户端ip050.                        $onlineip = getenv('HTTP_CLIENT_IP');051.        } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {052.            //如果存在代理ip,则获取代理ip053.                        $onlineip = getenv('HTTP_X_FORWARDED_FOR');054.        } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {055.            //代理服务器 IP056.                        $onlineip = getenv('REMOTE_ADDR');057.        } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {058.            $onlineip = $_SERVER['REMOTE_ADDR'];059.        }060.        preg_match("/[d.]{7,15}/", $onlineip, $onlineipmatches);061.                //通过正则检验,是否是ip地址的格式062.        $_SGLOBAL['onlineip'] = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';063.    }064.    if($format) {065.        $ips = explode('.', $_SGLOBAL['onlineip']); //将ip地址,以.为分隔存入到数组066.        for($i=0;$i<3;$i++) {067.            $ips[$i] = intval($ips[$i]);068.        }069.        return sprintf('%03d%03d%13d', $ips[0], $ips[1], $ips[2]);//返回ip地十的前三段,03d:三位整数,如果不足刚以0填充070.    } else {071.        return $_SGLOBAL['onlineip'];072.    }073.}074.  075.//076./**077. * 判断当前用户登录状态078. */079.function checkauth() {080.    global $_SGLOBAL, $_SC, $_SCONFIG, $_SCOOKIE, $_SN;081.  082.    if($_SGLOBAL['mobile'] && $_GET['m_auth']) $_SCOOKIE['auth'] = $_GET['m_auth'];083.    if($_SCOOKIE['auth']) { //如果设置了名了auth的cookie084.        @list($password, $uid) = explode("t", authcode($_SCOOKIE['auth'], 'DECODE')); //通过authcode()函数将加密过的auth进行解密,将解密的信息分别存在$password与$uid中085.        $_SGLOBAL['supe
 代码  1 /*  2     [UCenter Home] (C) 2007-2008 Comsenz Inc.  3     $Id: function_common.php 2009-10-20 21:12:00  4     @author ymaozi  5     @copyright http://www.codedesign.cn  6     @uchome源码交流QQ群:83400263  7 */  8 /**  9  * 获取表名 10  * @param string 表名 11  * @return string 加了表前缀的表名 12  */ 13 function tname($name) { 14     global $_SC; 15     return $_SC['tablepre'].$name; 16 } 17  18 /** 19  * 对话框 20  * @param string 转入的提示信息 21  * @param string 跳转的url 22  * @param int 跳转的时间 23  * 24  */ 25 function showmessage($msgkey, $url_forward='', $second=1, $values=array()) { 26     global $_SGLOBAL, $_SC, $_SCONFIG, $_TPL, $space, $_SN; 27  28     obclean(); //清除缓存 29  30     //去掉广告 31     $_SGLOBAL['ad'] = array(); 32  33     //语言 34     include_once(S_ROOT.'./language/lang_showmessage.php'); //引入语言文件 35     if(isset($_SGLOBAL['msglang'][$msgkey])) { //$_SGLOBAL['msglang']数组中是否存在$msgkey 36         $message = lang_replace($_SGLOBAL['msglang'][$msgkey], $values); 37     } else { 38         $message = $msgkey; 39     } 40     //手机 41     if($_SGLOBAL['mobile']) { 42         include template('showmessage'); 43         exit(); 44     } 45     //显示 46     if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) { 47         header("HTTP/1.1 301 Moved Permanently"); 48         header("Location: $url_forward"); 49     } else { 50         if($_SGLOBAL['inajax']) { 51             if($url_forward) { 52                 $message = "<a href="$url_forward">$message</a><ajaxok>"; 53             } 54             //$message = "<h1>".$_SGLOBAL['msglang']['box_title']."</h1><a href="javascript:;" onclick="hideMenu();" class="float_del">X</a><div class="popupmenu_inner">$message</div>"; 55             echo $message; 56             ob_out(); 57         } else { 58             if($url_forward) { 59                 $message = "<a href="$url_forward">$message</a><script>setTimeout("window.location.href ='$url_forward';", ".($second*1000).");</script>"; 60             } 61             include template('showmessage'); 62         } 63     } 64     exit(); 65 } 66  67 /** 68  * 判断提交是否正确 69  * @param string 提交的按钮名 70  * @return bool 71  */ 72 function submitcheck($var) { 73         //如果存在$var的值并且提交方法为post 74     if(!empty($_POST[$var]) && $_SERVER['REQUEST_METHOD'] == 'POST') { 75         if((empty($_SERVER['HTTP_REFERER']) || preg_replace("/https?://([^:/]+).*/i", "\1", $_SERVER['HTTP_REFERER']) == preg_replace("/([^:]+).*/", "\1", $_SERVER['HTTP_HOST'])) && $_POST['formhash'] == formhash()) { 76             return true; 77         } else { 78             showmessage('submit_invalid'); 79         } 80     } else { 81         return false; 82     } 83 } 84  85 /** 86  * 添加数据 87  * @global array $_SGLOBAL 88  * @param string $tablename 表名 89  * @param array $insertsqlarr 要插入的数组 90  * @param int $returnid 91  * @param bool $replace 92  * @param int $silent 93  * @return string 94  */ 95 function inserttable($tablename, $insertsqlarr, $returnid=0, $replace = false, $silent=0) { 96     global $_SGLOBAL; 97  98     $insertkeysql = $insertvaluesql = $comma = ''; 99     foreach ($insertsqlarr as $insert_key => $insert_value) {100         $insertkeysql .= $comma.'`'.$insert_key.'`'; //插入的键值101         $insertvaluesql .= $comma.'''.$insert_value.'''; //插入的值102         $comma = ', ';103     }104     $method = $replace?'REPLACE':'INSERT';105     $_SGLOBAL['db']->query($method.' INTO '.tname($tablename).' ('.$insertkeysql.') VALUES ('.$insertvaluesql.')', $silent?'SILENT':'');106     if($returnid && !$replace) { //如果$returnid为真,则返回插入的uid.107         return $_SGLOBAL['db']->insert_id();108     }109 }110 111 /**112  * 编辑信息113  * @global array $_SGLOBAL114  * @param string $tablename 更新的表名115  * @param array $setsqlarr 更新的字段116  * @param array $wheresqlarr where117  * @param int $silent118  */119 function updatetable($tablename, $setsqlarr, $wheresqlarr, $silent=0) {120     global $_SGLOBAL;121 122     $setsql = $comma = '';123     foreach ($setsqlarr as $set_key => $set_value) {124         if(is_array($set_value)) {125             $setsql .= $comma.'`'.$set_key.'`'.'='.$set_value[0];126         } else {127             $setsql .= $comma.'`'.$set_key.'`'.'=''.$set_value.''';128         }129         $comma = ', ';130     }131     $where = $comma = '';132     if(empty($wheresqlarr)) {133         $where = '1';134     } elseif(is_array($wheresqlarr)) {135         foreach ($wheresqlarr as $key =>
URL 静态化是一个利于搜索引擎的设置,通过 URL 静态化,达到原来是动态的 PHP 页面转换为静态化的 HTML 页面,当然,这里的静态化是一种假静态,目的只是提高搜索引擎的搜索量,Comsenz 旗下的产品 Discuz!、SupeSite/X-Space、ECShop、SupeV、UCHome 等都支持此功能。当然这个功能还需要服务器环境的支持,下面介绍一下如何在 Apache 服务器下配置 URL 静态化的 Rewrite 规则。当然这里分两种情况,一种是独立主机用户,这部分用户拥有对主机的管理权限,因此配置起来比较方便一些。(注:这里就以 Discuz!6.1.0 的 Rewrite 规则为例,稍后在后面会列举出其他产品的 Rewrite 规则。首先确定您使用的 Apache 版本,及是否加载了 mod_Rewrite 模块。Apache 1.x 的用户请检查 conf/httpd.conf 中是否存在如下两段代码:LoadModule Rewrite_module libexec/mod_Rewrite.soAddModule mod_Rewrite.cApache 2.x 的用户请检查 conf/httpd.conf 中是否存在如下一段代码:LoadModule Rewrite_module modules/mod_Rewrite.so如果存在,那么在配置文件(通常就是 conf/httpd.conf)中加入如下代码。此时请务必注意,如果网站使用通过虚拟主机来定义,请务必加到虚拟主机配置,即 <VirtualHost> 中去,如果加在虚拟主机配置外部将可能无法使用,改好后将 Apache 重启。<IfModule mod_Rewrite.c>RewriteEngine OnRewriteRule ^(.*)/archiver/((fid|tid)-[w-]+.html)$ $1/archiver/index.php?$2RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&page=$3RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/viewthread.php?tid=$2&extra=page%3D$4&page=$3RewriteRule ^(.*)/space-(username|uid)-(.+).html$ $1/space.php?$2=$3RewriteRule ^(.*)/tag-(.+).html$ $1/tag.php?name=$2</IfModule>如果没有安装 mod_Rewrite,您可以重新编译 Apache,并在原有 configure 的内容中加入 --enable-Rewrite=shared,然后再在 Apache 配置文件中加入上述代码即可。另外一种用户是 Apache 虚拟主机用户。在开始以下设置之前,请首先咨询您的空间服务商,空间是否支持 Rewrite 以及是否支持对站点目录中 .htaccess 的文件解析,否则即便按照下面的方法设置好了,也无法使用。检查论坛所在目录中是否存在 .htaccess 文件,如果不存在,请手工建立此文件。Win32 系统下,无法直接建立 .htaccess 文件,您可以从其他系统中拷贝一份,或者在 Discuz.net 技术支持栏目中下载此文件。编辑并修改 .htaccess 文件,添加以下内容:# 将 RewriteEngine 模式打开RewriteEngine On# 修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 /RewriteBase /discuz# Rewrite 系统规则请勿修改RewriteRule ^archiver/((fid|tid)-[w-]+.html)$ archiver/index.php?$1RewriteRule ^forum-([0-9]+)-([0-9]+).html$ forumdisplay.php?fid=$1&page=$2RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+).html$ viewthread.php?tid=$1&extra=page%3D$3&page=$2RewriteRule ^space-(username|uid)-(.+).html$ space.php?$1=$2RewriteRule ^tag-(.+).html$ tag.php?name=$1添加内容时,请遵照上面的提示,修改论坛所在的路径,然后保存。将 .htaccess 文件上传到论坛所在的目录中。然后进入论坛系统设置的搜索引擎优化,根据需要开启 URL 静态化功能。下面简单介绍一些其他产品的 Rewrite 规则。SupeSite/X-Space6.0 UC规则Apache 独立主机用户:<IfModule mod_Rewrite.c>RewriteEngine On###Rewrite 系统规则请勿修改RewriteRule ^/([0-9]+)/spacelist(.+)$ /index.php?uid/$1/action/spacelist/type$2 [L]RewriteRule ^/([0-9]+)/viewspace(.+)$ /index.php?uid/$1/action/viewspace/itemid$2 [L]RewriteRule ^/([0-9]+)/viewbbs(.+)$ /index.php?uid/$1/action/viewbbs/tid$2 [L]RewriteRule ^/([0-9]+)/(.*)$ /index.php?uid/$1/$2 [L]RewriteRule ^/([0-9]+)$ /index.php?uid/$1 [L]RewriteRule ^/action(.+)$ /index.php?action$1 [L]RewriteRule ^/category(.+)$ /index.php?action/category/catid$1 [L]RewriteRule ^/viewnews(.+)$ /index.php?action/viewnews/itemid$1 [L]RewriteRule ^/viewthread(.+)$ /index.php?action/viewthread/tid$1 [L]RewriteRule ^/mygroup(.+)$ /index.php?action/mygroup/gid$1 [L]</IfModule>Apache 虚拟主机用户:### 将 RewriteEngine 模式打开RewriteEngine On### 修改以下语句中的 /SupeSite 修改为你的SupeSite目录地址,如果程序放在根目录中,请将 /SupeSite 修改为 /RewriteBase /### Rewrite 系统规则请勿修改RewriteRule ^([0-9]+)/spacelist(.+)$ index.php?uid/$1/action/spacelist/type$2 [L]RewriteRule ^([0-9]+)/viewspace(.+)$ index.php?uid/$1/action/viewspace/itemid$2 [L]RewriteRule ^([0-9]+)/viewbbs(.+)$ index.php?uid/$1/action/viewbbs/tid$2 [L]RewriteRule ^([0-9]+)/(.*)$ index.php?uid/$1/$2 [L]RewriteRule ^([0-9]+)$ index.php?uid/$1 [L]RewriteRule ^action(.+)$ index.php?action$1 [L]RewriteRule ^category(.+)$ index.php?action/category/catid$1 [L]RewriteRule ^viewnews(.+)$ index.php?action/viewnews/itemid$1 [L]RewriteRule ^viewthread(.+)$ index.php?action/viewthread/tid$1 [L]RewriteRule ^mygroup(.+)$ index.php?action/mygroup/gid$1 [L]ECShop2.6.0 规则Apache 独立主机用户:<IfModule mod_Rewrite.c>RewriteEngine OnRewriteRule ^(.*)/index.html$ $1/index.phpRewriteRule ^(.*)/category$ $1/index.php [L]RewriteRule ^(.*)/feed-c([0-9]+).xml$ $1/feed.php?cat=$2 [L]RewriteRule ^(.*)/feed-b([0-9]+).xml$ $1/feed.php?brand=$2 [L]RewriteRule ^(.*)/feed.xml$ $1/feed.phpRewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*).html$ $1/category.php?id=$2&brand=$3&price_min=$4&price_max=$5&filter_attr=$6&page=$7&sort=$8&order=$9RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*).html$ $1/category.php?id=$2&brand=$3&price_min=$4&price_max=$5&filter_attr=$6RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*).html$ $1/category.php?id=$2&brand=$3&page=$4&sort=$5&order=$6RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*).html$ $1/category.php?id=$2&brand=$3&page=$4RewriteRule ^(.*)/category-([0-9]+)-b([0-9]+)(.*).html$ $1/category.php?id=$2&brand=$3RewriteRule ^(.*)/category-([0-9]+)(.*).html$ $1/category.php?id=$2RewriteRule ^(.*)/goods-([0-9]+)(.*).html$ $1/goods.php?id=$2RewriteRule ^(.*)/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*).html$ $1/article_cat.php?id=$2&page=$3&sort=$4&order=$5RewriteRule ^(.*)/article_cat-([0-9]+)-([0-9]+)(.*).html$
使用UCHome插件的用户越来越多,但所有的站都使用同样的同样的程序,没有自己的特色是很难推广开的。同时不同的站需要不同的功能,同时同一个站在不同的时期也有不同的功能需求,鉴于此,本人通过多款插件的开发经验,对UCHome程序也有了一定的认识。为了感谢广大站长对我的插件的关心,本人开贴,对UCHome程序进行全面解析。主要分为程序篇和模板篇。请希望学习UCHome的会员关注此贴。今天晚上准备第一章,index.php文件第一行就是包含了include_once('./common.php');文件所以先对common.php文件解析代码  1 <?php  2 /*  3         [UCenter Home] (C) 2007-2008 Comsenz Inc.  4         $Id: common.php 10981 2009-01-14 03:05:20Z liguode $  5 */  6 //定义一个常量,用来在其他页面中,防止被恶意用户直接调用其他PHP文件。  7 @define('IN_UCHOME', TRUE);  8 //定义一个常量,这个常量表示版本号  9 define('X_VER', '1.5'); 10 //这个也是一个常量,次版本号 11 define('X_RELEASE', '20090114'); 12 /*定义程序的调试模式,在我们调试程序的时候将常量值设为1,这样程序出错的时候会在页面显示错误信息。 13 在调试完毕正常投入使用后设为0,这样程序出错不会显示给用户。 14 */ 15 define('D_BUG', '0'); 16 //通过D_BUG常量值指定错误报告类型。其中error_reporting()的参数是错误报告类型,相关参数可查询PHP手册 17 D_BUG?error_reporting(7):error_reporting(0); 18 //这下面都是定义的全局变量。具体的会在后面使用的时候一一介绍 19 $_SGLOBAL = $_SCONFIG = $_SBLOCK = $_TPL = $_SCOOKIE = $_SN = $space = array(); 20 //定义程序目录常量。其中DIRECTORY_SEPARATOR是路径分隔符,linux上就是’/’ windows上是’’ 21 define('S_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR); 22  23 //加载基本的配置文件,用了@符号,达到找不到该文件时在页面不提示错误信息 24 if(!@include_once(S_ROOT.'./config.php')) { 25         //如果找不到的话则重定向到安装文件 26         header("Location: install/index.php"); 27         exit(); 28 } 29  30 //通用函数文件,具体函数在介绍时间会一一解释 31 include_once(S_ROOT.'./source/function_common.php'); 32 //时间microtime()获取含毫秒的时间 33 $mtime = explode(' ', microtime()); 34 $_SGLOBAL['timestamp'] = $mtime[1]; 35 //$mtime[0]为UNIX时间戳(整形), $mtime[0]为毫秒 36 $_SGLOBAL['supe_starttime'] = $_SGLOBAL['timestamp'] + $mtime[0]; 37  38 //get_magic_quotes_gpc检测PHP.INI配置中的魔术引号功能是否打开 39 $magic_quote = get_magic_quotes_gpc(); 40 if(empty($magic_quote)) { 41         //如果自动过滤每打开,则对传入的参数进行转义 42         $_GET = saddslashes($_GET); 43         $_POST = saddslashes($_POST); 44 } 45  46 //货主站点的URL,其中getsiteurl()是用来获取当前站点的域名 47 if(empty($_SC['siteurl'])) $_SC['siteurl'] = getsiteurl(); 48  49 //链接数据库 50 dbconnect(); 51  52 //打开缓存文件 53 foreach (array('config', 'app', 'userapp', 'ad') as $value) { 54         if(!@include_once(S_ROOT.'./data/data_'.$value.'.php')) { 55                 //如果缓存文件打开失败重建缓存,function_cache.php是包含建立缓存的函数文件 56                 include_once(S_ROOT.'./source/function_cache.php'); 57                 $cache_func = $value.'_cache'; 58                 //调用相应的函数来生成缓存。 59                 $cache_func(); 60         } 61 } 62  63 //获取COOKIE前缀的长度,$_SC['cookiepre']是在config.php中定义的COOKIE函数的前缀名称,$_COOKIE是存放COOKIE的数据全局变量数组 64 $prelength = strlen($_SC['cookiepre']); 65 foreach($_COOKIE as $key => $val) { 66         //判断当前域名下的COOKIE中属于UCHome的COOKIE 67         if(substr($key, 0, $prelength) == $_SC['cookiepre']) { 68                 //对COOKIE值进行转义 69                 $_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val; 70         } 71 } 72  73 //是否启用GIP压缩传输,这个是用来提高PHP传输速度的。 74 if ($_SC['gzipcompress'] && function_exists('ob_gzhandler')) { 75         ob_start('ob_gzhandler'); 76 } else { 77         ob_start(); 78 } 79  80 //初始化 81 $_SGLOBAL['supe_uid'] = 0; //初始化当前用户的UID 82 $_SGLOBAL['supe_username'] = ''; //初始化当前用户的用户名 83 $_SGLOBAL['inajax'] = empty($_GET['inajax'])?0:intval($_GET['inajax']); //这个是用来在页面中控制一些弹出框,在模板篇会介绍 84 $_SGLOBAL['ajaxmenuid'] = empty($_GET['ajaxmenuid'])?'':$_GET['ajaxmenuid']; 85 $_SGLOBAL['refer'] = empty($_SERVER['HTTP_REFERER'])?'':$_SERVER['HTTP_REFERER']; //获得上一页的URL,用来跳转 86  87 //登录注册防灌水机 88 /* 89 在登录或者注册的时候看到形如:do.php?ac=750e45d29d276b2f86f1445627c08f99的链接 90 后面的750e45d29d276b2f86f1445627c08f99就是用下面的来获取的。 91 */ 92 if(empty($_SCONFIG['login_action'])) $_SCONFIG['login_action'] = md5('login'.md5($_SCONFIG['sitekey'])); 93 if(empty($_SCONFIG['register_action'])) $_SCONFIG['register_action'] = md5('register'.md5($_SCONFIG['sitekey'])); 94  95 //整站风格,检查站点模板的路径。此处是default目录,就是我们常用黄色风格的模板路径 96 if(empty($_SCONFIG['template'])) { 97         $_SCONFIG['template'] = 'default'; 98 } 99 //在首页由下角可以自行选择风格的实现就是通过这段。100 if($_SCOOKIE['mytemplate']) {101         $_SCOOKIE['mytemplate'] = str_replace('.','',trim($_SCOOKIE['mytemplate']));102         if(file_exists(S_ROOT.'./template/'.$_SCOOKIE['mytemplate'].'/style.css')) {103                 $_SCONFIG['template'] = $_SCOOKIE['mytemplate'];104         } else {105                 ssetcookie('mytemplate', '');106         }107 }108 109 //处理REQUEST_URI,查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。 如为空则为当前页面。110 if(!isset($_SERVER['REQUEST_URI'])) {  111         $_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'];112         if(isset($_SERVER['QUERY_STRING'])) $_SERVER[&
第一集:授人以鱼不如授人以渔,UCHome全面大解析培训活动开展一继  授人以鱼不如授人以渔,UCHome全面大解析培训活动开展一之后,许多用户反应希望能从简单的开始,因此此系列活动进行相应的修改。本期主要介绍UCHOME的体系结构开始,一步一步教大家理解UCHOME。UCHOME安装后的主要目录与文件介绍:admin/      管理后台api/      API函数[插件开发与模板等的修改不需要动此文件]attachment/ 附件目录data/   缓存目录,此目录要有777权限,系统相关缓存基本上都在这里了   data/tpl_cache/ 模板缓存目录,注意,如果你的UCH白屏了,无法进入后台跟新缓存,通过FTP手工删除此目录下的所有文件即可相当于模板缓存的更新image/  图片目录language/   语言目录 ,跳转提示语言等source/  PHP源程序目录template/  模板目录theme/ 个人主页目录uc_client/ ucenter客户端 [插件开发与模板等的修改不需要动此文件]以下是UCHOME根目录下常用文件【不常用的不在介绍】admincp.php  后台管理入口文件common.php  通用文件,所有的文件都要包含这个文件,在上篇已详细解释了内容config.php  基本配置文件cp.php     编辑日志、相册、活动等等相关编辑操作基本上都从这个文件入口do.php   登录、注册、找回密码、相册批量上传、在需要密码的情况下才能查看日志相册、验证码、发送邮件、统计、邮件验证等行为的入口文件editor.php  编辑器的入口文件,强烈建议您不用动他magic.php  道具入口文件network.php 随便看看等入口文件space.php   个人空间、日志、相册、活动等入口文件我们一般修改UCH主要涉及的入口文件有space.php  network.php  do.php  cp.php 这四个,那么我们如何根据你访问的URL判断涉及到那些PHP文件和模板文件,方便您的进一步修改!好了,现在我们以最简单的do.php入口文件来分析下,举个列子,如果我们使用找回密码功能,通常链接如下:do.php?ac=lostpasswd,而注册的链接一般分两种,一种是do.php?ac=后台自定义登录识别名另一种是do.php?ac=随机好了,我们进入do.php文件中继续看看代码 1 include_once('./common.php'); //上节说了,这个是公用文件,在上篇已详细解释了内容 2  3 //获取方法 4 $ac = empty($_GET['ac'])?'':$_GET['ac']; //获取do.php?ac中ac的值 5  6 //自定义登录 7 if($ac == $_SCONFIG['login_action']) { 8 //这里的全局变量$_SCONFIG['login_action']就是ac=自定义标示名或那个随机串,如果相同则把原来的do.php?ac=XXXX抓换成类似效果do.php?ac=login 9     $ac = 'login';10 } elseif($ac == 'login') {11     $ac = '';12 }13 if($ac == $_SCONFIG['register_action']) {14 //这里的全局变量$_SCONFIG['register_action']15 //就是ac=就是后面的自定义标示名或那个随机串,如果相同则把原来的do.php?ac=XXXX抓换成类似效果do.php?ac=register16     $ac = 'register';17 } elseif($ac == 'register') {18     $ac = '';19 }20 21 //允许的方法22 //这里很重要,login对应的是登录,register定义的是注册,lostpasswd定义的是找回密码,与上面访问的URL是否是对应上了23 //对应上面的do.php?ac=login,do.php?ac=register,do.php?ac=lostpasswd,其他类似!如果ac后的参数不在下面的数组中,则为非法。跳转到首页24 $acs = array('login', 'register', 'lostpasswd', 'swfupload', 'inputpwd',25     'ajax', 'seccode', 'sendmail', 'stat', 'emailcheck');26 if(empty($ac) || !in_array($ac, $acs)) {27     showmessage('enter_the_space', 'index.php', 0);28 }29 30 //链接31 $theurl = 'do.php?ac='.$ac;32 //这是包含文件的意思,继续执行一下文件的意思,33 //其中S_ROOT是UCHOME安装目录的常量34 //根据下面的语句,我们可以这样判断,如果链接是do.php?ac=lostpasswd的话,程序继续执行source/do_lostpasswd.php文件!35 include_once(S_ROOT.'./source/do_'.$ac.'.php');不知道大家是否能理解,不理解多看几遍!好了,我们找到source/do_lostpasswd.php文件看下,这个文件代码较多,我们不用管他,最主要的是我们要找到其对应的模板,查找下include template这个语句【注:在其他php文件中可能有多个结果,那是因为不同条件下包含不同的模板】。你就会发现在末尾找到include template('do_lostpasswd');这就是模板名,这个记住规则,do_lostpasswd对应的模板是do_lostpasswd.htm名。那么这个文件在哪个位置呢?我们系统目录template/下有 默认的default,blue,green这三个文件夹,对应不同的风格,如果你安装了其他风格,可能还有其他目录。系统是如何查找do_lostpasswd.htm呢?大家记得在后台有一个模板选择的下拉表吗?系统会在你选择的模板风格文件夹下查找do_lostpasswd.htm,如果找不到则在去default目录下查找。注意: 为了提供效率,模板并不是每次都编译的,严格的来说,UCHOME会先判断对应的模板是否被解析过了【查找data/tpl_cache/目录下是否有对应的模板缓存】如果没有的话才会去按上面的规则去查找。基本上,按照以上思路就可以根据链接找到匹配的程序文件和模板文件了下节我们将会介绍几个制作模板中实用的诀窍及模板的解析原理。如如何修改程序让UCHOME每次都重新解析模板,而不生成缓存!
本节开始介绍UCH模板机制首先告诉大家一个小技巧,就是如何让系统每次自动更新缓存,免去每次修改模板后都要到后台更新缓存操作,记住,在解决完所有问题后,要在改回来,否则会大幅度提高服务器负担.打开source/function_common.php文件,找到if(!file_exists($objfile)) {      include_once(S_ROOT.'./source/function_template.php');      parse_template($tpl);} 修改成://if(!file_exists($objfile)) {      include_once(S_ROOT.'./source/function_template.php');      parse_template($tpl);//} 这样修改模板后就不用到后台更新缓存了下面开始讲一下模板中常用的标签及变量输出。一、变量:如我们在PHP文件中定义了一个变量并赋值了,如:$siteUrl='http://www.yiqi123.cn';$siteName='找插件网'; 那么如何在模板中输出呢?其实这个很简单:站点地址:$siteUrl站点名称:$siteName就可以输出结果:站点地址:http://www.yiqi123.cn站点名称:找插件网二、标签UCHOME模板中一般含有以下标签if标签,else标签,loop标签 ,eval标签1、if标签和 else标签主要是判断标签,格式如下<!---{if 条件}-->输出内容<!---{/if}-->和<!---{if 条件}-->输出内容1<!---{else}-->输出内容2<!---{/if}-->以上的 条件  可以是变量及合法的PHP函数及自定义函数。2、 loop标签loop标签是循环输出数组的,如果你不懂数组,那么请自行参考相关资料。格式一:<!--{loop $s $key $value}-->$value<!--{/loop}-->相当于PHP代码中foreach($s as $key=>$value){echo $value} 格式二:<!--{loop $s  $value}-->$value<!--{/loop}-->相当于PHP代码中foreach($s as  $value){echo $value} 注意:$s必须是二维数组。3、eval标签eval标签主要是用来在模板中执行php语法,在eval后必须紧跟合法的PHP语法,如:<!--{eval echo '这是PHP语法';}-->基本上UCHOME模板中的标签就这么几个,也是最常用的几个了    转自:http://www.yiqi123.cn/read.php?tid-26.html
1,要想开启mcrypt支持,系统需要安装了libmcrypt.dll库。这个一般用户是没有安装过的,但不用担心,PHP的windows发行包里已经给我们附带了此文件,在PHP压缩包的根目录下即可找到,然后将其复制到%system%/system32目录下即可。2,要想开启OpenSSL支持,系统需要安装libeay32.dll和ssleay32.dll两个库。如果你以前安装过OpenSSL,那么你的系统目录中应该已经存在这两个文件;如果没有安装,PHP的windows发行包里同样附带了这两个文件,将其复制到%system%/system32目录下即可。
装了个UCHOME,设置一些参数的时候发现了个问题,怎么弄也不能发送邮件,比较郁闷,去discuz查了N多资料,也还是不行,按照上面设置的步骤来,还是不可以,比较头疼,大致原因好像是这样环境:Windows操作系统,IIS6.0做为php解释引擎可能为windows原因,服务器又没有安装邮件系统,所以默认的发送方法不可行,也就是"通过 PHP 函数的 sendmail 发送(推荐此方式)",实验了N多次,不可以.没有办法,只好自己看代码修改了,通过第二种方式,也就是"通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)",但是实验了几个邮箱,QQ的没有发送成功,gmail没有发送成功,但是foxmail发送成功了.这个时候有点知道了,按理说应该是服务器设置原因,gmail必须要安全验证,也就是ssl发送才可以,看了下UCHOME的邮件发送代码,发现挺简单,加一句话就可以了.打开source/function_sendmail.php,查找fsockopen,然后修改这句为:fsockopen("ssl://".$mail['server'], $mail['port'], $errno, $errstr, 30)这样的话,就可以了,但是需要服务器支持OpenSSL,这个可以通过查看PHPINFO来确定是否支持,嘿嘿,本来偶的也不支持,但是联系了下陈哥,帮忙解决了.如何开启OpenSSL和mcrypt到此为止,OK了,Discuz论坛上一堆人文这个问题,但是没几个说怎么解决的,翻来覆去都是那么几个帖子,拜托,就那么几个选项还能不知道怎么填么,问题是根本没把问题描述清楚.- -#PS:而且sendmail.php这个文件在官方的程序里面貌似还没有?至少我这个版本里面没有,不知道大C他们搞什么呢.下面是这个文件的代码,放到/source/cron/文件夹下面就可以了. 代码  1 <?php  2 /*  3         [UCenter Home] (C) 2007-2008 Comsenz Inc.  4         $Id: sendmail.php 8302 2008-08-01 02:10:28Z liguode $  5 */  6 if(!defined('IN_UCHOME')) {  7         exit('Access Denied');  8 }  9  10 //防止超时 11 set_time_limit(0); 12  13 //一次发送邮件个数 14 $pernum = 5; 15  16 include_once(S_ROOT.'./source/function_sendmail.php'); 17  18 //获取发送队列 19 $emails = $touids = array(); 20 $query = $_SGLOBAL['db']->query("SELECT touid, email FROM ".tname('mailcron')." WHERE sendtime<='$_SGLOBAL[timestamp]' ORDER BY sendtime LIMIT 0,$pernum"); 21 while ($value = $_SGLOBAL['db']->fetch_array($query)) { 22         if($value['email']) { 23                 $emails[$value['email']] = $value['email']; 24         } elseif ($value['touid']) { 25                 $touids[$value['touid']] = $value['touid']; 26         } 27 } 28  29 //获取用户邮件 30 $useremails = $deluids = array(); 31 if($touids) { 32         $query = $_SGLOBAL['db']->query("SELECT sf.emailcheck, sf.email, s.uid, s.lastsend, s.updatetime 33                         FROM ".tname('space')." s 34                         LEFT JOIN ".tname('spacefield')." sf ON sf.uid=s.uid 35                         WHERE s.uid IN (".simplode($touids).")"); 36         while ($value = $_SGLOBAL['db']->fetch_array($query)) { 37                 if($_SCONFIG['sendmailday'] && $value['emailcheck'] && $value['email'] && ($_SGLOBAL['timestamp'] - $value['lastlogin'] > $_SCONFIG['sendmailday']*86400)) { 38                         $useremails[$value['uid']] = $value['email']; 39                 } else { 40                         $deluids[$value['uid']] = $value['uid']; 41                         unset($touids[$value['uid']]); 42                 } 43         } 44 } 45  46   47  48 //删除无效的用户邮件 49 if($deluids) { 50         $_SGLOBAL['db']->query("DELETE FROM ".tname('mailcron')." WHERE touid IN (".simplode($deluids).")"); 51         $_SGLOBAL['db']->query("DELETE FROM ".tname('mailqueue')." WHERE touid IN (".simplode($deluids).")"); 52 } 53  54 //获取邮件队列 55 $wherearr = $sends = $sendmails = array(); 56 if($emails) { 57         $wherearr[] = 'email IN ('.simplode($emails).')'; 58 } 59 if($touids) { 60         $wherearr[] = 'touid IN ('.simplode($touids).')'; 61 } 62  63 if($wherearr) { 64         $query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('mailqueue')." WHERE ".implode(' OR ', $wherearr)); 65         while ($value = $_SGLOBAL['db']->fetch_array($query)) { 66                 if($value['touid']) { 67                         $value['email'] = $useremails[$value['touid']]; 68                 } 69                 $sendmails[$value['email']] = $value['email']; 70                 $sends[$value['email']]['subject'][] = $value['subject']; 71                 $sends[$value['email']]['message'][] = $value['message']; 72                 $sends[$value['email']]['dateline'][] = $value['dateline']; 73         } 74         //删除当前已执行的队列 75         $_SGLOBAL['db']->query("DELETE FROM ".tname('mailcron')." WHERE ".implode(' OR ', $wherearr)); 76         $_SGLOBAL['db']->query("DELETE FROM ".tname('mailqueue')." WHERE ".implode(' OR ', $wherearr)); 77  78         //更新用户最后发送时间 79         if($touids) { 80                 $_SGLOBAL['db']->query("UPDATE ".tname('space')." SET lastsend='$_SGLOBAL[timestamp]' WHERE uid IN (".simplode($touids).")"); 81         } 82 } 83  84 //开始发送邮件 85 foreach ($sendmails as $email) { 86         $thesend = $sends[$email]; 87         $subject = $thesend['subject'][0]; 88         $message = ''; 89         foreach ($thesend[
showmessage();函数作用:对话框,用于信息提示,跳转功能。代码片断:showmessage(‘操作成功!’,’index.php’,5);解释:符合特定条件后,提示“操作成功!”5秒后跳转到index.php页。inserttable();  前3个参数 插入的表名称   数据数组 是否返回插入ID 默认0  函数作用:向数据库中某表插入记录。代码片断:$userinfo=array(‘username’ => ‘wufujun2000’,’sex’=>’男’);            $uid = inserttable(‘member’, $userinfo, 1);             if($uid){               showmessage(‘用户注册成功’,’index.php’);             }else{                showmessage(‘注册失败’);             }解释:建立一个数组,脚标分别对应数据库中的字段名,username赋值为wufujun,sex赋值为男,通过inserttable函数向数据库中的member表中插入记录,记录内容为$userinfo中的内容,参数1表示,插入成功后返回新插入记录的ID号,插入失败则不返回,通过判断$uid是否有值,来确定数据是否插入成功。updatetable();参数3 要更新的表 要更新的数据数组 条件数组函数作用:更新数据库中某表符合条件的记录。代码片断:$uid = 1            $userinfo=array(’sex’=>’女’);            updatetable(‘member’,$userinfo,array(‘uid’=>$uid));解释:更新member表中uid=1的记录,把sex的值改为‘女’。getspace();函数作用:获取用户空间信息。代码片断:$uid = 1            $space = getspace($uid,’uid’,0);解释:获取uid=1的用户空间信息。获取后的$space为数组变量,通过脚标得到最终想要的数据,如想获取用户名可以写成$username = $space[‘username’],其它空间信息数据以此类推。avatar ();函数作用:获取用户头像。代码片断:$uid = 1            avatar($uid,’small’);解释:此函数一般用于模板之中,获取用户头像。上面的片断为获取uid=1的用户的小头像,如要获取中或者大的头像,把’small’改成想应的’middle’或’big’。checkclose();函数作用:判断站点是否关闭。代码片断:checkclose();解释:这个函数一般写在代码的最开始,用于判断站点否关闭,如果在后台设置了站点关闭,那么在访问代码的时候,除了管理员,都会提示在后台设的站点关闭提示语.getstr();函数作用:获取字符串。这个函数是对字符串操作的,通过参数设定有很多的用处,比如可以去掉字符串里的html代码,词语屏蔽等功能,这里只介绍最常用也是最实用的功能--字符串截取。代码片断:$summarylen = 6;            $title = "好好学习天天向上";            $showtitle = getstr($showtitle, $summarylen);解释:把“好好学习天天向上”截取3个字,最后$showtitle的值为“好好学”,对于GBK的编码来说,一个汉字等于2个字节,也就是$summarylen=6截取的是3个汉字,UTF8的编码一个汉字等于3个字节,所以这段代码在UFT8的编码下最后$showtitle的值为“好好”。以上这些函数都是source/function_common.php文件里的,如果要用到这些函数,只要引用include_once('./common.php');这个文件即可。-----------------------------------------------------------------------------------------------------------------//判断字符串是否存在function strexists($haystack, $needle) {return !(strpos($haystack, $needle) === FALSE);}//获取文件名后缀function fileext($filename) {return strtolower(trim(substr(strrchr($filename, '.'), 1)));}//检查邮箱是否有效function isemail($email) {return strlen($email) > 6 && preg_match("/^[w-.]+@[w-.]+(.w+)+$/", $email);}///取数组中的随机个function sarray_rand($arr, $num) {$r_values = array();if($arr && count($arr) > $num) {   if($num > 1) {    $r_keys = array_rand($arr, $num);    foreach ($r_keys as $key) {     $r_values[$key] = $arr[$key];    }   } else {    $r_key = array_rand($arr, 1);    $r_values[$r_key] = $arr[$r_key];   }} else {   $r_values = $arr;}return $r_values;}转:http://hi.baidu.com/caixudong/blog/item/408015648ee881f8f636547a.html-------------------------------------------------------------------------------------------------------------------------source/function_template.php模板函数文件,提供模板文件的解析方法,被function_common文件中的template调用,将template目录下xxx.htm文件解析成xxx.php文件,将模板语法<!--{if $staffid}--><!--{/if}-->的代码转义为<?php if ($staffid) {?><?php } ?>,用 loop 来指代 foreach,解析的代码也不复杂,有兴趣可以仔细阅读下function_template.php文件里的parse_template方法,都是调用preg_replace进行正则表达式替换,通过这种方式,你就不用去编写混杂着<?php 和html的代码了,眼不见为净。性能的提高?交给下面的cache吧source/function_cache.php提供缓存的写入和更新,最重要的方法就是cache_write方法,看看声明:function cache_write($name, $var, $values)如果我想把员工数据缓存起来,那么对于$staff = array('name'=>'hankshuang','age'=>25)就调用方法cache_write('staffcache','staff',$staff)下次想用这个内容的话,直接include data目录下的这个data_staffcache.php文件,就得到$staff这个对象了,原理简单,用起来却很方便.转:http://blog.sina.com.cn/s/blog_4496b0890100h3sz.html----------------------------------------------------------------------------------------------------------------------------//SQL ADDSLASHESfunction saddslashes($string) return $string;//取消HTML代码function shtmlspecialchars($string)   return $string;//字符串解密加密function authcode($string, $operation = ‘DECODE’, $key = ”, $expiry = 0)//清空cookiefunction clearcookie()//cookie设置function ssetcookie($var, $value, $life=0)//数据库连接function dbconnect()//获取在线IPfunction getonlineip($format=0)//判断当前用户登录状态function checkauth()//获取用户app列表function getuserapp($uid=0)//获取到表名function tname($name)//对话框function showmessage($msgkey, $url_forward=”, $second=1, $values=array())//判断提交是否正确function submitcheck($var)//添加数据function inserttable($tablename, $insertsqlarr, $returnid=0, $replace = false, $silent=0)   return insert_id;//更新数据function updatetable($tablename, $setsqlarr, $wheresqlarr, $silent=0)//获取用户空间信息function getspace($key, $indextype=’uid’)//获取当前用户信息function getmember()//检查隐私function ckprivacy($type, $feedmode=0)//检查APP隐私function app_ckprivacy($privacy)//获取用户组function getgroupid($credit, $gid=0)//检查权限function checkperm($permtype)//写运行日志function runlog($file, $log, $halt=0)//获取字符串function getstr($string, $length, $in_slashes=0, $out_slashes=0, $censor=0, $bbcode=0, $html=0)//时间格式化function sgmdate($dateformat, $timestamp=”, $format=0)//字符串时间化function sstrtotime($string)//分页function multi($num, $perpage, $curpage, $mpurl)//obfunction obclean()//模板调用function template($name)//子模板更新检查function subtplcheck($subfiles, $mktime, $tpl)//模块function block($param)//获取数目function getcount($tablename, $wherearr, $get=’COUNT(
 群组功能发帖时候增加编辑器,其实并不是很复杂,只不过我们要理解,为什么要这样修改代码。*可能有些听不懂,不过不会影响修改,多学点东西总是好的吧? 首先,我们解析一下blog的编辑器。看模板文件夹下cp_blog.htm里面的这段代码: 代码: 代码<textarea class=”userData” name=”message” id=”uchome-ttHtmlEditor” style=”height:100%;width:100%;display:none;border:0px”>$blog[message]</textarea><iframe src=”editor.php?charset=$_SC[charset]&allowhtml=$allowhtml” name=”uchome-ifrHtmlEditor” id=”uchome-ifrHtmlEditor” scrolling=”no” border=”0″ frameborder=”0″ style=”width:100%;border: 1px solid #C5C5C5;” height=”400″></iframe>  第一步呢,我们先要读懂这两行代码:这就是编辑器的比较核心的部分,用一个隐藏的textarea来提交信息,用js提取框架iframe里面的编辑内容,而iframe里面的部分是编辑器页面。display:none 表示用css隐藏了textarea,看不到但是提交信息是可以发出去的。我们会发现,textarea的iduchome-ttHtmlEditor和iframe里面的name和id都很像,对,这两个能合并在一起就是用这个挂钩的,当然,还要借助于js实现。 第二步,再看提交的时候,触发了什么,请看这两段代码,还是那个文件。 代码: <input type=”button” id=”blogbutton” name=”blogbutton” value=”提交发布” onclick=”validate(this);” style=”display: none;” /> 代码: <input type=”button” id=”issuance” onclick=”document.getElementById(’blogbutton’).click();” value=”保存发布” class=”submit” />  如果刚才认真听课的同学都发现了,“display: none”又一次使用到了隐藏。但是提交的时候更有趣:下面的按钮触发的是上面按钮的动作,怎么做到的呢? 代码: onclick=”document.getElementById(’blogbutton’).click();”   这行代码表示在点击的时候,触发一个js事件:document.getElementById(’blogbutton’).click();而这个事件的js实际上就是点击第一个按钮的动作,等同于触发了第一个按钮的: 代码: onclick=”validate(this);”   这个部分,那么我们就找到了提交的时候,一定会包含处理编辑器的js函数:validate 搜索刚才那个文件中的代码,我们很容易找到这段: 代码:       代码 1  function validate(obj) { 2  3             var subject = $(’subject’); 4  5             if (subject) { 6  7                     var slen = strlen(subject.value); 8  9                 if (slen < 1 || slen > 80) {10 11                     alert(”标题长度(1~80字符)不符合要求”);12 13                     subject.focus();14 15                     return false;16 17                 }18 19             }20 21  22 23             if($(’seccode’)) {24 25                         var code = $(’seccode’).value;26 27                         var x = new Ajax();28 29                         x.get(’cp.php?ac=common&op=seccode&code=’ + code, function(s){30 31                                 s = trim(s);32 33                                 if(s != ’succeed’) {34 35                                         alert(s);36 37                                         $(’seccode’).focus();38 39                                    return false;40 41                                 } else {42 43                                         uploadEdit(obj);44 45                                         return true;46 47                                 }48 49                         });50 51             } else {52 53                     uploadEdit(obj);54 55                     return true;56 57             }58 59         }60 61  这个东西什么意思呢?我们大概看看,我也作简要解释:function是函数必须的部分,后面表示 validate(obj)函数名和所传递进来的参数。参数是一个对象,所以用obj来命名,不是语法必须,只是比较方便理解。然后定义了另外一个对象,在函数内部: var subject = $(’subject’);表示将id为’subject’的部分当作对象给前面的变量,听不懂这些术语没所谓,以后会明白,不会影响这次你学习哦。 有这样的对象有啥用啊?这样的对象可以直接指向某个DOM的节点,更简单的说法是方便操作部分指定的html,哈哈,这样理解了吧? 再看这个js函数。我用注释来说明每一行做什么: 代码:       代码 1  function validate(obj) {//创建函数和函数名,声明需要传入什么参数 2  3             var subject = $(’subject’);//设定一个函数内的变量,方便后面用,指向了id为subject的html部分。 4  5             if (subject) {//如果有这个对象,可以理解成,如果有这个html的话 6  7                     var slen = strlen(subject.value);//读取这个html部分的value值的长度 8  9                 if (slen < 1 || slen > 80) {//判断长度是否超过80或者小于1.10 11                     alert(”标题长度(1~80字符)不符合要求”);//提示不合法12 13                     subject.focus();//将光标焦点放到指定的对象上14 15                     return false;//返回这个函数的返回值为否(假),目的是告诉浏览器不要继续表单提交了,有问题啦。如果运行到这里,整个函数结束,不再继续运行。但是,刚才的判断部分如果没有进入这个大括号的话,程序继续运行。细节部分参考一下相关描述js函数的书籍或资料,不详细说了。16 17                 }18 19             }20 21  22 23             if($(’seccode’)) {//这个是判断’seccode’部分的,有ajax的部分,跳过大部分,我只简单说,我们直接谈中心部分。24 25                         var code = $(’seccode’).value;//读取’seccode’的值26 27                         var x = new Ajax();//创建一个ajax的实例,理解为要做ajax之前的热身,不然程序容易抽筋,那就不能继续了,呵呵28 29                         x.get(’cp.php?ac=common&op=seccode&code=’ + code, function(s){//将’cp.php?ac=common&op=seccode&code=’ + code作为ajax异步传输读取的地址,返回的是这个地址给的结果,也就是s30 31                                 s = trim(s);//安全处理s32 33                                 if(s != ’succeed’) {//如果s不是’succeed’的话,则运行下面的部分。34 35                                         alert(s);//警告,内容就是s,估计如果s不是’succeed’的话,会直接返回错误提示。36 37                                         $(’seccode’).focus();//呵呵,上面见过,将鼠标光标放到’seccode’上。38 39                                    return false;//返回别继续的指令,刚才说过。40 41                                 } else {//否则运行(也就是说s的内容就是’succeed’)42 43                                         uploadEdit(obj);//哈哈,bingo~~~就是要照这个,更新编辑器的函数44 45                                         return true;//告诉浏览器,哈哈,正确了,提交吧,我拿到了编辑器的数据啦~~~46 47                                 }48 49                         });50 51             } else {//这两行自己理解一下,自己看看括号是哪里的if和else,如果不知道if-else是什么,参考我之前发过的教程。52 53                     uploadEdit(obj);54 55                     return true;56 57             }58 59         }60 61  这样我们就找到要得部分了,估计现在有
在模板里边要显示分页的地方写上<div class="page" clear:both;margin:15px 5px;">$multi</div>在程序里边加入$page = empty($_GET['page'])?1:intval($_GET['page']);if($page<1) $page=1;$id = empty($_GET['id'])?0:intval($_GET['id']);$perpage = 8; //每页要显示的条数$start = ($page-1)*$perpage;ckstart($start, $perpage);$count = $_SGLOBAL['db']->result($_SGLOBAL['db']->query("SELECT COUNT(*) FROM 你的表名 WHERE 你的查询条件"),0);$query = $_SGLOBAL['db']->query("SELECT * FROM 你的表名 where 你的查询条件 limit $start,$perpage");while ($row = $_SGLOBAL['db']->fetch_array($query)){   $list[] = $row;}$multi = multi($count, $perpage, $page, "你也没的地址例如:(space.php?uid=$space[uid]&do=gift)", '', 'comment_ul');
uchome中有一个方便的ajaxget函数,用于向某段php代码传递若干个值进行处理,然后将得到的结果显示到指定的html元素中。类似:ajaxget(‘custom.php?op=getinfo&countryname=’ + countryname, ‘tdprovinces’);第一个参数(蓝色)是表示进行后台处理的url地址,第二个参数(红色)表示将处理返回结果显示到id=tdprovinces的元素中去(我这里是一个单元格)。环境:mysql 5.x.xx gbk浏览器 firefox 3.5现象是:当counrtryname的值是数字或者英文的时候,能够正常返回结果并显示到中去,但是一旦counrtryname的值为中文的时候,php运行没有报错,没有返回任何字符串。首先排查是否代码错误(因为ajaxget这里如果代码错误是看不到报错的,只表现为无返回结果),于是单独提出这段查询代码运行(新写一个php 文件,手工给定变量的值$provincename = ‘北京’),运行能够得到结果,说明代码无错,是ajax传输过程中的字符编码问题。先看看传递过来后变成什么样子了吧,于是在php页面里测试输出$_GET['countryname'],发现是一段%6E%…..类似的,汗(IE应该会显示一段utf-8版的乱码)明白了,应该是sql语句中的 cname = {$countryname}这里,因为$countryname不是一个合法的gbk字符串(mysql能识别的GBK格式——’北京’),所以导致查找不到任何记录。查资料,提示是需要将url进行编码,于是改成ajaxget(encodeURI(encodeURI(’tigtag_custom.php?op=getschools&provincename=’ + provincename)), ‘tdschools’);这次还是不行,测试输出仍然是一段代码“%5E%xxxxxx”,甚至用escape也不行,估计ajaxget函数已经把这个操作封装了。再进行一次是多此一举。汗,最后想到,是不是需要在php代码里用iconv将ajax传递过来的字符串转换成gbk的呢?因为ajax好像默认是传递utf-8格式的。好,加上一段 $provincename = iconv(”UTF-8″,”GBK”,$provincename); 试试看,强制地UTF-8转GBK再次输出$provincename测试,已经是正常的汉字“北京”了。同时mysql也能认出来并正常查询了,查询结果显示也没问题。解决。看来ajax的编码的问题,要从几个地方考虑啊,1.来源地 2.url是否需要转码 3.数据库的编码 4……====================================最新补充:我本地的测试环境是 WAMP;需要进行iconv,而在linux服务器下,反而无法输出$provincename,取消iconv操作后一切正常。百思不得其解!
 本文分两部分:第一部分是uchome模板文件的功能说明,即每个模板页面分别表示哪个功能;所有内容均以uchome1.5版为准第二部分是模板页面内使用的语法,用几个具体的例子来解释。一. 原系统模板页面简介uchome 1.5的系统模板页面主要在/templates/default目录下,命名大致分为以下几类:以cp_开头的文件(主要是用户进行数据‘操作’的模板)以do_开头的文件(注册、登陆等)以network_开头的文件(主要‘显示’随便看看里面使用)以space_开头的文件(主要用于‘显示’用户各类信息的模板)单独文件(header、footer等)样式表/templates/default/style.css****很多页面调用的模板可以从url地址中猜测出来比如左侧“日志”的链接为:http//home.xxx.com/space.php?do=blog,那么把space和blog连接起来为space_blog,然后再看该页面显示了什么,在这里这个页面显示了日志的列表,而/template/default/下面有个文件正好是space_blog_list.htm,呵呵……然后我们分别点击这个页面顶上的功能导航好友最新日志 我的日志 我踩过的日志 大家的日志 发现页面右边会显示不同的内容,有时是“按作者查看”,有时是“日志分类”,我们打开space_blog_list.htm,找到</DIV一行,发现从这里开始有两个IF判断,这就表示这两个不同的显示都整合到这一个模板页面里啦。。。>同样也可以从模板文件的名称来猜测前台页面的url,比如看到一个模板文件network_blog.htm,不晓得干什么的,那么我们就拆分它,在url里输入http://home.xxx.com/network.php?ac=blog 就可以访问了一般url里面的参数有 do cp ac 等等几个 后面连接的是功能名,如blog日志,mtag群组,thread群组话题,album相册 等等。二. 二次开发的插件使用的模版页面二次开发的插件模板页面一般位于插件文件夹下的view/文件夹下,比如结伴同行插件目录为/partner,那么模板文件在/partner/view下,样式表位于/partner/css下三. 图片文件夹一些公用的图片(如应用的icon等)放在/image/目录下,大部分与界面有关的图片位于/templates/default/image目录下四. 系统模板页面功能详细说明***注:说明里面一般是表示通过这几步操作可以看到该页面cp_advance.htm : 说明: 个人设置-》高级管理cp_album.htm : 说明: 相册-》我的相册-》管理相册主界面,包括编辑相册、编辑图片、删除相册、删除图片cp_avatar.htm : 说明: 个人设置-》我的头像cp_blog.htm : 说明: 日志-》我的日志-》发表新日志、编辑日志等操作cp_class.htm : 说明: 日志分类操作,日志-我的日志-右侧日志分类的编辑和删除cp_comment.htm : 说明: 评论的操作,包括编辑、删除、以及对别人评论的回复cp_common.htm : 说明: 举报、屏蔽通知等操作cp_credit.htm : 说明: 个人设置-》积分cp_doing.htm : 说明: 心情记录-》回复或者删除cp_domain.htm : 说明: 设置个人二级域名-现在不用管cp_feed.htm : 说明: 删除某个动态以及,消息-》通知 某个通知后面图标表示的“屏蔽”cp_friend.htm : 说明: 对好友的所有操作 ,如列表、查找、批准等等cp_header.htm : 说明: 个人设置页面的头部 ,如我的头像、个人资料、主页风格等cp_import.htm : 说明: 日志-》发表日志-》导入cp_invite.htm : 说明: 页面最顶部-》“邀请”cp_mtag.htm : 说明: 群组的操作页面,包括新建、删除、修改等cp_password.htm : 说明: 设置-》账号设置cp_pm.htm : 说明: 最顶部-》消息 包括发 删cp_poke.htm : 说明: 打招呼 包括向别人打招呼 管理别人的招呼cp_privacy.htm : 说明: 顶部-》隐私 (个人隐私设置)cp_profile.htm : 说明: 设置-》个人资料cp_sendmail.htm : 说明: 邮件相关cp_share.htm : 说明: 处理“分享”操作 例如在博客列表标题后点击分享弹出的界面cp_space.htm : 说明: 好像与“应用”有关cp_task.htm : 说明: 参与活动 例如进入首页的 “更新个人头像”,等等。。cp_theme.htm : 说明: 设置-》主页风格cp_thread.htm : 说明: 群组中 “话题”的相关操作页面cp_upload.htm : 说明: 左侧 “相册”的上传链接cp_userapp.htm : 说明: 管理用户app应用 ,暂时不管do_ajax.htm : 说明: 一些ajax操作的结果界面do_inputpwd.htm : 说明: 密码验证do_login.htm : 说明: 登陆 退出后 点击最顶部的“登录”do_lostpasswd.htm : 说明: 忘记密码do_register.htm : 说明: 退出后 点击最顶部的“注册”do_swfupload.htm : 说明: 相册上传的 “批量操作”footer.htm : 说明: 页脚header.htm : 说明:页头help.htm : 说明: 帮助页面 help.php可以看到iframe.htm : 说明: 不清楚 待研究index.htm : 说明: 首页—未登录状态的欢迎页面,聚合了blog、相册等invite.htm : 说明: 点击别人发过来的邀请链接后出现的界面network_album.htm : 说明: 随便看看-相册network_blog.htm : 说明: 随便看看-博客network_doing.htm : 说明: 随便看看-记录network_header.htm : 说明: 随便看看-顶部那几个链接network_index.htm : 说明: 随便看看-全部network_mtag.htm : 说明: 随便看看-群组network_share.htm : 说明: 随便看看-分享network_space.htm : 说明: 随便看看-成员network_thread.htm : 说明: 随便看看-话题sendmail.htm : 说明: 系统邮件的模板showmessage.htm : 说明: 信息提示space_album_list.htm : 说明: 相册列表space_album_pic.htm : 说明: 查看某个照片的页面space_album_view.htm : 说明: 点击相册,列出该相册的照片(注:区分album和pic)space_blog_list.htm : 说明: 博客列表space_blog_view.htm : 说明: 查看某博客内容space_comment_li.htm : 说明: 显示评论列表某条(这个在很多有评论功能的页面都引用了,用循环这个“小小”模板的方式列出所有评论)space_doing.htm : 说明: 心情记录space_feed.htm : 说明: 个人动态页面space_feed_li.htm : 说明: 个人动态列表(被包含在space_feed.htm里,用循环方式引用)space_friend.htm : 说明: 点击顶部“好友”space_guide.htm : 说明: 用户刚开通空间时候的向导页面,提示上传头像等space_index.htm : 说明: 点击顶部“个人主页”space_list.htm : 说明: 用户列表(被network_space.htm包含)space_menu.htm : 说明: 个人空间顶部的链接菜单space_mood.htm : 说明: 个人主页-同心情的朋友space_mtag.htm : 说明: 群组-我的群组space_mtag_field.htm : 说明: 群组-热门群组(有群组分类)space_mtag_index.htm : 说明:群组-进入某个群组space_mtag_list.htm : 说明: 群组-进入某个群组-讨论区space_mtag_member.htm : 说明: 群组-进入某个群组-成员列表space_notice.htm : 说明:顶部-通知space_pm.htm : 说明:顶部-通知-消息space_post_li.htm : 说明: 被space_thread_view.htm文件引用(被循环调用显示帖子)space_privacy.htm : 说明: 隐私相关,正在研究space_rss.htm : 说明: 订阅的,不用管space_share_li.htm : 说明: 分享-查看某条项目(被下面的space_share_list列表页循环引用)space_share_list.htm : 说明: 分享-列表space_share_view.htm : 说明: 查看某条分享的内容,在分享列表点评论的时候会出现space_tag_list.htm : 说明: 打开某篇日志——标题下如果有标签——点击标签——标签列表space_tag_view.htm : 说明: 查看某个标签space_thread_list.htm : 说明: 群组话题列表 点左侧的群组默认页面space_thread_view.htm : 说明: 查看某个主题space_wall.htm : 说明: 留言板,包括给自己留言给别人留言style.css : 说明: 样式表userapp.htm : 说明:用户添加应用或管理应用操作,不用管五. 插件模板文件说明以结伴同行为例/partner/viewpartner.htm : 说明: 首页以及信息列表页partner_header.htm : 说明: 头部文件,一般包括此插件的几个功能导航partner_post.htm : 说明: 发布新信息partner_view.htm : 说明: 浏览某条信息的内容 
本篇主要以几个例子来详细说明下uchome的模板文件结构及语法说明。必须先来了解一下uchome的模板文件解析过程,我们以“随便看看”里的“博客”为例:它的url地址是http://home.xxx.com/network.php?ac=blog,那么我们先打开/network.php看一下,我们看到第25行有一段//允许的方法$acs = array(’space’, ‘doing’, ‘blog’, ‘album’, ‘mtag’, ‘thread’, ’share’);$ac = (empty($_GET['ac']) || !in_array($_GET['ac'], $acs))?’index’:$_GET['ac'];这里是保证不会出现其他不存在的模块。看到里面有个’blog’了吧。然后又看到第37行里面有一段//数据处理include_once(S_ROOT.”./source/network_{$ac}.php”);这个实际上引用了/source/network_blog.php文件,而network_blog.php里面进行相关的博客数据准备及其他操作,为下一步的解析模板做准备 最后第49行有//模板调用include_once template(”network_$ac”);即用template函数解析对应的静态htm模板页面再进行调用,template函数就不详细说了,主要是定位到模板文件夹下的指定模板页面(例如这里就是/template/default/network_blog.htm),然后用正则表达式替换模板文件中的变量和模板语法语句,填充上一步得到的博客数据,然后输出到屏幕之所以使用模板页面,而不直接在php里面写htm代码输出,是为了使程序代码和模板页面分离,便于设计师和程序员的工作互不影响。好了废话了很多,先看一下uchome的基本模板语法就以/template/default/network_blog.htm为例,它的内容是(绿色的和褐色底色的就是嵌入到模板页面里面的语法代码了)<!–{eval $_TPL['titles'] = array(’日志’, ‘随便看看’);}–><!–{template header}–><!–{template network_header}–><div id=“search” class=“h_status”><div id=“m_search”<!–{if !empty($gets) || !empty($_GET['view'])}–> ”display:none;”<!–{/if}–>><form method=“get” action=“network.php”><input type=“text” name=“key” value=“$_GET[key]“ size=“26″ class=“t_input” /><input type=“hidden” name=“ac” value=“$ac” /><input type=“hidden” name=“searchmode” value=“1″ /><input type=“submit” name=“searchsubmit” value=“搜索日志” class=“submit” /><a href=“java script:;”onclick=“document.getElementById(’m_search’).style.display=’none’; document.getElementById(’adv_search’).style.display=’block’”>高级搜索< /a></form></div><form method=“get” action=“network.php”><table cellspacing=“0″ cellpadding=“0″ class=“formtable” id=“adv_search”<!–{if empty($gets) &&empty($_GET['view'])}–> ”display:none;”<!–{/if}–>><tr><th width=“60″>关键字*</th><td><input type=“text” name=“key” value=“$_GET[key]“ size=“26″ class=“t_input” /></td></tr><tr><th>作者名*</th><td><input type=“text” name=“username” value=“$_GET[username]“ size=“26″ class=“t_input” /></td></tr><tr><th>时间范围</th><td><input type=“text” name=“starttime” value=“$_GET[starttime]“ size=“10″ class=“t_input” /> ~ <inputtype=“text” name=“endtime” value=“$_GET[endtime]“ size=“10″ class=“t_input” />格式为 YYYY-MM-DD</td></tr><tr><th>搜索方式</th><td><label for=“subject”><input id=“subject” type=“radio” value=“subject”name=“type”$typearr[subject]>搜索标题</label><label for=“fulltext”><input id=“fulltext” type=“radio” value=“fulltext” name=“type”$typearr[fulltext]>全文搜索</label></td></tr><tr><th>结果排序</th><td><select name=“orderby”><option value=“dateline”>发布时间</option><option value=“replynum”$orderbyarr[replynum]>回复数量</option><option value=“viewnum”$orderbyarr[viewnum]>浏览次数</option></select><select name=“ascdesc”><option value=“asc”>按升序排列</option><option value=“desc”$ascdescarr[desc]>按降序排列</option></select></td></tr><tr><th>&nbsp;</th><td><input type=“hidden” name=“ac” value=“$ac” /><input type=“hidden” name=“searchmode” value=“1″ /><input type=“submit” name=“searchsubmit” value=“搜索” class=“submit” /></td></tr></table></form></div><!–{if $list}–><div class=“entry_list”><ul><!–{loop $list $value}–><li><div class=“avatar48″><a href=“space.php?uid=$value[uid]“><img src=“<!–{avatar($value[uid],small)}–>” class=“avatar” /></a></div><div class=“title”><div class=“r_option”><a href=“cp.php?ac=share&type=blog&id=$value[blogid]“id=“a_share_$value[blogid]“ onclick=“ajaxmenu(event, this.id, 99999,” , -1)” class=“a_share”>分享</a></div><h4><a href=“space.php?uid=$value[uid]&do=blog&id=$value[blogid]“>$value[subject]</a></h4><div><a href=“space.php?uid=$value[uid]“>{$_SN[$value[uid]]}</a> <span class=“time”><!–{date(’Y-m-d H:i’,$value[dateline],1)}–></span></div></div><div class=“detail image_right l_text s_clear” id=“blog_article_$value[blogid]“><!–{if $value[pic]}–><p class=“image”><a href=“space.php?uid=$value[uid]&do=blog&id=$value[blogid]“><img src=“$value[pic]“ /> $value[message]</div><div><!–{if $value[viewnum]}–><a href=“space.php?uid=$value[uid]&do=blog&id=$value[blogid]“>$value[viewnum] 次阅读</a><spanclass=“pipe”>|</span><!–{/if}–><!–{if $value[replynum]}–><a href=“space.php?uid=$value[uid]&do=blog&id=$value[blogid]#comment”>$value[replynum] 个评论</a><!–{else}–>没有评论<!–{/if}–></div></li><!–{/loop}–></ul></div
前言:基于uchomer的插件如果没有使用ajax或flex,可以说无论如何也做不到完美的。而相比于flex,ajax使用的较多。好多插件开发者在研究 uchome的ajax的使用过程中花费了不少时间,此文意在减少插件开发者的研究时间。flex相关插件的说明,敬请关注!此文整理花了本同学4个小时以上的时间,如果版主觉得对大家有帮助,请加精!非常感谢:) 我们举日志回复为例:一、局部刷新的部分(先看看现象)图一: 1、评论条数由原来的a修改为a+1;2、评论内容。从数据库里读取显示于此;3、提示语,这里的“搞好了”,是我修改之后的,原来好像是“你执行的操作已成功”。当然里的内容也可能是“你发帖的时间太短了,请等等59秒后再发”之类的。注意,用innerHTML来展示的还有右上角的红色loading…,不过因为出现的时间太短,不方便截图,而且大家也很容易理解,在此不多解释。二、好了,看完现象之后,我们要从代码来研究执行过程了1、模板文件template/default/space_blog_view.htm评论表单代码里的 onclick=”ajaxpost(’quickcommentform_{$id}’, ‘comment_add’)” />     点击“评论”的时候要调用的java script函数ajaxpost(),ajaxpost函数在哪里呢?在2、source/script_ajax.js的267行代码 1 function ajaxpost(formid, func, timeout) {  2 showloading();  3  4 if(ajaxpostHandle != 0) {  5 return false;  6 }  7 var ajaxframeid = ‘ajaxframe’;  8 var ajaxframe = $(ajaxframeid);  9 if(ajaxframe == null) { 10 if (is_ie && !is_opera) { 11 ajaxframe = document.createElement(”<iframe name=’” + ajaxframeid + “‘ id=’” + ajaxframeid + “‘></iframe>”); 12 } else { 13 ajaxframe = document.createElement(”iframe”); 14 ajaxframe.name = ajaxframeid; 15 ajaxframe.id = ajaxframeid; 16 } 17 ajaxframe.style.display = ‘none’; 18 $(’append_parent’).appendChild(ajaxframe); 19 } 20 21 //产生异步的十字路口 22 $(formid).target = ajaxframeid; 23 $(formid).action = $(formid).action + ‘&inajax=1′; 24 25 ajaxpostHandle = [formid, func, timeout]; 26 27 if(ajaxframe.attachEvent) { 28 ajaxframe.detachEvent (’onload’, ajaxpost_load); 29 ajaxframe.attachEvent(’onload’, ajaxpost_load); 30 } else { 31 document.removeEventListener(’load’, ajaxpost_load, true); 32 ajaxframe.addEventListener(’load’, ajaxpost_load, false); 33 } 34 $(formid).submit(); 35 return false; 36 }  代码解读:在这里,此函数只接到两个参数表单名quickcommentform_{$id}和函数名comment_adda、showloading();显示上面说的“右上角的红色loading…”;b、ajaxframe.style.display = ‘none’;$(’append_parent’).appendChild(ajaxframe);创建一个名字ajaxframe的iframe标签之后让它隐藏起来以避免跟观众见面(一会我们会了解到,此iframe为默默无闻的幕后黑手),让ajaxframe作append_parent节点,有些同学可能一直纳闷为何header.htm总有一个<div id=”append_parent”></div>空层,在这里我们终于知道它是为儿子ajaxframe而存在的。c、$(formid).target = ajaxframeid;$(formid).action = $(formid).action + ‘&inajax=1′;这个很关键哦。设置表单的target属性为隐藏的ajaxframe可以说是此流程的核心。它使表单提交之后,页面不动弹。接着是修改表单的action属性值,在后面加个参数inajax,让处理表单的action知道这个是使用ajax技术的,要特殊照顾。设置target和action为不同值,可以说是使用表单产生异步的关键点。d、ajaxpostHandle = [formid, func, timeout];设置句柄,为下面调用ajaxpost_load函数准备两个参数formid和func;e、ajaxframe.detachEvent (’onload’, ajaxpost_load);ajaxframe.attachEvent(’onload’, ajaxpost_load);为隐藏的ajaxframe设置监听,此两行是用于ie系统的浏览器,else下面的那两行是用于其他的浏览器。f、好了,以上工作都做好,然后怎么办?提交表单呗–$(formid).submit()。我们看看表单的action代码:3、模板文件template/default/space_blog_view.htm评论表单代码里的: action=”cp.php?ac=comment”   实际上action的值已经被修改为cp.php?ac=comment&inajax=1了,重申,此表单的target的值已为ajaxframe,用于监听。4、action开始处理了,程序代码为cp_comment.php。下面拿几个重要的函数来说说。a.        //入库$cid = inserttable(’comment’, $setarr, 1);第335行。顾名思义,把数据保存到数据库里啦;b、                        //提示语//$msg = ‘do_success’;$msg = ‘搞好了’;第373行。还记得刚才的“搞好了”三个字从哪里来吗?就在这里定义的。c、每468行。showmessage($msg, $_POST['refer'], 0, $magvalues);把结果“搞好了” echo出来。具体看看showmessage函数的代码:5、source/function_common.php第221行  代码 1 //对话框 2  3 function showmessage($msgkey, $url_forward=”, $second=1, $values=array()) { 4  5 global $_SGLOBAL, $_SC, $_SCONFIG, $_TPL, $space, $_SN; 6  7  8  9 obclean();10 11 12 13 //去掉广告14 15 $_SGLOBAL['ad'] = array();16 17 18 19 //语言20 21 include_once(S_ROOT.’./language/lang_showmessage.php’);22 23 if(isset($_SGLOBAL['msglang'][$msgkey])) {24 25 $message = lang_replace($_SGLOBAL['msglang'][$msgkey], $values);26 27 } else {28 29 $message = $msgkey;30 31 }32 33 //手机34 35 if($_SGLOBAL['mobile']) {36 37 include template(’showmessage’);38 39 exit();40 41 }42 43 //显示44 45 if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {46 47 header(”HTTP/1.1 301 Moved Permanently”);48 49 header(”Location: $url_forward”);50 51 } else {52 53 if($_SGLOBAL['inajax']) {54 55 if($url_forward) {56 57 $message = “<a href=”$url_forward”>$message</a><ajaxok>”;58 59 }60 61 //$message = “<h1>”.$_SGLOBAL['msglang']['box_title'].”</h1><a href=”java script:;” onclick=”hideMenu();” class=”float_del”>X</a><div class=”popupmenu_inner”>$message</div>”;62 63 echo $message;64 65 ob_out(); //输入message内容以备获取66 67 } else {68 69 if($url_forward) {70 71 $message = “<a href=”$url_forward”>$message</a><script>setTimeout(”window.location.href =’$url_forward’;”, “.($second*1000).”);</script>”;72 73 }74 75 include template(’showmessage’);76 77 }78 79 }80 81 exit();82 83 } 84   这个函数比较重要,解读一下吧。a、obclean();把缓存里的echo出来的数据清空,具体原理百度一下吧。b、$message = “<a href=”$url_forward”>$message</a><ajaxok>”;这一行定义好要echo的内容了c、echo $message;echo出来d、ob_out(); //输入message内容以备获取 紧接echo,捕获上面echo的内容,然后编辑之。具体看ob_out函数代码6、source/function_common.php第936行代码 1 //调整输出 2 function ob_out() { 3 global $_SGLOBAL, $_SCONFIG, $_SC; 4  5 [color=Blue]$content = ob_get_contents();[/color] 6  7 $preg_searchs = $preg_replaces = $str_searchs = $str_re
定义和用法microtime() 函数返回当前 Unix 时间戳和微秒数。语法microtime(get_as_float)参数描述get_as_float如果给出了 get_as_float 参数并且其值等价于 TRUE,该函数将返回一个浮点数。说明本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。例子<?php  echo(microtime());?> 输出:0.25139300 1138197510  ===================================================================== 康盛产品系列应用: 代码1 //获取时间2 //$mtime[1]为UNIX时间戳(整形), $mtime[0]为毫秒3 $mtime = explode(' ', microtime());4 $_SGLOBAL['timestamp'] = $mtime[1];//以"秒"为单位,精确到"秒",没有小数部分5 $_SGLOBAL['supe_starttime'] = $_SGLOBAL['timestamp'] + $mtime[0];//以"秒"为单位,精确到"毫秒",有小数部分6 7 echo($_SGLOBAL['timestamp']),'<br/>';8 echo($_SGLOBAL['supe_starttime']);输出:12750160131275016013.52