PHPCMS 整站代码分析讲解教程Word格式.docx
- 文档编号:19521344
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:35
- 大小:49.04KB
PHPCMS 整站代码分析讲解教程Word格式.docx
《PHPCMS 整站代码分析讲解教程Word格式.docx》由会员分享,可在线阅读,更多相关《PHPCMS 整站代码分析讲解教程Word格式.docx(35页珍藏版)》请在冰豆网上搜索。
如果给人家include了以后。
你怕不怕。
PHPCMS_ROOT'
str_replace("
\\"
'
/'
substr(dirname(__FILE__),0,-8)));
为了程序产品的跨平台。
自动获取程序的安装目录路径,定义为PHPCMS_ROOT常量。
方便以后程序使用。
建议大家都这样做哦
requirePHPCMS_ROOT.'
/include/global.func.php'
;
包含全局函数global.func.php文件。
里面放了些程序全局都有需要用的函数.大家看到了吧。
常量PHPCMS_ROOT已经发挥作用。
这样程序给人家发布到了二级目录下。
也不需要人家手动改整站根目录路径了。
自己好好理解下。
。
$search_arr=array("
/union/i"
"
/select/i"
/update/i"
/outfile/i"
/or/i"
);
("
)
这个是正则的写法?
不懂正则的自己XX找教程来学。
这里不详细说了
$replace_arr=array('
union'
'
select'
update'
outfile'
or'
看这个意思很明了。
union:
连接两条SQL语句。
outfile:
主要用来导出数据库资料到其他介质上。
干啥字要定义这两个变量呢?
在global.func.php文件(前面已经加载)里面有个函数strip_sql()各位可以看下。
functionstrip_sql($string)
{
global$search_arr,$replace_arr;
returnis_array($string)?
array_map('
strip_sql'
$string):
preg_replace($search_arr,$replace_arr,$string);
}
函数里面定义了这两个变量为global全局变量。
那么函数里就可以直接使用了。
先讲解下这个函数吧。
顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。
主要过滤那些SQL语句呢。
主要是这几个关键字:
union
select
updateoutfile
or等。
因为这几个SQL字是极度容易在$_GET传输中给截注.
这个函数写得实在精妙。
is_array来判断$string是否为数组。
如果是
就array_map()函数来递归过滤$string数组里面的每一个单元.每个单元是一个字符窜吧?
当递归调用strip_sql()以后is_array()判断$string肯定为假了,因为$string已经不是数组而是字符窜。
所以执行preg_replace()函数。
这个函数很好理解了。
就是替换了。
$_POST=strip_sql($_POST);
$_GET=strip_sql($_GET);
$_COOKIE=strip_sql($_COOKIE);
使用strip_sql()函数来过滤$_POST
$_GET
$_COOKIE;
一般不是开源的站。
很少过SQL关键字过滤。
不过这个也是冒很大风险的。
unset($search_arr,$replace_arr);
unset使用过但以后不需要的变量。
这个是很好的习惯。
第一不会浪费内存。
如果变量存了大量的数据字节,而后你的程序是一直不需要用的。
那么
就会很浪费内存。
拉底程序性能.哈哈。
真很书面。
反正是好习惯我们都要学习的拉。
$magic_quotes_gpc=get_magic_quotes_gpc();
//get_magic_quotes_gpc()检测gpc是否系统自动转意。
gpc是什么呢?
GETPOSTCOOKIE来来去去就这几个东西罗。
会返回真或假
if(!
$magic_quotes_gpc)
$_POST=new_addslashes($_POST);
$_GET=new_addslashes($_GET);
判断一下系统是否打开了自动对gpc进行转意这个选择。
如果是的话,就不需要我们自动转意了。
如果不是那么还是要老百姓的手段。
自己动手丰衣足食。
来看下也是在global.func.php文件里面定义的这个函数:
其实是一个封装好的php的addslashes()函数的函数。
PHP都自己有了为什么还要自己封装成函数呢?
理由很简单。
为了以后的扩展更改容易罗。
如果我们一开始就全部用addslashes()这个函数来对'
进行转意的话。
那么以后随着程序的发展。
我可能想多过滤个^*()之类的
那如何是好呢?
所以为了以后孩子的成长。
我们还是最好封起来吧。
记住:
以后有可能会边的东西。
最好都封装成模块。
函数。
类。
这样程序的灵活度就上去了。
functionnew_addslashes($string)
is_array($string))returnaddslashes($string);
foreach($stringas$key=>
$val)$string[$key]=new_addslashes($val);
return$string;
这个函数也是写得贼好。
也是同时考虑过滤字符窜或数组,也是使用了传归。
看下就应该明白了吧。
这个不用说了。
我们要学下这个思路这个方法方式哦。
这样才能进步。
哈哈。
我们要懂模仿。
@extract($_POST,EXTR_OVERWRITE);
@extract($_GET,EXTR_OVERWRITE);
嘿。
extract前面加个@鸡蛋做什么呢?
?
抑制错误的。
还不懂的话。
自己XX了。
为什么用extract()函数呢.
平时我们程序是不是要常使用$_POST
$_GET来获取传递的变量呀。
是不是感觉贼麻烦呀。
比如$_POST['
xx'
]
这样接受是挺好。
但写多了很麻烦是吧。
我是感觉麻烦。
我现在想直接就$xx就可以获取传递过来的东西。
那怎么办呢。
就用了extract()函数来实现这么一个技巧。
这个技巧在discuz论坛上也有应用。
unset($_POST,$_GET);
unset()好处不用说了吧。
释放$_POST$_GET数组,因为已经不需要他们了。
>
明天放假了.今天在写点罗.放假没空写了.要陪老婆,大家看了有什么不明白的.可以跟帖问.我懂的我会回答.谢谢
PHPCMS整站代码分析讲解
(二)
逆雪寒.2007-12-21
/config.inc.php'
加栽整站的配置参数文件。
一般的程序都会有这个文件。
做什么的呢?
比如一些数据库连接地址。
用户名,密码等。
需要用到的参数都定义在这个文件里面。
这样以后配置变了。
我们只要改动下这个文件里面的
变量值就好。
是不是很方便呢。
呵呵.
在这里说下require()这个加载函数。
require和include都是用来加载其他PHP文件用的。
但他们是有区别的。
require函数:
是"
预解释"
函数。
就是程序一加载,就执行了require函数。
而include
呢。
是个过程加载函数。
我们可以在逻辑里比如:
if里面使用include来动态的加载其他程序片段。
而require就不行。
/languages/'
.$CONFIG['
language'
].'
/phpcms.lang.php'
顾名思义:
这个就是加载语言包了。
PHP的国际化目前做得最多的。
就是直接用PHP文件来实现。
在phpcms.lang.php文件里面定义程序中要用到的中文信息。
然后在程序一开始就加载。
那里程序里面
就可以使用这个文件里面的变量和一切。
那么就简单了。
模板上就不需要直接写中文信息了。
直接用这个文件里面定义的变量等来替换。
从而实现国际化。
over!
!
最好自己打开这个语言文件再加上自己思考下。
就知道。
原来如此简单。
PHPCMS_PATH'
$CONFIG['
rootpath'
]);
PHPCMS_CACHEDIR'
cachedir'
$CONFIG['
这个就是全局配置文件 config.inc.php文件里面数据库信息。
等全部配置信息。
在这里把他们定义为 常量。
为什么需要定义为常量呢。
因为作者感觉这样写爽罗。
呵呵。
其实因为后面
用到这两个变量多。
所以干脆定义为常量。
方便使用。
再多说一个技巧:
$CONFIG['
其实也可以写成 $CONFIG[rootpath]
但是最好不要这样。
为什么呢。
因为PHP引擎会先判断
rootpath是不是常量。
如果不是才会认定
$CONFIG[rootpath]
是数组。
这样性能上就差了一点点了。
再多说一个技巧:
为什么程序多数都用 '
'
单引号呢而不用"
"
双引号呢。
因为这样效率好,"
双引号。
php引擎还会先检查里面是否有变量,如果有就解释。
而'
单引号不会做这一步的检查。
而直接就当成字符窜了。
所以效率上也会有一点点影响哦。
enablephplog'
]?
set_error_handler('
phpcms_error'
):
error_reporting(E_ERROR|E_WARNING|E_PARSE);
是否开启错误日志设置。
这个设置在全局配置文件里面.config.inc.php。
这里使用了 三目运算符 偶最喜欢用了。
一些简短的逻辑判断。
可以使用 ?
:
;
来实现比较简洁
set_error_handler()这个函数就大有来头了。
php4里面的典型自定义程序出错后行为的一个函数。
十分好用。
怎么用呢?
set_error_handler(函数) 的参数也是一个函数。
这个函数。
反映了程序出错后行为的。
phpcms_error函数存在 global.func.php全局函数里面。
functionphpcms_error($errno,$errmsg,$filename,$linenum,$vars)
$filename=str_replace(PHPCMS_ROOT,'
.'
$filename);
$filename=str_replace("
// 把win平台的\\ 换成 /兼容常见系统的路径
if(!
defined('
E_STRICT'
))define('
2048);
$dt=date('
Y-m-dH:
i:
s'
$errortype=array(
E_ERROR
=>
Error'
E_WARNING
Warning'
E_PARSE
ParsingError'
E_NOTICE
=>
Notice'
E_CORE_ERROR
CoreError'
E_CORE_WARNING
CoreWarning'
E_COMPILE_ERROR
CompileError'
E_COMPILE_WARNING=>
CompileWarning'
E_USER_ERROR
UserError'
E_USER_WARNING
UserWarning'
E_USER_NOTICE
UserNotice'
E_STRICT
RuntimeNotice'
$user_errors=array(E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE);
$err="
errorentry>
\n"
$err.="
\t<
datetime>
.$dt."
/datetime>
errornum>
.$errno."
/errornum>
errortype>
.$errortype[$errno]."
/errortype>
errormsg>
.$errmsg."
/errormsg>
scriptname>
.$filename."
/scriptname>
scriptlinenum>
.$linenum."
/scriptlinenum>
if(in_array($errno,$user_errors))
$err.="
vartrace>
.wddx_serialize_value($vars,"
Variables"
)."
/vartrace>
/errorentry>
\n\n"
echo$err;
error_log($err,3,PHPCMS_ROOT.'
/data/php_error_log.xml'
chmod(PHPCMS_ROOT.'
0777);
就是这个鸟蛋。
现在我们慢慢来干掉他。
呵呵
这个自定义出错信息函数默认带有四个参数。
第一个参数 $errno是程序出错的等级。
第二参数是程序出错的界面信息。
第三是出现错误的程序文件名。
第四是 第几行出现错误。
第五个参数。
要不要都行是当前变量状态的快照.看吧。
我们有这些信息后。
想定义怎么样的错误信息给客户看都很容易了是吧?
但现在我们是要生成错误日志呢?
这里phpcms作者是动态生成一个XML文件来做错误日志的。
不错不错.
他使用了in_array()函数来实现(因为比较简单,自己理解下) 只记录 E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE这三个级别的错误日志信息。
\n是文本换行符 \t是制表符.这里他使用了一个比较漂亮而不常用的函数wddx_serialize_value()wddx其实也是一种 xml。
wddx_serialize_value() 这个函数就是把一般变量以XML格式输出。
这样我们就不用自己模拟写xml了。
方便吧。
呵呵第一个参数就是:
要格式输出的变量,第二个参数是输出的xml的介绍信息.下面就是error_log()函数。
这个函数十分有用了。
就是生成错误日志XML文件。
不需要我们fopen了。
它还有很多功能。
详细的看手册。
chmod设置日志文件的权限是 可读可写可执行。
在php5中。
我习惯使用extends Exception 来定义自己的出错信息。
所以很少用set_error_handle().如果没开启日志功能。
那么 error_reporting(E_ERROR|E_WARNING|E_PARSE) 就运行了。
把一般出错信息先出过来。
if($CONFIG['
sessionsavepath'
])session_save_path($CONFIG['
定义session的存储路径,session其实 也是cookie不过session是实现在服务器端的。
安全但负载重点。
这样做的好处?
效率很好。
如果你在虚拟主机的话。
大家的sessioncookie都放在了php.ini里面设置的默认地方。
文件夹臃肿就会慢罗。
是吧。
第二就是安全罗。
记得一定要定义在session_start()函数之前
session_start();
if(function_exists('
date_default_timezone_set'
))date_default_timezone_set($CONFIG['
timezone'
php5开始有时区的概念了。
记得就行
header('
Content-type:
text/html;
charset='
charset'
设置页面编码. php编码有:
页面编码。
数据库编码。
文件内码。
如果三码相同就一般不会出现乱码. 文件内码是什么呢?
每个文件都有自己的内部编码。
一般都用UTF8比较爽。
怎么改变文件内码?
你用DW也行 UE 也行。
随便。
数据库编码那肯定是要指定的了。
mysql5开始也有字符集模式这个最好也设置这样可以兼容更多平台。
页面编码:
metahttp-equiv="
Content-Type"
c/>
这句就是。
一般的HTML头文件都有。
那还需要header('
吗?
其实需要的。
因为有些自己写的提示层呀。
或是文件里没指定页面编码的。
就很容易出现乱码那么我们就防范于未然。
header一个编码过去。
那就OK了。
多好。
if(getenv('
HTTP_CLIENT_IP'
)&
&
strcasecmp(getenv('
),'
unknown'
))
$PHP_IP=getenv('
elseif(getenv('
HTTP_X_FORWARDED_FOR'
REMOTE_ADDR'
elseif(isset($_SERVER['
])&
$_SERVER['
]&
strcasecmp($_SERVER['
],'
$PHP_IP=$_SERVER['
];
preg_match("
/[\d\.]{7,15}/"
$PHP_IP,$ipmatches);
$PHP_IP=$ipmatches[0]?
$ipmatches[0]:
PHPCMS整站代码分析讲解
(二)续
QUOTE:
原帖由peixin229于2008-1-1909:
46AM发表
用户名,密码等...
由于论坛字符限制,所以分两次发,接上面一部分。
函数 getenv()是获取环境变量。
环境变量:
HTTP_CLIENT_IP是获取客户端的IP 。
但有可能人家是通过代理来访问你的程序的呢。
那么这时候就要用环境变量:
HTTP_X_FORWARDED_FOR
了。
包括 getenv('
) $_SERVER['
] 都是获取人家 IP的。
反正碰罗。
碰到那个能获取就大工告成。
$PHP_TIME=time();
$PHP_SELF=isset($_SERVER['
PHP_SELF'
])?
PH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHPCMS 整站代码分析讲解教程 代码 分析 讲解 教程