对于common.inc.php这个页面其实是公共文件库。里面可以有配置参数,有详细功能的类库,有进行公有化参数。而且每个文件都直接或间接引用了这个文件。当涉及到安全问题时。比如a能防住某项攻击。那么我们把a放在index的第一行,就能防住从index进入。但如果黑客们从其他的页面进入呢。这个时候,因为如果每个需要数据处理的页面都在第一行包含了common.inc.php我们把a放在common.inc.php的第一行,也就防住了这项攻击。
附上详细注释,供日后复习!代码用灰色标出,思考用红色标出。留待日后用蓝色。知识点用绿色标出
// 报错级别设定,一般在开发环境中用E_ALL,这样能够看到所有错误提示
// 系统正常运行后,直接设定为E_ALL || ~E_NOTICE,取消错误显示
// error_reporting(E_ALL);
error_reporting(E_ALL || ~E_NOTICE);
/**知识点:
* define(a,b,c); 意思是定一个常量a,值为b,c为false和true,代表是否对大小写敏刚。
* str_replace(a,b,c,d); 意思是在c中找到a,用b代替。d为对替换进行计数。
* __FILE__代表当前代码所在文件的完整路径。(JiaPeng/include/common.inc.php)dirname(__FILE__)是当前代码文件所在文件夹的完整路径。dirname(dirname(__FILE__));代指前面文件夹的上一层。类似于../的用法。
* substr(a,b,c);返回a字符串中的部分字符串。从b处开始,返回的长度为c。b为负,从字符串的结尾开始算指定位置。c为负则从字符串的末端开始返回。
* 思考1:
* 注意第一个//用的是双引号,\用的是单引号。思考//中是不是第一个/为转义字符?
* 注释:
* 第一句的作用就是,先在当前代码文件所在目录的完整路径中检查是否有\\这样不正确的格式,有的话用/代替。这样得出一个完整的正确的路径,并且由于代码是我们布置的,用这样的
* 方法可以解决代码放在不同文件夹里面的路径问题。这样最后得出一个路径,并赋值给DEDEINC这个常量。以后要用到这个路径直接引用DEDEINC即可。
* 第二句的作用就是,把DEDEINC进行返回,其实返回的是JiaPeng/ 并把这个值赋给DEDEROOT常量。
* 第三句的作用就是,把JiaPeng/data赋值给DEDEDATA常量。
* 第四句的作用就是,把JiaPeng/templets赋值给DEDETEMPLATE常量。这个目录是模板目录。就是前端的存放目录。
*/
define('DEDEINC', str_replace("\\", '/', dirname(__FILE__)));
define('DEDEROOT', str_replace("\\", '/', substr(DEDEINC, 0, -8)));
define('DEDEDATA', DEDEROOT . '/data');
define('DEDEMEMBER', DEDEROOT . '/member');
define('DEDETEMPLATE', DEDEROOT . '/templets');
/**
* 注释:定义常量DEDEMODEL='./model' 我猜测这个意思就是,用常量代指一个文件夹目录。以后他的上级目录不管怎么变,都能得到我们想要的 ./表示当前目录下的文件。
*/
// ------------------------------------------------------------------------
define('DEDEMODEL', './model');
define('DEDECONTROL', './control');
define('DEDEAPPTPL', './templates');
define('DEBUG_LEVEL', FALSE);
/**
* 知识点:
* version_compare表示对比两个php版本数字字符串。有助于编写仅能兼容某些版本的php程序。
* version_compare(a,b,c);a为第一个版本,b为第二个版本。c为比较操作符。a c b
* 如果没有写c,则有默认的比较方式。a<b时返回-1。a=b时返回0。a大于b时返回1。
* set_magic_quotes_runtime() 当设置为1时作用是把一些特殊的字符写入到数据库中。如\" ,等。这样就能解决特殊字符提交数据库时显示错误。
* strtoupper();将字符串转换为大写。
* ini_get();返回php.ini里面环境变量的值。如果里面是布尔型,则返回0或1;如果想获取整个php.ini里的变量值。可以用它的加强函数ini_get_all();来以数组的方式返回整个php的环境变量。
* function_exists();在调用某个函数之前可以用它先检测一下,那个函数是否存在。以加强php的健壮性。
* session_register()的用法,session_register('var');$var='abc';相当于session_register('abc');而且当更改$var后,session_register('var');里面的值也不会改变。很麻烦,所以一般不用
* func_get_args() 返回当前函数所有参数的一个数组。
* *注释:
* 第一个if语句,当版本小于5.3.0时取消了把特殊字符写入数据库
* 第二个if语句,获取php.ini里的环境变量配置。转化为大写后判断是否等于 C
* 第三个if语句,这里的session_register()和上面说的那个并不一样。这个是自定义的。不懂这段代码的功能作用???总感觉这段代码写的有问题。应该是foreach($args as $key=>$value)
* 不过总的来说,三个if语句,是判断我们php的版本。dedecms来做相应的响应。
*/
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
set_magic_quotes_runtime(0);
}
if (version_compare(PHP_VERSION, '5.3.0', '>')) {
if (strtoupper(ini_get('request_order')) == 'C')
exit('DedeCMS Error: (PHP 5.3 and above) Please set \'request_order\' ini value to include C,G and P (recommended: \'CGP\') in php.ini,<a href="http://help.dedecms.com/install-use/apply/2013/0715/2325.html" target="_blank">more...</a>');
}
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
if (!function_exists('session_register')) {
function session_register() {
$args = func_get_args();
foreach ($args as $key) {
$_SESSION[$key] = $GLOBALS[$key];
}
}
function session_is_registered($key) {
return isset($_SESSION[$key]);
}
function session_unregister($key) {
unset($_SESSION[$key]);
}
}
}
/**
* 注释:先让$cfg_is_mb 和$cfg_is_iconv 初始化为FALSE,再根据两个函数是否存在来确定这两个变量的bool值。PHP6.0中get_magic_quotes_gpc已经被取消了。
*/
//是否启用mb_substr替换cn_substr来提高效率
$cfg_is_mb = $cfg_is_iconv = FALSE;
if (function_exists('mb_substr'))
$cfg_is_mb = TRUE;
if (function_exists('iconv_substr'))
$cfg_is_iconv = TRUE;
function _RunMagicQuotes(&$svar) {
if (!get_magic_quotes_gpc()) {
if (is_array($svar)) {
foreach ($svar as $_k => $_v)
$svar[$_k] = _RunMagicQuotes($_v);
} else {
if (strlen($svar) > 0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#', $svar)) {
exit('Request var not allow!');
}
$svar = addslashes($svar);
}
}
return $svar;
}
/**
* 知识点:
* is_array();检查变量是否是数组。
* preg_match(a,b);执行一个正则表达式匹配。按照a规则在b中找到相匹配的。
* $a=1;$b=&$a;这里的意思其实就是,定义的$b的内存已经和a的一样了。当改变b时,a也会变。当改变a时,b也会变。学名叫做函数的传址调用
*
*
* 注释:
* 当传入一个变量后,$val已经指向了变量的内存块。遍历它,看看有没有'nvarname'这个键值。后面两句CheckRequest基本
*
*
*/
if (!defined('DEDEREQUEST')) {
//检查和注册外部提交的变量 (2011.8.10 修改登录时相关过滤)
function CheckRequest(&$val) {
if (is_array($val)) {
foreach ($val as $_k => $_v) {
if ($_k == 'nvarname')
continue;
CheckRequest($_k);
CheckRequest($val[$_k]);
}
} else {
if (strlen($val) > 0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#', $val)) {
exit('Request var not allow!');
}
}
}
//当用户用url提交了一个变量时,$_REQUEST可以获取post和get提交的变量。把这个变量提交给CheckRequest();函数。
CheckRequest($_REQUEST);
/**
*
*/
foreach (Array('_GET', '_POST', '_COOKIE') as $_request) {
foreach ($$_request as $_k => $_v) {
if ($_k == 'nvarname')
${$_k} = $_v;
else
${$_k} = _RunMagicQuotes($_v);
}
}
}
//系统相关变量检测
if (!isset($needFilter)) {
$needFilter = false;
}
$registerGlobals = @ini_get("register_globals");
$isUrlOpen = @ini_get("allow_url_fopen");
$isSafeMode = @ini_get("safe_mode");
if (preg_match('/windows/i', @getenv('OS'))) {
$isSafeMode = false;
}
/**知识点:
* is_writeable();判断指定的文件是否可以写。is_readable 判断指定的文件是否可以读。
* session.save_path对于files处理器,此值是创建会话数据文件的路径。
* 注释:
* 我们在设计中肯定要用到session,故需要设置session的保存路径。
* 思考2:
* 1、这样说的话,这个文件里面的东西,是不是就都是我们设计时要用到的那些东西的配置,比如:保存路径啊,php的版本啊。常用的一些路径什么的定义成常量。登录注册的检测信息。等等。同样,我们是不是可以推测出,这里定义的一些的东西,基本上就涵盖了dedecms这款系统大部分的功能,窥一斑而知全豹。
*2、在php文件路径中 ./ /分别代表什么意思? “” ‘’ 又有什么区别?
*
* */
//Session保存路径
$sessSavePath = DEDEDATA . "/sessions/";
if (is_writeable($sessSavePath) && is_readable($sessSavePath)) {
session_save_path($sessSavePath);
}
/**
* 注释:
* 把DEDECMS的系统配置参数文件包含进来。这个配置文件是数据库里面的配置信息的缓存。
*/
//系统配置参数
require_once(DEDEDATA . "/config.cache.inc.php");
/**
* 注释:
* 如果是文件类型,包含上传文件的规则文件。
* 思考:
* if($_FILES)中$_FILES是上传的文件相关的变量。
*/
//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数
if ($_FILES) {
require_once(DEDEINC . '/uploadsafe.inc.php');
}
/**
* 注释:
* 这个数据库配置文件,不是上面的缓存,而是我们安装时根据我们所填的信息。自动生成的数据库配置。
* 里面包含了数据库的连接配置
*/
//数据库配置文件
require_once(DEDEDATA . '/common.inc.php');
/**知识点:
* serialize();把一个实例化的对象转化成一个字符串。$p=new a();$p1=serialize($p);当这个实例化的对象被删除以后。
* 用unserialize();又可以把这个对象还原。$p2=unserialize($p1);$p2-> getname(); getname()是$p对象里面的方法。
* 注释:调用安全配置文件,
*/
//载入系统验证安全配置
if (file_exists(DEDEDATA . '/safe/inc_safe_config.php')) {
require_once(DEDEDATA . '/safe/inc_safe_config.php');
if (!empty($safe_faqs))
$safefaqs = unserialize($safe_faqs);
}
/**知识点:
* @session_set_cookie_params不知道什么意思?
* 注释:
*/
//Session跨域设置
if (!empty($cfg_domain_cookie)) {
@session_set_cookie_params(0, '/', $cfg_domain_cookie);
}
/**知识点:
* data_default_timezone_set('PRC');设置时区的函数。PRC表示中华人民共和国The People`s Republic of China
*
* 注释:????????
* 写的我看不懂。个人感觉可以这样写:
* if(PHP_VERSION > '5.1'){
* data_default_timezone_set('PRC');}
*/
//php5.1版本以上时区设置
//由于这个函数对于是php5.1以下版本并无意义,因此实际上的时间调用,应该用MyDate函数调用
if (PHP_VERSION > '5.1') {
$time51 = $cfg_cli_time * -1;
@date_default_timezone_set('Etc/GMT' . $time51);
}
$cfg_isUrlOpen = @ini_get("allow_url_fopen");
//用户访问的网站host
$cfg_clihost = 'http://' . $_SERVER['HTTP_HOST'];
/**知识点:
* preg_replace('a','b','c');在c中所有匹配a正则式的以b代替。
* 注释:
* 思考3:
* '#' . $cfg_cmspath . '\/include$#i' 这也是正则表达式?
* 这里突然有好多变量,如:$cfg_cmspath ,$cfg_multi_site,$cfg_mainsite ,$cfg_basehost这些都是在哪里定义的。我知道php中变量要用的时候,直接定义即可
* 但像这里$cfg_mainsite = $cfg_basehost;$cfg_basehost总也要有个出处吧!难道是把变量在这里定义。在以后的地方引用?留待日后。。。
*/
//站点根目录
$cfg_basedir = preg_replace('#' . $cfg_cmspath . '\/include$#i', '', DEDEINC);
if ($cfg_multi_site == 'Y') {
$cfg_mainsite = $cfg_basehost;
} else {
$cfg_mainsite = '';
}
/**
* 思考4:
* 姑且猜测在本地上面。$cfg_cmspath=JiaPeng/
* 像本地啊,模板啊。上面不是已经定义了一些常量吗。下面又来重新定义。留待日后,看看是我不懂,还是他乱写一通。???
*/
//模板的存放目录
$cfg_templets_dir = $cfg_cmspath . '/templets';
$cfg_templeturl = $cfg_mainsite . $cfg_templets_dir;
$cfg_templets_skin = empty($cfg_df_style) ? $cfg_mainsite . $cfg_templets_dir . "/default" : $cfg_mainsite . $cfg_templets_dir . "/$cfg_df_style";
//cms安装目录的网址
$cfg_cmsurl = $cfg_mainsite . $cfg_cmspath;
//插件目录,这个目录是用于存放计数器、投票、评论等程序的必要动态程序
$cfg_plus_dir = $cfg_cmspath . '/plus';
$cfg_phpurl = $cfg_mainsite . $cfg_plus_dir;
$cfg_data_dir = $cfg_cmspath . '/data';
$cfg_dataurl = $cfg_mainsite . $cfg_data_dir;
//会员目录
$cfg_member_dir = $cfg_cmspath . '/member';
$cfg_memberurl = $cfg_mainsite . $cfg_member_dir;
//专题列表的存放路径
$cfg_special = $cfg_cmspath . '/special';
$cfg_specialurl = $cfg_mainsite . $cfg_special;
//附件目录
$cfg_medias_dir = $cfg_cmspath . $cfg_medias_dir;
$cfg_mediasurl = $cfg_mainsite . $cfg_medias_dir;
//上传的普通图片的路径,建议按默认
$cfg_image_dir = $cfg_medias_dir . '/allimg';
//上传的缩略图
$ddcfg_image_dir = $cfg_medias_dir . '/litimg';
//用户投稿图片存放目录
$cfg_user_dir = $cfg_medias_dir . '/userup';
//上传的软件目录
$cfg_soft_dir = $cfg_medias_dir . '/soft';
//上传的多媒体文件目录
$cfg_other_medias = $cfg_medias_dir . '/media';
//软件摘要信息,****请不要删除本项**** 否则系统无法正确接收系统漏洞或升级信息
$cfg_version = '';
$cfg_soft_lang = 'utf-8';
$cfg_soft_public = 'base';
$cfg_softname = '星宇时空定制,嘉鹏影视后台管理系统';
$cfg_soft_enname = 'StarsPaces';
$cfg_soft_devteam = 'StarsPaces';
//文档的默认命名规则
$art_shortname = $cfg_df_ext = '.html';
$cfg_df_namerule = '{typedir}/{Y}/{M}{D}/{aid}' . $cfg_df_ext;
//新建目录的权限,如果你使用别的属性,本程不保证程序能顺利在Linux或Unix系统运行
if (isset($cfg_ftp_mkdir) && $cfg_ftp_mkdir == 'Y') {
$cfg_dir_purview = '0755';
} else {
$cfg_dir_purview = 0755;
}
//会员是否使用精简模式(已禁用)
$cfg_mb_lit = 'N';
//特殊全局变量
$_sys_globals['curfile'] = '';
$_sys_globals['typeid'] = 0;
$_sys_globals['typename'] = '';
$_sys_globals['aid'] = 0;
if (empty($cfg_addon_savetype)) {
$cfg_addon_savetype = 'Ymd';
}
if ($cfg_sendmail_bysmtp == 'Y' && !empty($cfg_smtp_usermail)) {
$cfg_adminemail = $cfg_smtp_usermail;
}
/**
* intval(a,b);获取变量的整数值。b默认是十进制。返回变量a的十进制整数值。
*/
//对全局分页传递参数进行过滤
if (isset($GLOBALS['PageNo'])) {
$GLOBALS['PageNo'] = intval($GLOBALS['PageNo']);
}
if (isset($GLOBALS['TotalResult'])) {
$GLOBALS['TotalResult'] = intval($GLOBALS['TotalResult']);
}
/**
* 缓存不懂。属于哪一块?
*/
// ------------------------------------------------------------------------
// 设定缓存配置信息
if ($cfg_memcache_enable == 'Y') {
$cache_helper_config = array();
$cache_helper_config['memcache']['is_mc_enable'] = $GLOBALS["cfg_memcache_enable"];
$cache_helper_config['memcache']['mc'] = array(
'default' => $GLOBALS["cfg_memcache_mc_defa"],
'other' => $GLOBALS["cfg_memcache_mc_oth"]
);
$cache_helper_config['memcache']['mc_cache_time'] = $GLOBALS["cfg_puccache_time"];
}
if (!isset($cfg_NotPrintHead)) {
header("Content-Type: text/html; charset={$cfg_soft_lang}");
}
//自动加载类库处理
function __autoload($classname) {
global $cfg_soft_lang;
$classname = preg_replace("/[^0-9a-z_]/i", '', $classname);
if (class_exists($classname)) {
return TRUE;
}
$classfile = $classname . '.php';
$libclassfile = $classname . '.class.php';
if (is_file(DEDEINC . '/' . $libclassfile)) {
require DEDEINC . '/' . $libclassfile;
} else if (is_file(DEDEMODEL . '/' . $classfile)) {
require DEDEMODEL . '/' . $classfile;
} else {
if (DEBUG_LEVEL === TRUE) {
echo '<pre>';
echo $classname . '类找不到';
echo '</pre>';
exit();
} else {
header("location:/404.html");
die();
}
}
}
//引入数据库类
if ($GLOBALS['cfg_mysql_type'] == 'mysqli' && function_exists("mysqli_init")) {
require_once(DEDEINC . '/dedesqli.class.php');
} else {
require_once(DEDEINC . '/dedesql.class.php');
}
//全局常用函数
require_once(DEDEINC . '/common.func.php');
/**
* 思考5:
* 从这两个类库文件就能了解到MVC到底是怎么工作的。
*/
// 模块MVC框架需要的控制器和模型基类
require_once(DEDEINC . '/control.class.php');
require_once(DEDEINC . '/model.class.php');
//载入小助手配置,并对其进行默认初始化
if (file_exists(DEDEDATA . '/helper.inc.php')) {
require_once(DEDEDATA . '/helper.inc.php');
// 若没有载入配置,则初始化一个默认小助手配置
if (!isset($cfg_helper_autoload)) {
$cfg_helper_autoload = array('util', 'charset', 'string', 'time', 'cookie');
}
// 初始化小助手
helper($cfg_helper_autoload);
}