include/common.inc.php
<?php
/**
《PHPCMS2007 include/common.inc.php文件分析》
作者:fan12 (随便崇拜,不介意)
本人为大师级分析,高屋建瓴,
有想看细节分析的google搜“phpcms 源码分析”,有个叫逆水寒的写了几篇小兵级分析,写得很细,可以参考
phpcms和discuz编码风格差不多,这个common.inc.php文件是几乎所有其他脚本都要包含进去的
*/
##################################### Section 1 ###################################################
###################################################################################################
/*
处理时间、超级全局变量、魔术引用、定义‘IN_PHPCMS’防止翻墙
定义根目录PHPCMS_ROOT、包含/include/global.func.php 函数文件
定义$search_arr、$replace_arr两个数组变量处理数据库操作
给$_GET,$_POST,$_COOKIE剥皮、转义
extract $_POST,$_GET以备后用
unset掉$_POST,$_GET
*/
$mtime = explode(' ', microtime());
$phpcms_starttime = $mtime[1] + $mtime[0];
unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
set_magic_quotes_runtime(0);
define('IN_PHPCMS', TRUE);
define('PHPCMS_ROOT', str_replace("//", '/', substr(dirname(__FILE__), 0, -8)));
require PHPCMS_ROOT.'/include/global.func.php';
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
unset($search_arr, $replace_arr);
$magic_quotes_gpc = get_magic_quotes_gpc();
if(!$magic_quotes_gpc)
{
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
}
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
unset($_POST, $_GET);
admin.php:
<?php
/**
《phpcms2007 admin.php脚本分析》
作者:fan12
phpcms的后台管理最先执行这个脚本,然后根据GET变量mod和file决定include哪个xxx.inc.php,
再然后在xxx.inc.php里根据GET变量switch($action)决定include哪个xxx.tpl.php模板,显示给用户
用户再选择点击把新的GET变量mod,file,action,channelid等传到服务器请求admin.php文件,服务器做出响应
比如刚登陆时就include的是index.inc.php文件,index.inc.php根据action的值indlude相应的模板显示给用户
大家在后台管理边点边看本分析
*/
/**
这个脚本最后基本上都会落到最后一句:
if(!@include $filepath) showmessage($LANG['illegal_operation']);
$filepath是个xxx.inc.php脚本,xxx根据$file定,
然后在xxx.inc.php根据swith($action) include对应的admintpl(xxx) 模板文件
具体可以到admin/templates/下去一个一个看,别的模块下的/admin/templates/也有
*/
############################################# Section 1 #####################################################
#############################################################################################################
/**
包含了一堆文件,new了session
处理GET变量file
关闭cache开关
处理所有的传递变量:file,action,job,catid,specialid
*/
define('IN_ADMIN', TRUE);
$rootdir = dirname(__FILE__);
require $rootdir.'/admin/include/global.func.php'; //很多admin相关的函数
require $rootdir.'/include/common.inc.php'; //common.inc.php,phpcms的核心文件,干了很多事,很重要,建议详细看看
$session = new phpcms_session(); //通过common.inc.php里包含进来的/include/session_'.$CONFIG['database'].'.class.php实现
require PHPCMS_ROOT.'/languages/'.$CONFIG['adminlanguage'].'/phpcms_admin.lang.php'; //全是$LANG[],操作交互过程的提示信息
require_once PHPCMS_ROOT.'/include/version.inc.php'; //版本信息,就两行
require_once PHPCMS_ROOT.'/include/formselect.func.php'; //很多和选择相关的函数
require_once PHPCMS_ROOT.'/include/cache.func.php'; //缓存函数,去看相应的脚本和讲解
require_once PHPCMS_ROOT.'/include/post.func.php'; //与发布相关的函数,比如关键字设置,作者更新之类的
//其实根据变量命名就可以看出来,$file--意思就是每次请求的都是一个对应的file
if(!isset($file)) $file = 'index'; //如果$file没设,就给设为'index',相对应的代码会处理
preg_match("/^[0-9A-Za-z_]+$/",$file) or showmessage('Invalid Request.'); //防止$file含非法字符
$db->iscache = 0; //$db 在common.inc里已经new了,那里iscache=$CONFIG['dbiscache'],但后台不能cache,所以设为0,给禁掉
$fileiscache = 0;
$filecaching = 0;
$file = isset($file) ? $file : 'login'; //有点多余,好象是为安全性考虑,不过也是初始化的习惯而已
$action = isset($action) ? $action : ''; //$action初始化
$job = isset($job) ? $job : ''; //同上
$catid = isset($catid) ? intval($catid) : 0; //目录id
$specialid = isset($specialid) ? intval($specialid) : 0; //专题id(应该是)
admin/index.inc.php:
<?php
/**
《phpcms2007 admin/index.inc.php脚本分析》
作者:fan12
------------------后台admin首页------------------
admin.php的inc文件,file=index就会include该文件
然后再通过下面的swith()语句,根据action的值执行相应的操作
*/
############################################# Section 1 #####################################################
#############################################################################################################
/**
判断是否定义IN_PHPCMS或重定向
定义showresult()函数
定义zend_optimizer_version()函数
*/
defined('IN_PHPCMS') or header('location:../admin.php?mod=phpcms&file=index');
function showresult($v)
{
global $LANG;
return $v ? ' <font color="blue"><b>'.$LANG['yes'].'</b></font>' : '<font color="red"><b>'.$LANG['no'].'</b></font>';
}
if(!function_exists('zend_optimizer_version'))
{
function zend_optimizer_version()
{
ob_start();
@phpinfo();
$phpinfo = ob_get_contents();
ob_end_clean();
preg_match( "/Zend(?: | +?Optimizer(?: | +?v([0-9]+/.[0-9]+/.[0-9]+),/",strip_tags($phpinfo),$info);
return $info[1];
}
}
############################################# Section 2 #####################################################
#############################################################################################################
/**
action的switch()语句,每个case最后都会包含根目录/admin/templates/下的模板文件
default即index在最下面,执行的是include admintpl('index');
admintpl()在admin/include/global.func.php里,返回.$module_dir.'/admin/templates/'.$file.'.tpl.php'
$module_dir为空则直接返回/admin/templates/'.$file.'.tpl.php
默认即返回admin/templates/index.tpl.php, 该脚本生成了一个框架
然后框架顶部src= "?mod=phpcms&file=index&action=top",也就是还请求admin.php,file还=index,不过action=top
左框架src= "?mod=phpcms&file=index&action=mymenu",
右框架src= "?mod=phpcms&file=index&action=main"
*/
switch($action)
phpcms2007几个核心文件讲解
最新推荐文章于 2024-05-26 23:08:24 发布