PageRenderTime 60ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/phpsso_server/phpcms/libs/functions/global.func.php

https://github.com/sinfey69/cms
PHP | 818 lines | 521 code | 51 blank | 246 comment | 132 complexity | f111e9d82453f6a201309af2d47977fd MD5 | raw file
  1. <?php
  2. /**
  3. * global.func.php 公共函数库
  4. *
  5. * @copyright (C) 2005-2010 PHPCMS
  6. * @license http://www.phpcms.cn/license/
  7. * @lastmodify 2010-6-1
  8. */
  9. /**
  10. * 返回经addslashes处理过的字符串或数组
  11. * @param $string 需要处理的字符串或数组
  12. * @return mixed
  13. */
  14. function new_addslashes($string) {
  15. if(!is_array($string)) return addslashes($string);
  16. foreach($string as $key => $val) $string[$key] = new_addslashes($val);
  17. return $string;
  18. }
  19. /**
  20. * 返回经stripslashes处理过的字符串或数组
  21. * @param $string 需要处理的字符串或数组
  22. * @return mixed
  23. */
  24. function new_stripslashes($string) {
  25. if(!is_array($string)) return stripslashes($string);
  26. foreach($string as $key => $val) $string[$key] = new_stripslashes($val);
  27. return $string;
  28. }
  29. /**
  30. * 返回经addslashe处理过的字符串或数组
  31. * @param $obj 需要处理的字符串或数组
  32. * @return mixed
  33. */
  34. function new_html_special_chars($string) {
  35. $encoding = 'utf-8';
  36. if(strtolower(CHARSET)=='gbk') $encoding = 'gb2312';
  37. if(!is_array($string)) return htmlspecialchars($string,ENT_COMPAT,$encoding);
  38. foreach($string as $key => $val) $string[$key] = new_html_special_chars($val);
  39. return $string;
  40. }
  41. /**
  42. * 安全过滤函数
  43. *
  44. * @param $string
  45. * @return string
  46. */
  47. function safe_replace($string) {
  48. $string = str_replace('%20','',$string);
  49. $string = str_replace('%27','',$string);
  50. $string = str_replace('%2527','',$string);
  51. $string = str_replace('*','',$string);
  52. $string = str_replace('"','&quot;',$string);
  53. $string = str_replace("'",'',$string);
  54. $string = str_replace('"','',$string);
  55. $string = str_replace(';','',$string);
  56. $string = str_replace('<','&lt;',$string);
  57. $string = str_replace('>','&gt;',$string);
  58. $string = str_replace("{",'',$string);
  59. $string = str_replace('}','',$string);
  60. $string = str_replace('\\','',$string);
  61. return $string;
  62. }
  63. /**
  64. * 过滤ASCII码从0-28的控制字符
  65. * @return String
  66. */
  67. function trim_unsafe_control_chars($str) {
  68. $rule = '/[' . chr ( 1 ) . '-' . chr ( 8 ) . chr ( 11 ) . '-' . chr ( 12 ) . chr ( 14 ) . '-' . chr ( 31 ) . ']*/';
  69. return str_replace ( chr ( 0 ), '', preg_replace ( $rule, '', $str ) );
  70. }
  71. /**
  72. * 格式化文本域内容
  73. *
  74. * @param $string 文本域内容
  75. * @return string
  76. */
  77. function trim_textarea($string) {
  78. $string = nl2br ( str_replace ( ' ', '&nbsp;', $string ) );
  79. return $string;
  80. }
  81. /**
  82. * 将文本格式成适合js输出的字符串
  83. * @param string $string 需要处理的字符串
  84. * @param intval $isjs 是否执行字符串格式化,默认为执行
  85. * @return string 处理后的字符串
  86. */
  87. function format_js($string, $isjs = 1) {
  88. $string = addslashes(str_replace(array("\r", "\n"), array('', ''), $string));
  89. return $isjs ? 'document.write("'.$string.'");' : $string;
  90. }
  91. /**
  92. * 转义 javascript 代码标记
  93. *
  94. * @param $str
  95. * @return mixed
  96. */
  97. function trim_script($str) {
  98. $str = preg_replace ( '/\<([\/]?)script([^\>]*?)\>/si', '&lt;\\1script\\2&gt;', $str );
  99. $str = preg_replace ( '/\<([\/]?)iframe([^\>]*?)\>/si', '&lt;\\1iframe\\2&gt;', $str );
  100. $str = preg_replace ( '/\<([\/]?)frame([^\>]*?)\>/si', '&lt;\\1frame\\2&gt;', $str );
  101. $str = preg_replace ( '/]]\>/si', ']] >', $str );
  102. return $str;
  103. }
  104. /**
  105. * 获取当前页面完整URL地址
  106. */
  107. function get_url() {
  108. $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
  109. $php_self = $_SERVER['PHP_SELF'] ? safe_replace($_SERVER['PHP_SELF']) : safe_replace($_SERVER['SCRIPT_NAME']);
  110. $path_info = isset($_SERVER['PATH_INFO']) ? safe_replace($_SERVER['PATH_INFO']) : '';
  111. $relate_url = isset($_SERVER['REQUEST_URI']) ? safe_replace($_SERVER['REQUEST_URI']) : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.safe_replace($_SERVER['QUERY_STRING']) : $path_info);
  112. return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
  113. }
  114. /**
  115. * 字符截取 支持UTF8/GBK
  116. * @param $string
  117. * @param $length
  118. * @param $dot
  119. */
  120. function str_cut($string, $length, $dot = '...') {
  121. $strlen = strlen($string);
  122. if($strlen <= $length) return $string;
  123. $string = str_replace(array('&nbsp;', '&amp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;'), array(' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $string);
  124. $strcut = '';
  125. if(strtolower(CHARSET) == 'utf-8') {
  126. $n = $tn = $noc = 0;
  127. while($n < $strlen) {
  128. $t = ord($string[$n]);
  129. if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
  130. $tn = 1; $n++; $noc++;
  131. } elseif(194 <= $t && $t <= 223) {
  132. $tn = 2; $n += 2; $noc += 2;
  133. } elseif(224 <= $t && $t < 239) {
  134. $tn = 3; $n += 3; $noc += 2;
  135. } elseif(240 <= $t && $t <= 247) {
  136. $tn = 4; $n += 4; $noc += 2;
  137. } elseif(248 <= $t && $t <= 251) {
  138. $tn = 5; $n += 5; $noc += 2;
  139. } elseif($t == 252 || $t == 253) {
  140. $tn = 6; $n += 6; $noc += 2;
  141. } else {
  142. $n++;
  143. }
  144. if($noc >= $length) break;
  145. }
  146. if($noc > $length) $n -= $tn;
  147. $strcut = substr($string, 0, $n);
  148. } else {
  149. $dotlen = strlen($dot);
  150. $maxi = $length - $dotlen - 1;
  151. for($i = 0; $i < $maxi; $i++)
  152. {
  153. $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
  154. }
  155. }
  156. $strcut = str_replace(array('&', '"', "'", '<', '>'), array('&amp;', '&quot;', '&#039;', '&lt;', '&gt;'), $strcut);
  157. return $strcut.$dot;
  158. }
  159. /**
  160. * 获取请求ip
  161. *
  162. * @return ip地址
  163. */
  164. function ip() {
  165. if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
  166. $ip = getenv('HTTP_CLIENT_IP');
  167. } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
  168. $ip = getenv('HTTP_X_FORWARDED_FOR');
  169. } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
  170. $ip = getenv('REMOTE_ADDR');
  171. } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
  172. $ip = $_SERVER['REMOTE_ADDR'];
  173. }
  174. return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
  175. }
  176. function get_cost_time() {
  177. $microtime = microtime(TRUE);
  178. return $microtime - SYS_START_TIME;
  179. }
  180. /**
  181. * 程序执行时间
  182. *
  183. * @return int 单位ms
  184. */
  185. function execute_time() {
  186. $stime = explode ( ' ', SYS_START_TIME );
  187. $etime = explode ( ' ', microtime () );
  188. return number_format ( ($etime [1] + $etime [0] - $stime [1] - $stime [0]), 6 );
  189. }
  190. /**
  191. * 产生随机字符串
  192. *
  193. * @param int $length 输出长度
  194. * @param string $chars 可选的 ,默认为 0123456789
  195. * @return string 字符串
  196. */
  197. function random($length, $chars = '0123456789') {
  198. $hash = '';
  199. $max = strlen($chars) - 1;
  200. for($i = 0; $i < $length; $i++) {
  201. $hash .= $chars[mt_rand(0, $max)];
  202. }
  203. return $hash;
  204. }
  205. /**
  206. * 将字符串转换为数组
  207. *
  208. * @param string $data 字符串
  209. * @return array 返回数组格式,如果,data为空,则返回空数组
  210. */
  211. function string2array($data) {
  212. if($data == '') return array();
  213. eval("\$array = $data;");
  214. return $array;
  215. }
  216. /**
  217. * 将数组转换为字符串
  218. *
  219. * @param array $data 数组
  220. * @param bool $isformdata 如果为0,则不使用new_stripslashes处理,可选参数,默认为1
  221. * @return string 返回字符串,如果,data为空,则返回空
  222. */
  223. function array2string($data, $isformdata = 1) {
  224. if($data == '') return '';
  225. if($isformdata) $data = new_stripslashes($data);
  226. return addslashes(var_export($data, TRUE));
  227. }
  228. /**
  229. * 转换字节数为其他单位
  230. *
  231. *
  232. * @param string $filesize 字节大小
  233. * @return string 返回大小
  234. */
  235. function sizecount($filesize) {
  236. if ($filesize >= 1073741824) {
  237. $filesize = round($filesize / 1073741824 * 100) / 100 .' GB';
  238. } elseif ($filesize >= 1048576) {
  239. $filesize = round($filesize / 1048576 * 100) / 100 .' MB';
  240. } elseif($filesize >= 1024) {
  241. $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
  242. } else {
  243. $filesize = $filesize.' Bytes';
  244. }
  245. return $filesize;
  246. }
  247. /**
  248. * 字符串加密、解密函数
  249. *
  250. *
  251. * @param string $txt 字符串
  252. * @param string $operation ENCODE为加密,DECODE为解密,可选参数,默认为ENCODE,
  253. * @param string $key 密钥:数字、字母、下划线
  254. * @param string $expiry 过期时间
  255. * @return string
  256. */
  257. function sys_auth($string, $operation = 'ENCODE', $key = '', $expiry = 0) {
  258. $key_length = 4;
  259. $key = md5($key != '' ? $key : pc_base::load_config('system', 'auth_key'));
  260. $fixedkey = hash('md5', $key);
  261. $egiskeys = md5(substr($fixedkey, 16, 16));
  262. $runtokey = $key_length ? ($operation == 'ENCODE' ? substr(hash('md5', microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
  263. $keys = hash('md5', substr($runtokey, 0, 16) . substr($fixedkey, 0, 16) . substr($runtokey, 16) . substr($fixedkey, 16));
  264. $string = $operation == 'ENCODE' ? sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$egiskeys), 0, 16) . $string : base64_decode(substr($string, $key_length));
  265. $i = 0; $result = '';
  266. $string_length = strlen($string);
  267. for ($i = 0; $i < $string_length; $i++){
  268. $result .= chr(ord($string{$i}) ^ ord($keys{$i % 32}));
  269. }
  270. if($operation == 'ENCODE') {
  271. return $runtokey . str_replace('=', '', base64_encode($result));
  272. } else {
  273. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$egiskeys), 0, 16)) {
  274. return substr($result, 26);
  275. } else {
  276. return '';
  277. }
  278. }
  279. }
  280. /**
  281. * 语言文件处理
  282. *
  283. * @param string $language 标示符
  284. * @param array $pars 转义的数组,二维数组 ,'key1'=>'value1','key2'=>'value2',
  285. * @param string $modules 多个模块之间用半角逗号隔开,如:member,guestbook
  286. * @return string 语言字符
  287. */
  288. function L($language = 'no_language',$pars = array(), $modules = '') {
  289. static $LANG = array();
  290. if(!$LANG) {
  291. $lang = pc_base::load_config('system','lang');
  292. require_once PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.'system.lang.php';
  293. if(defined('IN_ADMIN')) require_once PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.'system_menu.lang.php';
  294. if(file_exists(PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.ROUTE_M.'.lang.php')) require PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.ROUTE_M.'.lang.php';
  295. if(!empty($modules)) {
  296. $modules = explode(',',$modules);
  297. foreach($modules AS $m) {
  298. require PC_PATH.'languages'.DIRECTORY_SEPARATOR.$lang.DIRECTORY_SEPARATOR.$m.'.lang.php';
  299. }
  300. }
  301. }
  302. if(!array_key_exists($language,$LANG)) {
  303. return $LANG['no_language'].'['.$language.']';
  304. } else {
  305. $language = $LANG[$language];
  306. if($pars) {
  307. foreach($pars AS $_k=>$_v) {
  308. $language = str_replace('{'.$_k.'}',$_v,$language);
  309. }
  310. }
  311. return $language;
  312. }
  313. }
  314. /**
  315. * 模板调用
  316. *
  317. * @param $module
  318. * @param $template
  319. * @param $istag
  320. * @return unknown_type
  321. */
  322. function template($module = 'content', $template = 'index', $style = 'default') {
  323. $template_cache = pc_base::load_sys_class('template_cache');
  324. $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';
  325. if(file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html')) {
  326. if(!file_exists($compiledtplfile) || (@filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > @filemtime($compiledtplfile))) {
  327. $template_cache->template_compile($module, $template, $style);
  328. }
  329. } else {
  330. $compiledtplfile = PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.default.php';
  331. if(file_exists(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') && filemtime(PC_PATH.'templates'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html') > filemtime($compiledtplfile)) {
  332. $template_cache->template_compile($module, $template, 'default');
  333. } else {
  334. showmessage('Template does not exist.'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.html');
  335. }
  336. }
  337. return $compiledtplfile;
  338. }
  339. /**
  340. * 输出自定义错误
  341. *
  342. * @param $errno 错误号
  343. * @param $errstr 错误描述
  344. * @param $errfile 报错文件地址
  345. * @param $errline 错误行号
  346. * @return string 错误提示
  347. */
  348. function my_error_handler($errno, $errstr, $errfile, $errline) {
  349. if($errno==8) return '';
  350. $errfile = str_replace(PHPCMS_PATH,'',$errfile);
  351. if(pc_base::load_config('system','errorlog')) {
  352. error_log(date('m-d H:i:s',SYS_TIME).' | '.$errno.' | '.str_pad($errstr,30).' | '.$errfile.' | '.$errline."\r\n", 3, CACHE_PATH.'error_log.php');
  353. } else {
  354. $str = '<div style="font-size:12px;text-align:left; border-bottom:1px solid #9cc9e0; border-right:1px solid #9cc9e0;padding:1px 4px;color:#000000;font-family:Arial, Helvetica,sans-serif;"><span>errorno:' . $errno . ',str:' . $errstr . ',file:<font color="blue">' . $errfile . '</font>,line' . $errline .'<br /><a href="http://faq.phpcms.cn/?type=file&errno='.$errno.'&errstr='.urlencode($errstr).'&errfile='.urlencode($errfile).'&errline='.$errline.'" target="_blank" style="color:red">Need Help?</a></span></div>';
  355. echo $str;
  356. }
  357. }
  358. /**
  359. * 提示信息页面跳转,跳转地址如果传入数组,页面会提示多个地址供用户选择,默认跳转地址为数组的第一个值,时间为5秒。
  360. * showmessage('登录成功', array('默认跳转地址'=>'http://www.phpcms.cn'));
  361. * @param string $msg 提示信息
  362. * @param mixed(string/array) $url_forward 跳转地址
  363. * @param int $ms 跳转等待时间
  364. */
  365. function showmessage($msg, $url_forward = 'goback', $ms = 1250, $dialog = '') {
  366. if(defined('IN_ADMIN')) {
  367. include(admin::admin_tpl('showmessage', 'admin'));
  368. } else {
  369. include(template('content', 'message'));
  370. }
  371. exit;
  372. }
  373. /**
  374. * 查询字符是否存在于某字符串
  375. *
  376. * @param $haystack 字符串
  377. * @param $needle 要查找的字符
  378. * @return bool
  379. */
  380. function str_exists($haystack, $needle)
  381. {
  382. return !(strpos($haystack, $needle) === FALSE);
  383. }
  384. /**
  385. * 取得文件扩展
  386. *
  387. * @param $filename 文件名
  388. * @return 扩展名
  389. */
  390. function fileext($filename) {
  391. return strtolower(trim(substr(strrchr($filename, '.'), 1, 10)));
  392. }
  393. /**
  394. * 加载模板标签缓存
  395. * @param string $name 缓存名
  396. * @param integer $times 缓存时间
  397. */
  398. function tpl_cache($name,$times = 0) {
  399. $filepath = 'tpl_data';
  400. $info = getcacheinfo($name, $filepath);
  401. if (SYS_TIME - $info['filemtime'] >= $times) {
  402. return false;
  403. } else {
  404. return getcache($name,$filepath);
  405. }
  406. }
  407. /**
  408. * 写入缓存,默认为文件缓存,不加载缓存配置。
  409. * @param $name 缓存名称
  410. * @param $data 缓存数据
  411. * @param $filepath 数据路径(模块名称) caches/cache_$filepath/
  412. * @param $type 缓存类型[file,memcache,apc]
  413. * @param $config 配置名称
  414. * @param $timeout 过期时间
  415. */
  416. function setcache($name, $data, $filepath='', $type='file', $config='', $timeout='') {
  417. pc_base::load_sys_class('cache_factory','',0);
  418. if($config) {
  419. $cacheconfig = pc_base::load_config('cache');
  420. $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
  421. } else {
  422. $cache = cache_factory::get_instance()->get_cache($type);
  423. }
  424. return $cache->set($name, $data, $timeout, '', $filepath);
  425. }
  426. /**
  427. * 读取缓存,默认为文件缓存,不加载缓存配置。
  428. * @param string $name 缓存名称
  429. * @param $filepath 数据路径(模块名称) caches/cache_$filepath/
  430. * @param string $config 配置名称
  431. */
  432. function getcache($name, $filepath='', $type='file', $config='') {
  433. pc_base::load_sys_class('cache_factory','',0);
  434. if($config) {
  435. $cacheconfig = pc_base::load_config('cache');
  436. $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
  437. } else {
  438. $cache = cache_factory::get_instance()->get_cache($type);
  439. }
  440. return $cache->get($name, '', '', $filepath);
  441. }
  442. /**
  443. * 删除缓存,默认为文件缓存,不加载缓存配置。
  444. * @param $name 缓存名称
  445. * @param $filepath 数据路径(模块名称) caches/cache_$filepath/
  446. * @param $type 缓存类型[file,memcache,apc]
  447. * @param $config 配置名称
  448. */
  449. function delcache($name, $filepath='', $type='file', $config='') {
  450. pc_base::load_sys_class('cache_factory','',0);
  451. if($config) {
  452. $cacheconfig = pc_base::load_config('cache');
  453. $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
  454. } else {
  455. $cache = cache_factory::get_instance()->get_cache($type);
  456. }
  457. return $cache->delete($name, '', '', $filepath);
  458. }
  459. /**
  460. * 读取缓存,默认为文件缓存,不加载缓存配置。
  461. * @param string $name 缓存名称
  462. * @param $filepath 数据路径(模块名称) caches/cache_$filepath/
  463. * @param string $config 配置名称
  464. */
  465. function getcacheinfo($name, $filepath='', $type='file', $config='') {
  466. pc_base::load_sys_class('cache_factory');
  467. if($config) {
  468. $cacheconfig = pc_base::load_config('cache');
  469. $cache = cache_factory::get_instance($cacheconfig)->get_cache($config);
  470. } else {
  471. $cache = cache_factory::get_instance()->get_cache($type);
  472. }
  473. return $cache->cacheinfo($name, '', '', $filepath);
  474. }
  475. function url($url, $isabs = 0) {
  476. if(strpos($url, '://') !== FALSE || $url[0] == '?') return $url;
  477. $siteurl = get_url();
  478. if($isabs || defined('SHOWJS')) {
  479. $url = strpos($url, WEB_PATH) === 0 ? $siteurl.substr($url, strlen(WEB_PATH)) : $siteurl.$url;
  480. } else {
  481. $url = strpos($url, WEB_PATH) === 0 ? $url : WEB_PATH.$url;
  482. }
  483. return $url;
  484. }
  485. /**
  486. * 生成sql语句,如果传入$in_cloumn 生成格式为 IN('a', 'b', 'c')
  487. * @param $data 条件数组或者字符串
  488. * @param $front 连接符
  489. * @param $in_column 字段名称
  490. * @return string
  491. */
  492. function to_sqls($data, $front = ' AND ', $in_column = false) {
  493. if($in_column && is_array($data)) {
  494. $ids = '\''.implode('\',\'', $data).'\'';
  495. $sql = "$in_column IN ($ids)";
  496. return $sql;
  497. } else {
  498. if ($front == '') {
  499. $front = ' AND ';
  500. }
  501. if(is_array($data) && count($data) > 0) {
  502. $sql = '';
  503. foreach ($data as $key => $val) {
  504. $sql .= $sql ? " $front `$key` = '$val' " : " `$key` = '$val' ";
  505. }
  506. return $sql;
  507. } else {
  508. return $data;
  509. }
  510. }
  511. }
  512. /**
  513. * 分页函数
  514. *
  515. * @param $num 信息总数
  516. * @param $curr_page 当前分页
  517. * @param $perpage 每页显示数
  518. * @param $urlrule URL规则
  519. * @param $array 需要传递的数组,用于增加额外的方法
  520. * @return 分页
  521. */
  522. function pages($num, $curr_page, $perpage = 20, $urlrule = '', $array = array()) {
  523. if($urlrule == '') $urlrule = url_par('page={$page}');
  524. $multipage = '';
  525. if($num > $perpage) {
  526. $page = 11;
  527. $offset = 4;
  528. $pages = ceil($num / $perpage);
  529. $from = $curr_page - $offset;
  530. $to = $curr_page + $offset;
  531. $more = 0;
  532. if($page >= $pages) {
  533. $from = 2;
  534. $to = $pages-1;
  535. } else {
  536. if($from <= 1) {
  537. $to = $page-1;
  538. $from = 2;
  539. } elseif($to >= $pages) {
  540. $from = $pages-($page-2);
  541. $to = $pages-1;
  542. }
  543. $more = 1;
  544. }
  545. $multipage .= L('total').'<b>'.$num.'</b>&nbsp;&nbsp;';
  546. if($curr_page>0) {
  547. $multipage .= ' <a href="'.pageurl($urlrule, $curr_page-1, $array).'" class="a1">'.L('previous').'</a>';
  548. if($curr_page==1) {
  549. $multipage .= ' <span>1</span>';
  550. } elseif($curr_page>6 && $more) {
  551. $multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>..';
  552. } else {
  553. $multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>';
  554. }
  555. }
  556. for($i = $from; $i <= $to; $i++) {
  557. if($i != $curr_page) {
  558. $multipage .= ' <a href="'.pageurl($urlrule, $i, $array).'">'.$i.'</a>';
  559. } else {
  560. $multipage .= ' <span>'.$i.'</span>';
  561. }
  562. }
  563. if($curr_page<$pages) {
  564. if($curr_page<$pages-5 && $more) {
  565. $multipage .= ' ..<a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next').'</a>';
  566. } else {
  567. $multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next').'</a>';
  568. }
  569. } elseif($curr_page==$pages) {
  570. $multipage .= ' <span>'.$pages.'</span> <a href="'.pageurl($urlrule, $curr_page, $array).'" class="a1">'.L('next').'</a>';
  571. } else {
  572. $multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next').'</a>'; }
  573. }
  574. return $multipage;
  575. }
  576. /**
  577. * 返回分页路径
  578. *
  579. * @param $urlrule 分页规则
  580. * @param $page 当前页
  581. * @param $array 需要传递的数组,用于增加额外的方法
  582. * @return 完整的URL路径
  583. */
  584. function pageurl($urlrule, $page, $array = array()) {
  585. if(strpos($urlrule, '#')) {
  586. $urlrules = explode('#', $urlrule);
  587. $urlrule = $page < 2 ? $urlrules[0] : $urlrules[1];
  588. }
  589. $findme = array('{$page}');
  590. $replaceme = array($page);
  591. if (is_array($array)) foreach ($array as $k=>$v) {
  592. $findme[] = '{$'.$k.'}';
  593. $replaceme[] = $v;
  594. }
  595. $url = str_replace($findme, $replaceme, $urlrule);
  596. return $url;
  597. }
  598. /**
  599. * URL路径解析,pages 函数的辅助函数
  600. *
  601. * @param $par 传入需要解析的变量 默认为,page={$page}
  602. * @param $url URL地址
  603. * @return URL
  604. */
  605. function url_par($par, $url = '') {
  606. if($url == '') $url = get_url();
  607. $pos = strpos($url, '?');
  608. if($pos === false) {
  609. $url .= '?'.$par;
  610. } else {
  611. $querystring = substr(strstr($url, '?'), 1);
  612. parse_str($querystring, $pars);
  613. $query_array = array();
  614. foreach($pars as $k=>$v) {
  615. $query_array[$k] = $v;
  616. }
  617. $querystring = http_build_query($query_array).'&'.$par;
  618. $url = substr($url, 0, $pos).'?'.$querystring;
  619. }
  620. return $url;
  621. }
  622. /**
  623. * 判断email格式是否正确
  624. * @param $email
  625. */
  626. function is_email($email) {
  627. return strlen($email) > 6 && preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/", $email);
  628. }
  629. /**
  630. * iconv 编辑转换
  631. */
  632. if (!function_exists('iconv')) {
  633. function iconv($in_charset, $out_charset, $str) {
  634. $in_charset = strtoupper($in_charset);
  635. $out_charset = strtoupper($out_charset);
  636. if (function_exists('mb_convert_encoding')) {
  637. return mb_convert_encoding($str, $out_charset, $in_charset);
  638. } else {
  639. pc_base::load_sys_func('iconv');
  640. $in_charset = strtoupper($in_charset);
  641. $out_charset = strtoupper($out_charset);
  642. if($in_charset == 'UTF-8' && ($out_charset == 'GBK' || $out_charset == 'GB2312')) {
  643. return utf8_to_gbk($str);
  644. }
  645. if(($in_charset == 'GBK' || $in_charset == 'GB2312') && $out_charset == 'UTF-8') {
  646. return gbk_to_utf8($str);
  647. }
  648. return $str;
  649. }
  650. }
  651. }
  652. /**
  653. * 代码广告展示函数
  654. * @param intval $siteid 所属站点
  655. * @param intval $id 广告ID
  656. * @return 返回广告代码
  657. */
  658. function show_ad($siteid, $id) {
  659. $siteid = intval($siteid);
  660. $id = intval($id);
  661. if(!$id || !$siteid) return false;
  662. $p = pc_base::load_model('poster_model');
  663. $r = $p->get_one(array('spaceid'=>$id, 'siteid'=>$siteid), 'setting', '`id` ASC');
  664. if ($r['setting']) {
  665. $c = string2array($r['setting']);
  666. } else {
  667. $r['code'] = '';
  668. }
  669. return $c['code'];
  670. }
  671. /**
  672. * 获取当前的站点ID
  673. */
  674. function get_siteid() {
  675. static $siteid;
  676. if (!empty($siteid)) return $siteid;
  677. if (defined('IN_ADMIN')) {
  678. if ($d = param::get_cookie('siteid')) {
  679. $siteid = $d;
  680. } else {
  681. return '';
  682. }
  683. } else {
  684. $data = getcache('sitelist', 'commons');
  685. $site_url = SITE_PROTOCOL.SITE_URL;
  686. foreach ($data as $v) {
  687. if ($v['url'].'/' == $site_url) $siteid = $v['siteid'];
  688. }
  689. }
  690. return $siteid;
  691. }
  692. /**
  693. * 调用关联菜单
  694. * @param $linkageid
  695. * @param $id
  696. * @param $defaultvalue
  697. */
  698. function menu_linkage($linkageid = 0, $id = 'linkid', $defaultvalue = 0) {
  699. $linkageid = intval($linkageid);
  700. $datas = array();
  701. $datas = getcache($linkageid,'linkage');
  702. $infos = $datas['data'];
  703. $title = $defaultvalue ? $infos[$defaultvalue]['name'] : $datas['title'];
  704. $colObj = random(3).date('is');
  705. $string = '';
  706. if(!defined('LINKAGE_INIT')) {
  707. define('LINKAGE_INIT', 1);
  708. $string .= '<script type="text/javascript" src="'.JS_PATH.'linkage/js/mln.colselect.js"></script>';
  709. if(defined('IN_ADMIN')) {
  710. $string .= '<link href="'.JS_PATH.'linkage/style/admin.css" rel="stylesheet" type="text/css">';
  711. } else {
  712. $string .= '<link href="'.JS_PATH.'linkage/style/css.css" rel="stylesheet" type="text/css">';
  713. }
  714. }
  715. $string .= '<input type="hidden" name="info['.$id.']" value="1"><div id="'.$id.'"></div>';
  716. $string .= '<script type="text/javascript">';
  717. $string .= 'var colObj'.$colObj.' = {"Items":[';
  718. foreach($infos AS $k=>$v) {
  719. $s .= '{"name":"'.$v['name'].'","topid":"'.$v['parentid'].'","colid":"'.$k.'","value":"'.$k.'","fun":function(){}},';
  720. }
  721. $string .= substr($s, 0, -1);
  722. $string .= ']};';
  723. $string .= '$("#'.$id.'").mlnColsel(colObj'.$colObj.',{';
  724. $string .= 'title:"'.$title.'",';
  725. $string .= 'value:"'.$defaultvalue.'",';
  726. $string .= 'width:100';
  727. $string .= '});';
  728. $string .= '</script>';
  729. return $string;
  730. }
  731. /**
  732. * 判断字符串是否为utf8编码,英文和半角字符返回ture
  733. * @param $string
  734. * @return bool
  735. */
  736. function is_utf8($string) {
  737. return preg_match('%^(?:
  738. [\x09\x0A\x0D\x20-\x7E] # ASCII
  739. | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
  740. | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
  741. | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
  742. | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
  743. | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
  744. | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
  745. | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
  746. )*$%xs', $string);
  747. }
  748. /**
  749. * 获取UCenter数据库配置
  750. */
  751. function get_uc_database() {
  752. $config = pc_base::load_config('system');
  753. $config['uc_dbtablepre'] = str_replace('`'.$config['uc_dbname'].'`.','',$config['uc_dbtablepre']);
  754. return array (
  755. 'hostname' => $config['uc_dbhost'],
  756. 'database' => $config['uc_dbname'],
  757. 'username' => $config['uc_dbuser'],
  758. 'password' => $config['uc_dbpw'],
  759. 'tablepre' => $config['uc_dbtablepre'],
  760. 'charset' => $config['uc_dbcharset'],
  761. 'type' => 'mysql',
  762. 'debug' => true,
  763. 'pconnect' => 0,
  764. 'autoconnect' => 0
  765. );
  766. }
  767. ?>