Discuz!常用函数解析
php, 函数, Discuz, param,
Discuz二次开发
<?php
/*
[Discuz!] (C)2001-2007 Comsenz
Inc.
This is NOT a
freeware, use is subject to license terms
$Id: global.func.php 13426
2008-04-15 03:37:02Z heyond $
*/
if(!defined(‘IN_DISCUZ‘))
{
exit(‘Access
Denied‘);
}
/**
* 加密或者解密用户信息
* @param $string -
加密或解密的串
* @param $operation - 加密还是解密
* @param
密钥
* @return 返回字符串
* $ckey_length 随机密钥长度 取值
0-32;
*
加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
*
取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
* 当此值为 0
时,则不产生随机密钥
*/
function authcode($string, $operation = ‘DECODE‘, $key = ‘‘, $expiry
= 0) {
$ckey_length =
4;
$key = md5($key ?
$key :
$GLOBALS[‘discuz_auth_key‘]);
$keya = md5(substr($key, 0,
16));
$keyb =
md5(substr($key, 16,
16));
$keyc =
$ckey_length ? ($operation == ‘DECODE‘ ? substr($string, 0, $ckey_length):
substr(md5(microtime()), -$ckey_length)) : ‘‘;
$cryptkey =
$keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation ==
‘DECODE‘ ? base64_decode(substr($string, $ckey_length)) : sprintf(‘%010d‘,
$expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0,
16).$string;
$string_length = strlen($string);
$result =
‘‘;
$box = range(0,
255);
$rndkey =
array();
for($i = 0;
$i <= 255; $i++)
{
$rndkey[$i] = ord($cryptkey[$i %
$key_length]);
}
for($j = $i = 0; $i <
256; $i++)
{
$j = ($j + $box[$i] + $rndkey[$i]) %
256;
$tmp =
$box[$i];
$box[$i] =
$box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i
< $string_length; $i++)
{
$a = ($a + 1) %
256;
$j = ($j + $box[$a]) %
256;
$tmp =
$box[$a];
$box[$a] =
$box[$j];
$box[$j] =
$tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) %
256]));
}
if($operation == ‘DECODE‘)
{
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0)
&& substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0,
16))
{
return substr($result,
26);
} else
{
return
‘‘;
}
} else
{
return $keyc.str_replace(‘=‘, ‘‘,
base64_encode($result));
}
}
/**
*
清理cookie
*/
function clearcookies()
{
global $discuz_uid,
$discuz_user, $discuz_pw, $discuz_secques, $adminid,
$credits;
dsetcookie(‘sid‘, ‘‘, -86400 *
365);
dsetcookie(‘auth‘, ‘‘, -86400 *
365);
dsetcookie(‘visitedfid‘, ‘‘, -86400 *
365);
dsetcookie(‘onlinedetail‘, ‘‘, -86400 * 365,
0);
dsetcookie(‘loginuser‘, ‘‘, -86400 *
365);
dsetcookie(‘activationauth‘, ‘‘, -86400 * 365);
$discuz_uid = $adminid =
$credits = 0;
$discuz_user = $discuz_pw = $discuz_secques = ‘‘;
}
/**
* 检查积分下限
* @param $creditsarray -
积分数组
* @param $coef -
积分
*/
function checklowerlimit($creditsarray,
$coef = 1) {
if(is_array($creditsarray))
{
global $extcredits,
$id;
foreach($creditsarray as $id => $addcredits)
{
$addcredits = $addcredits *
$coef;
if($addcredits < 0 && ($GLOBALS[‘extcredits‘.$id] <
$extcredits[$id][‘lowerlimit‘] || (($GLOBALS[‘extcredits‘.$id] + $addcredits)
< $extcredits[$id][‘lowerlimit‘])))
{
if($coef == 1)
{
showmessage(‘credits_policy_lowerlimit‘);
} else
{
showmessage(‘credits_policy_num_lowerlimit‘);
}
}
}
}
}
/**
* 密码检测
*
* @param
string $md5
* @param string $verified
* @param
string $salt
*
@return
* 0=
Failed
* 1= MD5
with salt, 2= Dual MD5, 3= Normal Md5 4= MD5-16
*/
function checkmd5($md5, $verified, $salt = ‘‘)
{
if(md5($md5.$salt)
== $verified)
{
$result = !empty($salt) ? 1 :
2;
}
elseif(empty($salt))
{
$result = $md5 == $verified ? 3 : ((strlen($verified) == 16 &&
substr($md5, 8, 16) == $verified) ? 4 :
0);
} else
{
$result = 0;
}
return
$result;
}
/**
* 检查模板源文件是否更新
*
当编译文件不存时强制重新编译
* 当 tplrefresh = 1 时检查文件
* 当
tplrefresh > 1 时,则根据 tplrefresh
取余,无余时则检查更新
*
*/
function
checktplrefresh($maintpl, $subtpl, $timecompare, $templateid, $tpldir)
{
global
$tplrefresh;
if(empty($timecompare) || $tplrefresh == 1 || ($tplrefresh > 1 &&
!($GLOBALS[‘timestamp‘] % $tplrefresh)))
{
if(empty($timecompare) || @filemtime($subtpl) > $timecompare)
{
require_once
DISCUZ_ROOT.‘./include/template.func.php‘;
parse_template($maintpl, $templateid,
$tpldir);
return
TRUE;
}
}
return
FALSE;
}
/**
* 根据中文裁减字符串
* @param $string -
字符串
* @param $length - 长度
* @param $doc -
缩略后缀
* @return
返回带省略号被裁减好的字符串
*/
function cutstr($string,
$length, $dot = ‘ ...‘)
{
global
$charset;
if(strlen($string) <=
$length)
{
return $string;
}
$string =
str_replace(array(‘&‘, ‘"‘, ‘<‘, ‘>‘), array(‘&‘, ‘"‘, ‘<‘,
‘>‘), $string);
$strcut =
‘‘;
if(strtolower($charset) == ‘utf-8‘) {
$n = $tn = $noc =
0;
while($n < strlen($string)) {
$t =
ord($string[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126))
{
$tn = 1; $n++;
$noc++;
} elseif(194 <= $t && $t <= 223)
{
$tn = 2; $n += 2; $noc +=
2;
} elseif(224 <= $t && $t < 239)
{
$tn = 3; $n += 3; $noc +=
2;
} elseif(240 <= $t && $t <= 247)
{
$tn = 4; $n += 4; $noc +=
2;
} elseif(248 <= $t && $t <= 251)
{
$tn = 5; $n += 5; $noc +=
2;
} elseif($t == 252 || $t == 253)
{
$tn = 6; $n += 6; $noc +=
2;
} else
{
$n++;
}
if($noc >= $length)
{
break;
}
}
if($noc > $length)
{
$n -=
$tn;
}
$strcut = substr($string, 0, $n);
} else
{
for($i = 0; $i < $length; $i++)
{
$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] :
$string[$i];
}
}
$strcut =
str_replace(array(‘&‘, ‘"‘, ‘<‘, ‘>‘), array(‘&‘, ‘"‘, ‘<‘,
‘>‘), $strcut);
return
$strcut.$dot;
}
/**
* 处理转义字符
* @param $string
-字符串
* @param $force - 是否强制
* @return
返回整理好的字符串
*/
function daddslashes($string,
$force = 0) {
!defined(‘MAGIC_QUOTES_GPC‘) && define(‘MAGIC_QUOTES_GPC‘,
get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force)
{
if(is_array($string))
{
foreach($string as $key => $val)
{
$string[$key] = daddslashes($val,
$force);
}
} else
{
$string =
addslashes($string);
}
}
return
$string;
}
/**
*
检测日期的有效性
*/
function datecheck($ymd, $sep=‘-‘)
{
if(!empty($ymd))
{
list($year, $month, $day) = explode($sep,
$ymd);
return checkdate($month, $day,
$year);
} else
{
return FALSE;
}
}
/**
*
调试信息
*/
function debuginfo()
{
if($GLOBALS[‘debug‘])
{
global $db, $discuz_starttime,
$debuginfo;
$mtime = explode(‘ ‘,
microtime());
$debuginfo = array(‘time‘ => number_format(($mtime[1] + $mtime[0] -
$discuz_starttime), 6), ‘queries‘ =>
$db->querynum);
return TRUE;
} else
{
return FALSE;
}
}
/**
*
退出系统
*/
function dexit($message = ‘‘)
{
echo
$message;
output();
exit();
}
function dfopen($url, $limit = 0, $post = ‘‘, $cookie = ‘‘, $bysocket
= FALSE, $ip = ‘‘, $timeout = 15, $block = TRUE)
{
$return =
‘‘;
$matches =
parse_url($url);
$host =
$matches[‘host‘];
$path = $matches[‘path‘] ?
$matches[‘path‘].‘?‘.$matches[‘query‘].‘#‘.$matches[‘fragment‘] :
‘/‘;
$port =
!empty($matches[‘port‘]) ? $matches[‘port‘] : 80;
if($post)
{
$out = "POST $path
HTTP/1.0\r\n";
$out .= "Accept:
*/*\r\n";
//$out .= "Referer:
$boardurl\r\n";
$out .= "Accept-Language:
zh-cn\r\n";
$out .= "Content-Type:
application/x-www-form-urlencoded\r\n";
$out .= "User-Agent:
$_SERVER[HTTP_USER_AGENT]\r\n";
$out .= "Host:
$host\r\n";
$out .= ‘Content-Length:
‘.strlen($post)."\r\n";
$out .= "Connection:
Close\r\n";
$out .= "Cache-Control:
no-cache\r\n";
$out .= "Cookie:
$cookie\r\n\r\n";
$out .= $post;
} else
{
$out = "GET $path
HTTP/1.0\r\n";
$out .= "Accept:
*/*\r\n";
//$out .= "Referer:
$boardurl\r\n";
$out .= "Accept-Language:
zh-cn\r\n";
$out .= "User-Agent:
$_SERVER[HTTP_USER_AGENT]\r\n";
$out .= "Host:
$host\r\n";
$out .= "Connection:
Close\r\n";
$out .= "Cookie:
$cookie\r\n\r\n";
}
$fp =
@fsockopen(($ip ? $ip : $host), $port, $errno, $errstr,
$timeout);
if(!$fp)
{
return ‘‘;//note $errstr : $errno
\r\n
} else
{
stream_set_blocking($fp,
$block);
stream_set_timeout($fp,
$timeout);
@fwrite($fp,
$out);
$status =
stream_get_meta_data($fp);
if(!$status[‘timed_out‘])
{
while (!feof($fp))
{
if(($header = @fgets($fp)) && ($header == "\r\n" || $header ==
"\n"))
{
break;
}
}
$stop =
false;
while(!feof($fp) && !$stop)
{
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 :
$limit));
$return .=
$data;
if($limit)
{
$limit -=
strlen($data);
$stop = $limit <=
0;
}
}
}
@fclose($fp);
return $return;
}
}
/**
* HTML转义字符
* @param $string -
字符串
* @return
返回转义好的字符串
*/
function dhtmlspecialchars($string)
{
if(is_array($string))
{
foreach($string as $key => $val)
{
$string[$key] =
dhtmlspecialchars($val);
}
} else
{
$string =
preg_replace(‘/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/‘,
‘&\\1‘,
str_replace(array(‘&‘, ‘"‘, ‘<‘, ‘>‘), array(‘&‘, ‘"‘, ‘<‘,
‘>‘), $string));
}
return
$string;
}
function dheader($string, $replace = true, $http_response_code = 0)
{
$string =
str_replace(array("\r", "\n"), array(‘‘, ‘‘),
$string);
if(empty($http_response_code) || PHP_VERSION < ‘4.3‘ )
{
@header($string,
$replace);
} else
{
@header($string, $replace,
$http_response_code);
}
if(preg_match(‘/^\s*location:/is‘, $string))
{
exit();
}
}
/**
* 上传文件的函数
* @param $file -
要上传的文件
* @return
返回带省略号被裁减好的字符串
*/
function
disuploadedfile($file)
{
return
function_exists(‘is_uploaded_file‘) && (is_uploaded_file($file) ||
is_uploaded_file(str_replace(‘\\\\‘, ‘\\‘,
$file)));
}
/**
*
刷新重定向
*/
function dreferer($default = ‘‘)
{
global $referer,
$indexname;
$default = empty($default)
? $indexname : ‘‘;
if(empty($referer) && isset($GLOBALS[‘_SERVER‘][‘HTTP_REFERER‘]))
{
$referer = preg_replace("/([\?&])((sid\=[a-z0-9]{6})(&|$))/i", ‘\\1‘,
$GLOBALS[‘_SERVER‘][‘HTTP_REFERER‘]);
$referer = substr($referer, -1) == ‘?‘ ? substr($referer, 0, -1) :
$referer;
} else
{
$referer =
dhtmlspecialchars($referer);
}
if(!preg_match("/(\.php|[a-z]+(\-\d+)+\.html)/", $referer) || strpos($referer,
‘logging.php‘))
{
$referer = $default;
}
return
$referer;
}
/**
* 设置cookie
* @param $var -
变量名
* @param $value - 变量值
* @param $life -
生命期
* @param $prefix -
前缀
*/
function dsetcookie($var, $value, $life =
0, $prefix = 1) {
global $cookiepre, $cookiedomain, $cookiepath, $timestamp,
$_SERVER;
setcookie(($prefix ? $cookiepre : ‘‘).$var,
$value,
$life ? $timestamp + $life : 0,
$cookiepath,
$cookiedomain, $_SERVER[‘SERVER_PORT‘] == 443 ? 1 :
0);
}
function dunlink($filename, $havethumb = 0, $remote = 0)
{
global $authkey,
$ftp, $attachdir;
if($remote)
{
require_once
DISCUZ_ROOT.‘./include/ftp.func.php‘;
if(!$ftp[‘connid‘])
{
if(!($ftp[‘connid‘] = dftp_connect($ftp[‘host‘], $ftp[‘username‘],
authcode($ftp[‘password‘], ‘DECODE‘, md5($authkey)), $ftp[‘attachdir‘],
$ftp[‘port‘], $ftp[‘ssl‘])))
{
return;
}
}
dftp_delete($ftp[‘connid‘],
$filename);
$havethumb && dftp_delete($ftp[‘connid‘],
$filename.‘.thumb.jpg‘);
} else
{
@unlink($attachdir.‘/‘.$filename);
$havethumb &&
@unlink($attachdir.‘/‘.$filename.‘.thumb.jpg‘);
}
}
/*** 格式化email* @param $email -
邮箱地址* @param $tolink - 是否增加链接* @return
返回代码*/function emailconv($email, $tolink = 1)
{ $email =
str_replace(array(‘@‘, ‘.‘), array(‘@‘, ‘.‘),
$email); return
$tolink ? ‘<a href="mailto: ‘.$email.‘">‘.$email.‘</a>‘:
$email;}
/**
* 系统错误日志
* @param $type -
信息类型
* @param $message - 信息
* @param $halt -
是否退出
*/
function errorlog($type, $message, $halt
= 1) {
global
$timestamp, $discuz_userss, $onlineip,
$_SERVER;
$user =
empty($discuz_userss) ? ‘‘ : $discuz_userss.‘<br
/>‘;
$user .=
$onlineip.‘|‘.$_SERVER[‘REMOTE_ADDR‘];
writelog(‘errorlog‘,
dhtmlspecialchars("$timestamp\t$type\t$user\t".str_replace(array("\r", "\n"),
array(‘ ‘, ‘ ‘),
trim($message))));
if($halt)
{
exit();
}
}
/**
* 去掉文件扩展名
* @param $finename -
文件名称
* @return 文件名
*/
function
fileext($filename) {
return trim(substr(strrchr($filename, ‘.‘), 1,
10));
}
/**
*
产生form防伪码
*/
function formhash($specialadd = ‘‘)
{
global
$discuz_user, $discuz_uid, $discuz_pw, $timestamp,
$discuz_auth_key;
$hashadd = defined(‘IN_ADMINCP‘) ? ‘Only For Discuz! Admin Control Panel‘ :
‘‘;
return
substr(md5(substr($timestamp, 0,
-7).$discuz_user.$discuz_uid.$discuz_pw.$discuz_auth_key.$hashadd.$specialadd),
8, 8);
}
/**
* 论坛权限
* @param $permstr -
权限信息
* @return 0 无权限 > 0
有权限
*/
function forumperm($permstr)
{
global $groupid,
$extgroupids;
$groupidarray =
array($groupid);
foreach(explode("\t", $extgroupids) as $extgroupid)
{
if($extgroupid = intval(trim($extgroupid)))
{
$groupidarray[] =
$extgroupid;
}
}
return
preg_match("/(^|\t)(".implode(‘|‘, $groupidarray).")(\t|$)/",
$permstr);
}
/**
权限表达式
* @param $formula -
权限表达式
* @param $type - 0 论坛权限验证 1 勋章权限验证 2
返回勋章权限字串
*/
function formulaperm($formula, $type
= 0) {
global
$_DSESSION, $extcredits, $formulamessage, $usermsg, $forum,
$language;
if((!$formula ||
$_DSESSION[‘adminid‘] == 1 || $forum[‘ismoderator‘]) && !$type)
{
return;
}
$formula =
unserialize($formula);$formula =
$formula[1];
if(!$formula)
{
return;
}
@eval("\$formulaperm = ($formula) ? TRUE :
FALSE;");
if(!$formulaperm || $type == 2)
{
include_once
language(‘misc‘);
$search = array(‘$_DSESSION[\‘digestposts\‘]‘, ‘$_DSESSION[\‘posts\‘]‘,
‘$_DSESSION[\‘oltime\‘]‘,
‘$_DSESSION[\‘pageviews\‘]‘);
$replace = array($language[‘formulaperm_digestposts‘],
$language[‘formulaperm_posts‘], $language[‘formulaperm_oltime‘],
$language[‘formulaperm_pageviews‘]);
for($i = 1; $i <= 8; $i++)
{
$search[] =
‘$_DSESSION[\‘extcredits‘.$i.‘\‘]‘;
$replace[] = $extcredits[$i][‘title‘] ? $extcredits[$i][‘title‘] :
$language[‘formulaperm_extcredits‘].$i;
}
$i = 0;$usermsg =
‘‘;
foreach($search as $s)
{
$usermsg .= strexists($formula, $s) ? $replace[$i].‘ = ‘.(@eval(‘return
intval(‘.$s.‘);‘)).‘ ‘ :
‘‘;
$i++;
}
$search = array_merge($search, array(‘and‘, ‘or‘, ‘>=‘,
‘<=‘));
$replace = array_merge($replace, array(‘
‘.$language[‘formulaperm_and‘].‘ ‘, ‘
‘.$language[‘formulaperm_or‘].‘ ‘, ‘≥‘,
‘≤‘));
$formulamessage = str_replace($search, $replace, $formula);
if($type == 1)
{
showmessage(‘medal_permforum_nopermission‘, NULL,
‘NOPERM‘);
} elseif($type == 2)
{
return
$formulamessage;
} else
{
showmessage(‘forum_permforum_nopermission‘, NULL,
‘NOPERM‘);
}
}
return
TRUE;
}
/**
* 获取用户所在组
* @param $uid -
用户组
* @param $group - 用户组
* @param $member -
用户组
*/
function getgroupid($uid, $group,
&$member) {
global $creditsformula, $db, $tablepre;
if(!empty($creditsformula))
{
$updatearray =
array();
eval("\$credits = round($creditsformula);");
if($credits != $member[‘credits‘])
{
$updatearray[] =
"credits=‘$credits‘";
$member[‘credits‘] =
$credits;
}
if($group[‘type‘] == ‘member‘ && !($member[‘credits‘] >=
$group[‘creditshigher‘] && $member[‘credits‘] <
$group[‘creditslower‘]))
{
$query = $db->query("SELECT groupid FROM {$tablepre}usergroups WHERE
type=‘member‘ AND $member[credits]>=creditshigher AND
$member[credits]<creditslower LIMIT
1");
if($db->num_rows($query))
{
$member[‘groupid‘] = $db->result($query,
0);
$updatearray[] =
"groupid=‘$member[groupid]‘";
}
}
if($updatearray)
{
$db->query("UPDATE {$tablepre}members SET ".implode(‘, ‘, $updatearray)."
WHERE
uid=‘$uid‘");
}
}
return
$member[‘groupid‘];
}
function getrobot()
{
if(!defined(‘IS_ROBOT‘))
{
$kw_spiders =
‘Bot|Crawl|Spider|slurp|sohu-search|lycos|robozilla‘;
$kw_browsers =
‘MSIE|Netscape|Opera|Konqueror|Mozilla‘;
if(preg_match("/($kw_browsers)/", $_SERVER[‘HTTP_USER_AGENT‘]))
{
define(‘IS_ROBOT‘,
FALSE);
} elseif(preg_match("/($kw_spiders)/", $_SERVER[‘HTTP_USER_AGENT‘]))
{
define(‘IS_ROBOT‘,
TRUE);
} else
{
define(‘IS_ROBOT‘,
FALSE);
}
}
return
IS_ROBOT;
}
/**
* 根据用户的 uid 得到 avatar/home
目录
*
* @param int $uid
* @return
string
*/
function get_home($uid)
{
$uid =
sprintf("%05d",
$uid);
$dir1 =
substr($uid, 0, -4);
$dir2 = substr($uid, -4,
2);
$dir3 =
substr($uid, -2, 2);
return $dir1.‘/‘.$dir2.‘/‘.$dir3;
}
/**
* vip用户购买组权限是否到期
* @param $terms
期限 来源于 memberfields 表的 groupterms 字段
* @return
返回过期信息
*/
function groupexpiry($terms)
{
$terms =
is_array($terms) ? $terms :
unserialize($terms);
$groupexpiry = isset($terms[‘main‘][‘time‘]) ? intval($terms[‘main‘][‘time‘]) :
0;
if(is_array($terms[‘ext‘]))
{
foreach($terms[‘ext‘] as $expiry)
{
if((!$groupexpiry && $expiry) || $expiry < $groupexpiry)
{
$groupexpiry =
$expiry;
}
}
}
return
$groupexpiry;
}
/**
* ip允许访问
* @param $ip
要检查的ip地址
* @param - $accesslist 允许访问的ip地址
*
@param 返回结果
*/
function ipaccess($ip,
$accesslist) {
return
preg_match("/^(".str_replace(array("\r\n", ‘ ‘), array(‘|‘, ‘‘),
preg_quote($accesslist, ‘/‘)).")/", $ip);
}
/**
* 将数组元素格式化成类似 ‘1‘,‘2‘,‘3‘ 的字符串
*
@return STRING 字串 否则为 NULL
*/
function
implodeids($array) {
if(!empty($array))
{
return "‘".implode("‘,‘", is_array($array) ? $array :
array($array))."‘";
}
else
{
return ‘‘;
}
}
/**
* ip限制访问
* @param $ip
要检查的ip地址
* @param - $accesslist 允许访问的ip地址
*
@param 返回结果
*/
function ipbanned($onlineip)
{
global $ipaccess,
$timestamp, $cachelost;
if($ipaccess &&
!ipaccess($onlineip, $ipaccess))
{
return TRUE;
}
$cachelost .= (@include
DISCUZ_ROOT.‘./forumdata/cache/cache_ipbanned.php‘) ? ‘‘ : ‘
ipbanned‘;
if(empty($_DCACHE[‘ipbanned‘]))
{
return FALSE;
} else
{
if($_DCACHE[‘ipbanned‘][‘expiration‘] < $timestamp)
{
@unlink(DISCUZ_ROOT.‘./forumdata/cache/cache_ipbanned.php‘);
}
return preg_match("/^(".$_DCACHE[‘ipbanned‘][‘regexp‘].")$/",
$onlineip);
}
}
/**
* 检查邮箱是否有效
* @param $email
要检查的邮箱
* @param 返回结果
*/
function
isemail($email) {
return strlen($email) > 6 &&
preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/",
$email);
}
/**
* 加载语言
* @param $file -
语言文件
* @param $templateid - 模板号码
* @param
$tpldir - 模板路径
* @return
加载的语言
*/
function language($file, $templateid =
0, $tpldir = ‘‘) {
$tpldir = $tpldir ? $tpldir :
TPLDIR;
$templateid =
$templateid ? $templateid : TEMPLATEID;
$languagepack =
DISCUZ_ROOT.‘./‘.$tpldir.‘/‘.$file.‘.lang.php‘;
if(file_exists($languagepack))
{
return $languagepack;
} elseif($templateid != 1 && $tpldir != ‘./templates/default‘)
{
return language($file, 1,
‘./templates/default‘);
} else
{
return FALSE;
}
}
/**
* 分页
* @param $num -
总数
* @param $perpage - 每页数
* @param $curpage -
当前页
* @param $mpurl - 跳转的路径
* @param $maxpages -
允许显示的最大页数
* @param $page - 最多显示多少页码
* @param
$autogoto - 最后一页,自动跳转
* @param $simple -
是否简洁模式(简洁模式不显示上一页、下一页和页码跳转)
* @return
返回分页代码
*/
function multi($num, $perpage,
$curpage, $mpurl, $maxpages = 0, $page = 10, $autogoto = TRUE, $simple = FALSE)
{
global
$maxpage;
//debug 加入
ajaxtarget 属性
$ajaxtarget = !empty($_GET[‘ajaxtarget‘]) ? "
ajaxtarget=\"".dhtmlspecialchars($_GET[‘ajaxtarget‘])."\" " : ‘‘;
$multipage =
‘‘;
$mpurl .=
strpos($mpurl, ‘?‘) ? ‘&‘ :
‘?‘;
$realpages =
1;
if($num >
$perpage)
{
$offset = 2;
$realpages = @ceil($num /
$perpage);
$pages = $maxpages && $maxpages < $realpages ? $maxpages :
$realpages;
if($page > $pages)
{
$from =
1;
$to =
$pages;
} else
{
$from = $curpage -
$offset;
$to = $from + $page -
1;
if($from < 1)
{
$to = $curpage + 1 -
$from;
$from =
1;
if($to - $from < $page)
{
$to =
$page;
}
} elseif($to > $pages)
{
$from = $pages - $page +
1;
$to =
$pages;
}
}
$multipage = ($curpage - $offset > 1 && $pages > $page ? ‘<a
href="‘.$mpurl.‘page=1" class="first"‘.$ajaxtarget.‘>1 ...</a>‘ :
‘‘).
($curpage > 1 && !$simple ? ‘<a href="‘.$mpurl.‘page=‘.($curpage -
1).‘" class="prev"‘.$ajaxtarget.‘>??</a>‘ :
‘‘);
for($i = $from; $i <= $to; $i++)
{
$multipage .= $i == $curpage ? ‘<strong>‘.$i.‘</strong>‘
:
‘<a href="‘.$mpurl.‘page=‘.$i.($ajaxtarget && $i == $pages &&
$autogoto ? ‘#‘ :
‘‘).‘"‘.$ajaxtarget.‘>‘.$i.‘</a>‘;
}
$multipage .= ($curpage < $pages && !$simple ? ‘<a
href="‘.$mpurl.‘page=‘.($curpage + 1).‘"
class="next"‘.$ajaxtarget.‘>??</a>‘ :
‘‘).
($to < $pages ? ‘<a href="‘.$mpurl.‘page=‘.$pages.‘"
class="last"‘.$ajaxtarget.‘>... ‘.$realpages.‘</a>‘ :
‘‘).
(!$simple && $pages > $page && !$ajaxtarget ?
‘<kbd><input type="text" name="custompage" size="3" /></kbd>‘
: ‘‘);
$multipage = $multipage ? ‘<div class="pages">‘.(!$simple ? ‘<em>
‘.$num.‘ </em>‘ : ‘‘).$multipage.‘</div>‘ :
‘‘;
}
$maxpage =
$realpages;
return
$multipage;
}
/**
* 系统输出
* @return
返回内容
*/
function output()
{
if(defined(‘DISCUZ_OUTPUTED‘))
{
return;
}
define(‘DISCUZ_OUTPUTED‘,
1);
global $sid,
$transsidstatus, $rewritestatus, $ftp, $advlist, $insenz, $queryfloat, $thread,
$inajax;
if(($advlist ||
!empty($insenz[‘hardadstatus‘]) || $queryfloat) &&
!defined(‘IN_ADMINCP‘) && !(CURSCRIPT == ‘viewthread‘ &&
$thread[‘digest‘] == ‘-1‘) && !$inajax)
{
include
template(‘adv‘);
}
if(($transsidstatus =
empty($GLOBALS[‘_DCOOKIE‘][‘sid‘]) && $transsidstatus) ||
$rewritestatus)
{
if($transsidstatus)
{
$searcharray =
array
(
"/\<a(\s*[^\>]+\s*)href\=([\"|\‘]?)([^\"\‘\s]+)/ies",
"/(\<form.+?\>)/is"
);
$replacearray =
array
(
"transsid(‘\\3‘,‘<a\\1href=\\2‘)",
"\\1\n<input type=\"hidden\"
name=\"sid\" value=\"$sid\"
/>"
);
} else
{
$searcharray = $replacearray =
array();
if($rewritestatus & 1)
{
$searcharray[] = "/\<a
href\=\"forumdisplay\.php\?fid\=(\d+)(&page\=(\d+))?\"([^\>]*)\>/e";
$replacearray[] = "rewrite_forum(‘\\1‘, ‘\\3‘,
‘\\4‘)";
}
if($rewritestatus & 2)
{
$searcharray[] = "/\<a
href\=\"viewthread\.php\?tid\=(\d+)(&extra\=page\%3D(\d+))?(&page\=(\d+))?\"([^\>]*)\>/e";
$replacearray[] = "rewrite_thread(‘\\1‘, ‘\\5‘, ‘\\3‘,
‘\\6‘)";
}
if($rewritestatus & 4)
{
$searcharray[] = "/\<a
href\=\"space\.php\?(uid\=(\d+)|username\=([^&]+?))\"([^\>]*)\>/e";
$replacearray[] = "rewrite_space(‘\\2‘, ‘\\3‘,
‘\\4‘)";
}
if($rewritestatus & 8)
{
$searcharray[] = "/\<a
href\=\"tag\.php\?name\=([^&]+?)\"([^\>]*)\>/e";
$replacearray[] = "rewrite_tag(‘\\1‘,
‘\\2‘)";
}
}
$content = preg_replace($searcharray, $replacearray,
ob_get_contents());
ob_end_clean();
$GLOBALS[‘gzipcompress‘] ? ob_start(‘ob_gzhandler‘) : ob_start();
echo $content;
}
if($ftp[‘connid‘])
{
@ftp_close($ftp[‘connid‘]);
}
$ftp =
array();
//debug Module:HTML_CACHE
如果定义了缓存常量,则此处将缓冲区的内容写入文件。如果为 index 缓存,则直接写入 forumdata/index.cache ,如果为
viewthread
缓存,则根据md5(tid,等参数)取前三位为目录加上$tid_$page,做文件名。
//debug $threadcacheinfo, $indexcachefile
为全局变量
if(defined(‘CACHE_FILE‘) && CACHE_FILE &&
!defined(‘CACHE_FORBIDDEN‘))
{
global
$cachethreaddir;
if(diskfreespace(DISCUZ_ROOT.‘./‘.$cachethreaddir) > 1000000)
{
if($fp = @fopen(CACHE_FILE, ‘w‘))
{
flock($fp,
LOCK_EX);
fwrite($fp, empty($content) ? ob_get_contents() :
$content);
}
@fclose($fp);
chmod(CACHE_FILE,
0777);
}
}
}
/**
* 时间段设置检测
* @param $periods -
那种时间段 $settings[$periods] $settings[‘postbanperiods‘]
$settings[‘postmodperiods‘]
* @param $showmessage -
是否提示信息
* @return
返回检查结果
*/
function periodscheck($periods,
$showmessage = 1) {
global $timestamp, $disableperiodctrl, $_DCACHE, $banperiods;
if(!$disableperiodctrl
&& $_DCACHE[‘settings‘][$periods])
{
$now = gmdate(‘G.i‘, $timestamp + $_DCACHE[‘settings‘][‘timeoffset‘] *
3600);
foreach(explode("\r\n", str_replace(‘:‘, ‘.‘, $_DCACHE[‘settings‘][$periods]))
as $period)
{
list($periodbegin, $periodend) = explode(‘-‘,
$period);
if(($periodbegin > $periodend && ($now >= $periodbegin || $now
< $periodend)) || ($periodbegin < $periodend && $now >=
$periodbegin && $now < $periodend))
{
$banperiods = str_replace("\r\n", ‘, ‘,
$_DCACHE[‘settings‘][$periods]);
if($showmessage)
{
showmessage(‘period_nopermission‘, NULL,
‘NOPERM‘);
} else
{
return
TRUE;
}
}
}
}
return
FALSE;
}
function postfeed($feed)
{
global $discuz_uid,
$discuz_user;
require_once
DISCUZ_ROOT.‘./templates/default/feed.lang.php‘;
require_once DISCUZ_ROOT.‘./uc_client/client.php‘;
$feed[‘title_template‘] =
$feed[‘title_template‘] ? $language[$feed[‘title_template‘]] :
‘‘;
$feed[‘body_template‘] = $feed[‘title_template‘] ?
$language[$feed[‘body_template‘]] : ‘‘;
uc_feed_add($feed[‘icon‘],
$discuz_uid, $discuz_user, $feed[‘title_template‘], $feed[‘title_data‘],
$feed[‘body_template‘], $feed[‘body_data‘], ‘‘, ‘‘,
$feed[‘images‘]);
}
/**
* 问题答案加密
* @param $questionid -
问题
* @param $answer - 答案
* @return
返回加密的字串
*/
function quescrypt($questionid,
$answer) {
return
$questionid > 0 && $answer != ‘‘ ?
substr(md5($answer.md5($questionid)), 16, 8) :
‘‘;
}
/**
* 产生伪静态地址
* @param $tid
主题id
* @param $page 页标
* @param $prevpage
上一页
* @param extra 扩展
* @return
返回链接
*/
function rewrite_thread($tid, $page = 0,
$prevpage = 0, $extra = ‘‘)
{
return ‘<a
href="thread-‘.$tid.‘-‘.($page ? $page : 1).‘-‘.($prevpage && !IS_ROBOT
? $prevpage :
1).‘.html"‘.stripslashes($extra).‘>‘;
}
/**
* 产生伪静态地址
* @param $fid
论坛id
* @param $page 页标
* @param extra
扩展
* @return 返回链接
*/
function
rewrite_forum($fid, $page = 0, $extra = ‘‘)
{
return ‘<a
href="forum-‘.$fid.‘-‘.($page ? $page :
1).‘.html"‘.stripslashes($extra).‘>‘;
}
function rewrite_space($uid, $username, $extra = ‘‘)
{
$GLOBALS[‘rewritecompatible‘] && $username =
rawurlencode($username);
return ‘<a href="space-‘.($uid ? ‘uid-‘.$uid :
‘username-‘.$username).‘.html"‘.stripslashes($extra).‘>‘;
}
function rewrite_tag($name, $extra = ‘‘)
{
$GLOBALS[‘rewritecompatible‘] && $name =
rawurlencode($name);
return ‘<a
href="tag-‘.$name.‘.html"‘.stripslashes($extra).‘>‘;
}
/**
* 产生随机码
* @param $length -
要多长
* @param $numberic - 数字还是字符串
* @return
返回字符串
*/
function random($length, $numeric = 0)
{
PHP_VERSION <
‘4.2.0‘ && mt_srand((double)microtime() *
1000000);
if($numeric)
{
$hash = sprintf(‘%0‘.$length.‘d‘, mt_rand(0, pow(10, $length) -
1));
} else
{
$hash =
‘‘;
$chars =
‘ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz‘;
$max = strlen($chars) -
1;
for($i = 0; $i < $length; $i++)
{
$hash .= $chars[mt_rand(0,
$max)];
}
}
return
$hash;
}
/**
* 删除非空目录
* @param $path
目录
*/
function removedir($dirname, $keepdir =
FALSE) {
$dirname =
wipespecial($dirname);
if(!is_dir($dirname))
{
return FALSE;
}
$handle =
opendir($dirname);
while(($file = readdir($handle)) !== FALSE)
{
if($file != ‘.‘ && $file != ‘..‘)
{
$dir = $dirname . DIRECTORY_SEPARATOR .
$file;
is_dir($dir) ? removedir($dir) :
unlink($dir);
}
}
closedir($handle);
return !$keepdir ? (@rmdir($dirname) ? TRUE : FALSE) :
TRUE;
}
function request($cachekey, $fid = 0, $type = 0, $return = 0)
{
global $timestamp,
$_DCACHE;
$datalist =
‘‘;
if($fid
&& in_array(CURSCRIPT, array(‘forumdisplay‘, ‘viewthread‘)))
{
$specialfid =
$GLOBALS[‘forum‘][‘fid‘];
$cachekey = !isset($GLOBALS[‘infosidestatus‘][‘f‘.$specialfid][$type]) ?
$GLOBALS[‘infosidestatus‘][$type] :
$GLOBALS[‘infosidestatus‘][‘f‘.$specialfid][$type];
$key =
$cachekey;
$cachekey .=
‘_fid‘.$specialfid;
}
else
{
$specialfid =
0;
$key = $cachekey;
}
$cachefile =
DISCUZ_ROOT.‘./forumdata/cache/request_‘.$cachekey.‘.php‘;
if((@!include($cachefile)) || $expiration < $timestamp)
{
require_once
DISCUZ_ROOT.‘./forumdata/cache/cache_request.php‘;
require_once
DISCUZ_ROOT.‘./include/request.func.php‘;
parse_str($_DCACHE[‘request‘][$key][‘url‘],
$requestdata);
$datalist = parse_request($requestdata, $cachefile, 0, $specialfid,
$key);
}
if(!$return)
{
echo $datalist;
}
else
{
return $datalist;
}
}
/**
* 发送邮件
* @param $email_to -
接受者
* @param $email_subject - 标题
* @param
$email_messge - 内容
* @param $email_from -
发送者
*/
function sendmail($email_to,
$email_subject, $email_message, $email_from = ‘‘)
{
extract($GLOBALS,
EXTR_SKIP);
require
DISCUZ_ROOT.‘./include/sendmail.inc.php‘;
}
/**
* 发送短消息
* @param $toid -
接收方id
* @param $subject - 标题
* @param $message -
内容
* @param $fromid - 发送方id
* @param $from -
发送方名字
*/
function sendpm($toid, $subject,
$message, $fromid = ‘‘)
{
extract($GLOBALS,
EXTR_SKIP);
include
language(‘pms‘);
require_once
DISCUZ_ROOT.‘./uc_client/client.php‘;
if(isset($language[$subject]))
{
eval("\$subject =
addslashes(\"".$language[$subject]."\");");
}
if(isset($language[$message]))
{
eval("\$message =
addslashes(\"".$language[$message]."\");");
}
if($fromid === ‘‘)
{
$fromid =
$discuz_uid;
}
uc_pm_send($fromid,
$toid, $subject, $message);
}
/**
* 显示标准提示信息
* @param $toid -
信息
* @param $subject - 跳转到的url
* @param $message
- 扩展
*/
function showmessage($message,
$url_forward = ‘‘, $extra = ‘‘)
{
extract($GLOBALS,
EXTR_SKIP);
global
$extrahead, $discuz_action, $debuginfo, $seccode, $fid, $tid, $charset,
$show_message, $inajax, $_DCACHE,
$advlist;
define(‘CACHE_FORBIDDEN‘,
TRUE);
$show_message
= $message;
$msgforward =
unserialize($_DCACHE[‘settings‘][‘msgforward‘]);
$msgforward[‘refreshtime‘] = intval($msgforward[‘refreshtime‘]) *
1000;
$url_forward =
empty($url_forward) ? ‘‘ : (empty($_DCOOKIE[‘sid‘]) && $transsidstatus ?
transsid($url_forward) : $url_forward);
if($url_forward &&
empty($inajax) && $msgforward[‘quick‘] &&
$msgforward[‘messages‘] && @in_array($message, $msgforward[‘messages‘]))
{
updatesession();
dheader("location: ".str_replace(‘&‘, ‘&‘,
$url_forward));
}
if(in_array($extra,
array(‘HALTED‘, ‘NOPERM‘)))
{
$fid = $tid =
0;
$discuz_action = 254;
} else
{
$discuz_action = 255;
}
include
language(‘messages‘);
if(isset($language[$message]))
{
$pre = $inajax ? ‘ajax_‘ :
‘‘;
eval("\$show_message = \"".(isset($language[$pre.$message]) ?
$language[$pre.$message] :
$language[$message])."\";");
unset($pre);
}
$show_message .=
$url_forward && empty($inajax) ?
‘<script>setTimeout("window.location.href =\‘‘.$url_forward.‘\‘;",
‘.$msgforward[‘refreshtime‘].‘);</script>‘ : ‘‘;
if($advlist =
array_merge($globaladvs ? $globaladvs[‘type‘] : array(), $redirectadvs ?
$redirectadvs[‘type‘] : array()))
{
$advitems = ($globaladvs ? $globaladvs[‘items‘] : array()) + ($redirectadvs ?
$redirectadvs[‘items‘] :
array());
foreach($advlist AS $type => $redirectadvs)
{
$advlist[$type] =
$advitems[$redirectadvs[array_rand($redirectadvs)]];
}
}
if($extra == ‘NOPERM‘)
{
//get secure code checking status (pos.
-2)
if($seccodecheck = substr(sprintf(‘%05b‘, $seccodestatus), -2, 1))
{
$seccode = random(6, 1) + $seccode{0} *
1000000;
}
include
template(‘nopermission‘);
} else
{
include
template(‘showmessage‘);
}
dexit();
}
/**
* 显示等级
* @param $num -
等级
*/
function showstars($num)
{
global
$starthreshold;
$alt = ‘alt="Rank:
‘.$num.‘"‘;
if(empty($starthreshold))
{
for($i = 0; $i < $num; $i++)
{
echo ‘<img src="‘.IMGDIR.‘/star_level1.gif" ‘.$alt.‘
/>‘;
}
} else
{
for($i = 3; $i > 0; $i--)
{
$numlevel = intval($num / pow($starthreshold, ($i -
1)));
$num = ($num % pow($starthreshold, ($i -
1)));
for($j = 0; $j < $numlevel; $j++)
{
echo ‘<img src="‘.IMGDIR.‘/star_level‘.$i.‘.gif" ‘.$alt.‘
/>‘;
}
}
}
}
/**
* 返回当前链接的域名
* @return
返回域名
*/
function site()
{
return
$_SERVER[‘HTTP_HOST‘];
}
/**
* 判断一个字符串是否在另一个字符串中存在
* @param
haystack 待查找的字符串
* @param $needls 被查找的字符串
*
@return 是否存在
*/
function strexists($haystack,
$needle) {
return
!(strpos($haystack, $needle) === FALSE);
}
/**
* 验证码数字转字母
* @param seccode
带转换的验证码数字变量
*/
function
seccodeconvert(&$seccode)
{
global
$seccodedata,
$charset;
$seccode =
substr($seccode, -6);
if($seccodedata[‘type‘] == 1)
{
include_once
language(‘seccode‘);
$len = strtoupper($charset) == ‘GBK‘ ? 2 :
3;
$code = array(substr($seccode, 0, 3), substr($seccode, 3,
3));
$seccode =
‘‘;
for($i = 0; $i < 2; $i++)
{
$seccode .= substr($lang[‘chn‘], $code[$i] * $len,
$len);
}
return;
}
elseif($seccodedata[‘type‘] == 3)
{
$s = sprintf(‘%04s‘, base_convert($seccode, 10,
20));
$seccodeunits =
‘CEFHKLMNOPQRSTUVWXYZ‘;
} else
{
$s = sprintf(‘%04s‘, base_convert($seccode, 10,
24));
$seccodeunits =
‘BCEFGHJKMPQRTVWXY2346789‘;
}
$seccode =
‘‘;
for($i = 0; $i
< 4; $i++)
{
$unit =
ord($s{$i});
$seccode .= ($unit >= 0x30 && $unit <= 0x39) ? $seccodeunits[$unit
- 0x30] : $seccodeunits[$unit -
0x57];
}
}
/*** 检查是否正确提交了表单* @param $var
需要检查的变量* @param $allowget 是否允许GET方式* @param
$seccodecheck 验证码检测是否开启* @return
返回是否正确提交了表单*/function submitcheck($var,
$allowget = 0, $seccodecheck = 0, $secqaacheck = 0)
{
if(empty($GLOBALS[$var]))
{
return FALSE; } else
{
global $_SERVER, $seclevel, $seccode, $seccodedata, $seccodeverify, $secanswer,
$_DCACHE, $_DCOOKIE, $timestamp,
$discuz_uid;
if($allowget || ($_SERVER[‘REQUEST_METHOD‘] == ‘POST‘ &&
$GLOBALS[‘formhash‘] == formhash() && (empty($_SERVER[‘HTTP_REFERER‘])
||
preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1",
$_SERVER[‘HTTP_REFERER‘]) == preg_replace("/([^\:]+).*/", "\\1",
$_SERVER[‘HTTP_HOST‘]))))
{
if($seccodecheck)
{
if(!$seclevel)
{
$key = $seccodedata[‘type‘] != 3 ? ‘‘ :
$_DCACHE[‘settings‘][‘authkey‘].date(‘Ymd‘);
list($seccode, $expiration, $seccodeuid) = explode("\t",
authcode($_DCOOKIE[‘secc‘], ‘DECODE‘,
$key));
if($seccodeuid != $discuz_uid || $timestamp - $expiration > 600)
{
showmessage(‘submit_seccode_invalid‘);
}
dsetcookie(‘secc‘, ‘‘, -86400 *
365);
} else
{
$tmp = substr($seccode, 0,
1);
}
seccodeconvert($seccode);
if(strtoupper($seccodeverify) != $seccode)
{
showmessage(‘submit_seccode_invalid‘);
}
$seclevel && $seccode = random(6, 1) + $tmp *
1000000;
}
if($secqaacheck)
{
if(!$seclevel)
{
list($seccode, $expiration, $seccodeuid) = explode("\t",
authcode($_DCOOKIE[‘secq‘],
‘DECODE‘));
if($seccodeuid != $discuz_uid || $timestamp - $expiration > 600)
{
showmessage(‘submit_secqaa_invalid‘);
}
dsetcookie(‘secq‘, ‘‘, -86400 *
365);
}
require_once
DISCUZ_ROOT.‘./forumdata/cache/cache_secqaa.php‘;
if(md5($secanswer) != $_DCACHE[‘secqaa‘][substr($seccode, 0, 1)][‘answer‘])
{
showmessage(‘submit_secqaa_invalid‘);
}
$seclevel && $seccode = random(1, 1) * 1000000 + substr($seccode,
-6);
}
return
TRUE;
} else
{
showmessage(‘submit_invalid‘);
}
}}
/**
* 解析模板
* @return
返回域名
*/
function template($file, $templateid =
0, $tpldir = ‘‘) {
global $inajax;
$file
.= $inajax && ($file == ‘header‘ || $file == ‘footer‘) ? ‘_ajax‘ :
‘‘;
$tpldir = $tpldir
? $tpldir : TPLDIR;
$templateid = $templateid ? $templateid : TEMPLATEID;
$tplfile =
DISCUZ_ROOT.‘./‘.$tpldir.‘/‘.$file.‘.htm‘;
$objfile =
DISCUZ_ROOT.‘./forumdata/templates/‘.$templateid.‘_‘.$file.‘.tpl.php‘;
if($templateid != 1 && !file_exists($tplfile))
{
$tplfile =
DISCUZ_ROOT.‘./templates/default/‘.$file.‘.htm‘;
}
@checktplrefresh($tplfile, $tplfile, filemtime($objfile), $templateid,
$tpldir);
return
$objfile;
}
/**
* 如果cookie关闭使用GET方式传递sid
* @param
$url - 地址
* @param $tag - 标记
* @param $wml -
取得sid的input
* @return
返回url
*/
function transsid($url, $tag = ‘‘, $wml
= 0) {
global
$sid;
$tag =
stripslashes($tag);
if(!$tag || (!preg_match("/^(http:\/\/|mailto:|#|javascript)/i", $url)
&& !strpos($url, ‘sid=‘)))
{
if($pos = strpos($url, ‘#‘))
{
$urlret = substr($url,
$pos);
$url = substr($url, 0,
$pos);
} else
{
$urlret =
‘‘;
}
$url .= (strpos($url, ‘?‘) ? ($wml ? ‘&‘ : ‘&‘) :
‘?‘).‘sid=‘.$sid.$urlret;
}
return
$tag.$url;
}
/**
* 显示主题分类
* @param $curtypeid -
当前被选择的类型id
* @return
返回的HTML数据
*/
function typeselect($curtypeid = 0,
$special = ‘‘, $onchange = ‘‘, $modelid = 0)
{
global $fid, $sid,
$extra;
$onchange =
$onchange ? $onchange :
"onchange=\"ajaxget(‘post.php?action=threadtypes&typeid=‘+this.options[this.selectedIndex].value+‘&fid=$fid&sid=$sid‘,
‘threadtypes‘,
‘threadtypeswait‘)\"";
if($threadtypes = $GLOBALS[‘forum‘][‘threadtypes‘])
{
$selecthtml =
‘‘;
foreach($threadtypes[‘types‘] as $typeid => $name)
{
if(!$special || $special == ‘disabled‘ || !$threadtypes[‘special‘][$typeid])
{
$typehtml = ‘<option value="‘.$typeid.‘" ‘.($curtypeid == $typeid ?
‘selected="selected"‘ : ‘‘).‘ ‘.($threadtypes[‘special‘][$typeid] ?
‘class="special"‘ :
‘‘).‘>‘.strip_tags($name).‘</option>‘;
$selecthtml .= $modelid ? ($threadtypes[‘modelid‘][$typeid] == $modelid ?
$typehtml : ‘‘) :
$typehtml;
}
}
$html = $selecthtml ? ‘<select name="typeid" ‘.(!$special ? $onchange :
‘‘).‘><option value="0">
</option>‘.$selecthtml.‘</select><span
id="threadtypeswait"></span>‘.($special === ‘disabled‘ ? ‘<input
type="hidden" name="typeid" value="‘.$curtypeid.‘" />‘ : ‘‘) :
‘‘;
return $html;
} else
{
return ‘‘;
}
}
/**
* 更新积分
* @param $uids -
用户id数组
* @param $creditsarray - 积分数组
* @param
$coef - 积分
* @param $extrasql -
扩展SQL
*/
function updatecredits($uids,
$creditsarray, $coef = 1, $extrasql = ‘‘)
{
if($uids &&
((!empty($creditsarray) && is_array($creditsarray)) || $extrasql))
{
global $db,
$tablepre;
$creditsadd = $comma =
‘‘;
foreach($creditsarray as $id => $addcredits)
{
$creditsadd .=
$comma.‘extcredits‘.$id.‘=extcredits‘.$id.‘+(‘.intval($addcredits).‘)*(‘.$coef.‘)‘;
$comma = ‘,
‘;
}
if($creditsadd || $extrasql)
{
$db->query("UPDATE {$tablepre}members SET $creditsadd ".($creditsadd
&& $extrasql ? ‘, ‘ : ‘‘)." $extrasql WHERE uid IN (‘$uids‘)",
‘UNBUFFERED‘);
}
}
}
/**
*
更新session
*/
function updatesession()
{
if(!empty($GLOBALS[‘sessionupdated‘]))
{
return TRUE;
}
global $db, $tablepre,
$sessionexists, $sessionupdated, $sid, $onlineip, $discuz_uid, $discuz_user,
$timestamp, $lastactivity,
$seccode,
$pvfrequence, $spageviews, $lastolupdate, $oltimespan, $onlinehold, $groupid,
$styleid, $invisible, $discuz_action, $fid, $tid;
$fid =
intval($fid);
$tid =
intval($tid);
if($oltimespan &&
$discuz_uid && $lastactivity && $timestamp - ($lastolupdate ?
$lastolupdate : $lastactivity) > $oltimespan * 60)
{
$lastolupdate =
$timestamp;
$db->query("UPDATE {$tablepre}onlinetime SET total=total+‘$oltimespan‘,
thismonth=thismonth+‘$oltimespan‘, lastupdate=‘$timestamp‘ WHERE
uid=‘$discuz_uid‘ AND lastupdate<=‘".($timestamp - $oltimespan *
60)."‘");
if(!$db->affected_rows())
{
$db->query("INSERT INTO {$tablepre}onlinetime (uid, thismonth, total,
lastupdate)
VALUES (‘$discuz_uid‘, ‘$oltimespan‘, ‘$oltimespan‘, ‘$timestamp‘)",
‘SILENT‘);
}
} else
{
$lastolupdate =
intval($lastolupdate);
}
if($sessionexists == 1)
{
if($pvfrequence && $discuz_uid)
{
if($spageviews >= $pvfrequence)
{
$pageviewsadd = ‘,
pageviews=\‘0\‘‘;
$db->query("UPDATE {$tablepre}members SET pageviews=pageviews+‘$spageviews‘
WHERE uid=‘$discuz_uid‘",
‘UNBUFFERED‘);
} else
{
$pageviewsadd = ‘,
pageviews=pageviews+1‘;
}
} else
{
$pageviewsadd =
‘‘;
}
$db->query("UPDATE {$tablepre}sessions SET uid=‘$discuz_uid‘,
username=‘$discuz_user‘, groupid=‘$groupid‘, styleid=‘$styleid‘,
invisible=‘$invisible‘, action=‘$discuz_action‘, lastactivity=‘$timestamp‘,
lastolupdate=‘$lastolupdate‘, seccode=‘$seccode‘, fid=‘$fid‘, tid=‘$tid‘
$pageviewsadd WHERE
sid=‘$sid‘");
} else
{
$ips = explode(‘.‘, $onlineip);
$db->query("DELETE FROM {$tablepre}sessions WHERE sid=‘$sid‘ OR
lastactivity<($timestamp-$onlinehold) OR (‘$discuz_uid‘<>‘0‘ AND
uid=‘$discuz_uid‘) OR (uid=‘0‘ AND ip1=‘$ips[0]‘ AND ip2=‘$ips[1]‘ AND
ip3=‘$ips[2]‘ AND ip4=‘$ips[3]‘ AND
lastactivity>$timestamp-60)");
$db->query("INSERT INTO {$tablepre}sessions (sid, ip1, ip2, ip3, ip4, uid,
username, groupid, styleid, invisible, action, lastactivity, lastolupdate,
seccode, fid,
tid)
VALUES (‘$sid‘, ‘$ips[0]‘, ‘$ips[1]‘, ‘$ips[2]‘, ‘$ips[3]‘, ‘$discuz_uid‘,
‘$discuz_user‘, ‘$groupid‘, ‘$styleid‘, ‘$invisible‘, ‘$discuz_action‘,
‘$timestamp‘, ‘$lastolupdate‘, ‘$seccode‘, ‘$fid‘, ‘$tid‘)",
‘SILENT‘);
if($discuz_uid && $timestamp - $lastactivity > 21600)
{
if($oltimespan && $timestamp - $lastactivity > 86400)
{
$query = $db->query("SELECT total FROM {$tablepre}onlinetime WHERE
uid=‘$discuz_uid‘");
$oltimeadd = ‘, oltime=‘.round(intval($db->result($query, 0)) /
60);
} else
{
$oltimeadd =
‘‘;
}
$db->query("UPDATE {$tablepre}members SET lastip=‘$onlineip‘,
lastvisit=lastactivity, lastactivity=‘$timestamp‘ $oltimeadd WHERE
uid=‘$discuz_uid‘",
‘UNBUFFERED‘);
}
}
$sessionupdated =
1;
}
/**
*
更新管理者状态
* @param $modacton - 动作
* @param $smcols
- 执行次数
*/
function updatemodworks($modaction,
$posts = 1) {
global
$modworkstatus, $db, $tablepre, $discuz_uid, $timestamp,
$_DCACHE;
$today =
gmdate(‘Y-m-d‘, $timestamp + $_DCACHE[‘settings‘][‘timeoffset‘] *
3600);
if($modworkstatus && $modaction && $posts)
{
$db->query("UPDATE {$tablepre}modworks SET count=count+1,
posts=posts+‘$posts‘ WHERE uid=‘$discuz_uid‘ AND modaction=‘$modaction‘ AND
dateline=‘$today‘");
if(!$db->affected_rows())
{
$db->query("INSERT INTO {$tablepre}modworks (uid, modaction, dateline, count,
posts) VALUES (‘$discuz_uid‘, ‘$modaction‘, ‘$today‘, 1,
‘$posts‘)");
}
}
}
/**
* 写日志
* @param $path
日志名称
* @param $log
日志
*/
function writelog($file, $log)
{
global $timestamp,
$_DCACHE;
$yearmonth
= gmdate(‘Ym‘, $timestamp + $_DCACHE[‘settings‘][‘timeoffset‘] *
3600);
$logdir =
DISCUZ_ROOT.‘./forumdata/logs/‘;
$logfile =
$logdir.$yearmonth.‘_‘.$file.‘.php‘;
if(@filesize($logfile) > 2048000)
{
$dir =
opendir($logdir);
$length =
strlen($file);
$maxid = $id =
0;
while($entry = readdir($dir))
{
if(strexists($entry, $yearmonth.‘_‘.$file))
{
$id = intval(substr($entry, $length + 8,
-4));
$id > $maxid && $maxid =
$id;
}
}
closedir($dir);
$logfilebak = $logdir.$yearmonth.‘_‘.$file.‘_‘.($maxid +
1).‘.php‘;
@rename($logfile,
$logfilebak);
}
if($fp =
@fopen($logfile, ‘a‘))
{
@flock($fp,
2);
$log = is_array($log) ? $log :
array($log);
foreach($log as $tmp)
{
fwrite($fp, "<?PHP exit;?>\t".str_replace(array(‘<?‘, ‘?>‘), ‘‘,
$tmp)."\n");
}
fclose($fp);
}
}
function wipespecial($str)
{
return
str_replace(array( "\n", "\r", ‘..‘), array(‘‘, ‘‘, ‘‘),
$str);
}
function discuz_uc_avatar($uid, $size = ‘‘)
{
return
UC_API.‘/avatar.php?uid=‘.$uid.‘&size=‘.$size;
}
?>
Discuz常用函数解析,布布扣,bubuko.com
Discuz常用函数解析
原文:http://www.cnblogs.com/cninin/p/3655039.html