• phpwind 系统 global.php 文件讲解


    phpwind 系统 global.php 文件讲解
    //此文件内容为全局变量和公用函数 //定义只有运行错误和语法编译错误才会显示错误信息
    error_reporting(E_ERROR | E_PARSE); //设置 php.ini 中 magic_quotes_runtime
    选项值为 0 //若 magic_quotes_runtime 打开时,所有外部引入的数据库资料或者文件等等都会自动转
    为含有反斜线溢出字符的资料。 //0 表示关闭此功能 set_magic_quotes_runtime(0); //microtime() 当前
    Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的 操作系统下可用。 //如果调用时不带可选参数,本函数以
    "msec sec" 的格式返回一个字符串,其中 sec 是 自 Unix 纪元(0:00:00 January 1, 1970
    GMT)起到现在的秒数,msec 是微秒部分。 字符串的两部分都是以秒为单位返回的。 //用$t_array 变量记录
    microtime()函数产生的 msec 和 sec,此时$t_array 代表数组 $t_array = explode('
    ',microtime()); //$P_S_T 记录当前时间秒数 $P_S_T = $t_array[0] + $t_array[1];
    //判断__FILE__是否为空,返回路径值,并定义为 D_P 和 R_P //其中__FILE__文件的完整绝对路径和文件名 //D_P 和

    R_P 的区别在于,当论坛使用二级目录设置时,D_P 用于分论坛,R_P 用于记录 总论坛目录的绝对路径 //具体参考 PHPWind
    论坛关于二级目录方面的说明 //在没有使用这方面设置的时候这两个值相等 define('D_P',__FILE__ ?
    getdirname(__FILE__).'/' : './'); define('R_P',D_P); //销毁以下变量
    unset($_ENV,$HTTP_ENV_VARS,$_REQUEST,$HTTP_POST_VARS,$HTTP_GET_VA
    RS,$HTTP_POST_FILES,$HTTP_COOKIE_VARS); //get_magic_quotes_gpc 函数取得 PHP
    环境配置的变量 magic_quotes_gpc (GPC, Get /Post/Cookie) 值。返回 0 表示关闭本功能;返回 1
    表示本功能打开。当 magic_quotes _gpc 打开时,所有的 ' (单引号), " (双引号), \ (反斜线) and
    空字符会自动转为含有反斜 线的溢出字符。 //在 magic_quotes_gpc
    功能关闭的情况下,对$_POST、$_GET、$_COOKIE 中的特殊字 符转义处理 if(!get_magic_quotes_gpc()){
    //$_POST 经由 HTTP POST 方法提交至脚本的变量。 Add_S($_POST); //$_GET 经由 URL
    请求提交至脚本的变量。 Add_S($_GET); //$_FILES 通过 HTTP POST 方法传递的已上传文件项目组成的数组。
    Add_S($_FILES); //$_COOKIE 经由 HTTP Cookies 方法提交至脚本的变量。 Add_S($_COOKIE);
    } //$_SERVER 变量由 web 服务器设定或者直接与当前脚本的执行环境相关联。 //如果服务器变量中存在
    HTTP_X_FORWARDED_FOR,则从中取得客户端 ip,如果没有 则到 HTTP_CLIENT_IP 中取,都没有则到
    REMOTE_ADDR 中取 //'HTTP_CLIENT_IP','HTTP_X_FORWARDED_FOR'是代理的 IP //这些 IP
    头消息未必能够取得到(因为不同的浏览器不同的网络设备,可能发不同的 IP 头消 息).所以 PHP 就尝试把每个 IP
    头消息判断一下,若有,则取其中的一个. //$c_agentip 记录是否为代理 ip
    if($_SERVER['HTTP_X_FORWARDED_FOR']){ $onlineip =
    $_SERVER['HTTP_X_FORWARDED_FOR']; $c_agentip=1;
    }elseif($_SERVER['HTTP_CLIENT_IP']){ $onlineip =
    $_SERVER['HTTP_CLIENT_IP']; $c_agentip=1; }else{ $onlineip =
    $_SERVER['REMOTE_ADDR']; $c_agentip=0; } //str_replace
    用指定的字符串替换在被搜索的字符串中找到的字符串; //第一个,要搜索的字符串,第二个为替换为的字符串,第三个被搜索的字符串 //取得客户端
    ip 值 $onlineip = substrs(str_replace("\n",'',$onlineip),16); //返回自从 Unix
    纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。 $timestamp= time();
    //require_once require_once() 语句在脚本执行期间包含并运行指定文件。此行为和 requi re() 语句类似,
    //唯一区别是如果该文件中的代码已经被包含了, 则不会再次包含.应该用于在脚本执行期间 同一个文件有可能被 //包含超过一次的情况下,
    想确保它只被包含一次以避免函数重定义, 变量重新赋值等问题。 //包含 require/defend.php 文件,如果其中有重复包含,略过
    require_once(R_P.'require/defend.php'); //根据时区设置$db_cvtime
    取得正确的时间$timestamp $db_cvtime != 0 && $timestamp += $db_cvtime*60;
    //如果论坛运行在 DEBUG 模式下 if($db_debug){ //定义显示所有错误除了运行 NOTICE 错误
    error_reporting(E_ALL ^ E_NOTICE); } //PHPWind 论坛版本变量 $wind_version =
    "4.3.2"; //在线列表大小值 $db_olsize = 96; //静态 htm 缓存目录名 $htmdir = 'htm_data';
    //'PHP_SELF' 当前正在执行脚本的文件名,与 document root 相关 //'SCRIPT_NAME'
    当前执行脚本的绝对路径名,注: 如果脚本在 CLI 中被执行,作为相对 路径,例如 //file.php 或
    ../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。 //'QUERY_STRING'
    查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。 //如果 PHP_SELF(当前正在执行脚本的文件名)为空,则设置其为
    SCRIPT_NAME(包 含当前脚本的路径) !$_SERVER['PHP_SELF'] &&
    $_SERVER['PHP_SELF']=$_SERVER['SCRIPT_NAME']; //取得请求 url
    完整的路径保存在$REQUEST_URI 变量中 $REQUEST_URI =
    $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
    //判断当前执行文件名中是否包含静态目录$db_dir,如果包含,则
    if(strpos($_SERVER['PHP_SELF'],$db_dir)!==false){ //strpos
    查找字符串第一次出现的位置,第一个为被查找的字符串,第二个为要查找的字 符串。返回值为 0,或 //者被查找的字符第一次出现的数字位置的值;
    //取到静态目录前
    $tmp=substr($_SERVER['PHP_SELF'],0,strpos($_SERVER['PHP_SELF'],$db_dir));
    }else{ //取全部 $tmp=$_SERVER['PHP_SELF']; } //HTTP_HOST-当前请求的 Host: 头信息的内容
    //设置论坛地址
    $db_bbsurl="http://$_SERVER[HTTP_HOST]".substr($tmp,0,strrpos($tmp,'/'));
    //(int) 强制类型转换为整型 //定义整型变量$fid 用于记录板块 id $fid = (int)$fid; //定义整型变量$tid
    用于记录帖子 id $tid = (int)$tid; //初始化附件保存目录$attachname 及 js 脚本路径$js_path
    $attachname = $js_path = ''; //包含 data/bbscache/dbset.php
    文件,如果其中有重复包含,略过 require_once(D_P.'data/bbscache/dbset.php');
    //ob_start("ob_gzhandler");是一种压缩技术 //ob_start();仅仅启动缓冲 并没有压缩输出
    //ob_start 用来 打开输出缓冲区。 当缓冲区激活时,所有来自 PHP 程序的非文件头信息
    均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用 ob_end_flush() 或者使用
    ob_end_clean()来输出缓冲区的内容。 //是否允许 GZIP 压缩输出,允许使用 ob_gzhandler 压缩技术,否则只启动缓冲
    $db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();
    //如果使用跨台固定图片链,则图片路径为$db_http,$imgpath = $db_http != 'N' ? $db_http :
    $picpath; //如果使用远程附件连接设置,则附件路径为$db_attachurl,否则使用$attachname 附件保 存目录
    $attachpath = $db_attachurl != 'N' ? $db_attachurl : $attachname;
    //本地图片路径 $imgdir = R_P.$picpath; //本地附件路径 $attachdir = R_P.$attachname;
    //如果 D_P 和 R_P 不相等并且使用了跨台固定图片链,即使用了二级目录功能 if(D_P != R_P && $db_http !=
    'N'){ //取总站论坛地址 $R_url=substr($db_http,-1)=='/' ? substr($db_http,0,-1)
    : $db_http; $R_url=substr($R_url,0,strrpos($R_url,'/')); }else{
    //总站论坛地址即全局变量$db_bbsurl 中的论坛地址值 $R_url=$db_bbsurl; } //如果 cookie 中上次访问变量
    lastvisit 值是否为空 if(GetCookie('lastvisit')){ //取 cookie 中的上次访问变量
    lastvisit 值,以"\t"分割并分别赋于$c_oltime,$lastvisit,$las tpath
    //$c_oltime-用户在线时间,$lastvisit-上次访问时间,$lastpath-上次访问路径
    list($c_oltime,$lastvisit,$lastpath) =
    explode("\t",GetCookie('lastvisit'));
    //判断现在和上次访问之间的时间差是否小于论坛设定的在线用户时限,如果小于,则用 户此次在线时间累加相应时间数值
    ($onbbstime=$timestamp-$lastvisit)<$db_onlinetime &&
    $c_oltime+=$onbbstime; }else{ $lastvisit=$lastpath=''; $c_oltime=0; }
    //取在线偏移 cookie(在线列表文件中的偏移量) $ol_offset = GetCookie('ol_offset'); //取风格
    cookie $skinco = GetCookie('skinco'); //若刷新预防时间不等于 0 if
    ($db_refreshtime!=0){ //$REQUEST_URI 访问此页面所需的 URI。 //如果$REQUEST_URI
    与上次最后访问的路径相同,且与上次访问的时间差小于论坛设 定的刷新预防时间 if($REQUEST_URI==$lastpath &&
    $onbbstime<$db_refreshtime){ //如果 Cookie 中没有 winduser 即用户的记录, 设置$groupid
    为 guest 即当前用户归于 游客组 !GetCookie('winduser') && $groupid='guest';
    //创始人账号设置为 TRUE $manager=TRUE; //如果 cookie 中没有风格变量,则风格设置为论坛的默认风格 $skin =
    $skinco ? $skinco : $db_defaultstyle; //转页面显示语言文件中 refresh_limit
    对应键值的提示信息 Showmsg("refresh_limit"); } } //引用 在 PHP
    中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替 代的是,引用是符号 //表别名。注意在 PHP
    中,变量名和变量内容是不一样的,因此同样的内容可以有不同的 名字。PHP 的引用允 //许用两个变量来指向同一个内容。意思是,当这样做时: $a
    =& $b;这意味着 $a 和 $b 指向了 //同一个变量。注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,
    而是 $a 和 $b 指向 //了同一个地方。注: 如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函 数也是如此。 $H_url
    =& $db_wwwurl; $B_url =& $db_bbsurl; //包含 data/sql_config.php
    文件,如果其中有重复包含,略过 require_once(D_P.'data/sql_config.php'); //如果论坛关闭 if
    ($db_bbsifopen==0){ //从 cookie 中取得 AdminUser(管理人员)变量值,并对其进行解码操作后,以"\t"分割
    存入数组$CK 中 $CK = explode("\t",StrCode(GetCookie('AdminUser'),'DECODE'));
    //如果上次访问时间$CK[0]与现在相差超过 1800s 即 30 分钟 //或者账号$CK[1]不是创始人账号$manager
    //或者不符合安全检测 if ($timestamp-$CK[0]>1800 || $CK[1]!=$manager ||
    !SafeCheck($CK,PwdCode($m anager_pwd))){ //取得风格值 $skin = $skinco ?
    $skinco : $db_defaultstyle; //设置用户组为空 $groupid = '';
    //转页面显示$db_whybbsclose 信息即论坛关闭的原因 Showmsg($db_whybbsclose); } } //gmdate
    -- 格式化一个 GMT/UTC 日期/时间 //date -- 格式化一个本地时间/日期, 返回将整数 timestamp
    按照给定的格式字串而产生 的 //字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默 认值为
    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',$timestamp+$db_timedf*3600)); //floor -- 舍去法取整
    //今天的起始时间 $tdtime = (floor($timestamp/3600)-$t['hours'])*3600;
    //是否需要更新在线情况标记 $runfc = 'N'; //如果上次访问时间和当前时间的时间差大于论坛设置的在线用户时限 //或者板块$fid
    不为空且不等于 cookie 中的上次访问板块 id //或者上次访问板块 id 的 cookie 存在且$wind_in(论坛动作)为
    hm(论坛首页) if($timestamp-$lastvisit>$db_onlinetime || ($fid && $fid !=
    GetCookie('lastfid')) || (Get Cookie('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 //用户 id $winduid = $winddb['uid']; //用户组 id
    $groupid = $winddb['groupid']; //用户实际威望为数据库中威望值/10 取整 $userrvrc =
    (int)($winddb['rvrc']/10); //用户名 $windid = $winddb['username']; =
    User_info(); //用户时间显示格式 $_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".$timestamp."\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($_S
    ERVER['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 ? " ->
    <a href='$value'>$key</a>
    " : " -> $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 "
    <meta http-equiv='refresh' content='0;url=$URL'>
    "; 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,小表格宽度$mta
    blewidth,风格模板路径$tplpath,$runfc global
    $stylepath,$tablewidth,$mtablewidth,$tplpath,$runfc; $runfc=''; //检查
    SIMPLE 常量是否定义,如果定义过 if(defined('SIMPLE')){ //
    <base>
    是一个链接基准标记,用以改变页面中所有链接标记的参数默认值。 echo "
    <base href=\"$db_bbsurl/\">
    "; } //包含 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,$timest amp global
    $db_ckpath,$db_ckdomain,$timestamp; //如果设置有效的 cookie 时间参数为 F 则,cookie
    有效时间设置为 31536000s 即 1 年 //否则如果传入的 cookie 参数值为空并且有效时间参数为 0 则设置 cookie
    有效时间为 3 1536000s 即 1 年前,也就是无效 //如果都不是则设置时间为传入的 cookie 有效时间参数值 $ck_Time =
    $ck_Time == 'F' ? $timestamp + 31536000 : ($ck_Value == '' && $c k_Time
    == 0 ? $timestamp - 31536000 : $ck_Time);
    //SERVER_PORT-服务器所使用的端口。默认为“80”。如果使用 SSL 安全连接,则这 个值为用户设置的 HTTP 端口。
    //判断是否使用安全连接 $S = $_SERVER['SERVER_PORT'] == '443' ? 1:0; //如果 COOKIE
    有效目录为空则设置其为根目录 !$db_ckpath && $db_ckpath = '/'; //setcookie -- 发送一个
    cookie 信息 //参数说明:Cookie 的名字,Cookie 的值,Cookie 过期的时间(这是个 Unix 时间戳,即 从 Unix
    纪元开始的秒数),Cookie 在服务器端的有效路径,该 cookie 有效的域名,指明 co okie 是否仅通过安全的 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_N B 不希望 flock() 在锁定时堵塞 flock($handle,LOCK_SH);
    //filesize 返回文件字节数 //fread() 从文件指针 handle 读取最多 length 个字节(这里为全部),返回类型为 s
    tring $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() 返回 FA LSE。换句话说,
    //""、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('ipstat e') &&
    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,PHPWind 版本$w
    ind_version,图片目录$imgpath,此风格在 image 目录下的文件夹名称$stylepath,页脚广告$f
    ooter_ad,论坛联盟广告$db_union,当前时间$timestamp global
    $db,$db_obstart,$db_footertime,$db_htmifopen,$P_S_T,$mtablewidth,$db_ceo
    connect,$wind_version,$imgpath,$stylepath,$footer_ad,$db_union,$timestamp;
    //更新在线信息 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); = "Total
    $totaltime(s) query $qn,"; $wind_spend } //按格式取当前时间
    $ft_time=get_date($timestamp,'m-d H:i'); //包含对应风格目录下的 footer.htm 文件
    include PrintEot('footer'); //ob_get_contents
    返回输出缓存的内容,如输出缓存未被激活,将返回缓存内容或 Flas e; $output = str_replace(array('
    <!--<!---->
    ','
    <!---->
    '),array('',''),ob_get_contents()); //如果开启静态目录功能 if($db_htmifopen){
    //preg_replace -- 执行正则表达式的搜索和替换,mixed preg_replace ( mixed patte rn,
    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( "/\
    <a(\s*[^\>]+\s*)href\=([\"|\']?)([^\"\'>\s]+\.php\?[^\"\'>\s]+)([\"|\']?)/ies",
    "Htm_cv('\\3','<a \\1href=\
    "')", $output ); } ob_end_clean(); $db_obstart==
    1 ? ob_start('ob_gzhandler') :
    ob_start(); echo $output; //flush -- 刷新输出缓冲, 刷新 PHP 程序的缓冲, 而不论 PHP
    执行在何种情况下 (CGI , web
    服务器等等)。该 //函数将当前为止程序的所有输出发送到用户的浏览器。 flush() 函数不会对服务器或客户
    端浏览器的缓存模式产 //生影响。因此,必须同时使用 ob_flush() 和 flush() 函数来刷新输出缓冲。个别 web
    服务器程序,特别是 //Win32 下的 web 服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直
    到程序结束为止。有些 //Apache 的模块,比如 mod_gzip,可能自己进行输出缓存,这将导致 flush()函数产生的
    结果不会立即被发送 //到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行 //或
    html 标记的开头之前缓存内容,并且在接受到
    </table>
    标记之前,不会显示出整 个表格。一些版本的 //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,如果没有找到匹配或出错则返回 FA LSE。
    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,当前时间$timestamp,在线用户时限$db_onlinetime,用 户

    id$winduid,用户密码$windpwd,是否记录会员在线时间并在版块内显示$db_ifonlinetime,
    用户此次在线时间$c_oltime,客户端 ip$onlineip,是否开启 IP 验证功能$db_ipcheck,今日开
    始时间$tdtime; global
    $db,$timestamp,$db_onlinetime,$winduid,$windpwd,$db_ifonlinetime,$c_oltime,
    $onlineip,$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.gro
    upid,m.memberid,m.regdate,m.timedf,m.style,m.datefm,m.t_num,m.p_num,m.yz,m.newp
    m,m.showsign,m.payemail,md.postnum,md.rvrc,md.money,md.credit,md.currency,md.las
    tvisit,md.thisvisit,md.onlinetime,md.lastpost,md.todaypost,md.onlineip,md.uploadtime,md.
    uploadnum,md.editor,md.starttime FROM bbs_members m LEFT JOIN
    bbs_memberd ata 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_i pcheck==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($timestamp-$detail['thisvisit']>$db_onlinetime){ //非隐身
    if(!GetCookie('hideid')){
    $ct="lastvisit=thisvisit,thisvisit='$timestamp'"; //更新数组中上次访问时间变量为这次访问时间
    $detail['lastvisit'] = $detail['thisvisit']; //更新数组中这次访问时间变量为当前时间
    $detail['thisvisit'] = $timestamp; } //如果设置了记录会员在线时间并在版块内显示且 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
    bbs_memberdata SET $ct WHERE uid='$wind uid' AND
    $timestamp-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){
    //声明全局变量$timestamp global $timestamp; //上次访问时间和当前时间的时间差赋于变量$t $t =
    $timestamp - $CK[0]; //如果其超过定义的过期时间或者$CK[2]中存储的密码(编码后的密码连接上次访问时间 再 md5
    加密后得到的值)并不匹配 if($t > $expire || $CK[2] != md5($PwdCode.$CK[0])){
    //设置$var 状态为无效,即销毁此 cookie Cookie($var,'',0); return false; }else{
    //设置上次访问时间为当前时间 $CK[0] = $timestamp; //设置存储的密码信息为编码后的密码连接当前时间再 md5
    加密后得到的值 $CK[2] = md5($PwdCode.$timestamp); //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 i58 6)。也可以使用 get_browser() 得到此信息。 //连接头信息和论坛安全验证参数,md5 加密后,从第 8
    位起取 18 个字符,作为变量 k ey 的值 $key 8); =
    substr(md5($_SERVER["HTTP_USER_AGENT"].$GLOBALS['db_hash']),8,1
    //base64_decode -- 对使用 MIME base64 编码的数据进行解码 //如果选择的操作是编码操作,则 string
    变量不变仍旧为自己本身参数的值,否则为 bas e64 解码该参数后得到的值 $string = $action == 'ENCODE' ?
    $string : base64_decode($string); //记录 key 的长度,为 18 $len $code =
    strlen($key); = ''; //对 string 中的每个字符 for($i=0; $i<strlen
    ($string); $i++){ //k 变量存储$i % $len 余数 $k=$i
    % $len; //位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符 将操作字符的 ASCII
    值。 //$a ^ $b Xor(按位异或) 将把 $a$b 中不同的位设为 1。 //把$string[$i]和$key[$k]以
    ascii 值方式进行异或运算后,值累加到 code 变量中 $code .=$string[$i]
    ^ $key[$k]; } //base64_encode -- 使用 MIME base64
    对数据进行编码 //设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的
    主体。 //Base64-encoded 数据要比原始数据多占用 33% 左右的空间。 //如果选择的操作是加码操作,则 code
    变量不变,否则为 base64 编码 code 后得到的值 $code=$action == 'DECODE' ? $code :
    base64_encode($code); return $code; } //返回$content 字符串$length
    长度的值,超过$length 显示".." functionsubstrs($content,$length){ //取字符集设置 global $db_charset; if($length && strlen($content)>$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 (0x0 A)),换行符; //"\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($timestamp,$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=='111' ? 0 : $_timedf; }else{ $offset =
    $db_timedf=='111' ? 0 : $db_timedf; } //按格式返回真实的用户显示时间 return
    gmdate($date_show,$timestamp+$offset*3600); }
    //递归执行,使得每个数组中的字符串都是为了数据库查询语句等的需要在某些特殊字符前 加上了反斜线的字符串 function
    Add_S(&$array){ foreach($array as $key=>$value){ if(!is_array($value)){
    //addslashes -- 使用反斜线引用字符串,返回字符串,该字符串为了数据库查询语 句等的需要在某些字符前加
    //上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。 一个使用 //addslashes()
    的例子是当你要往数据库中输入数
    当你有事情忙的时候,你会觉得时间过得很快 很快。可能你会感觉有点累。但这是一个人成功的历程。请坚信,我一定会好好的。
    更多
  • 相关阅读:
    深入理解计算机系统第二版习题解答CSAPP 2.2
    深入理解计算机系统第二版习题解答CSAPP 2.1
    oracle 关闭回收站
    在Razor标记内写入文本
    MVC5+EF6 入门完整教程8_1:实体数据模型
    MVC5+EF6 入门完整教程9:多表数据加载
    MVC5+EF6 入门完整教程8:EF6 Code First 数据迁移
    SQL Linq Lambda
    web及H5 的链接测试
    web安全测试之一
  • 原文地址:https://www.cnblogs.com/yifenghong/p/2355768.html
Copyright © 2020-2023  润新知