PHPwind 源码解析大全


PHPwind 源码解析大全 本文由 gg8280525 发布:http://www.phpwind.net/read.php?tid=710678 下面对代码中的颜色使用作个说明 保留关键字 函数 类型 字符串 注释 括号 数字 运算符 预定义变量 PHP 开始结束标志 ************************** global.php 1800 || $CK[1]!=$manager || !SafeCheck($CK,PwdCode($manager_pwd))){ //取得风格值 $skin = $skinco ? $skinco : $db_defaultstyle; //设置用户组为空 $groupid = ''; //转页面显示$db_whybbsclose 信息即论坛关闭的原因 Showmsg($db_whybbsclose); } } //gmdate -- 格式化一个 GMT/UTC 日期/时间 //date -- 格式化一个本地时间/日期,返回将整数 times*****p 按照给定的格式字串而产生 的 //字符串。如果没有给出时间戳则使用本地当前时间。换句话说,times*****p 是可选的,默 认值为 time()。注: //有效的时间戳典型范围是格林威治时间 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 //03:14:07。(此范围符合 32 位有符号整数的最小值和最大值)。不过在 PHP 5.1 之前 此范围在某些系统 //(如 Windows)中限制为从 1970 年 1 月 1 日到 2038 年 1 月 19 日。 //格式字串可以识别以下 format 参数的字符串 format 字符 说明 返回值例子 //日 --- --- //d 月份中的第几天,有前导零的 2 位数字 01 到 31 //D 星期中的第几天,文本表示,3 个字母 Mon 到 Sun //j 月份中的第几天,没有前导零 1 到 31 //l(「L」的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday //N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7 (表示星期天) //S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 //w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六) //z 年份中的第几天 0 到 366 //星期 --- --- //W ISO-8601 格式年份中的第几周,每週从星期一开始(PHP 4.1.0 新加的) //月 --- --- //F 月份,完整的文本格式,例如 January 或者 March January 到 December //m 数字表示的月份,有前导零 01 到 12 //M 三个字母缩写表示的月份 Jan 到 Dec //n 数字表示的月份,没有前导零 1 到 12 //t 给定月份所应有的天数 28 到 31 //年 --- --- //L 是否为闰年 如果是闰年为 1,否则为 0 //o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前 一年或下一年,则用 //那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003 //Y 4 位数字完整表示的年份 例如:1999 或 2003 //y 2 位数字表示的年份 例如:99 或 03 //时间 --- --- //a 小写的上午和下午值 am 或 pm //A 大写的上午和下午值 AM 或 PM //B Swatch Internet 标准时 000 到 999 //g 小时,12 小时格式,没有前导零 1 到 12 //G 小时,24 小时格式,没有前导零 0 到 23 //h 小时,12 小时格式,有前导零 01 到 12 //H 小时,24 小时格式,有前导零 00 到 23 //i 有前导零的分钟数 00 到 59 //s 秒数,有前导零 00 到 59 //时区 --- --- //e 时区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores //I 是否为夏令时 如果是夏令时为 1,否则为 0 //O 与格林威治时间相差的小时数 例如:+0200 //T 本机所在的时区 例如:EST,MDT(在 Windows 下为完整文本格式,例如「Eastern //Standard Time」,中文版会显示「中国标准时间」)。 //Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正 的。 -43200 到 43200 //完整的日期/时间 --- --- //c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00 //r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200 //U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 参见 time() //格式字串中不能被识别的字符将原样显示。Z 格式在使用 gmdate() 时总是返回 0。 //取当前默认时区时间的 24 小时时间值,赋于$t['hours'] $t = array('hours'=>gmdate('G',$times*****p+$db_timedf*3600)); //floor -- 捨去法取整 //今天的起始时间 $tdtime = (floor($times*****p/3600)-$t['hours'])*3600; //是否需要更新在线情况标记 $runfc = 'N'; //如果上次访问时间和当前时间的时间差大于论坛设置的在线用户时限 //或者板块$fid 不为空且不等于 cookie 中的上次访问板块 id //或者上次访问板块 id 的 cookie 存在且$wind_in(论坛动作)为 hm(论坛首页) if($times*****p-$lastvisit>$db_onlinetime || ($fid && $fid != GetCookie('lastfid')) || (GetCookie('lastfid') && $wind_in=='hm')){ //设置 cookie 中上次访问板块 id Cookie('lastfid',$fid); //设置$runfc 为 Y $runfc='Y'; //包含 data/userglobal.php 文件,如果其中有重複包含,略过 require_once(R_P.'require/userglobal.php'); } ****************** // 包 含 require/db_'.$database.'.php 文件,如果其中有重複包含,略过(此处为 db_mysql.php) require_once(R_P.'require/db_'.$database.'.php'); //创建数据库连接 $db = new DB($dbhost, $dbuser, $dbpw, $dbname, $pconnect); //销毁$dbhost,$dbuser,$dbpw,$dbname,$pconnect,$manager_pwd 变量 unset($dbhost,$dbuser,$dbpw,$dbname,$pconnect,$manager_pwd); //从 cookie 中取得 winduser 信息解码用"\t"分割后存入$winduid,$windpwd list($winduid,$windpwd)=explode("\t",StrCode(GetCookie('winduser'),'DECODE')); //若用户登陆 id 存在且密码长度大等于 16 if($winduid && strlen($windpwd)>=16){ //定义$winddb 为用户信息数组 $winddb = User_info(); //用户 id $winduid = $winddb['uid']; //用户组 id $groupid = $winddb['groupid']; //用户实际威望为数据库中威望值/10 取整 $userrvrc = (int)($winddb['rvrc']/10); //用户名 $windid = $winddb['username']; //用户时间显示格式 $_datefm = $winddb['datefm']; //用户时区设置 $_timedf = $winddb['timedf']; //用户皮肤 $skin = $winddb['style'] ? $winddb['style'] : $db_defaultstyle; //用户在线 ip $winddb['onlineip']=substr($winddb['onlineip'],0,strpos($winddb['onlineip'],'|')); //如果用户组 id 为-1 则设置用户组 id 为用户的会员组 id $groupid=='-1' && $groupid=$winddb['memberid']; //若用户开启签名显示功能 且 //(( 用 户 开 始 使用签名时间为空 且 签名显示一天需要交易币个数不为空 且当前用户组属 于需要购买签名显示的用户组 且 用户拥有的交易币数大于签名显示一天需要交易币个数) 或者 //(用户开始使用签名时间不为空 且 用户开始使用签名时间不等于今日开始时间)) if($winddb['showsign'] && (!$winddb['starttime'] && $db_signmoney && strpos($db_signgroup,",$groupid,") !== false && $winddb['currency'] > $db_signmoney || $winddb['starttime'] && $winddb['starttime'] != $tdtime)){ //包含 require/Signfunc.php 文件,如果其中有重複包含,略过 require_once(R_P.'require/Signfunc.php'); //对用交易币购买签名做相应的操作 Signfunc($winddb['showsign'],$winddb['starttime'],$winddb['currency']); } } else{ //若登陆 id 不存在 //设置风格为论坛默认风格 $skin = $db_defaultstyle; //用户组为游客组 $groupid = 'guest'; //销毁$winddb unset($winddb); //设置用户名,用户 id,用户时间显示方式,用户时区设置 $windid=$winduid=$_datefm=$_timedf=''; } //取最优先的风格 $_GET['skinco'] && $skinco=$_GET['skinco']; $_POST['skinco'] && $skinco=$_POST['skinco']; //如果风格存在,且 D_P."data/style/$skinco.php"文件存在,风格变量中不包含".." if($skinco && file_exists(D_P."data/style/$skinco.php") && strpos($skinco,'..')===false){ //设置风格变量 $skin=$skinco; //设置风格 cookie Cookie('skinco',$skinco); } //对处在 ip 封禁列表中的 ip 禁止登陆 Ipban(); //设置上次访问 cookie,包括此次在线时间、当前时间、请求页面 Cookie('lastvisit',$c_oltime."\t".$times*****p."\t".$REQUEST_URI); //如果当前用户组不是游客 if($groupid!='guest'){ //且相应组别配置文件存在 if(file_exists(D_P."data/groupdb/group_$groupid.php")){ //包含相应组别配置文件,如有重複,略过 require_once(D_P."data/groupdb/group_$groupid.php"); }else{ //否则载入默认组别配置文件 require_once(D_P."data/groupdb/group_1.php"); } } else{ //载入游客组配置文件 require_once(D_P."data/groupdb/group_2.php"); } //HTTP_REFERER 链接到当前页面的前一页面的 URL 地址。不是所有的用户代理( 浏览 器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不 总是真实正确的。 //HTTP_HOST 当前请求的 Host: 头信息的内容。 //如果允许用户使用宣传代码且用户名非空且传入的参数$u 为数字 //或者传入的参数$a 存在且长度不超过 16 且 HTTP_REFERER 中不含 HTTP_HOST if($db_ads && !$windid && (is_numeric($u) || ($a && strlen($a)<16)) && strpos($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST'])===false){ //设置用户宣传 cookie userads Cookie('userads',"$u\t$a"); } //如果 SCR 常量没有定义 if(!defined('SCR')){ //定义其为 other define('SCR','other'); } //标记页面类型 $SCR = SCR; $header_ad=$footer_ad=''; //如果页面类型不是帖子页面 if(SCR != 'read'){ //取得广告信息数组 $advertdb = AdvertInit(SCR,$fid); //is_array -- 检测变量是否是数组 if(is_array($advertdb['header'])){ //array_rand -- 从数组中随机取出一个或多个单元 //取得页首广告 $header_ad = $advertdb['header'][array_rand($advertdb['header'])]['code']; } if(is_array($advertdb['footer'])){ //取得页尾广告 $footer_ad = $advertdb['footer'][array_rand($advertdb['footer'])]['code']; } } //返回页首导航 类似 霏凡论坛 -> 口- 超级灌水 function headguide($guidename=array(),$guide=''){ global $fid,$jinhua; if(is_array($guidename)){ foreach($guidename as $key=>$value){ if($key){ $headguide.=$value ? " -> $key" : " -> $key"; } } } else{ $headguide.=" -> ".$guidename; } //返回页首导航字符串 return $headguide; } //页面跳转 function refreshto($URL,$content,$statime=1){ global $db_ifjump; //替换 url 中的特殊字符= $URL=str_replace('=','=',$URL); //如果开启自动跳转且多少秒后抓向$statime 大于 0 if($db_ifjump && $statime>0){ //清空缓冲 ob_end_clean(); //是否允许 GZIP 压缩输出,允许使用 ob_gzhandler 压缩技术,否则只启动缓冲 global $tplpath,$fid,$imgpath,$db_obstart,$db_bbsname,$skin,$B_url; $index_name =& $db_bbsname; $index_url =& $B_url; $db_obstart==1 ? ob_start('ob_gzhandler') : ob_start(); //确定引用风格 if(file_exists(D_P."data/style/$skin.php") && strpos($skin,'..')===false){ include_once(D_P."data/style/$skin.php"); }else{ include_once(D_P."data/style/wind.php"); } //解出全局变量数组,如果有冲突不覆盖 @extract($GLOBALS, EXTR_SKIP); //包含对应风格目录下的 lang_refreshto.php 语言文件,如果其中有重複包含,略过 require_once GetLang('refreshto'); $lang[$content] && $content=$lang[$content]; //包含对应风格目录下的 refreshto.htm 文件 @require PrintEot('refreshto'); //退出 exit; } else{ ObHeader($URL); } } //页面直接转向 function ObHeader($URL){ global $db_obstart,$db_bbsurl,$db_htmifopen; //strtolower-小写处理字符串 //如果开启静态目录部署功能且 url 中不是 http 开头 if($db_htmifopen && strtolower(substr($URL,0,4))!='http'){ $URL="$db_bbsurl/$URL"; } //页面直接转向 if($db_obstart){ //header -- 发送一个原始 HTTP 标头 header("Location: $URL");exit; }else{ ob_start(); echo ""; exit; } } //转向显示提示信息的页面显示提示信息 function Showmsg($msg_info,$dejump=0){ //extract -- 从数组中将变量导入到当前的符号表 //extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的 变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以 是以下值之一: //EXTR_OVERWRITE(如果有冲突,覆盖已有的变量) //EXTR_SKIP(如果有冲突,不覆盖已有的变量) //EXTR_PREFIX_SAME(如果有冲突,在变量名前加上前缀 prefix) //EXTR_PREFIX_ALL(给所有变量名加上前缀 prefix) //EXTR_PREFIX_INVALID(仅在非法/数字的变量名前加上前缀 prefix) //EXTR_IF_EXISTS(仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。 可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖 这些变量的场合。) //EXTR_PREFIX_IF_EXISTS(仅在当前符号表中已有同名变量时,建立附加了前缀的变量 名,其它的都不处理) //EXTR_REFS(将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参 数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用) //如果没有指定 extract_type,则被假定为 EXTR_OVERWRITE。 //extract() 返回成功导入到符号表中的变量数目。 //$GLOBALS 由所有已定义全局变量组成的数组。变量名就是该数组的索引。 //将全局变量导入当前符号表 @extract($GLOBALS, EXTR_SKIP); //在函数中声明了全局变量,任何变量的所有引用变量都会指向到全局变量。包括修改 //声明全局变量,风格图片文件路径$stylepath,表格宽度$tablewidth,小表格宽度 $mtablewidth,风格模板路径$tplpath,$runfc global $stylepath,$tablewidth,$mtablewidth,$tplpath,$runfc; $runfc=''; //检查 SIMPLE 常量是否定义,如果定义过 if(defined('SIMPLE')){ //是一个链接基准标记,用以改变页面中所有链接标记的参数默认值。 echo ""; } //包含 require/header.php 文件,如果其中有重複包含,略过 require_once(R_P.'require/header.php'); //包含对应风格目录下的 lang_msg.php 语言文件,如果其中有重複包含,略过 require_once GetLang('msg'); //如果相应的语言文件中对应键值存在,则设置$msg_info 为对应值 $lang[$msg_info] && $msg_info=$lang[$msg_info]; //包含对应风格目录下的 showmsg.htm 文件 require_once PrintEot('showmsg'); exit; } //返回参数指定的文件相应风格语言文件路径 function GetLang($lang,$EXT="php"){ //声明全局变量风格模板路径 global $tplpath; //路径为…… $path=R_P."template/$tplpath/lang_$lang.$EXT"; //如果该风格下模板指定的文件不存在,则路径为默认的 wind 风格下的对应文件 !file_exists($path) && $path=R_P."template/wind/lang_$lang.$EXT"; return $path; } //返回参数指定的文件相应风格模板路径 function PrintEot($template,$EXT="htm"){ //Copyright (c) 2003-06 PHPWind //声明全局变量风格模板路径 global $tplpath; //如果参数为空,则设置参数值为 N if(!$template) $template=N; //路径为…… $path=R_P."template/$tplpath/$template.$EXT"; //如果该风格下模板指定的文件不存在,则路径为默认的 wind 风格下的对应文件 !file_exists($path) && $path=R_P."template/wind/$template.$EXT"; return $path; } //设置相关 cookie function Cookie($ck_Var,$ck_Value,$ck_Time = 'F'){ // 声 明全局变量 COOKIE 有 效 目录$db_ckpath,COOKIE 有 效 域 名 $db_ckdomain,$times*****p global $db_ckpath,$db_ckdomain,$times*****p; //如果设置有效的 cookie 时间参数为 F 则,cookie 有效时间设置为 31536000s 即 1 年 //否则如果传入的 cookie 参数值为空并且有效时间参数为 0 则设置 cookie 有效时间为 31536000s 即 1 年前,也就是无效 //如果都不是则设置时间为传入的 cookie 有效时间参数值 $ck_Time = $ck_Time == 'F' ? $times*****p + 31536000 : ($ck_Value == '' && $ck_Time == 0 ? $times*****p - 31536000 : $ck_Time); //SERVER_PORT-服务器所使用的端口。默认为「80」。如果使用 SSL 安全连接,则这 个值为用户设置的 HTTP 端口。 //判断是否使用安全连接 $S = $_SERVER['SERVER_PORT'] == 験' ? 1:0; //如果 COOKIE 有效目录为空则设置其为根目录 !$db_ckpath && $db_ckpath = '/'; //setcookie -- 发送一个 cookie 信息 //参数说明:Cookie 的名字,Cookie 的值,Cookie 过期的时间(这是个 Unix 时间戳,即从 Unix 纪元开始的秒数),Cookie 在服务器端的有效路径,该 cookie 有效的域名,指明 cookie 是否仅通过安全的 HTTPS 连接传送(当设成 TRUE 时,cookie 仅在安全的连接 中被设置,默认值为 FALSE) setCookie($ck_Var,$ck_Value,$ck_Time,$db_ckpath,$db_ckdomain,$S); } //取 cookie 中的某变量值 function GetCookie($Var){ //_COOKIE 通过 HTTP cookies 传递的变量组成的数组。是自动全局变量。 return $_COOKIE[$Var]; } //对处在 ip 封禁列表中的 ip 禁止登陆 function Ipban(){ //声明全局变量 IP 封禁列表$db_ipban,客户端 ip$onlineip,图片目录$imgpath,风格图片文件 路径$stylepath global $db_ipban,$onlineip,$imgpath,$stylepath; //如果 ip 封禁列表不为空 if($db_ipban){ //以","分割 $baniparray=explode(",",$db_ipban); foreach($baniparray as $banip){ //ip 为空继续下个循环 if(!$banip)continue; //去掉变量中的空格 $banip=trim($banip); //如果客户端 ip 在被封禁列表中 if(strpos(','.$onlineip.'.',','.$banip.'.')!==false){ //转页面显示语言文件中 ip_ban 对应键值的提示信息 Showmsg('ip_ban'); } } } } //删除文件 function P_unlink($filename){ //判断是否$filename 是否包含..,包含则退出显示 Forbidden strpos($filename,'..')!==false && exit('Forbidden'); //unlink -- 删除文件 @unlink($filename); } //读取文件内容 function readover($filename,$method="rb"){ //由于 strpos 函数返回是整数值,所 以 使用!==(不全等)符号判断是否$filename 是否包含.., 包含则退出显示 Forbidden strpos($filename,'..')!==false && exit('Forbidden'); //fopen -- 打开文件或者 URL, //mode 说明 //'r' 只读方式打开,将文件指针指向文件头。 //'r+' 读写方式打开,将文件指针指向文件头。 //'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试 创建之。 //'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试 创建之。 //'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 //'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 //'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用 失败并返回 FALSE, //并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底 层的 open(2) 系统调 //用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支 持,仅能用于本地文 //件。 //'x+' 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用 失败并返回 //FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这 和给 底层的 open //(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的 版本所支持,仅能用 //于本地文件。 //@为错误运算符。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信 息都被忽略掉。 //以读方式打开文件,并将返回的资源(resource)保存在$handle 变量中 if($handle=@fopen($filename,$method)){ //flock -- 轻便的咨询文件锁定 //flock() 操作的 handle 必须是一个已经打开的文件指针。operation 可以是以下值之一: LOCK_SH 取得共享锁定、LOCK_EX 取得独佔锁定、LOCK_UN 释放锁定、LOCK_NB 不 希望 flock() 在锁定时堵塞 flock($handle,LOCK_SH); //filesize 返回文件字节数 //fread() 从文件指针 handle 读取最多 length 个字节(这裡为全部),返回类型为 string $filedata=@fread($handle,filesize($filename)); //fclose -- 关闭一个已打开的文件指针 fclose($handle); } //返回文件内容 return $filedata; } //写入文件 function writeover($filename,$data,$method="rb+",$iflock=1,$check=1,$chmod=1){ //Copyright (c) 2003-06 PHPWind //判断是否$filename 是否包含..,包含则退出显示 Forbidden $check && strpos($filename,'..')!==false && exit('Forbidden'); //touch -- 设定文件的访问和修改时间 touch($filename); //以读写方式打开文件,并将返回的资源(resource)保存在$handle 变量中 $handle=fopen($filename,$method); if($iflock){ flock($handle,LOCK_EX); } //fwrite -- 写入文件(可安全用于二进制文件) fwrite($handle,$data); //ftruncate -- 将文件截断到给定的长度 if($method=="rb+") ftruncate($handle,strlen($data)); fclose($handle); //chmod -- 改变文件模式 //mode 参数包含三个八进制数按顺序分别指定了所有者、所有者所在的组以及所有人的访 问限制。每一部分都可以通过加入所需的权限来计算出所要的权限。数字 1 表示使文件可 执行,数字 2 表示使文件可写,数字 4 表示使文件可读。 $chmod && @chmod($filename,0777); } //打开文件,返回文件数组 function openfile($filename){ //读取文件内容 $filedata=readover($filename); //做相应替换 $filedata=str_replace("\n","\n<:wind:>",$filedata); //以"<:wind:>"分割,相当于每行一个数组元素 $filedb=explode("<:wind:>",$filedata); //count -- 计算数组中的单元数目或对像中的属性个数,返回 var 中的单元数目,通常是一 个 array,任何其它 //类型都只有一个单元。对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调 用 count()。该接口 //只有一个方法 count(),此方法返回 count() 函数的返回值。如果 var 不是数组类型或者 实现了 Countable //接口的对象,将返回 1,有 一 个 例 外,如果 var 是 NULL 则结果是 0。注 : 可选的 mode 参数自 PHP //4.2.0 起可用。如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将 递归地对数组计 //数。对计算多维数组的所有单元尤其有用。mode 的默认值是 0。count() 识别不了无限 递归。count() 对没 //有初始化的变量返回 0,但对于空的数组也会返回 0。用 isset() 来测试变量是否已经初 始化。 $count=count($filedb); //如果数组最后一个元素为空或者为"\r",销毁此元素 if($filedb[$count-1]==''||$filedb[$count-1]=="\r"){unset($filedb[$count-1]);} //empty -- 检查一个变量是否为空,如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说, //""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是 空的,如果 var //为空,则返回 TRUE。除了当变量没有置值时不产生警告之外,empty() 是 (boolean) var 的反义词。 if(empty($filedb)){$filedb[0]="";} //返回文件数组 return $filedb; } //更新在线信息 function Update_ol(){ global $runfc; if($runfc == 'Y'){ //声明全局变量在在线文件中的偏移量$ol_offset,用户 id$winduid,是否开启 IP 统计 $db_ipstates,是否修改$isModify global $ol_offset,$winduid,$db_ipstates,$isModify; //如果用户 id 存在 if($winduid != ''){ //更新在线会员文件 list($alt_offset,$isModify) = addonlinefile($ol_offset,$winduid); }else{ //更新在线游客文件 list($alt_offset,$isModify) = addguestfile($ol_offset); } //如果返回的文件中偏移量和当前 cookie 中的不同,更新该 cookie if($alt_offset!=$ol_offset)Cookie('ol_offset',$alt_offset,0); //重置是否更新在线信息标记为空 $runfc=''; //如果开启 ip 统计 且 //(cookie 中 ipstate 信息为空且修改标记为是 或 //cookie 中 ipstate 信息存在但其小于今日开始时间) if($db_ipstates && ((!GetCookie('ipstate') && $isModify===1) || (GetCookie('ipstate') && GetCookie('ipstate')<$GLOBALS['tdtime']))){ //包含 require/ipstates.php,若有重複,略过 require_once(R_P.'require/ipstates.php'); } } } //页脚处理显示函数 function footer(){ //声明全局变量数据库访问类$db,是否开启 GZIP 压缩输出$db_obstart,是否在页脚显示程 序运行时间$db_footertime,是否开启静态目录部署功能$db_htmifopen,当前时间秒数 $P_S_T,头部和尾部表格宽度$mtablewidth,联繫我们 URL$db_ceoconnect,PHPWin*****本 $wind_version,图片目录$imgpath,此风格在 image 目录下的文件夹名称$stylepath,页脚广 告$footer_ad,论坛联盟广告$db_union,当前时间$times*****p global $db,$db_obstart,$db_footertime,$db_htmifopen,$P_S_T,$mtablewidth,$db_ceoconnect,$ wind_version,$imgpath,$stylepath,$footer_ad,$db_union,$times*****p; //更新在线信息 Update_ol(); //如果访问类不为空 if($db){ //记录查询次数 $qn=$db->query_num; } //显示是否开始 gzip 压缩 $ft_gzip=($db_obstart==1 ? "Gzip enabled" : "Gzip disabled").$db_union[3]; //如果设置了允许在页脚显示程序运行时间 if ($db_footertime == 1){ $t_array = explode(' ',microtime()); //number_format 按照千分制划分数字,string number_format ( float number [, int decimals [, //string dec_point, string thousands_sep]] )它接受一个、两个或四个参数,不接受三个; 给 //定一个将没有十进制 . 点号,只有千分制 , 逗号;两个,具有十进制的 . 点号和千进制 的 , 句号;四个,十进 //制、千进制全部用 , 都好划分;注:仅千进制的第一个字符被使用;例如,你使用 foo 作为千进制的区分,那 //么 1000 就成为 1f000; $totaltime = number_format(($t_array[0]+$t_array[1]-$P_S_T),6); $wind_spend = "Total $totaltime(s) query $qn,"; } //按格式取当前时间 $ft_time=get_date($times*****p,'m-d H:i'); //包含对应风格目录下的 footer.htm 文件 include PrintEot('footer'); //ob_get_contents 返回输出缓存的内容,如输出缓存未被激活,将返回缓存内容或 Flase; $output = str_replace(array('',''),array('',''),ob_get_contents()); //如果开启静态目录功能 if($db_htmifopen){ //preg_replace -- 执行正则表达式的搜索和替换,mixed preg_replace ( mixed pattern, mixed //replacement, mixed subject [, int limit] )在 subject 中搜索 pattern 模式的匹配项并替换 为 //replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1, 则所有的匹配项 //都会被替换。replacement 可以包含 \\n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引 用,首选使用后者。 ****************** ************** //每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 \\0 或 //$0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子 模式的数目。对替换模式 //在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能 使用熟悉的 \\1 符号 //来表示逆向引用。举例说 \\11,将会使 preg_replace() 搞不清楚是想要一个 \\1 的逆向 引用后面跟着一个 //数字 1 还是一个 \\11 的逆向引用。本例中的解决方法是使用 \${1}1。这会形成一个隔 离的 $1 逆向引用, //而使另一个 1 只是单纯的文字。 $output = preg_replace( "/\]+\s*)href\=([\"|\']?)([^\"\'>\s]+\.php\?[^\"\'>\s]+)([\"|\']?)/ies", "Htm_cv('\\3',' 标记之前,不会显示出整个表 格。一些版本的 //Microsoft Internet Explorer 只有当接受到的 256 个字节以后才开始显示该页面,所 以 必 须 发 送 一 些 额 外的 //空格来让这些浏览器显示页面内容。 flush; exit; } //返回静态目录功能开始时页面的访问路径 function Htm_cv($url,$tag){ //声明全局变量静态目录$db_dir,静态目录扩展名设置$db_ext global $db_dir,$db_ext; //ereg -- 正则表达式匹配,注: 使用 Perl 兼容正则表达式语法的 preg_match() 函数通常 是比 ereg() 更快 //的替代方桉。以区分大小写的方式在 string 中寻找与给定的正则表达式 pattern 所匹配 的子串。如果找到与 //pattern 中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数 regs,则匹配 项将被存入 regs //数组中。$regs[1] 包含第一个左圆括号开始的子串,$regs[2] 包含第二个子串,以此类推。 $regs[0] 包含 //整个匹配的字符串。注: 直到 PHP 4.1.0 为止,$regs 将被填充为正好十个单元,即使实 际匹配的子串少于十 //个。这并不影响 ereg() 匹配更多子串的能力。如果没有找到匹配,则 $regs 不会被 ereg() 更改。 如果在 //string 中找到 pattern 模式的匹配则返回 TRUE,如果没有找到匹配或出错则返回 FALSE。 if(ereg("^http|ftp|telnet|mms|rtsp|admin.php|rss.php",$url)===false){ if(strpos($url,'#')!==false){ $add = substr($url,strpos($url,'#')); } $url = str_replace( array('.php?','=','&',$add), array($db_dir,'-','-',''), $url ).$db_ext.$add; } return $tag.$url.'"'; } //取得用户信息数组 function User_info(){ //声明全局变量数据库访问类$db,当前时间$times*****p,在线用户时限$db_onlinetime,用户 id$winduid,用户密码$windpwd,是否记录会员在线时间并在版块内显示$db_ifonlinetime,用 户此次在线时间$c_oltime,客户端 ip$onlineip,是否开启 IP 验证功能$db_ipcheck,今日开始 时间$tdtime; global $db,$times*****p,$db_onlinetime,$winduid,$windpwd,$db_ifonlinetime,$c_oltime,$onlinei p,$db_ipcheck,$tdtime; $ct=''; //取得数据表中的相应记录 //相关字段名解释如下: //用户 id-m.uid, //用户名-m.username, //用户密码-m.password, //用户邮箱-m.email, //用户 qq 号-oicq, //用户系统组 id-m.groupid, //用户会员组 id-m.memberid, //用户注册时间-m.regdate, //用户时区设置-m.timedf, //用户风格设置-m.style, //用户时间显示格式设置-m.datefm, //主题列表每页个数-m.t_num, //文章列表每页个数-m.p_num, //是否已激活-m.yz, //是否有新的短消息-m.newpm, //是否开启签名展示功能-m.showsign, //用户交易帐号信息-m.payemail //用户发帖数-md.postnum, //用户威望数-md.rvrc, //用户金钱数-md.money, //用户自定义积分数-md.credit, //用户交易币数-md.currency, //用户上次访问时间-md.lastvisit, //用户这次访问时间-md.thisvisit, //用户在线时间-md.onlinetime, //用户上次回复时间-md.lastpost, //用户今日发帖数-md.todaypost, //用户在线 ip 情况-md.onlineip, //用户上传时间-md.uploadtime, //用户上传数-md.uploadnum, //使用所见即所得编辑器还是 windcode 编辑器-md.editor, //签名使用起始时间-md.starttime $detail =$db->get_one("SELECT m.uid,m.username,m.password,m.email,oicq,m.groupid,m.memberid,m.regdate,m.timedf ,m.style,m.datefm,m.t_num,m.p_num,m.yz,m.newpm,m.showsign,m.payemail,md.postnu m,md.rvrc,md.money,md.credit,md.currency,md.lastvisit,md.thisvisit,md.onlinetime,md.la stpost,md.todaypost,md.onlineip,md.uploadtime,md.uploadnum,md.editor,md.starttime FROM pcr_members m LEFT JOIN pcr_memberdata md USING(uid) WHERE m.uid='$winduid'"); //如果用户登陆 ip 字段中不存在当前客户端 ip 信息 if(strpos($detail['onlineip'],$onlineip)===false){ //以"."分割客户端 ip $iparray=explode(".",$onlineip); //如果用户登陆 ip 字段中不存在当前客户端 ip 的前 2 节则退出标记设为 Y if(strpos($detail['onlineip'],$iparray[0].'.'.$iparray[1])===false) $loginout='Y'; } //如果查询不到该会员信息即$detail 为空 //或者用户密码在编码后和 cookie 中保存的值不相同 //或者退出标记为 Y 且论坛开启了 IP 验证功能 if(!$detail || PwdCode($detail['password']) != $windpwd || ($loginout=='Y' && $db_ipcheck==1)){ //销毁$detail unset($detail); //设置当前用户组为游客 $GLOBALS['groupid']='guest'; //包含 require/checkpass.php 文件,如果其中有重複包含,略过 require_once(R_P.'require/checkpass.php'); //退出并清空 cookies Loginout(); //转页面显示语言文件中 ip_change 对应键值的提示信息 Showmsg('ip_change'); }else{ //销毁用户信息中的密码变量 unset($detail['password']); //如果当前时间和数据库中用户这次访问时间差大于在线用户时限 if($times*****p-$detail['thisvisit']>$db_onlinetime){ //非隐身 if(!GetCookie('hideid')){ $ct="lastvisit=thisvisit,thisvisit='$times*****p'"; //更新数组中上次访问时间变量为这次访问时间 $detail['lastvisit'] = $detail['thisvisit']; //更新数组中这次访问时间变量为当前时间 $detail['thisvisit'] = $times*****p; } //如果设置了记录会员在线时间并在版块内显示且 ct 变量不为空,且用户此次在线时间大 于 0 if($db_ifonlinetime == 1 && $ct && $c_oltime > 0){ //如果用户此次在线时间大于在线用户时限的 1.2 倍 if($c_oltime > $db_onlinetime*1.2){ //更新用户此次在线时间为在线用户时限 $c_oltime = $db_onlinetime; } $ct .= ",onlinetime=onlinetime+'$c_oltime'"; $c_oltime = 0; } //若 ct 变量不为空,则更新数据库中的上次访问时间、这次访问时间、在线时间 $ct && $db->update("UPDATE pcr_memberdata SET $ct WHERE uid='$winduid' AND $times*****p-thisvisit>$db_onlinetime"); } } //返回用户信息数组 return $detail; } //返回 pwd 的编码后值 function PwdCode($pwd){ //连接头信息、$pwd 参数(密码)以及论坛安全验证参数,md5 加密后返回该值 return md5($_SERVER["HTTP_USER_AGENT"].$pwd.$GLOBALS['db_hash']); } //安全检测,若不符合销毁相应 cookie,符合重新设置相应 cookie function SafeCheck($CK,$PwdCode,$var='AdminUser',$expire=1800){ //声明全局变量$times*****p global $times*****p; //上次访问时间和当前时间的时间差赋于变量$t $t = $times*****p - $CK[0]; //如果其超过定义的过期时间或者$CK[2]中存储的密码(编码后的密码连接上次访问时间再 md5 加密后得到的值)并不匹配 if($t > $expire || $CK[2] != md5($PwdCode.$CK[0])){ //设置$var 状态为无效,即销毁此 cookie Cookie($var,'',0); return false; }else{ //设置上次访问时间为当前时间 $CK[0] = $times*****p; //设置存储的密码信息为编码后的密码连接当前时间再 md5 加密后得到的值 $CK[2] = md5($PwdCode.$times*****p); //implode 联结数组元素为一个字符串;string implode ( string glue, array pieces )第一个 参数为分割符 //第二个参数为要联结的数组单元; //用"\t"连接数组$CK $Value = implode("\t",$CK); //设置变量$$var 为$Value 编码后的值 $$var = StrCode($Value); Cookie($var,StrCode($Value)); return true; } } //对字符串进行编码或解码处理,并返回编码或解码后得到的值 function StrCode($string,$action='ENCODE'){ //HTTP_USER_AGENT-当前请求的 User-Agent: 头信息的内容。该字符串表明了访问该 页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。 也可以使用 get_browser() 得到此信息。 //连接头信息和论坛安全验证参数,md5 加密后,从第 8 位起取 18 个字符,作为变量 key 的值 $key = substr(md5($_SERVER["HTTP_USER_AGENT"].$GLOBALS['db_hash']),8,18); //base64_decode -- 对使用 MIME base64 编码的数据进行解码 //如果选择的操作是编码操作,则 string 变量不变仍旧为自己本身参数的值,否则为 base64 解码该参数后得到的值 $string = $action == 'ENCODE' ? $string : base64_decode($string); //记录 key 的长度,为 18 $len = strlen($key); $code = ''; //对 string 中的每个字符 for($i=0; $i$length){ if($db_charset!='utf-8'){ $retstr=''; for($i = 0; $i < $length - 2; $i++) { //ord 返回字符串的第一个字符的二进制值;string chr ( int ascii ) 返回相对应于 ascii 所指定的单个字符。 $retstr .= ord($content[$i]) > 127 ? $content[$i].$content[++$i] : $content[$i]; } return $retstr.' ..'; }else{ //trim 去除字符串裡的空格或其他字符,string trim ( string str [, string charlist] ), //" " (ASCII 32 (0x20)), 空格."\t" (ASCII 9 (0x09)),tab 字符."\n" (ASCII 10 (0x0A)),换行 符; //"\r" (ASCII 13 (0x0D)), 回车符."\0" (ASCII 0 (0x00)),空字符."\x0B" (ASCII 11 (0x0B)), 垂直 tab. return utf8_trim(substr($content,0,$length)).' ..'; } } return $content; } //将非 utf8 字符集字符串取整字符串避免乱码 function utf8_trim($str) { $len = strlen($str); for($i=strlen($str)-1;$i>=0;$i-=1){ $hex .= ' '.ord($str[$i]); $ch = ord($str[$i]); if(($ch & 128)==0) return substr($str,0,$i); if(($ch & 192)==192)return substr($str,0,$i); } return($str.$hex); } //按格式返回时间 function get_date($times*****p,$timeformat=''){ //声明全局变量论坛默认时间显示格式$db_datefm,默认时区设置$db_timedf,用户时间显示 格式$_datefm,用户时区设置$_timedf global $db_datefm,$db_timedf,$_datefm,$_timedf; //如果传入参数设定了时间格式,则时间格式取参数中设定的值,否则看是否用户设置了时 间显示格式,有则取用户的时间显示格式,否则取论坛默认时间显示格式 $date_show=$timeformat ? $timeformat : ($_datefm ? $_datefm : $db_datefm); //取得时区设置(用户没设置取论坛默认的) if($_timedf){ $offset = $_timedf==飇' ? 0 : $_timedf; }else{ $offset = $db_timedf==飇' ? 0 : $db_timedf; } //按格式返回真实的用户显示时间 return gmdate($date_show,$times*****p+$offset*3600); } //递归执行,使得每个数组中的字符串都是为了数据库查询语句等的需要在某些特殊字符前 加上了反斜线的字符串 function Add_S(&$array){ foreach($array as $key=>$value){ if(!is_array($value)){ //addslashes -- 使用反斜线引用字符串,返回字符串,该字符串为了数据库查询语句等 的需要在某些字符前加 //上了反斜线。这些字符是单引号(')、双引号(")、 反斜线(\)与 NUL(NULL 字符)。 一个使用 //addslashes() 的例子是当你要往数据库中输入数据时。例如,将名字 O'reilly 插入到数 据库中,这就需要对 //其进行转义。大多数据库使用 \ 作为转义符:O\'reilly。这样可以将数据放入数据库中, 而不会插入额外的 \。 //当 PHP 指令 magic_quotes_sybase 被设置成 on 时,意味着插入 ' 时将使用 ' 进 行转义。默认情况下, //PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 //addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(), 因为这样会导致 //双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。 $array[$key]=addslashes($value); }else{ Add_S($array[$key]); } } } //对字符中的特殊字符进行转义,并返回转换后的字符串 function Char_cv($msg){ $msg = str_replace('&','&',$msg); $msg = str_replace(' ',' ',$msg); $msg = str_replace('"','"',$msg); $msg = str_replace("'",''',$msg); $msg = str_replace("<","<",$msg); $msg = str_replace(">",">",$msg); $msg = str_replace("\t"," ",$msg); $msg = str_replace("\r","",$msg); $msg = str_replace(" "," ",$msg); return $msg; } //认证码检查函数 function GdConfirm($code){ //销毁 cookie 中的 cknum Cookie('cknum','',0); if(!$code || !SafeCheck(explode("\t",StrCode(GetCookie('cknum'),'DECODE')),$code,'cknum',1800) ){ //转页面显示语言文件中 check_error 对应键值的提示信息 Showmsg('check_error'); } } //广告初始化函数 function AdvertInit($SCR,$fid){ //声明全局变量当前时间$times*****p global $times*****p; //包含 data/bbscache/advert_data.php include(D_P.'data/bbscache/advert_data.php'); $newadvert = array(); foreach($advertdb as $key=>$val){ foreach($val as $k=>$v){ //strtotime -- 将任何英文文本的日期时间描述解析为 Unix 时间戳,本函数预期接受一个 包含美国英语日期格 //式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的 秒数),其值相对于 //now 参数给出的时间,如果没有提供此参数则用系统当前时间。本函数将使用 TZ 环 境变量(如果有的话)来 //计算时间戳。自 PHP 5.1.0 起有更容易的方法来定义时区用于所有的日期/时间函数。 此过程在 //date_default_timezone_get() 函数页面中有说明。注: 如果给定的年份是两位数字的格 式,则其值 0-69 //表示 2000-2069,70-100 表示 1970-2000。参数 time 被解析的字符串,格式根据 GNU Date //Input Formats 语法 now 用来计算返回值的时间戳 返回值 成功则返回时间戳,否则 返回 FALSE。 //在 PHP 5.1.0 之前本函数在失败时返回 -1。 php5.1.0 失败时返回 FALSE,不再是 -1。 //如果是头部横幅广告或者底部横幅广告且结束时间为空 //或者结束时间小于当前时间 if(($key=='header' || $key=='footer') && !$v['endtime'] || strtotime($v['endtime']) < $times*****p){ //跳出执行下个循环 continue; } //如果是首页且投放范围为首页 if($SCR == 'index' && strpos(",$v[fid],",",-1,")!==false){ $newadvert[$key][]=$v; //如果是板块且投放范围为主题列表页面 }elseif($SCR == 'thread' && strpos(",$v[fid],",",-2,")!==false){ $newadvert[$key][]=$v; //如果是帖子且投放范围为帖子页面 }elseif($SCR == 'read' && strpos(",$v[fid],",",-3,")!==false){ $newadvert[$key][]=$v; //如果投放范围为所有页面 }elseif(strpos(",$v[fid],",",-4,")!==false){ $newadvert[$key][]=$v; //如果板块 fid 不为空投放范围包含该板块 }elseif($fid && strpos(",$v[fid],",",$fid,")!==false){ $newadvert[$key][]=$v; } } } //返回广告数组 return $newadvert; } //取路径,去除$path 中的文件名 function getdirname($path){ if(strpos($path,'\\')!==false){ //strrpos 查找匹配字符串出现的最后位置;没找到,返回 False return substr($path,0,strrpos($path,'\\')); }elseif(strpos($path,'/')!==false){ return substr($path,0,strrpos($path,'/')); }else{ return '/'; } } ?> data\sql_config.php array(' 银 行 ','bank','bank.php','bankset.php',Ƈ','hack/bank.php,hack/bankset.php,template/wind/bank. htm,template/admin/bankset.htm'), 'colony'=>array(' 朋友圈 ','colony','colony.php','colonyset.php',Ƈ','hack/colony.php,hack/colonyset.php,template/ad min/colonyset.htm,template/wind/colony.htm'), 'advert'=>array('广告管理','advert','','advert.php',Ƈ','hack/advert.php'), 'new'=>array('首页调用管理','new','','new.php',Ɔ','hack/new.php'), 'medal'=>array(' 勳章中心 ','medal','medal.php','medalset.php',Ɔ','hack/medal.php,hack/medalset.php,template/wind /medal.htm,template/admin/medalset.htm'), 'toolcenter'=>array(' 道 具 中 心 ','toolcenter','toolcenter.php','toolsetting.php',Ɔ','hack/toolcenter.php,hack/toolsetting.php,t emplate/wind/toolcenter.htm,template/admin/toolsetting.htm'), 'blog'=>array(' 博 客 ','blog','blog.php','blogset.php',Ɔ','hack/blog.php,hack/blogset.php,template/wind/blog.htm ,template/admin/blogset.htm'), 'live'=>array('看不见','live','live.php','',ƈ',''), ); ?> [HTTP_HOST]" **************
还剩30页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

muvtou

贡献于2012-06-30

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf