PHPWind 源码解析

本文介绍 PHPWind 论坛系统的全局配置文件 global.php 的关键内容,包括错误处理、时间戳获取、IP 地址检测等功能,以及如何进行用户认证、权限管理等重要配置。

 

保留关键字 
函数 
类型 
字符串 
注释 
括号      
数字 
运算符 
预定义变量 
PHP 开始结束标签 


global.php 

QUOTE: 

<?php 
/** 

* Copyright (c) 2003-06 PHPWind.net. All rights reserved. 
* Support : http://www.phpwind.net 
* This software is the proprietary information of PHPWind.com. 

*/ 
//此文件内容为全局变量和公用函数 

//定义只有运行错误和语法编译错误才会显示错误信息 

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_VARS,$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() 语句在脚本执行期间包含并运行指定文件。此行为和 require() 语句类似, 
//唯一区别是如果该文件中的代码已经被包含了,则不会再次包含.应该用于在脚本执行期间同一个文件有可能被 
//包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。 
//包含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缓存目录名 
$htm dir = '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值,否则使用$picpath图片保存目录 
$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,$lastpath 
  //$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 ($manager_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'  ))  ||  ( 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"  . $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  (  $_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  ?  " -> <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 color: #0
携圣诞和元旦的双重喜庆与祝福,PHPWind7火热发布!感谢一直辛苦等待新版本的童鞋们,祝大家新年进步,事业有成,尽情尽兴! PHPWind是一套采用php+mysql数据库方式运行并可生成html页面的全新且完善的强大系统.我们希望作为一个开源.共享的软件,PHPWind可以以其流畅的速度与高负载能力激起各位加入PHPWind阵营的热情!共同打造专业品牌PHPWind.Net PHPWind除了具备多重子版块.和后台用户组权限可以自由组合外,还具备分版块控制生成html页面、可选用的所见即所得编辑器、防止图片和附件防盗链、多附件上传下载、输入图片URL直接显示图片、版块主题分类、版块积分控制与版块内的用户组权限控制、主题与回复审核功能、自定义积分与自定义等级提升系统、论坛用户宣传接口、帖子加密隐藏出售、分论坛二级目录/域名等一些特色功能.从而减轻了大部分论坛程序中都必须要借助开发hack才能实现的诸多工作。 正式版更新 改进后台计划任务设置 修正添加好友时消息显示错误 批量用户权限修改 后台用户个人.权限管理 改进权限算法 改进广告出租管理,自定义发消息 改进帖子中code代码显示方式 增加后台checkbox选中效果 邮件群发按注册时间选择用户 邮件群发可暂停发送任务 邮件群发发送意外故障后任务恢复功能 批量上传功能 版主已阅功能加强 搜索页面,搜索关键词用空格隔开 初始人或版主搜索新帖子批量管理 申请勋章短消息通知 短消息的下一条、下一条、转发 板块批量添加修改 附件出售 附件加密 外链提醒的白名单 修改发布辩论主题帖
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值