国内著名CMS: PHPCMS 整站代码分析讲解 -2008-1-2已更新(# 20页)(第三章继续进行中..)
时间:2007-12-21
来源:互联网

希望全部打包上来,看这种好代码好舒服呀。
作者: PHPChina 发布时间: 2007-12-20
作者: PHPChina 发布时间: 2007-12-20
作者: jayliu 发布时间: 2007-12-21

学习了
作者: LostSinger 发布时间: 2007-12-21

作者: qs9515 发布时间: 2007-12-21
作者: index 发布时间: 2007-12-21


鸟 。。。
作者: michaeli 发布时间: 2007-12-21
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
....................................................
在以下的代码中用到了$_SERVER数组的变量
$PHP_QUERYSTRING = $_SERVER['QUERY_STRING'];
$PHP_DOMAIN = $_SERVER['SERVER_NAME'];
我们在提交地址时,可以自己构造$_SERVER数组的变量,比如提交:
http://www.phpcms.com/index.php?_SERVER[SERVER_NAME]=some_string
那么执行@extract($_GET, EXTR_OVERWRITE)后,会生成$_SERVER[SERVER_NAME]=some_string,$PHP_DOMAIN 将不在是程序期望的结果。
没有检测这个漏洞对整个程序有什么影响,但这样肯定不安全。正确的做法是检测提交变量的第一个字母是否是 _,引一段Discuz的代码:
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
作者: dujiangtao 发布时间: 2007-12-21
作者: MoHock 发布时间: 2007-12-21

作者: carche 发布时间: 2007-12-21

有空看看收藏!
作者: chyoqin 发布时间: 2007-12-21
作者: 逆雪寒 发布时间: 2007-12-21

php和钱一扯上关系.我就郁闷

作者: zhaofei299 发布时间: 2007-12-21


作者: thankwsx 发布时间: 2007-12-21
引用:
原帖由 carche 于 2007-12-21 15:24 发表这两行有严重的代码漏洞,没有对提交的变量进行过滤就释放了。
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
....................................................
在以下的代码中用 ...
如果有重复的就跳过,这样就好点.要不在extract之前 要经过严格的过滤
作者: 逆雪寒 发布时间: 2007-12-21
作者: MoHock 发布时间: 2007-12-21
作者: 逆雪寒 发布时间: 2007-12-21

作者: chyoqin 发布时间: 2007-12-21
不过能简洁一下吗?废话好多啊。
作者: 逆雪寒 发布时间: 2007-12-21

我也是力求各种水平的人都能理解.众口难调呀.LS兄弟将就下吧

作者: javachen 发布时间: 2007-12-21
作者: 追梦ren 发布时间: 2007-12-21
作者: 逆雪寒 发布时间: 2007-12-21
赞一个 !!
作者: ascmvi 发布时间: 2007-12-21
作者: zig 发布时间: 2007-12-21



太好了,刚好可以学习呢!

作者: tjlwz 发布时间: 2007-12-21


作者: zhn 发布时间: 2007-12-21

作者: 笑天 发布时间: 2007-12-21
加油!
作者: 少天一 发布时间: 2007-12-21
作者: xlez 发布时间: 2007-12-21
作者: oolala 发布时间: 2007-12-21
作者: 小狮子 发布时间: 2007-12-22
作者: 痞子PHP 发布时间: 2007-12-22
作者: lc0633 发布时间: 2007-12-22

作者: snowcxy 发布时间: 2007-12-22
作者: chenmfly 发布时间: 2007-12-22
作者: macgroup 发布时间: 2007-12-22

作者: 温柔的大海 发布时间: 2007-12-22
这个兄弟.请看清楚.他并没有md5加密 get 传递 的数据.而是以这个算出 这个页面是否已经缓存...看仔细点

作者: fly_yang 发布时间: 2007-12-22

作者: xyiyo 发布时间: 2007-12-22
希望楼主能坚持

作者: robertvvv 发布时间: 2007-12-22

回复那位兄弟.代码给初学者看的.象你这样的高高手.就没必要看了.谢谢
作者: 逆雪寒 发布时间: 2007-12-22

作者: wangchun 发布时间: 2007-12-22
作者: zw870307 发布时间: 2007-12-22
作者: zw870307 发布时间: 2007-12-22

作者: 逆雪寒 发布时间: 2007-12-22
作者: 飘渺晴霜 发布时间: 2007-12-23
谢谢LZ。
学到了很多东西,收藏啊,一定要收藏。
作者: hongfu1 发布时间: 2007-12-23

星期一继续放新东西.不过这一个启动文件快讲完了.下一章再讲phpcms 的缓存机制.大家继续帮我顶阿~
作者: sandssss 发布时间: 2007-12-23
引用:
原帖由 wangchun 于 2007-12-22 22:10 发表以前没注意phpcms不过楼主分析的这个文件代码的却不咋的,废话多。
废话不多的高手们,俺们新手也很想听听你们的废话呢!!!
除了phpcms,还有php168 dedecms(织梦系统)
据说,织梦系统和 帝国管理系统 是超级牛的
请给分析分析…………
呵呵
------------
赞赏楼主的无私奉献之壮举!!
帮着顶起,慢慢研究!
好好学习!
[ 本帖最后由 coolcool1265 于 2007-12-23 10:52 编辑 ]
作者: lhphp 发布时间: 2007-12-23
帝国管理系统.听说不错.
其实分析那套系统都没关系.分析他们不是为了教大家怎么使用那套系统,而只是让大家学习里面的思想从而提高PHP开发能力而已. PHPCMS 也不错.代码写得挺容易懂的.

弄完这个以后有时间在弄其他的吧.本来说想找套PHP5的 CMS来讲解.不过找了半天找不到有点名气的.郁闷.我还是喜欢PHP5
作者: jackywdx 发布时间: 2007-12-23
楼主辛苦了!
作者: fhjr999 发布时间: 2007-12-23
那再请教一次。
在这个文件刚开始,已经关闭了自动转义了,那为什么后边还要为COOKIE,GET,POST再进行转义呢???
还有一个问题,一个页面,获得上个页面提交的GET,POST等数据,是在什么时候获得的??
是在执行这个页面的任何代码之前吗?? 如果是在之前,假如服务器默认开启了自动转义的话,是不是,这些数据已经被转义过了??还是只有这些数据被用到的时候才会进行自动转义?
如果是在之后才会获得,不过有点说不过去啊,如果第一句就用GET。POST,那起不是得不到数据了。
作者: 逆雪寒 发布时间: 2007-12-23
一个是资料入库前对字符窜进行转意
一个是 对 gpc 进行转意. 概念不一样.
好好理解下.
[ 本帖最后由 逆雪寒 于 2007-12-23 12:03 编辑 ]
作者: coolcool1265 发布时间: 2007-12-23

作者: 逆雪寒 发布时间: 2007-12-23
set_magic_quotes_runtime(0);
$x = 'asdf"sdfasdf"sadfsadf';
if ($x==addslashes($x)) echo $x; else echo 'no';
首先关闭了自动转义,然后将$x跟转义了之后的$x比较,发现两个并不相等。
关闭了自动转义之后,接着又对POST,GET,COOKIE进行转义,那么假如想在程序中用POST,GET中的一些数据进行比较。
例如:if ($_POST['username']=='sfasdf"asdf"asffasf')
那起不是也需要对'sfasdf"asdf"asffasf' 也要先转义一下。这样不会很麻烦吗????
为什么不平时操作时都不转义,只在对数据库进行存储,读出的时候才转义一下呢???我感觉这样应该更不容易引起混乱啊。
作者: saso 发布时间: 2007-12-23
作者: fhjr999 发布时间: 2007-12-23
作者: 逆雪寒 发布时间: 2007-12-23
作者: erentan 发布时间: 2007-12-23
引用:
原帖由 逆雪寒 于 2007-12-22 20:42 发表接着开始用一系列的规则来找出缓寸的文件名和目录: 以 脚本名:xx.php和后续传递的参数 ?xx=ee&bb=jj 他两的字符窜的MD5 .以这个md5窜来定义出了缓存目录.和缓存文件
这个兄弟.请看清楚.他并没有md5加密 get ...
[ 本帖最后由 robertvvv 于 2007-12-23 14:55 编辑 ]
作者: fhjr999 发布时间: 2007-12-23
引用:
原帖由 逆雪寒 于 2007-12-23 11:13 发表我对 织梦系统 没什么好感.因为我装了一次.失败了.所以我就直接丢掉了.
帝国管理系统.听说不错.
其实分析那套系统都没关系.分析他们不是为了教大家怎么使用那套系统,而只是让大家学习里面的思想从而提高PHP开 ...
[ 本帖最后由 robertvvv 于 2007-12-23 17:12 编辑 ]
作者: fhjr999 发布时间: 2007-12-23
但是今天真的学了不少东西。。
不顶对不起LZ啊......
加油加油。。
作者: benaheng 发布时间: 2007-12-23
引用:
原帖由 xlez 于 2007-12-21 20:53 发表比看av还爽

作者: carche 发布时间: 2007-12-23
作者: robertvvv 发布时间: 2007-12-23

作者: robertvvv 发布时间: 2007-12-23
引用:
原帖由 robertvvv 于 2007-12-23 14:53 发表跟我一样,第一次装织梦直接失败,听说是经常跳票的产品
作者: coolkiss 发布时间: 2007-12-24
引用:
原帖由 逆雪寒 于 2007-12-21 17:15 发表谢谢.我会继续的.坚持把phpcms 弄个底朝天的.
作者: ascmvi 发布时间: 2007-12-24


目前正在苦练 linux c .
作者: liuxingke 发布时间: 2007-12-24
作者: jyb21 发布时间: 2007-12-24
引用:
原帖由 逆雪寒 于 2007-12-24 12:08 发表

目前正在苦练 linux c .
作者: billx 发布时间: 2007-12-24
谢谢楼主
分析完了phpcms 接着dz,pw,dede,接着phpbb...^_^
作者: jyb21 发布时间: 2007-12-24
把dz分析的差不多了
你可以去找找呵呵
作者: 逆雪寒 发布时间: 2007-12-24
作者: jinchao_1985 发布时间: 2007-12-24
引用:
define('IN_PHPCMS', TRUE);/**
程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。
防止你翻墙进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
那么就基本可以肯定你这个家伙是个小偷来的。 人可能翻墙进入。但程序怎么翻墙呢。只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。
作者: chyoqin 发布时间: 2007-12-24
作者: psdshow 发布时间: 2007-12-24
引用:
原帖由 qfangcn 于 2007-12-24 15:23 发表这段不是很明白,麻烦楼主给个例子
$dbuser = 'xxx';
$pwd = '22541';
include 'xx.php';
echo $dbuser;
echo $pwd
可以获得你密码资料等。
作者: coolcool1265 发布时间: 2007-12-24
为什么不像phpwind那样用{pre}前缀呢?
作者: yuanjing_119 发布时间: 2007-12-24
包含任何varchar、text等变长字段的数据表,即为变长表,反之则为定长表。
l 对于变长表,由于记录大小不同,在其上进行许多删除和更改将会使表中的碎片更多。需要定期运行OPTIMIZE TABLE以保持性能。而定长表就没有这个问题;
l 如果表中有可变长的字段,将它们转换为定长字段能够改进性能,因为定长记录易于处理。但在试图这样做之前,应该考虑下列问题:
l 使用定长列涉及某种折衷。它们更快,但占用的空间更多。char(n) 类型列的每个值总要占用n 个字节(即使空串也是如此),因为在表中存储时,值的长度不够将在右边补空格;
l 而varchar(n)类型的列所占空间较少,因为只给它们分配存储每个值所需要的空间,每个值再加一个字节用于记录其长度。因此,如果在char和varchar类型之间进行选择,需要对时间与空间作出折衷;
l 变长表到定长表的转换,不能只转换一个可变长字段,必须对它们全部进行转换。而且必须使用一个ALTER TABLE语句同时全部转换,否则转换将不起作用;
l 有时不能使用定长类型,即使想这样做也不行。例如对于比255字符更长的串,没有定长类型;
l 在设计表结构时如果能够使用定长数据类型尽量用定长的,因为定长表的查询、检索、更新速度都很快。必要时可以把部分关键的、承担频繁访问的表拆分,例如定长数据一个表,非定长数据一个表。例如phpcms的phpcms_member表等。因此规划数据结构时需要进行全局考虑;
进行表结构设计时,应当做到恰到好处,反复推敲,从而实现最优的数据存储体系。
作者: qfangcn 发布时间: 2007-12-24
这样可以灵活的更换表名而对程序的影响达到最小。

作者: okhwyy 发布时间: 2007-12-24

作者: 逆雪寒 发布时间: 2007-12-24

我在学习中……
作者: 东感地带 发布时间: 2007-12-24

作者: 东感地带 发布时间: 2007-12-24

作者: 逆雪寒 发布时间: 2007-12-24
引用:
原帖由 逆雪寒 于 2007-12-24 16:28 发表xx.php 文件
$dbuser = 'xxx';
$pwd = '22541';
include 'xx.php';
echo $dbuser;
echo $pwd
可以获得你密码资料等。
作者: 宁静致远 发布时间: 2007-12-24
作者: 宁静致远 发布时间: 2007-12-24
谢谢~
排队等候下一章~

作者: chyoqin 发布时间: 2007-12-24

作者: billx 发布时间: 2007-12-24
[ 本帖最后由 thinkinginlamp 于 2007-12-25 08:45 编辑 ]
作者: qfangcn 发布时间: 2007-12-24
http://www.phpchina.com/bbs/thread-45889-1-1.html
有朋友提出了解决方案,不知楼主有何高见
我自己的解决方案是:将后面的参数强制转换为int, 不知楼主有没有更好的方法
作者: hhcsb 发布时间: 2007-12-24
sql 语句里面 SELECT * FROM xx WHERE uid = '$xx'
记得加单引号.这才是好习惯.
而且最好过滤每个GET 变量 去掉 or union 等SQL关键字.
作者: xjgale 发布时间: 2007-12-25

作者: 黄山狼 发布时间: 2007-12-25
可是一直没找到TABLE_MEMBER是在哪里定义的。。
按照phpcms官方的说法,比较常用的几个表都定义为常量了,关键是在哪里呢???
作者: thinkinginlamp 发布时间: 2007-12-25
加油!继续!
作者: dongxin1390008 发布时间: 2007-12-25
作者: 逆雪寒 发布时间: 2007-12-25
引用:
原帖由 东感地带 于 2007-12-25 09:22 发表我想把phpcms_member和phpwind里的pw_members两个表合并起来。
可是一直没找到TABLE_MEMBER是在哪里定义的。。
按照phpcms官方的说法,比较常用的几个表都定义为常量了,关键是在哪里呢???
作者: jyb21 发布时间: 2007-12-25
引用:
原帖由 coolcool1265 于 2007-12-24 14:20 发表dz 社区里面有个大哥超级牛的人
把dz分析的差不多了
你可以去找找呵呵
作者: 东感地带 发布时间: 2007-12-25

这两天都在弄 C的PHP扩展. 郁闷死了. 扩展写好了,C也编译成功了.但加载DLL ,怎么也phpinfo() 不出来.而且.也不能用. 扩展是 php-5.2.4 版本的.不知道是不是版本问题.我本地是php-5.1.2 的.
我把扩展发上来那位兄弟.是php-5.2.4的麻烦给我开扩展.试下函数能不能用.

在php.ini 里面 加个 extension=haha.dll
然后在phpinfo() 看下能不能显示支持 haha 扩展库 和运行下 haha() 这个函数看能不能提示找到这个函数就OK

还有那个 数据表常量.等下看下回答你
[ 本帖最后由 逆雪寒 于 2007-12-25 11:23 编辑 ]
作者: lnnujxxy 发布时间: 2007-12-25
作者: fly_yang 发布时间: 2007-12-25
作者: robertvvv 发布时间: 2007-12-25


作者: 玉面修罗 发布时间: 2007-12-25




作者: 逆雪寒 发布时间: 2007-12-25

作者: lovewqww 发布时间: 2007-12-25


作者: PEA@wikiPHP 发布时间: 2007-12-25
而且这个CMS源码也太老了
PHP3时代的吧
作者: 逆雪寒 发布时间: 2007-12-25
怎么判断代码老或不老呢。教我两招

作者: 追风1 发布时间: 2007-12-25


作者: 逆雪寒 发布时间: 2007-12-25



作者: hongfu1 发布时间: 2007-12-25
引用:
原帖由 东感地带 于 2007-12-25 09:22 发表我想把phpcms_member和phpwind里的pw_members两个表合并起来。
可是一直没找到TABLE_MEMBER是在哪里定义的。。
按照phpcms官方的说法,比较常用的几个表都定义为常量了,关键是在哪里呢???
作者: 逆雪寒 发布时间: 2007-12-25
啥都不说了,眼泪哗哗的呀!!!!
作者: hongfu1 发布时间: 2007-12-25
引用:
原帖由 fly_yang 于 2007-12-25 09:39 发表不知道版主能不能把源码分享下
作者: 逆雪寒 发布时间: 2007-12-25
引用:
原帖由 逆雪寒 于 2007-12-25 12:39 发表楼上果然眼厉。
怎么判断代码老或不老呢。教我两招


作者: hongfu1 发布时间: 2007-12-25
引用:
原帖由 追风1 于 2007-12-25 12:04 发表




作者: 逆雪寒 发布时间: 2007-12-25
PHP代码:
/*** 执行sql语句
* @param string sql语句
* @param string 默认为空,可选值为 CACHE UNBUFFERED
* @param int Cache以秒为单位的生命周期
* @return resource
*/
function query($sql , $type = '' , $expires = 3600, $dbname = '')
{
$func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query';
/**
mysql_unbuffered_query 效率更好。节省内存 看手册
*/
if(!($query = $func($sql , $this->connid)) && $type != 'SILENT')
{
$this->halt('MySQL Query Error', $sql);
}
$this->querynum++;
return $query;
}
/**
* 执行sql语句,只得到一条记录
* @param string sql语句
* @param string 默认为空,可选值为 CACHE UNBUFFERED
* @param int Cache以秒为单位的生命周期
* @return array
*/
function get_one($sql, $type = '', $expires = 3600, $dbname = '')
{
$query = $this->query($sql, $type, $expires, $dbname);
$rs = $this->fetch_array($query);
$this->free_result($query);
return $rs ;
}
作者: 东感地带 发布时间: 2007-12-25

国家领导人不也一样有人说好有人说不好
哈哈
拿多点时间学习罗.28岁还不能做到CTO 就等着回家开小卖部去

作者: jyb21 发布时间: 2007-12-25
所以可以忽略.可能是他们以后要实现的东西

作者: jyb21 发布时间: 2007-12-25
引用:
原帖由 逆雪寒 于 2007-12-25 16:58 发表
国家领导人不也一样有人说好有人说不好
哈哈
拿多点时间学习罗.28岁还不能做到CTO 就等着回家开小卖部去


作者: jyb21 发布时间: 2007-12-25

休闲 舒服 幸福
作者: chyoqin 发布时间: 2007-12-25
这个能构造出:$_SERVER[SERVER_NAME]=some_string ?????
如果:
[url=http://www.phpcms.com/index.php?_SESSION[SERVER_NAME]=some_string]http://www.phpcms.com/index.php?_SESSION[SERVER_NAME]=some_string[/url]
那岂不是很恐怖了???
[ 本帖最后由 flash866 于 2007-12-25 19:24 编辑 ]
作者: 逆雪寒 发布时间: 2007-12-25
作者: 逆雪寒 发布时间: 2007-12-25


作者: jyb21 发布时间: 2007-12-25

作者: 逆雪寒 发布时间: 2007-12-25
作者: flash866 发布时间: 2007-12-25



作者: gleon 发布时间: 2007-12-26

作者: linvo 发布时间: 2007-12-26
编码规范和目录结构
http://dev.phpcms.cn/start/
作者: billx 发布时间: 2007-12-26
phpcms编码规范,前几天发的,转发到这里顶下 逆雪寒,也让更多的人省事,省得复制粘贴相关文档了
作者: chenmfly 发布时间: 2007-12-26
引用:
原帖由 东感地带 于 2007-12-26 09:04 发表找“地基”的可以参照这里。
编码规范和目录结构
http://dev.phpcms.cn/start/

作者: jyb21 发布时间: 2007-12-26
引用:
原帖由 逆雪寒 于 2007-12-26 08:59 发表前面分析的都是"地基"


作者: 逆雪寒 发布时间: 2007-12-26

慢慢会好的
作者: 东感地带 发布时间: 2007-12-26
现在开始讲 index.php 首页文件. 基本来说PHPCMS的加载到显示操作的整个流程都分析完了.大家看一遍后.还要整体的来看来分析.慢慢体会.把些好的思想和思路实现到自己以后的项目里.我相信大家都会变得很强的. 记得: 程序是死的,人是活的.有实现思路一切都好办了.
PHP代码:
<?php
/**
代码分析版权所有:逆雪寒
*/
require './include/common.inc.php';
/**
看 common.inc.php 核心启动文件我们已经讲解完了。应该都明白了吧
*/
if($PHPCMS['ishtml'] == 1 && file_exists(PHPCMS_ROOT.'/'.$PHPCMS['index'].'.'.$PHPCMS['fileext']))
{
header('location:'.$PHPCMS['index'].'.'.$PHPCMS['fileext']);
exit;
}
/**
phpcms 允许在后台生静态和使用静态,这里就是先判断 $PHPCMS['ishtml'](从文本缓存弄过来的。应该知道了吧)是否为1 就是开启了。和这个 静态的html文件是否存在。
*/
$channels = array();
$channels['article'] = $channels['down'] = $channels['picture'] = $channels['info']= array();
foreach($CHANNEL as $v)
{
$module = $v['module'];
if($v['islink'] == 0 && $MODULE[$module]['iscopy'] == 1) $channels[$module][$v['channelid']] = $v;
}
//获取频道模块的信息。都是从缓存中取的
$head['title'] = $PHPCMS['seo_title'];
$head['keywords'] = $PHPCMS['seo_keywords'];
$head['description'] = $PHPCMS['seo_description'];
// 这个是网页的SEO (title,keywords,description)信息。这个写好了。网络蜘蛛会找你哦。
include template('phpcms', 'index');
// template() 函数是模板函数。这个就是这章的主题。往下会讲模板引擎的制作,大家都看到include 了吧。它的参数是文件地址。那么就可以想到 template()函数其实就是
// 模板编译后的PHP文件地址。
phpcache();
/**
这个函数厉害了。用来自动生缓存页的(这个是页面缓存和数据库信息的文本缓存不是一会事),页面缓存,就是把你所看的页自动生成 XX.html 静态页。请注意前面代码。是不是有个 header()跳转到静态页呀。
那静态页那里来的?就是给这个函数弄出来的。自动静态化了其实。@@是不是很简单呢。上菜先:
function phpcache($is_js = 0)
{
global $CONFIG,$cachefiledir,$cachefile;
if(!$is_js && $CONFIG['phpcache'] != '2') return FALSE;
$contents = ob_get_clean();
if($is_js) $contents = strip_js($contents);
if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile)
{
dir_create($cachefiledir);
file_put_contents($cachefile, $contents);
@chmod($cachefile, 0777);
}
header('Expires: Mon, 26 Jul 2000 05:00:00 GMT'); 告诉浏览器此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); 告诉服务器本页最后修改日期。目的就是强迫浏览器获取最新资料
header('Cache-Control: no-cache, must-revalidate'); 这句 session_cache_limiter('private') 作用差不多。就是用户 点击后退不会出现警告页。十分有用哦。大家别忘了
header('Pragma: no-cache'); 不缓存当前页 。其实和前一句一样意思,这句不过是为了兼容http1.0协议。
echo $contents; //输出内容。
}
首先判断。文件当前文件不是JS问文件和后台打开了页面缓存静态化,。然后使用了OB读写缓冲区系列函数来操作缓冲区。
ob_get_clean() 函数。十分有用。一般我们做整站静态化也是利用OB系列函数来实现。
这个函数就是获取当前缓冲区的HTML内容。然后把将要输出的缓冲区内容清除掉。网页先是一点点读到浏览器的缓冲区。当缓冲区满了以后才会放出来。所以我们
可以用OB系列函数在缓冲区没有输出之前截取内容来做我们要做的过滤等动作。(dz的伪静态有部分就这样实现的。把缓冲区中的所有超级连接地址更改成:thread-46695-1-3.html 形式。然后apache 那边再用.hataccess 来做判断跳转) 这里也是。我们获取将要输出的内容以后 调用 strip_js() 这个函数来过滤HTML内容。 因为比较简单继续上菜:
function strip_js($string, $js = 1)
{
$string = str_replace(array("\n","\r","\""),array('','',"[url=]\\\""),$string[/url]);
return $js==1 ? "document.write(\"".$string."\");\n" : $string;
}
主要是来过滤内容里面的 \n 换行 、\r 换页符 和 '\' 具体请百度:制表符
继续我们上个函数strip_js过滤完内容后。 在使用 file_put_contents() 函数 把内容写到文件里面去。也就是那个 HTML静态页,恩完成了。当前页的静态页已经存在了。
但好象不对是吧。因为你刚用了 ob_get_clean() 函数。截取内容后清空了输出的内容。那就是浏览器成了空白页了。所以我们要手动的来 echo 输出内容给客户看。echo 前呢
还有些东西要做就是 header 几个http协议头过去 注释已经给出。详细的百度:http协议,会有详细的参数说明 。其主要目的是:强制用户每次访问这个页面时获取最新资料,而不是使用存在客户端的缓存。
*/
?>
支持我吧.哈哈

作者: jyb21 发布时间: 2007-12-26
作者: jyb21 发布时间: 2007-12-26

作者: jyb21 发布时间: 2007-12-26
引用:
记得: 程序是死的,人是活的.有实现思路一切都好办了.作者: 逆雪寒 发布时间: 2007-12-26

思路>是要思考才能来的.
很多实现方法思路我都是自己想来的. 想法每个人都有.当然拉.用人家的想法来弄也行
作者: 逆雪寒 发布时间: 2007-12-26
PHP代码:
if($is_js) $contents = strip_js($contents);if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile)
{
dir_create($cachefiledir);
file_put_contents($cachefile, $contents);
@chmod($cachefile, 0777);
}
而不是楼主所说的
主要是来过滤内容里面的 \n 换行 、\r 换页符 和 '\' 具体请百度:制表符
继续我们上个函数strip_js过滤完内容后。 在使用 file_put_contents() 函数 把内容写到文件里面去。
作者: chyoqin 发布时间: 2007-12-26
作者: 逆雪寒 发布时间: 2007-12-26
{
$string = str_replace(array("\n","\r","\""),array('','',"[url=]\\\""),$string[/url]);
return $js==1 ? "document.write(\"".$string."\");\n" : $string;
}
$js 为 1的时候 是document.write 内容.
JS格式我也不知道是什么格式.看功能.它只是很简单、的过滤掉 \n \r \ 而已.
欢迎提出问题.谢谢
作者: jyb21 发布时间: 2007-12-26
作者: 逆雪寒 发布时间: 2007-12-26
伪静态的优点就是SEO吧.

作者: twm121 发布时间: 2007-12-26
作者: jyb21 发布时间: 2007-12-26
太好啦
作者: 逆雪寒 发布时间: 2007-12-26
PHP代码:
/**phpcms* 执行sql语句,只得到一条记录
* @param string sql语句
* @param string 默认为空,可选值为 CACHE UNBUFFERED
* @param int Cache以秒为单位的生命周期
* @return array
*/
function get_one($sql, $type = '', $expires = 3600, $dbname = '')
{
$query = $this->query($sql, $type, $expires, $dbname);
$rs = $this->fetch_array($query);
$this->free_result($query);
return $rs ;
}
PHP代码:
/*ecshop*/function getOne($sql, $limited = false)
{
if ($limited == true)
{
$sql = trim($sql . ' LIMIT 1');
}
$res = $this->query($sql);
if ($res !== false)
{
$row = mysql_fetch_row($res);
return $row[0];
}
else
{
return false;
}
}
作者: 东感地带 发布时间: 2007-12-26

万法归中.青菜萝卜.各有各的看头
作者: 逆雪寒 发布时间: 2007-12-26
作者: 独自迷茫 发布时间: 2007-12-26

作者: maixiaomai 发布时间: 2007-12-26
Warning: extract() [function.extract]: First argument should be an array in /member/index.php on line 6 这一行的语句是extract($member->get_info());
查找member.class.php找到这个函数
function get_info()
{
return $this->db->get_one("SELECT * FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.uid=i.uid and m.username='$this->username' limit 0,1");
}
phpmyadmin里执行语句可以找到记录
SELECT * FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.uid=i.uid and m.username='admin' limit 0,1
因此我觉得问题出在成员变量username上。
作者: chyoqin 发布时间: 2007-12-26
PHP代码:
<?php
defined('IN_PHPCMS') or exit('Access Denied');
$errormsgs = array('user_not_exists'=>$LANG['username_not_exist'],
'password_is_wrong'=>$LANG['password_not_right'],
'user_is_locked'=>$LANG['your_account_banned_by_admin'],
'user_is_verify'=>$LANG['your_account_not_validate'],
'user_is_checking'=>$LANG['your_account_is_approvalling']);
class member
{
var $username = '';
var $db;
var $errormsg;
function member($username = '')
{
global $db;
$this->db = &$db;
$this->set_username($username);
register_shutdown_function(array(&$this, '__destruct'));
}
function __destruct()
{
}
function set_username($username)
{
if($this->is_badword($username)) return FALSE;
$this->username = $username;
return TRUE;
}
function get_info()
{
return $this->db->get_one("SELECT * FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.uid=i.uid and username='$this->username' limit 0,1");
}
function login($login_password, $login_cookietime = 0, $forward = '')
{
global $PHPCMS,$PHP_TIME,$PHP_IP,$LANG;
$info = $this->get_info();
if(!$info)
{
$this->errormsg = 'user_not_exists';
return FALSE;
}
@extract($info);
if($password != md5($login_password))
{
$this->errormsg = 'password_is_wrong';
return FALSE;
}
if($groupid == 2)
{
$this->errormsg = 'user_is_locked';
return FALSE;
}
elseif($groupid == 4)
{
$this->errormsg = 'user_is_verify';
return FALSE;
}
elseif($groupid == 5)
{
$this->errormsg = 'user_is_checking';
return FALSE;
}
$_cookietime = $login_cookietime ? intval($login_cookietime) : (getcookie('cookietime') ? getcookie('cookietime') : 0);
$cookietime = $_cookietime ? $PHP_TIME + $_cookietime : 0;
$phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']);
$phpcms_auth = phpcms_auth($userid."\t".$password."\t".$answer, 'ENCODE', $phpcms_auth_key);
mkcookie('auth', $phpcms_auth, $cookietime);
mkcookie('cookietime', $_cookietime, $cookietime);
$this->db->query("UPDATE ".TABLE_MEMBER." SET lastloginip='$PHP_IP',lastlogintime=$PHP_TIME,logintimes=logintimes+1 WHERE username='$this->username'");
if($forward) showmessage($LANG['login_success'], $forward);
return $info;
}
作者: 逆雪寒 发布时间: 2007-12-26
作者: chyoqin 发布时间: 2007-12-26
PHP代码:
function get_info(){
return $this->db->get_one("SELECT * FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.uid=i.uid and m.username='$this->username' limit 0,1");
}
function is_reg($username)
{
return $this->db->get_one("SELECT uid FROM ".TABLE_MEMBER." WHERE username='$username' limit 0,1");
}
作者: herolee 发布时间: 2007-12-26



作者: 东感地带 发布时间: 2007-12-26
作者: 东感地带 发布时间: 2007-12-26

作者: sunfall 发布时间: 2007-12-26
作者: 东感地带 发布时间: 2007-12-26

作者: MoHock 发布时间: 2007-12-27
我刚学PHP的时候用.现在不用了.几行代码写出来的东西没必要拿人家的.
作者: linvo 发布时间: 2007-12-27



作者: jyb21 发布时间: 2007-12-27
楼主,你用的phpcms的版本是多少啊????
作者: fuhsea 发布时间: 2007-12-27

作者: 逆雪寒 发布时间: 2007-12-27
作者: 逆雪寒 发布时间: 2007-12-27
为何还要用substr呢?
作者: suihr 发布时间: 2007-12-27
从第一个字符开始截取,一直取到倒数第八个,也就是把最后的include去掉了
作者: ascmvi 发布时间: 2007-12-27
怎么还没发呢
我排队学习中嘻嘻

作者: jyb21 发布时间: 2007-12-27

没找到问题.还在努力中....... 暂不发先了

作者: shenyuxiang2008 发布时间: 2007-12-27
作者: solidluck 发布时间: 2007-12-27


作者: 东感地带 发布时间: 2007-12-27

作者: xjgale 发布时间: 2007-12-27
作者: 逆雪寒 发布时间: 2007-12-27

作者: linvo 发布时间: 2007-12-27
作者: jayeeliu 发布时间: 2007-12-27
很了分析才发现,有好多函数没见过
有好多语句看不懂
希望楼主继续
这个研究完了,应该技术就能上升一大步了

作者: xjgale 发布时间: 2007-12-27
一点小问题,楼主的源码是哪个版本的,我下的源码里面怎么没有“common.inc.php”文件啊?
[ 本帖最后由 terry915 于 2007-12-28 10:40 编辑 ]
作者: suchasplus 发布时间: 2007-12-28
作者: jyb21 发布时间: 2007-12-28
我也想继续.昨天忙配置环境.今天忙写下东西. 时间不是很允许.下一节该讲PHPCMS的模板引擎. 会继续的....
作者: ct_174880859 发布时间: 2007-12-28
作者: jingangel 发布时间: 2007-12-28
作者: terry915 发布时间: 2007-12-28
我下的是这个板本的
也没有“common.inc.php”
作者: jingangel 发布时间: 2007-12-28
作者: 逆雪寒 发布时间: 2007-12-28
引用:
原帖由 qfangcn 于 2007-12-24 20:44 发表关键是我的xx.php你怎么可能直接include呢,你如何把你的文件放到我的站点上呢?
a.php
PHP代码:
<?php
define('IN_PHPCMS',TRUE);
……
?>
PHP代码:
<?php
defined('IN_PHPCMS') or exit('Access Denied');
echo $password;
?>
不知道这样说和不合适
在举个例子,比如网站的管理后台,有很多页面,不可能在所有的页面上都加上管理权限认证吧?
那么就可以console.php?do=usermanage
console.php里管理权限认证,定义一个类似IN_PHPCMS这样的常量,然后根据参数do来调用usermanage.php
usermanage.php里检查IN_PHPCMS有没有定义过,如果定义了就说明是从console.php来的,经过了管理权限认证
OVER
作者: terry915 发布时间: 2007-12-28
作者: 逆雪寒 发布时间: 2007-12-28
作者: xjgale 发布时间: 2007-12-28
生成静态那块全面的分析一下啊
作者: 逆雪寒 发布时间: 2007-12-28
引用:
原帖由 jingangel 于 2007-12-29 09:55 发表楼主能不能把phpcms的
生成静态那块全面的分析一下啊

作者: kukat 发布时间: 2007-12-28

作者: 逆雪寒 发布时间: 2007-12-29

首先 LINUX 下 的PHP 扩展已经成功运行. 我自己写的 哈哈
算是在PHP扩展方面踏出了关键的一步

作者: 东感地带 发布时间: 2007-12-29
引用:
原帖由 逆雪寒 于 2007-12-29 10:26 发表
首先 LINUX 下 的PHP 扩展已经成功运行. 我自己写的 哈哈
算是在PHP扩展方面踏出了关键的一步


作者: jingangel 发布时间: 2007-12-29
作者: jyb21 发布时间: 2007-12-29
作者: jyb21 发布时间: 2007-12-29

作者: 逆雪寒 发布时间: 2007-12-29
再一次感谢楼主。。。
作者: jyb21 发布时间: 2007-12-29
作者: ws00377531 发布时间: 2007-12-29
看楼主的文章成为学php的动力了哈
作者: ws00377531 发布时间: 2007-12-29

作者: 逆雪寒 发布时间: 2007-12-29
作者: chenmfly 发布时间: 2007-12-30
\\

作者: qqsheji 发布时间: 2008-01-01
引用:
原帖由 jingangel 于 2008-1-2 10:39 发表这一晃一年都过去了,
\\


作者: xjgale 发布时间: 2008-01-02
PHP代码:
<?php
/**
函数 template函数是在global.func.php 里面定义的。 在前面的phpcms 的首页 index.php 里就见到了。 用法: include template() 用法很熟, 呵呵其实和 dz 的模板引擎一样的用法。 但DZ的模板引擎比 PHPCMS 的简单很多,因为没有用到模板的标签技术。 大家有空可以研究下DZ的模板引擎。这里不说。 好分析下上面这个 模板的主要函数吧。 他的作用是返回编译好的模板文件路径。也就是把模板 X.html(模板文件) 用正则替换成 x.php(编译后的PHP文件).然后使用 include 函数。懂了吧! php的模板引擎都一个鸟样。 然后剩下的就是正则的东西了。等下再说。
*/
function template($module = 'phpcms', $template = 'index')
{
global $CONFIG;
$compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
/**
因为phpcms是分模块来存放模板文件。所以 template 函数有两个参数: 第一个就是模块目录名,第二个就是此模块里面的模板文件名.
$CONFIG['templatescachedir'] 这个是放编译后php文件存放的目录。在config.inc.php 站点配置文件里面定义的自己去看。 这样就取得了模板编译后的php文件路径。
*/
if($CONFIG['templaterefresh']) //$CONFIG['templaterefresh'] 在 config.inc.php里面配置了。默认是1 。是更新模板开关。如果你设置为0 那么模板更新了。程序也不会更新。
{
$tplfile = PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html';
/**
和上面那句意思差不多。$CONFIG['defaulttemplate'] 是默认模板目录 。这句是获取你要的那个模块和里面的那个模板文件的路径(@@获取没编译前的模板文件)
*/
if(!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile))
{
/**
我把文件编译成了php文件。那么模板改变了。 php文件总得也改变吧。要不你修改了模板后。站还是以前那个样子没变那有什么意思呢。
首先判断模板编译文件是否存在。如果不存在那么后边那个条件不用判断了。 因为编译文件都不存在。程序肯定运行不了拉。(因为其实我们主要是运行编译后的那个php文件,模板文件是html的运行个P呀)
或 后边那个 @filemtime($tplfile) > @filemtime($compiledtplfile) 很容易就明白: 函数 filetime() 判断文件最近修改的时间,返回Unix 时间戳。 如果模板文件的修改时间 大于 编译文件。 那么证明 模板文件 在 编译文件生成后 还进行了修改。那么我们是不是还要在更新次编译文件呀 ,那是肯定的拉。 所以继续执行下去。
*/
require_once PHPCMS_ROOT.'/include/template.func.php'; // 加载编译函数
template_refresh($tplfile, $compiledtplfile);// 这个就是模板的 编译启动函数 ,带动一系列的模板编译函数来最终生成模板编译文件。
}
}
return $compiledtplfile; // 返回 模板编译后的PHP文件路径。
}
defined('IN_PHPCMS') or exit('Access Denied');
function template_compile($module,$template) //和下面那个一样是编译模板启动函数。不过两函数的参数不一样,按照上下文意思。这个函数是为了配合批量编译模板而写的。第一个是模块目录名,第二是模板文件名,解释同下。请看下面那个
{
global $CONFIG;
$content = file_get_contents(PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html');
$content = template_parse($content);
$compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
$strlen = file_put_contents($compiledtplfile, $content);
@chmod($compiledtplfile, 0777);
return $strlen;
}
function template_refresh($tplfile,$compiledtplfile) //模板编译启动函数。 参数 第一个是 模板文件名 第二个是 编译后的php文件名
{
$str = file_get_contents($tplfile); //使用了php5 的最爽函数:file_get_contents() 获取文件的内容 。
$str = template_parse($str); /*然后 使用 template_parse() 函数来对文件内容进行替换。比如把一些我们自己定义的语句:{if xx > xx} 正则替换成 <?php if(xx > xx){?>具体看下面*/
$strlen = file_put_contents($compiledtplfile, $str);//编译完成后。把内容写到我们的 那个所谓的编译PHP文件。
@chmod($compiledtplfile, 0777); //别忘了设置下权限。
return $strlen; //返回 写到编译文件里的内容字大小节数,下面我们看下 template_parse() 函数
}
function template_module($module)//这个很有用。批量编译某模块目录下的模板文件
{
global $CONFIG;
$files = glob(PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/*.html');
/*
glob 函数 取得 在此路径下的所有 *.html 以html为扩展名的文件列表。 具体看手册。
**/
if(is_array($files))
{
foreach($files as $tpl)
{ //开始批量
$template = str_replace('.html', '', basename($tpl));
// 获取模板文件名。以次来做编译后的PHP文件名
template_compile($module, $template); //这个函数上面讲过了。看上面
}
}
return TRUE;
}
function template_cache() //这个是比上面那个更大批量的生成。因为 $MODULE 里面的所有模块 $MODULE 存在于缓存文件模板。前面已经说了。自己看吧
{
global $MODULE;
foreach($MODULE as $module=>$m)
{
template_module($module);
}
return TRUE;
}
/**
哇,别给它吓到。其实都是些简单的正则。只要知道他们是干什么的就好办了。 在模板里面我们使用了些自己定义的标签呀。语句呀。这些东西不是PHP标准语法。所以根本不可能运行。
那么怎么办呢。通过正则对我们自己定义的语法 。转变成标准的PHP语法。然后写到我们的 PHP文件里。所以下面正则都是对我们自己定义的语法进行编译。
下面讲解下正则。按照本人水平解释。大概的解释了下。不过不懂正则的请自己百度学下。有不对的地方。大家可以讨论下。@@ 还没懂 preg_replace() 函数的同学兄弟朋友姐妹。请自己看手册。
*/
function template_parse($str)
{
$str = preg_replace("/([\n\r]+)\t+/s","[url=file://\\1]\\1",$str[/url]);
// 用 \n\r 过滤掉 tab制表符, [url=file://\\1]\\1[/url] 是逆向引用了第一个括号里面\n换行\r换页匹配的文本 (@@解释好要口,最好自己看下正则知识 /s为修正符。自己百度吧)
$str = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}",$str);
// 以 {xx} 来替换 <!--{xx}--> {xx}在下面肯定还要进行第二次正则替换,要不是不能在PHP里面运行的。 .+? 和 .+ 一个是懒惰 一个是贪婪。 看名字就知道。不知道的 百度吧: 正则贪婪。
$str = preg_replace("/\{template\s+(.+)\}/","\n<?php include template([url=file://\\1]\\1[/url]); ?>\n",$str);
/*把模板里面的 {template 'xx','jj'} 编译成PHP标准写法:<?php include template('xx','jj') ?> 大家可能一看就明白了: include template() 这个在那里见过。对了。这个在PHP里也可以运行的。因为 template() 函数不是定义了吗。*/
$str = preg_replace("/\{include\s+(.+)\}/","\n<?php include [url=file://\\1]\\1[/url]; ?>\n",$str);
/* 模板里面的 {include xx.php} 编译成 PHP文件里的 <?php include xx.php?>**/
$str = preg_replace("/\{php\s+(.+)\}/","\n<?php [url=file://\\1?]\\1?>\n",$str[/url]);
/* 模板里面的 {php xxxx} 编译成 <?php xxxx?> 大家也应该明白了。 xxxx 肯定是PHP的标准语法拉。 所以phpcms模板语句: {php } 就是用来给你在模板里写要运行的PHP语句。在smarty 里也有这功能**/
$str = preg_replace("/\{if\s+(.+?)\}/","<?php if([url=file://\\1]\\1[/url]) { ?>",$str);
/* 这个就更简单了。 把模板里面的{if xxxx} 编译成 <?php if(){?> 看这样一步一步的把一些自己定义的语句编译成PHP的标准语法。这个就叫模板引擎了。**/
$str = preg_replace("/\{else\}/","<?php } else { ?>",$str);
/* {else } 转 <?php } else {?>**/
$str = preg_replace("/\{elseif\s+(.+?)\}/","<?php } elseif ([url=file://\\1]\\1[/url]) { ?>",$str);
/* {elseif } 转 <?php } elseif {?>**/
$str = preg_replace("/\{\/if\}/","<?php } ?>",$str);
/* {/if} 转 <?php }?> phpcms 模板语法有: {/if}的哦。大家别忘了,要不 php肯定运行不了**/
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","<?php if(is_array([url=file://\\1]\\1[/url])) foreach([url=file://\\1]\\1[/url] AS [url=file://\\2]\\2[/url]) { ?>",$str);
/* 下面就是循环了。模板里用{loop xx jj} 其实编译成了PHP的 foreach(xx AS jj) 这样大家都会用了吧**/
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/","\n<?php if(is_array([url=file://\\1]\\1[/url])) foreach([url=file://\\1]\\1[/url] AS [url=file://\\2]\\2[/url] => [url=file://\\3]\\3[/url]) { ?>",$str);
/* 这句和上面也差不多。不过是多了个取出数组的标名 {loop xx jj yy} 成 foreach(xx as jj=> yy)**/
$str = preg_replace("/\{\/loop\}/","\n<?php } ?>\n",$str);
/* 循环结束别忘了 {/loop} 对应PHP的 <?php }?>**/
$str = preg_replace("/\{tag_([^}]+)\}/e", "get_tag('\\1')", $str);
/* {tag_xx} 替换为 get_tag('xx') get_tag() 函数是自己定义的函数,因为phpcms 的模板引擎应用了标签功能。这个函数就是为了调用标签的。**/
$str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","<?php echo [url=file://\\1;?]\\1;?>",$str[/url]);
/* {xxx(jj)} 这么个奇怪的东西。因为奇怪所以我找了下PHPCMS的模板文件。找了几个文件都没发现这个怪物。大家有谁找到的说下我去看下。怕是我理解错了正则。先谢了**/
$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","<?php echo [url=file://\\1;?]\\1;?>",$str[/url]);
/* {$xxx(wwsd)} 专换成 <?php echo xxx(wwsd)?> 当然了 xxx() 是程序中定义过的函数**/
$str = preg_replace("/\{([url=file://\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/]\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/","<?php[/url] echo [url=file://\\1;?]\\1;?>",$str[/url]);
/* 把{$xxjj} 转成 <?php echo $xxjj?> 当然了是把变量输出**/
$str = preg_replace("/\{([url=file://\\$[a-zA-Z0-9_\[\]\]\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es[/url]", "addquote('<?php echo [url=file://\\1;?]\\1;?>')",$str[/url]);
/* 主要是把{$xxx['jj']} 转成 <?php echo $xxx['jj']?> addquote() 函数自己定义的看下面,二次过滤。有代验证,头昏了看太久的黄色字。我昏**/
$str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo [url=file://\\1;?]\\1;?>",$str[/url]);
/* {XXJJ} <?php echo XXJJ?> XXJJ 是我们定义的常量**/
$str = "<?php defined('IN_PHPCMS') or exit('Access Denied'); ?>".$str;
/* 最后别忘了在自己的每个编译后的文件里加上这个。以前讲过了不明白找前面例子**/
return $str; //最后返回过滤完成的内容
}
function get_tag($tagname) //这个函数在 上面这个编译函数里面看到了。 其实就是获取对应标签的内容,头有点昏,下节再说标签吧。
{
global $tags,$html,$CONFIG;
if(!$tags) require PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/tags.php';
if(!$html) require PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/html.php';
if(!isset($tags[$tagname])) return '{tag_'.$tagname.'}';
$code = isset($html[$tagname]) ? 'tag_read('.$html[$tagname].')' : $tags[$tagname];
return "<?php echo $code;?>";
}
function addquote($var)
{
return str_replace("[url=]\\\[/url]"", """, preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var));
}
?>

作者: xlight 发布时间: 2008-01-02

作者: jyb21 发布时间: 2008-01-02

作者: jingangel 发布时间: 2008-01-02


作者: jyb21 发布时间: 2008-01-02


php 开发.工资再高再高也不会很高.这是他能为企业谋多大利益决定的.不是说高手高手高高手就一定是 发财的那种.
给你吧PHPCMS 卖了.也没多少钱. 呵呵. 努力吧
作者: 逆雪寒 发布时间: 2008-01-02
楼主很有想法
作者: jyb21 发布时间: 2008-01-02
作者: water6000 发布时间: 2008-01-02
将来要是又几乎能见到你。一定要请你吃饭!哈哈
作者: jyb21 发布时间: 2008-01-02

作者: 逆雪寒 发布时间: 2008-01-02
作者: xjgale 发布时间: 2008-01-02

作者: chenmfly 发布时间: 2008-01-03
作者: answer17 发布时间: 2008-01-03
向LZ学习ING
作者: chyoqin 发布时间: 2008-01-05

作者: jackywdx 发布时间: 2008-01-07
作者: 4C[FANTASY] 发布时间: 2008-01-07
DZ好像有只查看楼主的功能...怎么没找到
作者: jyb21 发布时间: 2008-01-07
引用:
原帖由 zw870307 于 2008-1-7 20:33 发表建议分开帖来写...不然这一页一页的找太麻烦了...
DZ好像有只查看楼主的功能...怎么没找到
作者: xctk 发布时间: 2008-01-07
PHP代码:
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
还有这句:
define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));
我觉得这样写不是很好。搞个-8是为了除掉那个include,我觉得这样写是不是更好呢?
define('PHPCMS_ROOT', str_replace("\\", '/', realpath(dirname(__FILE__)."/../")));
/*
realpath(PHP 4, PHP 5)
realpath -- 返回规范化的绝对路径名
说明string realpath ( string path )
realpath() 扩展所有的符号连接并且处理输入的 path 中的 '/./', '/../' 以及多余的 '/' 并返回规范化后的绝对路径名。返回的路径中没有符号连接,'/./' 或 '/../' 成分。
realpath() 失败时返回 FALSE,比如说文件不存在的话。在 BSD 系统上,如果仅仅是 path 不存在的话,PHP 并不会像其它系统那样返回 FALSE。
*/
[ 本帖最后由 黄山狼 于 2008-1-8 09:32 编辑 ]
作者: 东感地带 发布时间: 2008-01-07
如果楼主能全部分析完。我想我的 PHP会提高一大截的。。
支持楼主。加油楼主。强悍!
作者: fkeuem 发布时间: 2008-01-08

作者: zw870307 发布时间: 2008-01-08

作者: 东感地带 发布时间: 2008-01-08
你看下phpcms 那个文件代码. select 替换不是这样的. 上面的代码给 DZ这个编辑器给过滤或执行了.
[ 本帖最后由 逆雪寒 于 2008-1-14 08:46 编辑 ]
作者: 黄山狼 发布时间: 2008-01-08

作者: wljk506 发布时间: 2008-01-08
2008 是机遇还是 倒霉. 真郁闷
作者: jyb21 发布时间: 2008-01-08
新来的就看到这么好的分析..爽
作者: 逆雪寒 发布时间: 2008-01-10

有时候真想一咬牙就回去老家开小卖部去。哎。。。。。
作者: 黄山狼 发布时间: 2008-01-10
引用:
原帖由 逆雪寒 于 2008-1-13 13:18 发表
有时候真想一咬牙就回去老家开小卖部去。哎。。。。。

作者: chyoqin 发布时间: 2008-01-13
引用:
原帖由 逆雪寒 于 2008-1-13 13:18 发表
有时候真想一咬牙就回去老家开小卖部去。哎。。。。。

作者: 逆雪寒 发布时间: 2008-01-13
引用:
原帖由 jyb21 于 2008-1-14 09:34 发表开小卖部太大才小用了,不过要是开着小卖部写出惊天动地的代码来,央视都要专访你的

谁要学PHP能研究出杂交水稻来,怕是不只央视来采访。。。
作者: kinji 发布时间: 2008-01-13
这边PHP应该很缺人的
网龙公司招PHP工资很高 的
作者: 逆雪寒 发布时间: 2008-01-14

作者: BlackCoffee 发布时间: 2008-01-14
作者: jyb21 发布时间: 2008-01-14
作者: 东感地带 发布时间: 2008-01-15
作者: xjgale 发布时间: 2008-01-17

作者: jingangel 发布时间: 2008-01-21

作者: ct_174880859 发布时间: 2008-01-22
引用:
原帖由 逆雪寒 于 2008-1-22 19:26 发表

作者: xiaobaby87 发布时间: 2008-01-22
引用:
原帖由 ascmvi 于 2007-12-23 22:11 发表哈哈,是啊,看av还不带翻译的
作者: czly 发布时间: 2008-01-22
作者: jyb21 发布时间: 2008-01-23
回帖贼多 不太容易找您的帖子
所以建议在第一页中说明下哪几页有您的分析文

作者: 逆雪寒 发布时间: 2008-01-23
作者: jyb21 发布时间: 2008-01-23

作者: ipengjun 发布时间: 2008-01-24
作者: 依龙 发布时间: 2008-01-28
轻易不看第二次同样的帖
我看了
轻易发现不了一个强人
我发现了!
作者: silasoni 发布时间: 2008-01-28
作者: netspider 发布时间: 2008-01-29
PHP代码:
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
想了半天试了半天也没有想出这个过滤掉什么了......为何$replace_arr不直接为空格全部替换为空?
这个我看起来像是什么操作也没有做一样......
兄弟们这块都是明明白白的?
谁能头头是道讲一下?
Thanks!
作者: webCool 发布时间: 2008-01-31

作者: adleyliu 发布时间: 2008-01-31

作者: xiaoxiao0503 发布时间: 2008-02-04
谢谢.我会继续的.坚持把phpcms 弄个底朝天的. [/quote
逆雪寒 支持你 顶个好贴,我也在看PHPCMS的代码,但好多没读懂,向你学习
作者: xiaoxiao0503 发布时间: 2008-02-04

作者: liuxingyuyuni 发布时间: 2008-02-04
有部分程序与DZ旧版本完全相同。
总的来说沉余代码很多,没用的代码也有。PHPCMS不怎么样。
作者: liuxingyuyuni 发布时间: 2008-02-04
作者: liuxingyuyuni 发布时间: 2008-02-11
引用:
原帖由 smallwl 于 2008-2-12 03:58 发表以前没研究过PHPCMS 。现在看了,有很重DZ的影子。
有部分程序与DZ旧版本完全相同。
总的来说沉余代码很多,没用的代码也有。PHPCMS不怎么样。
作者: php? 发布时间: 2008-02-12
作者: liuxingyuyuni 发布时间: 2008-02-15
关于这里的[url=file://: ] [url] 起到了什么作用啊 想不通 请哪位前辈指教下啊 在此先谢了
作者: smallwl 发布时间: 2008-02-16
想问你一个问题,phpcms是怎样处理$LANG,这个数组的,是在哪个文件编译的呢?谢谢!

phpcms是怎样处理语言包的呢?
作者: rocky711 发布时间: 2008-02-17
PHP代码:
function template_parse($str){
$str = preg_replace("/([\n\r]+)\t+/s","[url=file://\\1]\\1",$str[/url]);
$str = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}",$str);
$str = preg_replace("/\{template\s+(.+)\}/","\n<?php include template([url=file://\\1]\\1[/url]); ?>\n",$str);
$str = preg_replace("/\{include\s+(.+)\}/","\n<?php include [url=file://\\1]\\1[/url]; ?>\n",$str);
$str = preg_replace("/\{php\s+(.+)\}/","\n<?php [url=file://\\1?]\\1?>\n",$str[/url]);
$str = preg_replace("/\{if\s+(.+?)\}/","<?php if([url=file://\\1]\\1[/url]) { ?>",$str);
$str = preg_replace("/\{else\}/","<?php } else { ?>",$str);
$str = preg_replace("/\{elseif\s+(.+?)\}/","<?php } elseif ([url=file://\\1]\\1[/url]) { ?>",$str);
$str = preg_replace("/\{\/if\}/","<?php } ?>",$str);
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","<?php if(is_array([url=file://\\1]\\1[/url])) foreach([url=file://\\1]\\1[/url] AS [url=file://\\2]\\2[/url]) { ?>",$str);
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/","\n<?php if(is_array([url=file://\\1]\\1[/url])) foreach([url=file://\\1]\\1[/url] AS [url=file://\\2]\\2[/url] => [url=file://\\3]\\3[/url]) { ?>",$str);
$str = preg_replace("/\{\/loop\}/","\n<?php } ?>\n",$str);
$str = preg_replace("/\{tag_([^}]+)\}/e", "get_tag('\\1')", $str);
$str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","<?php echo [url=file://\\1;?]\\1;?>",$str[/url]);
$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","<?php echo [url=file://\\1;?]\\1;?>",$str[/url]);
$str = preg_replace("/\{([url=file://\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/]\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/","<?php[/url] echo [url=file://\\1;?]\\1;?>",$str[/url]);
$str = preg_replace("/\{([url=file://\\$[a-zA-Z0-9_\[\]\]\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es[/url]", "addquote('<?php echo [url=file://\\1;?]\\1;?>')",$str[/url]);
$str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo [url=file://\\1;?]\\1;?>",$str[/url]);
$str = "<?php defined('IN_PHPCMS') or exit('Access Denied'); ?>".$str;
return $str;
}
作者: jyb21 发布时间: 2008-02-21
<div class="xw-off" onClick="showContent(2, {$channelid}, 1)" id="nav{$channelid}_1"><span>推荐资料</span></div>
什么意思呢?如何单独调用一个栏目的下载呢?
作者: 自由活动 发布时间: 2008-02-23
作者: xiaobaby87 发布时间: 2008-02-24
PHP代码:
$str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","",$str[/url]);在yp/job.html中有一个{area_select('areaid', '请选择地区', $areaid)}
请问是什么意思?
作者: darlin 发布时间: 2008-02-24

作者: xiaobaby87 发布时间: 2008-02-24
作者: netspider 发布时间: 2008-02-25
以前没研究过PHPCMS 。现在看了,有很重DZ的影子。
有部分程序与DZ旧版本完全相同。
总的来说沉余代码很多,没用的代码也有。PHPCMS不怎么样。
同意同意!我最近也在看discuz,发现很多相似的地方!
作者: netspider 发布时间: 2008-02-25
作者: darlin 发布时间: 2008-02-26
作者: godkid 发布时间: 2008-02-27
作者: realjue 发布时间: 2008-03-03
编译成功后,运行程序,出现./connect: error while loading shared libraries: libmysqlclient.so.15: cannot open shared object file: No such file or directory
.出现上面的错误是因为系统运行的时候没有找到程序运行所需要的libmysqlclient.so.15运行库文件,解决方法有两个:
方法一:直接把libmysqlclient.so.15这个文件拷贝到系统指定的/usr/lib库文件目录中。
方法二:设置/etc/ld.so.conf文件,编辑该文件,在文件中加入libmysqlclient.so.15所在目录,保存退出。需要注意的是,每次改动ld.so.conf之后需要运行ldconfig来确认刷新。
ldconfig使用方法: ldconfig [options] [libs]
命令ldconfig决定位于目录/usr/lib和/lib下的共享库所需的运行的链接,这些链接在命令行上的libs指定并被保存在 /etc/ld.so.conf中。命令ldconfig和动态链接/装载工具ld.so协同工作,一起来创建和维护对最新版本共享库的链接。
作者: darlin 发布时间: 2008-03-03
学习了!~~~~~~~~~~
作者: osman 发布时间: 2008-03-04
感觉后台比前台复杂多了
作者: lxylxy888666 发布时间: 2008-03-04
作者: 闹类硬 发布时间: 2008-03-05

作者: 逆雪寒 发布时间: 2008-03-05
作者: woyouu 发布时间: 2008-03-08


作者: osman 发布时间: 2008-03-10
作者: hahajohn 发布时间: 2008-03-10


作者: jingangel 发布时间: 2008-03-11
作者: abc20053608 发布时间: 2008-03-12

作者: jyb21 发布时间: 2008-03-12
向楼主敬礼!!!

作者: 逆雪寒 发布时间: 2008-03-13

作者: ct_174880859 发布时间: 2008-03-14
作者: 蓝克 发布时间: 2008-03-22
第一章、第二章怎么划分呢?我刚注册,是不是以前发表过前2章?
作者: realjue 发布时间: 2008-03-22
作者: 宁静致远 发布时间: 2008-03-22
引用:
原帖由 kukat 于 2007-12-28 14:22 发表这样解释可能好点
a.php
b.php
这样你就不能直接访问 b.php ,会因为 IN_PHPCMS 这个常量没定义而 exit('Access Denied')
不知道这样说和不合适
在举个例子,比如网站的管理后台,有很多页面, ...
作者: richardhc 发布时间: 2008-03-29
作者: chaguifei 发布时间: 2008-03-31
作者: diego 发布时间: 2008-03-31
作者: aman 发布时间: 2008-03-31
作者: lxydyx 发布时间: 2008-04-09
作者: aman 发布时间: 2008-04-09
PHP代码:
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}
[ 本帖最后由 xiaobaby87 于 2008-4-12 10:58 编辑 ]
作者: xiaobaby87 发布时间: 2008-04-10
require PHPCMS_ROOT.'/include/global.func.php';
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
$replace_arr = array('&n bsp;union&n bsp;','&n bsp;select&n bsp;','&n bsp;update&n bsp;','&n bsp;outfile&n bsp;','&n bsp;or&n bsp;');
[ 本帖最后由 xiaobaby87 于 2008-4-12 12:54 编辑 ]
作者: 逆雪寒 发布时间: 2008-04-10
作者: yuanjing_119 发布时间: 2008-04-12
作者: jingangel 发布时间: 2008-04-12
偶对lz的敬仰犹如滔滔江水连绵不绝。。。
期待更新中!!!
作者: xiaobaby87 发布时间: 2008-04-12



作者: xiaobaby87 发布时间: 2008-04-25
作者: xiaobaby87 发布时间: 2008-04-25


作者: gezhenqiang 发布时间: 2008-04-29
引用:
原帖由 逆雪寒 于 2008-5-7 09:15 发表还有人顶呀。谢谢各位兄弟了。人呀越来越忙都没时间看PHPCMS的代码了。等吧以后看看再出。谢谢关注了各位
作者: zhuweibao 发布时间: 2008-05-06

作者: 83064248 发布时间: 2008-05-07
作者: lxydyx 发布时间: 2008-05-07
/**
代码讲解分析: 逆雪寒. 2007 - 12 - 20
*/
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
/**
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}
先讲解下这个函数吧。 顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。
*/
内容都没有发生变化,和替换之前都一模一样,怎么就实现使sql语句失效的啊?
作者: 逆雪寒 发布时间: 2008-05-08
作者: henanren 发布时间: 2008-05-08
从一开始你摆那么大架势就知道你弄不完,果然不出所料
有时间把模板简单讲一下吧,这是大家最要用的地方。
不要逐行分析,你那么讲太费劲,不过已经讲过的对初学者抛砖引玉的作用确实很好
作者: 0110 发布时间: 2008-05-08
function phpcms_error($errno, $errmsg, $filename, $linenum, $vars)
在执行这里的时候 调用了 phpcms_error 函数
那这些参数是怎么进去的呢 $errno, $errmsg, $filename, $linenum, $vars
不懂,请教,不要打我啊

作者: jingangel 发布时间: 2008-05-21

作者: tqyb 发布时间: 2008-05-21
哪个文件里的你也不说清楚
作者: study 发布时间: 2008-05-21
作者: hahajohn 发布时间: 2008-05-21
作者: fan12 发布时间: 2008-05-23
作者: ceallan 发布时间: 2008-05-23
引用:
本人菜鸟,想请教个问题:/**
代码讲解分析: 逆雪寒. 2007 - 12 - 20
*/
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
/**
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}
先讲解下这个函数吧。 顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。
*/
内容都没有发生变化,和替换之前都一模一样,怎么就实现使sql语句失效的啊?
outfile ',' or ');
这里有 & n b s p 的 !!!!!!!!
我想是为了避免 select 这些与 sql语句里的其他字母 写在一起的吧
如: selectID from table
[ 本帖最后由 xiaobaby87 于 2008-6-22 09:47 编辑 ]
作者: grasswen 发布时间: 2008-05-23
谢谢分享!同时希望大大能再发几个着样的代码分析讲解!!
作者: fan12 发布时间: 2008-05-30
以前没见过楼主的头像,听大家说得这么 ->神<-
很想见识一下,有空贴出来看看阿!
作者: 七月十五 发布时间: 2008-06-21
难道就没人有这个心思继续下去吗?
作者: fan12 发布时间: 2008-06-22

作者: aman 发布时间: 2008-06-22
作者: xiaobaby87 发布时间: 2008-06-22
作者: most4 发布时间: 2008-06-22
引用:
原帖由 coolcool1265 于 2007-12-24 14:20 发表dz 社区里面有个大哥超级牛的人
把dz分析的差不多了
你可以去找找呵呵
作者: most4 发布时间: 2008-06-23

作者: xiaobaby87 发布时间: 2008-06-23
http://bbs.phpchina.com/thread-70366-1-1.html
作者: inphpchinasky 发布时间: 2008-06-26
作者: papaxiong 发布时间: 2008-07-04


高手果然是高手啊,不能让好贴沉下去
作者: yzy14533 发布时间: 2008-07-12
作者: dogshasha 发布时间: 2008-07-22
作者: 如�� 发布时间: 2008-08-06
作者: fan12 发布时间: 2008-08-06
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28