轉自www.discuz.net 做者:郭鑫 /** * 用來獲得上一個頁面的地址,也就是來路。 * @para string $default 這個參數是直接設置一個refer,不用判斷獲得 * * @return string */ 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用的,我以爲這個和clearcookies放到一塊兒比較好,不過好像這個是按字母排的… * @para string $var cookie名 * @para string $value cookie值 * @para int $life 生存時間 * @para int $prefix cookie前綴 * */ function dsetcookie($var, $value, $life = 0, $prefix = 1) { global $cookiepre, $cookiedomain, $cookiepath, $timestamp, $_SERVER; //echo $prefix."--".$var."--".$value."--".$life."--".$cookiepath; setcookie(($prefix ? $cookiepre : '').$var, $value, $life ? $timestamp + $life : 0, $cookiepath, $cookiedomain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0); } 複製內容到剪貼板代碼: /** * 刪除論壇的附件用的 * @para string $filename 附件名 * @para int $havethumb 是否有縮略圖 * @para int $remote 是否爲遠程附件 * */ 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鏈接用的,好比把[email]nicollelord@yahoo.com[/email]換成:<a href="mailto:nicollelord@yahoo.com">nicollelord@yahoo.com</a>這樣的形式 * @para string $email * @para int $tolink */ function emailconv($email, $tolink = 1) { $email = str_replace(array('@', '.'), array('@', '.'), $email); return $tolink ? '<a href="mailto: '.$email.'">'.$email.'</a>': $email; } 複製內容到剪貼板代碼: /** * 記錄錯誤日誌用的 * @para string $type 錯誤類型 * @para string $message 錯誤內容 * @para int $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) { dexit(); } } 複製內容到剪貼板代碼: /** * 判斷訪問者是否是robot * * @return boolean */ 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; } 複製內容到剪貼板代碼: /** * 獲得一個文件的擴展名 * @para string $filename * * @return string */ function fileext($filename) { return trim(substr(strrchr($filename, '.'), 1, 10)); } /** * 用當前時間,會員名,uid,密碼,authkey生成一個form hash(哈希) * * @return string */ function formhash() { global $discuz_user, $discuz_uid, $discuz_pw, $timestamp, $discuz_auth_key; return substr(md5(substr($timestamp, 0, -7).$discuz_user.$discuz_uid.$discuz_pw.$discuz_auth_key), 8, 8); } 複製內容到剪貼板代碼: /** * 生成論壇訪問權限的字串,以|隔開 * @para string $permstr 訪問權限字串 * * @return string */ 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); } 複製內容到剪貼板代碼: /** * 獲得用戶組,同步groupid和member['groupid'],當會員積分和當前積分不一致更新members表。 * @para int $uid 會員的uid * @para array $group 會員所屬的用戶組 * @para array $member * * @return string */ 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'"; } 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']; } 複製內容到剪貼板代碼: /** * 這個的做用主要是把序列化後存在於數據庫中的會員組到期信息取出來 * @para string $terms * @para int $expiry */ 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是否是在容許訪問的範圍內 * @para string $ip * @para array $accesslist * * @return boolean */ function ipaccess($ip, $accesslist) { return preg_match("/^(".str_replace(array("\r\n", ' '), array('|', ''), preg_quote($accesslist, '/')).")/", $ip); } 複製內容到剪貼板代碼: /** * 判斷ip是否是被ban了 * @para string $onlineip * * @return boolean */ 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); } } 複製內容到剪貼板代碼: /** * 檢查一個email的合法性 * @para string $email * * @return boolean */ function isemail($email) { return strlen($email) > 6 && preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/", $email); } 複製內容到剪貼板代碼: /** * Discuz語言解析用到的東西,即按照須要裝入語言包這個數組 * @para string $file 語言文件(如:templates, email, actions等) * @para int $templateid 用的是哪套模板中的,若沒有的話用TEMPLATEID這個常數取代 * @para string $tpldir 模板所在的目錄 * * @return array or false */ 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; } } 複製內容到剪貼板代碼: /** * 超經典的分頁函數來了 * @para int $num 記錄總數 * @para int $perpage 每頁的記錄數 * @para int $curpage 當前頁 * @para string $mpurl 這個是用來保留query string中的參數的,打個比方:forumdisplay.php?fid=2,這個就是mpurl了,處理後會變成forumdisplay.php?fid=2&page=xx * @para int $maxpages 最大的頁數 * @para int $page 總頁數 * @para int $simple 好像simple若是比一大的話就只有第一頁,上一頁,下一頁,最後頁 * @para string $onclick 點擊觸發的事件,AJAX用的。 * * @return string */ function multi($num, $perpage, $curpage, $mpurl, $maxpages = 0, $page = 10, $simple = 0, $onclick = '') { $multipage = ''; $mpurl .= strpos($mpurl, '?') ? '&' : '?'; $onclick = $onclick ? ' onclick="'.$onclick.'(event)"' : ''; 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="p_redirect"'.$onclick.'>|‹</a>' : ''). ($curpage > 1 && !$simple ? '<a href="'.$mpurl.'page='.($curpage - 1).'" class="p_redirect">‹‹</a>' : ''); for($i = $from; $i <= $to; $i++) { $multipage .= $i == $curpage ? '<a class="p_curpage">'.$i.'</a>' : '<a href="'.$mpurl.'page='.$i.'" class="p_num"'.$onclick.'>'.$i.'</a>'; } $multipage .= ($curpage < $pages && !$simple ? '<a href="'.$mpurl.'page='.($curpage + 1).'" class="p_redirect"'.$onclick.'>››</a>' : ''). ($to < $pages ? '<a href="'.$mpurl.'page='.$pages.'" class="p_redirect"'.$onclick.'>›|</a>' : ''). ($curpage == $maxpages ? '<a class="p_redirect" href="misc.php?action=maxpages&pages='.$maxpages.'">›?</a>' : ''). (!$simple && $pages > $page ? '<a class="p_pages" style="padding: 0px"><input class="p_input" type="text" name="custompage" onKeyDown="if(event.keyCode==13) {window.location=\''.$mpurl.'page=\'+this.value; return false;}"></a>' : ''); $multipage = $multipage ? '<div class="p_bar">'.(!$simple ? '<a class="p_total"> '.$num.' </a><a class="p_pages"> '.$curpage.'/'.$realpages.' </a>' : '').$multipage.'</div>' : ''; } return $multipage; }