首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

国内著名CMS: PHPCMS 整站代码分析讲解 -2008-1-2已更新(# 20页)(第三章继续进行中..)

LZ想问一下QQ录取上了么?如果没有的话绝对是他们公司的一大损失呀
希望全部打包上来,看这种好代码好舒服呀。
昵称: PHPChina  时间: 2007-12-20 20:21:00
顶个好贴,我也在看PHPCMS的代码,但好多没读懂,向楼主学习,希望多发些类似的贴子哈。
昵称: PHPChina  时间: 2007-12-20 21:35:00
受益匪浅啊,连地球人都知道的东西我都还不知道呢
昵称: jayliu  时间: 2007-12-21 10:34:00

学习了
昵称: LostSinger  时间: 2007-12-21 10:44:00
不错,值得学习!
昵称: qs9515  时间: 2007-12-21 10:54:00
逆雪寒 继续啊,别停。
昵称: index  时间: 2007-12-21 14:50:00

鸟 。。。
昵称: michaeli  时间: 2007-12-21 15:14:00
这两行有严重的代码漏洞,没有对提交的变量进行过滤就释放了。
@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 15:24:00
没源码?
昵称: MoHock  时间: 2007-12-21 15:53:00
carche  说得很对.是个BUG .
昵称: carche  时间: 2007-12-21 16:05:00
没仔细看,但看到N多注释,不得不顶啊!
有空看看收藏!
昵称: chyoqin  时间: 2007-12-21 16:27:00
呵呵,兄弟,哺育新人啊
昵称: 逆雪寒  时间: 2007-12-21 16:38:00
   恩暂时做个忘记利益的快乐phper

php和钱一扯上关系.我就郁闷
昵称: zhaofei299  时间: 2007-12-21 16:40:00
昵称: thankwsx  时间: 2007-12-21 16:44:00
引用:
原帖由 carche 于 2007-12-21 15:24 发表
这两行有严重的代码漏洞,没有对提交的变量进行过滤就释放了。
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
....................................................

在以下的代码中用 ...
这个BUG 可以这样修复. extract($_GET,EXTR_SKIP)

如果有重复的就跳过,这样就好点.要不在extract之前 要经过严格的过滤
昵称: 逆雪寒  时间: 2007-12-21 16:56:00
看完,超级爽!待续.
昵称: MoHock  时间: 2007-12-21 16:59:00
谢谢.我会继续的.坚持把phpcms 弄个底朝天的.
昵称: 逆雪寒  时间: 2007-12-21 17:15:00
版主精神可嘉,实在是我等之幸事啊
昵称: chyoqin  时间: 2007-12-21 17:22:00
精神支持
不过能简洁一下吗?废话好多啊。
昵称: 逆雪寒  时间: 2007-12-21 17:22:00
  想大家看得舒服点嘛.废话里很多都是些PHP开发应该注意的问题来的.
我也是力求各种水平的人都能理解.众口难调呀.LS兄弟将就下吧
昵称: javachen  时间: 2007-12-21 17:28:00
强烈期待
昵称: 追梦ren  时间: 2007-12-21 17:30:00
drupal不错哦
昵称: 逆雪寒  时间: 2007-12-21 18:07:00
好帖
赞一个 !!
昵称: ascmvi  时间: 2007-12-21 18:36:00
顶啊,强烈支持啊
昵称: zig  时间: 2007-12-21 19:55:00
谢谢楼主分享!!!
太好了,刚好可以学习呢!
昵称: tjlwz  时间: 2007-12-21 20:10:00
刚接触php有些没信心啊!顶............................................
昵称: zhn  时间: 2007-12-21 20:23:00
比看av还爽 ,书上哪有这么详细的注释,做个标记,多多学习。
昵称: 笑天  时间: 2007-12-21 20:53:00
好人啊。顶你!
加油!
昵称: 少天一  时间: 2007-12-21 21:00:00
楼主分析IPB有多好啊
昵称: xlez  时间: 2007-12-21 21:07:00
收藏了,真不错
昵称: oolala  时间: 2007-12-21 21:17:00
俺也要收藏
昵称: 小狮子  时间: 2007-12-22 07:01:00
LZ是好人!
昵称: 痞子PHP  时间: 2007-12-22 10:26:00
楼主很好....强大...
昵称: lc0633  时间: 2007-12-22 11:07:00
昵称: snowcxy  时间: 2007-12-22 12:59

问下楼主,要学多久才能变这么强。
昵称: snowcxy  时间: 2007-12-22 12:59:00
能不能把源码共享下啊~
昵称: chenmfly  时间: 2007-12-22 13:52:00
顶个~~
昵称: macgroup  时间: 2007-12-22 16:46:00
最近也在看PHPCMS,谢谢楼主了,看见上面有很多人要源码就发上来,大家一起进步,另外楼主还有个东西要请教传输变量时md5已经加密,不解密直接可以使用么?我自己试试~谢谢楼主,源码在下面,呵呵 common.inc.rar (2.39 KB)
昵称: 温柔的大海  时间: 2007-12-22 17:51:00
接着开始用一系列的规则来找出缓寸的文件名和目录: 以 脚本名:xx.php和后续传递的参数 ?xx=ee&bb=jj 他两的字符窜的MD5 .以这个md5窜来定义出了缓存目录.和缓存文件

这个兄弟.请看清楚.他并没有md5加密 get 传递 的数据.而是以这个算出 这个页面是否已经缓存...看仔细点
昵称: fly_yang  时间: 2007-12-22 18:55:00
希望能坚持写完 学习啦
昵称: xyiyo  时间: 2007-12-22 20:42:00
很多都会写研究DZ.研究DE这些程序的一系列文章...好多都因为各种原因没能坚持下去

希望楼主能坚持 又重复下
昵称: robertvvv  时间: 2007-12-22 22:10:00
  恩.除非没钱吃饭了.要不我会坚持下去的.

回复那位兄弟.代码给初学者看的.象你这样的高高手.就没必要看了.谢谢
昵称: 逆雪寒  时间: 2007-12-22 22:22:00
LS正解
昵称: wangchun  时间: 2007-12-22 22:28:00
强贴,顶起慢慢看!
昵称: zw870307  时间: 2007-12-22 22:42:00
偶像!学习中
昵称: zw870307  时间: 2007-12-22 22:43:00
太棒了,精彩。
昵称: 逆雪寒  时间: 2007-12-22 23:25:00
太好了,非常有用。。。学习了。
昵称: 飘渺晴霜  时间: 2007-12-23 00:00:00
对我这样的新手帮助太大了。

谢谢LZ。

学到了很多东西,收藏啊,一定要收藏。
昵称: hongfu1  时间: 2007-12-23 01:42:00
  谢谢各位支持.星期六日休息.

星期一继续放新东西.不过这一个启动文件快讲完了.下一章再讲phpcms 的缓存机制.大家继续帮我顶阿~
昵称: sandssss  时间: 2007-12-23 01:45:00
引用:
原帖由 wangchun 于 2007-12-22 22:10 发表
以前没注意phpcms不过楼主分析的这个文件代码的却不咋的,废话多。
----------
废话不多的高手们,俺们新手也很想听听你们的废话呢!!!
除了phpcms,还有php168  dedecms(织梦系统)
据说,织梦系统和 帝国管理系统 是超级牛的
请给分析分析…………

呵呵
------------

赞赏楼主的无私奉献之壮举!!

帮着顶起,慢慢研究!

好好学习!

[ 本帖最后由 coolcool1265 于 2007-12-23 10:52 编辑 ]
昵称: lhphp  时间: 2007-12-23 01:54:00
我对 织梦系统 没什么好感.因为我装了一次.失败了.所以我就直接丢掉了.

帝国管理系统.听说不错.

其实分析那套系统都没关系.分析他们不是为了教大家怎么使用那套系统,而只是让大家学习里面的思想从而提高PHP开发能力而已. PHPCMS 也不错.代码写得挺容易懂的.

弄完这个以后有时间在弄其他的吧.本来说想找套PHP5的 CMS来讲解.不过找了半天找不到有点名气的.郁闷.我还是喜欢PHP5
昵称: jackywdx  时间: 2007-12-23 10:27:00
支持,收藏,狂顶,新手啊,学习中……
楼主辛苦了!
昵称: fhjr999  时间: 2007-12-23 10:51:00
我请教的问题,哪里去了???怎么找不到了??

那再请教一次。

在这个文件刚开始,已经关闭了自动转义了,那为什么后边还要为COOKIE,GET,POST再进行转义呢???

还有一个问题,一个页面,获得上个页面提交的GET,POST等数据,是在什么时候获得的??

是在执行这个页面的任何代码之前吗??  如果是在之前,假如服务器默认开启了自动转义的话,是不是,这些数据已经被转义过了??还是只有这些数据被用到的时候才会进行自动转义?

如果是在之后才会获得,不过有点说不过去啊,如果第一句就用GET。POST,那起不是得不到数据了。
昵称: 逆雪寒  时间: 2007-12-23 11:13:00
set_magic_quotes_runtime() 和 get_magic_quotes_gpc()函数的区别.

一个是资料入库前对字符窜进行转意  

一个是 对 gpc 进行转意.  概念不一样.

好好理解下.

[ 本帖最后由 逆雪寒 于 2007-12-23 12:03 编辑 ]
昵称: coolcool1265  时间: 2007-12-23 11:23:00
学习了
昵称: 逆雪寒  时间: 2007-12-23 11:51:00
我做了一个小测试。

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 12:01:00
谢谢了,终于搞明白是怎么回事了。
昵称: fhjr999  时间: 2007-12-23 12:04:00
我竟然认认真真看完了....
昵称: 逆雪寒  时间: 2007-12-23 12:14:00
呵呵,楼主真厉害啊,坚持下来吧。
昵称: erentan  时间: 2007-12-23 13:05:00
引用:
原帖由 逆雪寒 于 2007-12-22 20:42 发表
接着开始用一系列的规则来找出缓寸的文件名和目录: 以 脚本名:xx.php和后续传递的参数 ?xx=ee&bb=jj 他两的字符窜的MD5 .以这个md5窜来定义出了缓存目录.和缓存文件

这个兄弟.请看清楚.他并没有md5加密 get ...
Y的抽自己两下,没看见,呵呵,恩下次能不能讲讲PHPCMS的tag,这个一直不大理解,似乎类似smarty的<{include ****}>,是不是这个意思,不过有时候感觉PHPCMS有些时候,做的时候比较烦,比如info模块,根目录下面得定义引用module的内容,module写定义功能,template里面写模板...真是好烦啊~~以前不懂模板技术根本不知道怎么回事,我还是喜欢老外的东西,更方便些,主要文档多(我不是崇洋媚外)。比如drupal就有API可以提供查询,太方便了,不过把人弄得人都懒了。

[ 本帖最后由 robertvvv 于 2007-12-23 14:55 编辑 ]
昵称: fhjr999  时间: 2007-12-23 13:07:00
引用:
原帖由 逆雪寒 于 2007-12-23 11:13 发表
我对 织梦系统 没什么好感.因为我装了一次.失败了.所以我就直接丢掉了.

帝国管理系统.听说不错.

其实分析那套系统都没关系.分析他们不是为了教大家怎么使用那套系统,而只是让大家学习里面的思想从而提高PHP开 ...
跟我一样,第一次装织梦直接失败,听说是经常跳票的产品

[ 本帖最后由 robertvvv 于 2007-12-23 17:12 编辑 ]
昵称: fhjr999  时间: 2007-12-23 14:18:00
我看帖一般很少顶帖。。。
但是今天真的学了不少东西。。
不顶对不起LZ啊......
加油加油。。
昵称: benaheng  时间: 2007-12-23 14:52:00
引用:
原帖由 xlez 于 2007-12-21 20:53 发表
比看av还爽 ,书上哪有这么详细的注释,做个标记,多多学习。
哈哈,是啊,看av还不带翻译的
昵称: carche  时间: 2007-12-23 14:53:00
不错,继续
昵称: robertvvv  时间: 2007-12-23 18:11:00
相当不错,支持,楼主你的舌头功夫应该也不错吧
昵称: robertvvv  时间: 2007-12-23 22:11:00
引用:
原帖由 robertvvv 于 2007-12-23 14:53 发表

跟我一样,第一次装织梦直接失败,听说是经常跳票的产品
PHP产品里的跳票之王。。。。。。。负载很惨,灭有信誉的团队
昵称: coolkiss  时间: 2007-12-24 11:21:00
引用:
原帖由 逆雪寒 于 2007-12-21 17:15 发表
谢谢.我会继续的.坚持把phpcms 弄个底朝天的.
我也有这想法,把它翻个头,看php还能不能提高起来,支持你
昵称: ascmvi  时间: 2007-12-24 11:53:00
  偶的舌头不是一般的强.哈哈


   PHP想学精通.  首先必须精通C  能扩展 php引擎.就差不多了

目前正在苦练 linux  c .
昵称: liuxingke  时间: 2007-12-24 11:55:00
逆雪寒,继续发帖子吧!强烈支持
昵称: jyb21  时间: 2007-12-24 12:00:00
引用:
原帖由 逆雪寒 于 2007-12-24 12:08 发表
  偶的舌头不是一般的强.哈哈


   PHP想学精通.  首先必须精通C  能扩展 php引擎.就差不多了

目前正在苦练 linux  c .
C是C语言吧,linux C不也是C语言,有什么不同吗?
昵称: billx  时间: 2007-12-24 12:08:00

谢谢楼主
分析完了phpcms 接着dz,pw,dede,接着phpbb...^_^
昵称: jyb21  时间: 2007-12-24 12:16:00
dz 社区里面有个大哥超级牛的人
把dz分析的差不多了
你可以去找找呵呵
昵称: 逆雪寒  时间: 2007-12-24 12:39:00
楼主幸苦了。支持一个
昵称: jinchao_1985  时间: 2007-12-24 13:40:00
引用:
define('IN_PHPCMS', TRUE);
/**
程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。
防止你**进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
那么就基本可以肯定你这个家伙是个小偷来的。 人可能**进入。但程序怎么**呢。只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕
这段不是很明白,麻烦楼主给个例子
昵称: chyoqin  时间: 2007-12-24 14:20:00
学习,紧跟你的脚步。
昵称: psdshow  时间: 2007-12-24 14:34:00
引用:
原帖由 qfangcn 于 2007-12-24 15:23 发表


这段不是很明白,麻烦楼主给个例子
xx.php 文件

$dbuser = 'xxx';
$pwd         = '22541';


include 'xx.php';
echo $dbuser;
echo $pwd  

可以获得你密码资料等。
昵称: coolcool1265  时间: 2007-12-24 15:23:00
我想知道,TABLE_MEMBER是在哪里定义的????翻了半天也没找到。
为什么不像phpwind那样用{pre}前缀呢?
昵称: yuanjing_119  时间: 2007-12-24 15:53:00
5.3.1.   定长与变长表
包含任何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 16:28:00
TABLE_MEMBER  是一个常量。 是  表名。而不是前缀。

这样可以灵活的更换表名而对程序的影响达到最小。
昵称: okhwyy  时间: 2007-12-24 16:30:00
好好感动呢!
昵称: 逆雪寒  时间: 2007-12-24 16:45:00
请问下楼主,要学多久才能变得像你这么强?呵呵……
我在学习中……
昵称: 东感地带  时间: 2007-12-24 17:30:00
楼主你的头相太恶心了,真想把那舌头给"卡唰"掉,建议换一个 吧.
昵称: 东感地带  时间: 2007-12-24 18:09:00
请问下一章什么时候出,到时来排队
昵称: 逆雪寒  时间: 2007-12-24 18:15:00
引用:
原帖由 逆雪寒 于 2007-12-24 16:28 发表



xx.php 文件

$dbuser = 'xxx';
$pwd         = '22541';


include 'xx.php';
echo $dbuser;
echo $pwd  

可以获得你密码资料等。
关键是我的xx.php你怎么可能直接include呢,你如何把你的文件放到我的站点上呢?
昵称: 宁静致远  时间: 2007-12-24 18:17:00
逆雪寒果然牛!!!这么详细的代码说明……估计也只有你这里才有了。。。喜欢!!!支持你!!!顶
昵称: 宁静致远  时间: 2007-12-24 20:34:00
对于向我这样的新手来说,非常的收益
谢谢~
排队等候下一章~
昵称: chyoqin  时间: 2007-12-24 20:44:00
PHPCMS公司要破产了
昵称: billx  时间: 2007-12-24 21:04:00
phpcms代码。。。有些乱啊。。。这也讲解。。。对初学者或许更是误解。

[ 本帖最后由 thinkinginlamp 于 2007-12-25 08:45 编辑 ]
昵称: qfangcn  时间: 2007-12-24 22:47:00
楼主的文章很精彩,不知道楼主能否给我解释一下这个问题:
http://www.phpchina.com/bbs/thread-45889-1-1.html
有朋友提出了解决方案,不知楼主有何高见
我自己的解决方案是:将后面的参数强制转换为int, 不知楼主有没有更好的方法
昵称: hhcsb  时间: 2007-12-24 23:07:00
intval 转成 数字

sql  语句里面  SELECT * FROM xx WHERE uid = '$xx'

记得加单引号.这才是好习惯.

而且最好过滤每个GET 变量 去掉  or union  等SQL关键字.
昵称: xjgale  时间: 2007-12-25 08:44:00
什么时候出下一章,希望你把phpcms分析完啊!phpcms公司不会破产的,要不然它也不会开源了,有了楼主只会让他更出名,我估计要不了多久网上就到处都是转载楼主的文章的了
昵称: 黄山狼  时间: 2007-12-25 08:45:00
我想把phpcms_member和phpwind里的pw_members两个表合并起来。
可是一直没找到TABLE_MEMBER是在哪里定义的。。
按照phpcms官方的说法,比较常用的几个表都定义为常量了,关键是在哪里呢???
昵称: thinkinginlamp  时间: 2007-12-25 09:06:00
最近自己也在看PHPCMS,看看楼主的理解,受益非浅!谢谢了!
加油!继续!
昵称: dongxin1390008  时间: 2007-12-25 09:08:00
不知道版主能不能把源码分享下
昵称: 逆雪寒  时间: 2007-12-25 09:22:00
引用:
原帖由 东感地带 于 2007-12-25 09:22 发表
我想把phpcms_member和phpwind里的pw_members两个表合并起来。
可是一直没找到TABLE_MEMBER是在哪里定义的。。
按照phpcms官方的说法,比较常用的几个表都定义为常量了,关键是在哪里呢???
同问
昵称: jyb21  时间: 2007-12-25 09:27:00
引用:
原帖由 coolcool1265 于 2007-12-24 14:20 发表
dz 社区里面有个大哥超级牛的人
把dz分析的差不多了
你可以去找找呵呵
我对这个有兴趣.能不能帮忙把那个文章翻出来...
昵称: 东感地带  时间: 2007-12-25 09:39:00
  下午开始再看phpcms 的东西.
这两天都在弄 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

   暂时不弄扩展先.下午如果公司没活.那就开始PHPCMS 罗.  

还有那个  数据表常量.等下看下回答你

[ 本帖最后由 逆雪寒 于 2007-12-25 11:23 编辑 ]
昵称: lnnujxxy  时间: 2007-12-25 10:03:00
好贴,支持楼主!!
昵称: fly_yang  时间: 2007-12-25 10:30:00
老逆出品必是精品
昵称: robertvvv  时间: 2007-12-25 11:16:00
  哈哈楼上的。高手呀。那么多书  给本我吧
昵称: 玉面修罗  时间: 2007-12-25 11:21:00
楼主图像超恶心!你是那男人还是那女人?
昵称: 逆雪寒  时间: 2007-12-25 11:33:00
  偶有小JJ
昵称: lovewqww  时间: 2007-12-25 11:56:00
你看看MJJ,头像太有杀伤力了。。。
昵称: PEA@wikiPHP  时间: 2007-12-25 12:04:00
楼主的头像超恶心

而且这个CMS源码也太老了
PHP3时代的吧
昵称: 逆雪寒  时间: 2007-12-25 12:07:00
楼上果然眼厉。
怎么判断代码老或不老呢。教我两招  看来我们还在写PHP3的代码
昵称: 追风1  时间: 2007-12-25 12:16:00
楼主改头像!
昵称: 逆雪寒  时间: 2007-12-25 12:31:00
昵称: hongfu1  时间: 2007-12-25 12:39:00
引用:
原帖由 东感地带 于 2007-12-25 09:22 发表
我想把phpcms_member和phpwind里的pw_members两个表合并起来。
可是一直没找到TABLE_MEMBER是在哪里定义的。。
按照phpcms官方的说法,比较常用的几个表都定义为常量了,关键是在哪里呢???
是在缓存文件里面定义.具体请看我的 最新更新  PHPCMS文本缓存里面讲解
昵称: 逆雪寒  时间: 2007-12-25 16:04:00
哎呀妈呀!!!!
啥都不说了,眼泪哗哗的呀!!!!
昵称: hongfu1  时间: 2007-12-25 16:09:00
引用:
原帖由 fly_yang 于 2007-12-25 09:39 发表
不知道版主能不能把源码分享下
源码可在phpcms.cn下载啊
昵称: 逆雪寒  时间: 2007-12-25 16:18:00
引用:
原帖由 逆雪寒 于 2007-12-25 12:39 发表
楼上果然眼厉。
怎么判断代码老或不老呢。教我两招  看来我们还在写PHP3的代码
哈哈
昵称: hongfu1  时间: 2007-12-25 16:36:00
引用:
原帖由 追风1 于 2007-12-25 12:04 发表
楼主图像超恶心!你是那男人还是那女人?
我觉得一点都不恶心,感觉挺好,你们不会是嫉妒楼主吧
昵称: 逆雪寒  时间: 2007-12-25 16:48:00
这生命周期'$expires'在哪里可以体现出来呢?请解释下.谢谢!
复制PHP内容到剪贴板
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 ;
}


[ 本帖最后由 chyoqin 于 2007-12-25 16:59 编辑 ]
昵称: 东感地带  时间: 2007-12-25 16:49:00
   我不在乎别人的看法.

国家领导人不也一样有人说好有人说不好

哈哈

拿多点时间学习罗.28岁还不能做到CTO 就等着回家开小卖部去
昵称: jyb21  时间: 2007-12-25 16:50:00
这生命周期是源代码的注释.具体我看不出那里有生命周期的起作用.

所以可以忽略.可能是他们以后要实现的东西
昵称: jyb21  时间: 2007-12-25 16:57:00
引用:
原帖由 逆雪寒 于 2007-12-25 16:58 发表
   我不在乎别人的看法.

国家领导人不也一样有人说好有人说不好

哈哈

拿多点时间学习罗.28岁还不能做到CTO 就等着回家开小卖部去
我的小卖部正在筹划中。。。我30了
昵称: jyb21  时间: 2007-12-25 16:58:00
  小卖部也挺好的.

休闲 舒服 幸福
昵称: chyoqin  时间: 2007-12-25 17:00:00
http://www.phpcms.com/index.php?_SERVER[SERVER_NAME]=some_string
这个能构造出:$_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 17:01:00
看了..支持原创贴,头像,太恶心了
昵称: 逆雪寒  时间: 2007-12-25 17:12:00
昵称: jyb21  时间: 2007-12-25 19:22:00
群众对楼主的支持是大大的,对楼主头像的恶心程度也是大大的。。。。。。。。。建议楼主只在这个帖子里将像这样挺好,表开新帖了
昵称: 逆雪寒  时间: 2007-12-25 21:00:00
楼主的头像。。。汗一个。,。。。
昵称: flash866  时间: 2007-12-25 23:05:00
可否帮我们分析一下phpcms规划开发的思路 打个比方就是盖一个房子是从做地基开始的,可否帮助分析一下
昵称: gleon  时间: 2007-12-26 00:35:00
前面分析的都是"地基"
昵称: linvo  时间: 2007-12-26 08:27:00
找“地基”的可以参照这里。
编码规范和目录结构
http://dev.phpcms.cn/start/
昵称: billx  时间: 2007-12-26 08:56:00
http://www.phpchina.com/bbs/thread-46656-1-1.html
phpcms编码规范,前几天发的,转发到这里顶下 逆雪寒,也让更多的人省事,省得复制粘贴相关文档了
昵称: chenmfly  时间: 2007-12-26 08:59:00
引用:
原帖由 东感地带 于 2007-12-26 09:04 发表
找“地基”的可以参照这里。
编码规范和目录结构
http://dev.phpcms.cn/start/
我发的就是这个复制粘贴下来的。
昵称: jyb21  时间: 2007-12-26 09:04:00
引用:
原帖由 逆雪寒 于 2007-12-26 08:59 发表
前面分析的都是"地基"
恩 那就从代码看起,我看代码总是一头雾水,不知道开发者怎么知道,在这引用一下,在那包含一下。是不是到一种境界了就可以了,我不知道哪天才可以到达。
昵称: 逆雪寒  时间: 2007-12-26 09:42:00
如果你有这样的感觉.那你应该是刚学吧.慢慢会好的.  我学PHP也不过快一年而已.

慢慢会好的
昵称: 东感地带  时间: 2007-12-26 09:43:00
尽量每天都有新的东西每天都能进一小步

现在开始讲  index.php 首页文件. 基本来说PHPCMS的加载到显示操作的整个流程都分析完了.大家看一遍后.还要整体的来看来分析.慢慢体会.把些好的思想和思路实现到自己以后的项目里.我相信大家都会变得很强的. 记得: 程序是死的,人是活的.有实现思路一切都好办了.
复制PHP内容到剪贴板
PHP代码:

<?php 
/**
代码分析版权所有:逆雪寒
*/
require './include/common.inc.php';
/**
看 common.inc.php 核心启动文件我们已经讲解完了。应该都明白了吧
*/
if($PHPCMS['ishtml'] == && 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'] == && $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协议,会有详细的参数说明 。其主要目的是:强制用户每次访问这个页面时获取最新资料,而不是使用存在客户端的缓存。
*/
?>

下一步开始讲PHPCMS的模板引擎和模板引擎的实现原理.

支持我吧.哈哈
昵称: jyb21  时间: 2007-12-26 09:44:00
看源码不是先看后台再看前台好点吗?
昵称: jyb21  时间: 2007-12-26 10:35:00
前台在程序上没什么关系.一样的.看习惯而已. 后台没什么好讲的.
昵称: jyb21  时间: 2007-12-26 10:39:00
引用:
记得: 程序是死的,人是活的.有实现思路一切都好办了.
我现在差的就是思路,不知道怎么考虑一个站,我把一本书里面的实例从头到尾都敲了一遍了。还是不知道怎么下手,现在好好学思路,希望通过你的phpcms分析来领会
昵称: 逆雪寒  时间: 2007-12-26 11:07:00
   弄PHP那么久我还没好好看完过一本PHP的书

思路>是要思考才能来的.  

很多实现方法思路我都是自己想来的. 想法每个人都有.当然拉.用人家的想法来弄也行
昵称: 逆雪寒  时间: 2007-12-26 11:08:00
133#有个地方不对吧。。。。
复制PHP内容到剪贴板
PHP代码:
if($is_js$contents strip_js($contents);
if(
$CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile)
{
  
dir_create($cachefiledir);
  
file_put_contents($cachefile$contents);
  @
chmod($cachefile0777);
}


应该是如果is_js为真,就用strip_js将HTML格式替换成JS格式。

而不是楼主所说的
主要是来过滤内容里面的 \n 换行 、\r 换页符 和  '\'  具体请百度:制表符
继续我们上个函数strip_js过滤完内容后。 在使用 file_put_contents() 函数 把内容写到文件里面去。
昵称: chyoqin  时间: 2007-12-26 11:39:00
请问 phpcms生成的html页面是真正的html还是伪静态,听说伪静态对seo来说相对差些,是不是有此一说呢
昵称: 逆雪寒  时间: 2007-12-26 11:47:00
function strip_js($string, $js = 1)
{
$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 12:18:00
无非就是数据层、界面层和业务层罢了。。。
昵称: 逆雪寒  时间: 2007-12-26 12:26:00
PHPCMS可以 是伪静态 和真静态.

伪静态的优点就是SEO吧.
昵称: twm121  时间: 2007-12-26 12:27:00
总是潜水中 这篇帖子说什么都要顶阿  谢谢楼主无私奉献~~
昵称: jyb21  时间: 2007-12-26 13:50:00
楼主要坚持啊――――加油!
太好啦
昵称: 逆雪寒  时间: 2007-12-26 13:54:00
对比下这两个函数:那个较有优点呢?
复制PHP内容到剪贴板
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内容到剪贴板
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 15:28:00


万法归中.青菜萝卜.各有各的看头
昵称: 逆雪寒  时间: 2007-12-26 15:36:00
ecshop的太易明白了,用到return $row[0];一看就明白.可读性强多了.
昵称: 独自迷茫  时间: 2007-12-26 16:02:00
支持,顶一下
昵称: maixiaomai  时间: 2007-12-26 16:38:00
今天下午合并phpcms和pw的用户表,出现这样一个问题。。。
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 17:06:00
复制PHP内容到剪贴板
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(
$forwardshowmessage($LANG['login_success'], $forward);
  return 
$info;
}


昵称: 逆雪寒  时间: 2007-12-26 17:06:00
很好,很强大.我一般下开源的程序就是看看数据库怎么设计的,其它的很难得有耐心看下去.
昵称: chyoqin  时间: 2007-12-26 17:23:00
复制PHP内容到剪贴板
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");
}


不明白一点,两个函数,为什么第一个不像第二个一样,使用参数$username呢?使用$this->username有什么作用??
昵称: herolee  时间: 2007-12-26 17:29:00
昵称: 东感地带  时间: 2007-12-26 17:33:00
像这些大型的程序,为什么都自己用自己的模板引擎,为什么不用现成的(比如Smarty)?
昵称: 东感地带  时间: 2007-12-26 17:36:00
请楼主继续第四章
昵称: sunfall  时间: 2007-12-26 18:08:00
关注
昵称: 东感地带  时间: 2007-12-26 19:00:00
正在装LINUX 机器慢.等装完继续
昵称: MoHock  时间: 2007-12-27 09:04:00
smarty  十分不爽.

我刚学PHP的时候用.现在不用了.几行代码写出来的东西没必要拿人家的.
昵称: linvo  时间: 2007-12-27 09:33:00
顶了再顶,好贴!!! :lol: :lol:
昵称: jyb21  时间: 2007-12-27 09:47:00
楼主,你用的phpcms的版本是多少啊????
楼主,你用的phpcms的版本是多少啊????
昵称: fuhsea  时间: 2007-12-27 11:44:00
雪寒终于扛不住压力换头像了
昵称: 逆雪寒  时间: 2007-12-27 11:51:00
逆雪寒写的文章很是不错啊!自从来到这个社区以来,我对你印象比较最深!为人还不张扬,很关心一些想提高PHP的人!
昵称: 逆雪寒  时间: 2007-12-27 13:59:00
define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));
为何还要用substr呢?
昵称: suihr  时间: 2007-12-27 14:17:00
substr是截取字符串
从第一个字符开始截取,一直取到倒数第八个,也就是把最后的include去掉了
昵称: ascmvi  时间: 2007-12-27 15:38:00
版主今天迟到了么
怎么还没发呢
我排队学习中嘻嘻
昵称: jyb21  时间: 2007-12-27 15:45:00
  今天 配置  LINUX下的 php5.2.5   apache 2.2.6  一天

没找到问题.还在努力中.......   暂不发先了
昵称: shenyuxiang2008  时间: 2007-12-27 15:56:00
不是说apche2.2以后的版本需要插件才支持PHP5的,是真的吗?
昵称: solidluck  时间: 2007-12-27 17:26:00
这个一定要支持!!!
昵称: 东感地带  时间: 2007-12-27 17:55:00
昵称: xjgale  时间: 2007-12-27 18:50:00
phpcms的代码明显带有phpbb的风格
昵称: 逆雪寒  时间: 2007-12-27 19:13:00
我哪天能写出phpcms风格的也成啊
昵称: linvo  时间: 2007-12-27 21:47:00
收益了
昵称: jayeeliu  时间: 2007-12-27 21:57:00
原来我以为我会的不是很少了,
很了分析才发现,有好多函数没见过
有好多语句看不懂
希望楼主继续
这个研究完了,应该技术就能上升一大步了
昵称: xjgale  时间: 2007-12-27 22:18:00
啥也不说了,楼主,加油!

一点小问题,楼主的源码是哪个版本的,我下的源码里面怎么没有“common.inc.php”文件啊?

[ 本帖最后由 terry915 于 2007-12-28 10:40 编辑 ]
昵称: suchasplus  时间: 2007-12-28 09:16:00
不可能没有的,在include目录下
昵称: jyb21  时间: 2007-12-28 09:19:00
肯定有的.要不就是你下的不是PHPCMS ..

我也想继续.昨天忙配置环境.今天忙写下东西. 时间不是很允许.下一节该讲PHPCMS的模板引擎.  会继续的....
昵称: ct_174880859  时间: 2007-12-28 10:38:00
2007版吗?还是3.0?2.4?
昵称: jingangel  时间: 2007-12-28 11:47:00
那个版都应该有吧
昵称: terry915  时间: 2007-12-28 13:22:00
phpcms_v3.0_gbk_free
我下的是这个板本的
也没有“common.inc.php”
昵称: jingangel  时间: 2007-12-28 13:52:00
phpcms  2007  最新版本
昵称: 逆雪寒  时间: 2007-12-28 13:54:00
引用:
原帖由 qfangcn 于 2007-12-24 20:44 发表


关键是我的xx.php你怎么可能直接include呢,你如何把你的文件放到我的站点上呢?
这样解释可能好点
a.php
复制PHP内容到剪贴板
PHP代码:

<?php
define
('IN_PHPCMS',TRUE);

……

?>


b.php
复制PHP内容到剪贴板
PHP代码:

<?php
defined
('IN_PHPCMS') or exit('Access Denied');

echo 
$password;

?>

这样你就不能直接访问 b.php ,会因为 IN_PHPCMS 这个常量没定义而 exit('Access Denied')
不知道这样说和不合适
在举个例子,比如网站的管理后台,有很多页面,不可能在所有的页面上都加上管理权限认证吧?
那么就可以console.php?do=usermanage
console.php里管理权限认证,定义一个类似IN_PHPCMS这样的常量,然后根据参数do来调用usermanage.php
usermanage.php里检查IN_PHPCMS有没有定义过,如果定义了就说明是从console.php来的,经过了管理权限认证

OVER
昵称: terry915  时间: 2007-12-28 14:10:00
LS不错
昵称: 逆雪寒  时间: 2007-12-28 14:14:00
LS的头像不错
昵称: xjgale  时间: 2007-12-28 14:22:00
楼主能不能把phpcms的
生成静态那块全面的分析一下啊
昵称: 逆雪寒  时间: 2007-12-28 15:09:00
引用:
原帖由 jingangel 于 2007-12-29 09:55 发表
楼主能不能把phpcms的
生成静态那块全面的分析一下啊
我希望他能360个文件夹3408个文件需要分析的都分析一遍,如果实在分析不过来,指导我们分析一下那些简单的,我们自己分析简单的部分
昵称: kukat  时间: 2007-12-28 15:25:00
雪寒兄赶紧继续,马上08年了又老了一岁了,要抓紧了。千万别因为天冷就练龟缩大 法啊
昵称: 逆雪寒  时间: 2007-12-29 09:55:00
  呵呵.放心  我会继续的.今一早就很高兴.

首先  LINUX 下  的PHP 扩展已经成功运行.  我自己写的 哈哈
算是在PHP扩展方面踏出了关键的一步   弄了我昨天一天呀.西西
昵称: 东感地带  时间: 2007-12-29 10:22:00
引用:
原帖由 逆雪寒 于 2007-12-29 10:26 发表
  呵呵.放心  我会继续的.今一早就很高兴.

首先  LINUX 下  的PHP 扩展已经成功运行.  我自己写的 哈哈
算是在PHP扩展方面踏出了关键的一步   弄了我昨天一天呀.西西
分享一下
昵称: jingangel  时间: 2007-12-29 10:24:00
强烈要求 分享
昵称: jyb21  时间: 2007-12-29 10:26:00
楼主 有机会也搞一次 扩展的教程吧
昵称: jyb21  时间: 2007-12-29 10:49:00
   恩恩会的.等我研究透了ZEND API   再写个东西出来在出教程吧
昵称: 逆雪寒  时间: 2007-12-29 12:44:00
要新的分析。。。。看到换头像,很舒服。。。。
再一次感谢楼主。。。
昵称: jyb21  时间: 2007-12-29 12:44:00
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶上火星  写得太好了
昵称: ws00377531  时间: 2007-12-29 13:26:00
最近几天跟着楼主偷懒...没学php
看楼主的文章成为学php的动力了哈
昵称: ws00377531  时间: 2007-12-29 14:02:00
   好东西。。  呵呵
昵称: 逆雪寒  时间: 2007-12-29 17:54:00
等待楼主继续了
昵称: chenmfly  时间: 2007-12-30 20:38:00
这一晃一年都过去了,
\\
昵称: qqsheji  时间: 2008-01-01 12:03:00
引用:
原帖由 jingangel 于 2008-1-2 10:39 发表
这一晃一年都过去了,
\\
这一晃我都学了两年php了,还是这初级水平
昵称: xjgale  时间: 2008-01-02 09:22:00
一天亮就弄了.看多了黄黄的字.头昏眼花的.  暂时讲那么多了.突然发现自己好多东西要弄.时间都好少.哎.
复制PHP内容到剪贴板
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($compiledtplfile0777);
 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($compiledtplfile0777);  //别忘了设置下权限。
 
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));
}
?>

下一节讲  phpcms 的模板标签功能,讲得不好.大侠就别笑我了

昵称: xlight  时间: 2008-01-02 10:39:00
在另外一贴看你建议会日语的那个学JAVA就想到你在这应该更新了,果然
昵称: jyb21  时间: 2008-01-02 10:48:00
不错,不过,应该从总体架构来讲,而不是从代码来讲!各人建议!我也在做这方面的工作,希望交流!
昵称: jingangel  时间: 2008-01-02 11:53:00
我在想是不是可以把模板的标签技术等等需不着的可以去掉,其实phpcms里面应该有很多东西是可以去掉的,因为它是作为一个产品来开发的,为了照顾大家做了个大而全。等研究透了,我就把杂项全清除掉,然后拿来自己用或者卖钱是不是也不错,呵呵偷着乐一个。
昵称: jyb21  时间: 2008-01-02 12:30:00
   总体架构我不知道怎么讲.而且.我也刚基础PHPCMS   我是边看边写的.我没有其他时间看PHPCMS了.

   LINUX C 的PHP扩展.  等我都在同步弄着.挺累的.呵呵.不过也谢谢你的建议了.我不是老鸟.  呵呵.现在一直在弄通C 语言.  过段时间可能我会去培训下 嵌入开发.打算转到 嵌入这块.因为我本生懂硬件懂电路.

php 开发.工资再高再高也不会很高.这是他能为企业谋多大利益决定的.不是说高手高手高高手就一定是 发财的那种.

给你吧PHPCMS 卖了.也没多少钱.    呵呵.   努力吧
昵称: 逆雪寒  时间: 2008-01-02 12:36:00
顶一个~
楼主很有想法
昵称: jyb21  时间: 2008-01-02 12:39:00
支持你。。。。继续。。。
昵称: water6000  时间: 2008-01-02 12:51:00
辛苦了。楼主。加油。。
将来要是又几乎能见到你。一定要请你吃饭!哈哈
昵称: jyb21  时间: 2008-01-02 13:34:00
正则还不懂,百度一下再来看完,
昵称: 逆雪寒  时间: 2008-01-02 15:40:00
强烈支持楼主....学习了好多东西...希望楼主继续坚持啊...
昵称: xjgale  时间: 2008-01-02 18:02:00
学习学习
昵称: chenmfly  时间: 2008-01-03 11:55:00
还没更新
昵称: answer17  时间: 2008-01-03 16:49:00
LZ强人一个啊

向LZ学习ING
昵称: chyoqin  时间: 2008-01-05 14:04:00
头像的更新速度还真快
昵称: jackywdx  时间: 2008-01-07 09:25:00
深有同感哈
昵称: 4C[FANTASY]  时间: 2008-01-07 09:54:00
建议分开帖来写...不然这一页一页的找太麻烦了...

DZ好像有只查看楼主的功能...怎么没找到
昵称: jyb21  时间: 2008-01-07 14:45:00
引用:
原帖由 zw870307 于 2008-1-7 20:33 发表
建议分开帖来写...不然这一页一页的找太麻烦了...

DZ好像有只查看楼主的功能...怎么没找到
在发表日期后面有个链接“只看该作者”
昵称: xctk  时间: 2008-01-07 18:27:00
在你讲解的第一篇文章include/common.inc.php   中我又一点还是不懂!就是防止注入攻击这块。
复制PHP内容到剪贴板
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);

如果正则发现有匹配的内容,还是给他替换成原来的内容,这样有什么用啊? 比如$_GET里元素有个“select” ,程序把select 还是替换成select。这是为什么啊??

还有这句:
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 20:33:00
楼主的精品!我也是刚学不久,对PHP了解不是很深,看了楼主的强大分析,实在是收益非浅。哈哈!

如果楼主能全部分析完。我想我的 PHP会提高一大截的。。

支持楼主。加油楼主。强悍!
昵称: fkeuem  时间: 2008-01-08 09:12:00
楼主人呢,赶紧现身啊
昵称: zw870307  时间: 2008-01-08 09:12:00
    最近忙找工作忙做研究.时间不是很多.请谅解. 下午还要去复试呢.
昵称: 东感地带  时间: 2008-01-08 11:11:00
雪寒兄有空回答下我的问题啊! 216楼的 问题。谢谢!!!

你看下phpcms  那个文件代码.   select 替换不是这样的.  上面的代码给  DZ这个编辑器给过滤或执行了.

[ 本帖最后由 逆雪寒 于 2008-1-14 08:46 编辑 ]
昵称: 黄山狼  时间: 2008-01-08 11:37:00
LZ,再不更新可就要沉下去了.
昵称: wljk506  时间: 2008-01-08 11:40:00
不要意思了.已经丢了工作.后天开始我要去学LINUX 嵌入开发的课程.所以接下来的一个月时间都不多.所以暂停先了.以后有时间会更新的.


2008  是机遇还是 倒霉.  真郁闷
昵称: jyb21  时间: 2008-01-08 20:18:00
只要不是着手小卖部就成....
新来的就看到这么好的分析..爽
昵称: 逆雪寒  时间: 2008-01-10 11:04:00
现在心态总不定。

有时候真想一咬牙就回去老家开小卖部去。哎。。。。。
昵称: 黄山狼  时间: 2008-01-10 19:59:00
引用:
原帖由 逆雪寒 于 2008-1-13 13:18 发表
现在心态总不定。

有时候真想一咬牙就回去老家开小卖部去。哎。。。。。
逆境中成长,我支持你,精神上的
昵称: chyoqin  时间: 2008-01-13 00:52:00
引用:
原帖由 逆雪寒 于 2008-1-13 13:18 发表
现在心态总不定。

有时候真想一咬牙就回去老家开小卖部去。哎。。。。。
开小卖部太大才小用了,不过要是开着小卖部写出惊天动地的代码来,央视都要专访你的
昵称: 逆雪寒  时间: 2008-01-13 13:18:00
引用:
原帖由 jyb21 于 2008-1-14 09:34 发表

开小卖部太大才小用了,不过要是开着小卖部写出惊天动地的代码来,央视都要专访你的
现在这个社会,提倡一专多能。
谁要学PHP能研究出杂交水稻来,怕是不只央视来采访。。。
昵称: kinji  时间: 2008-01-13 13:52:00
楼主来福州找工作好了哈

这边PHP应该很缺人的
网龙公司招PHP工资很高 的
昵称: 逆雪寒  时间: 2008-01-14 09:34:00
昵称: BlackCoffee  时间: 2008-01-14 16:43:00
昵称: jyb21  时间: 2008-01-14 17:24:00
实在厉害啊!厉害啊  不能沉下去了  我狂顶!
昵称: 东感地带  时间: 2008-01-15 15:08:00
人真多。。。。。。。。。
昵称: xjgale  时间: 2008-01-17 15:47:00
好像停住了
昵称: jingangel  时间: 2008-01-21 21:45:00
不好意思各位兄弟,因为我现在在上一个软件开发课程.所以...天天都要学习.暂时没时间更新.等过了春节一切正常了.我会继续的.谢谢关注
昵称: ct_174880859  时间: 2008-01-22 00:57:00
引用:
原帖由 逆雪寒 于 2008-1-22 19:26 发表
不好意思各位兄弟,因为我现在在上一个软件开发课程.所以...天天都要学习.暂时没时间更新.等过了春节一切正常了.我会继续的.谢谢关注
是和链小科技在合作吧,我似乎看到你的身影的
昵称: xiaobaby87  时间: 2008-01-22 16:20:00
引用:
原帖由 ascmvi 于 2007-12-23 22:11 发表

哈哈,是啊,看av还不带翻译的
AV还要翻译吗?反正就那几句
昵称: czly  时间: 2008-01-22 19:26:00
支持!有空学习下。
昵称: jyb21  时间: 2008-01-23 09:06:00
说一下意见吧
回帖贼多 不太容易找您的帖子
所以建议在第一页中说明下哪几页有您的分析文
昵称: 逆雪寒  时间: 2008-01-23 13:06:00
版主太强了,最近刚接触PHPcms感觉有很多要了解的,向你学习学习。
昵称: jyb21  时间: 2008-01-23 17:04:00
不错,支持一下!
昵称: ipengjun  时间: 2008-01-24 10:18:00
非常详细
昵称: 依龙  时间: 2008-01-28 11:15:00
轻易不回帖,我回了
轻易不看第二次同样的帖
我看了
轻易发现不了一个强人
我发现了!
昵称: silasoni  时间: 2008-01-28 23:32:00
收藏咯看
昵称: netspider  时间: 2008-01-29 08:10:00
复制PHP内容到剪贴板
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 20:11:00
昵称: adleyliu  时间: 2008-01-31 20:11:00
昵称: xiaoxiao0503  时间: 2008-02-04 14:32:00
[quote]原帖由 逆雪寒 于 2007-12-21 17:15 发表
谢谢.我会继续的.坚持把phpcms 弄个底朝天的. [/quote
逆雪寒 支持你 顶个好贴,我也在看PHPCMS的代码,但好多没读懂,向你学习
昵称: xiaoxiao0503  时间: 2008-02-04 15:19:00
还是自己研究吧.
昵称: liuxingyuyuni  时间: 2008-02-04 15:19:00
以前没研究过PHPCMS 。现在看了,有很重DZ的影子。

有部分程序与DZ旧版本完全相同。

总的来说沉余代码很多,没用的代码也有。PHPCMS不怎么样。
昵称: liuxingyuyuni  时间: 2008-02-04 21:30:00
等着LZ继续
昵称: liuxingyuyuni  时间: 2008-02-11 13:40:00
引用:
原帖由 smallwl 于 2008-2-12 03:58 发表
以前没研究过PHPCMS 。现在看了,有很重DZ的影子。

有部分程序与DZ旧版本完全相同。

总的来说沉余代码很多,没用的代码也有。PHPCMS不怎么样。
分析分析
昵称: php?  时间: 2008-02-12 03:58:00
神仙啊!
昵称: liuxingyuyuni  时间: 2008-02-15 09:19:00
$str = preg_replace("/\{template\s+(.+)\}/","\n<?php include template([url=file://\\1]\\1[/url]); ?>\n",$str);
     关于这里的[url=file://: ]   [url]  起到了什么作用啊  想不通  请哪位前辈指教下啊  在此先谢了
昵称: smallwl  时间: 2008-02-16 17:49:00
您好!看来楼主分析的phpcms,感觉受益匪浅啊!谢谢!
想问你一个问题,phpcms是怎样处理$LANG,这个数组的,是在哪个文件编译的呢?谢谢!
phpcms是怎样处理语言包的呢?
昵称: rocky711  时间: 2008-02-17 21:17:00
复制PHP内容到剪贴板
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;
}


[ 本帖最后由 xiaobaby87 于 2008-2-24 12:51 编辑 ]
昵称: jyb21  时间: 2008-02-21 17:44:00
<div class="xw-on" onClick="showContent(2, {$channelid}, 0)" id="nav{$channelid}_0"><span>{$cha[channelname]}</span></div>
          <div class="xw-off" onClick="showContent(2, {$channelid}, 1)" id="nav{$channelid}_1"><span>推荐资料</span></div>

什么意思呢?如何单独调用一个栏目的下载呢?
昵称: 自由活动  时间: 2008-02-23 12:06:00
希望能介绍一些模版的知识。
昵称: xiaobaby87  时间: 2008-02-24 12:48:00
复制PHP内容到剪贴板
PHP代码:
$str preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","",$str[/url]);

/* {xxx(jj)}  这么个奇怪的东西。因为奇怪所以我找了下PHPCMS的模板文件。找了几个文件都没发现这个怪物。大家有谁找到的说下我去看下。怕是我理解错了正则。先谢了**/
在yp/job.html中有一个{area_select('areaid', '请选择地区', $areaid)}
请问是什么意思?
昵称: darlin  时间: 2008-02-24 13:00:00
刚学看不大懂,以后再试下。
昵称: xiaobaby87  时间: 2008-02-24 13:01:00
楼主不更新了呀
昵称: netspider  时间: 2008-02-25 12:13:00
引用:
原帖由 smallwl 于 2008-2-12 03:58 发表
以前没研究过PHPCMS 。现在看了,有很重DZ的影子。

有部分程序与DZ旧版本完全相同。

总的来说沉余代码很多,没用的代码也有。PHPCMS不怎么样。

同意同意!我最近也在看discuz,发现很多相似的地方!
昵称: netspider  时间: 2008-02-25 20:51:00
好像很久没有更新了,楼主有没有分析过后台的
昵称: darlin  时间: 2008-02-26 12:11:00
来看到了,不顶就太对不起楼主了。
昵称: godkid  时间: 2008-02-27 14:35:00
奉献精神可嘉!学了我也去整个diszu论坛分析!
昵称: realjue  时间: 2008-03-03 15:22:00
问题如下:

编译成功后,运行程序,出现./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 19:02:00
强悍!~~~~~~~~~
学习了!~~~~~~~~~~
昵称: osman  时间: 2008-03-04 17:38:00
楼主有没有空分析下后台,受你的强贴启示,我看了下后台,还是一头雾水亚
感觉后台比前台复杂多了
昵称: lxylxy888666  时间: 2008-03-04 23:44:00
不错的东西,有时间看看
昵称: 闹类硬  时间: 2008-03-05 13:24:00
楼主不更新了
昵称: 逆雪寒  时间: 2008-03-05 16:28:00
.楼主快快更新啊~~~~~~~~
昵称: woyouu  时间: 2008-03-08 15:19:00
楼主老弟怎么不来更新了,不能虎头蛇尾啊,要坚持 呵呵
昵称: osman  时间: 2008-03-10 10:37:00
换了新工作。手里有个比较大的项目。所以暂时还真没时间继续了。请各位谅解
昵称: hahajohn  时间: 2008-03-10 20:37:00
哈哈,LZ头像又换了,换个工作,换个头像
昵称: jingangel  时间: 2008-03-11 14:28:00
楼主辛苦了,特意去注册一个帐号来支持你。祝你新工作一切顺利,奖金多多!
昵称: abc20053608  时间: 2008-03-12 09:54:00
不更新了呀 楼主讲完标签嘛
昵称: jyb21  时间: 2008-03-12 11:02:00
我从第一页一直看到此处,做个标记,呵呵,以后从这里接着看就可以了,
向楼主敬礼!!!
昵称: 逆雪寒  时间: 2008-03-13 02:46:00
谢谢啊!!!学习了/1
昵称: ct_174880859  时间: 2008-03-14 12:12:00
希望那继续
昵称: 蓝克  时间: 2008-03-22 10:05:00
昵称: 宁静致远  时间: 2008-3-22 19:00

版主确实牛人,而且是个好人!
第一章、第二章怎么划分呢?我刚注册,是不是以前发表过前2章?
昵称: realjue  时间: 2008-03-22 11:08:00
学习
昵称: 宁静致远  时间: 2008-03-22 19:00:00
引用:
原帖由 kukat 于 2007-12-28 14:22 发表


这样解释可能好点
a.php




b.php


这样你就不能直接访问 b.php ,会因为 IN_PHPCMS 这个常量没定义而 exit('Access Denied')
不知道这样说和不合适
在举个例子,比如网站的管理后台,有很多页面, ...
这个可怕,那么源码的config.inc.php里面包含了mysql管理员的账号密码,不是轻易取得了?
昵称: richardhc  时间: 2008-03-29 08:14:00
难道. 莫非, 易水寒大哥,  人间蒸发了 ?
昵称: chaguifei  时间: 2008-03-31 17:04:00
楼上大哥。我还在。呵呵。不过新公司真的很忙。继续要看找个时间了。 对不住各位了。
昵称: diego  时间: 2008-03-31 17:05:00
说点PHP以外的,也是我特想说的:LZ,你老婆很漂亮
昵称: aman  时间: 2008-03-31 17:07:00
那当然,要不楼主能放头像上让大家看嘛
昵称: lxydyx  时间: 2008-04-09 13:27:00
up^up   一直等......
昵称: aman  时间: 2008-04-09 15:17:00
复制PHP内容到剪贴板
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);
}


其实这个strip_sql只是在 union select update outfile or  这些关键的词两边加个  空格  而已  并且都转化为小写

[ 本帖最后由 xiaobaby87 于 2008-4-12 10:58 编辑 ]
昵称: xiaobaby87  时间: 2008-04-10 10:19:00
并且,现在代码已经更新成

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 19:20:00
一直期待楼主继续!
昵称: yuanjing_119  时间: 2008-04-12 09:56:00
受益匪浅
昵称: jingangel  时间: 2008-04-12 10:54:00
lz 如此学识 如此胸襟 实开源之幸  phper之幸
偶对lz的敬仰犹如滔滔江水连绵不绝。。。
期待更新中!!!
昵称: xiaobaby87  时间: 2008-04-12 12:52:00
昵称: xiaobaby87  时间: 2008-04-25 13:46:00
还有人顶呀。谢谢各位兄弟了。人呀越来越忙都没时间看PHPCMS的代码了。等吧以后看看再出。谢谢关注了各位
昵称: xiaobaby87  时间: 2008-04-25 14:47:00
昵称: gezhenqiang  时间: 2008-04-29 22:20:00
引用:
原帖由 逆雪寒 于 2008-5-7 09:15 发表
还有人顶呀。谢谢各位兄弟了。人呀越来越忙都没时间看PHPCMS的代码了。等吧以后看看再出。谢谢关注了各位
打算搞一个千斤顶过来天天顶,顶你个底朝天!!!
昵称: zhuweibao  时间: 2008-05-06 14:43:00
昵称: 83064248  时间: 2008-05-07 09:15:00
我下的phpcms为什么和lz分析的这个代码不一样?
昵称: lxydyx  时间: 2008-05-07 17:37:00
本人菜鸟,想请教个问题:
/**
代码讲解分析: 逆雪寒. 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 00:14:00
收藏学习
昵称: henanren  时间: 2008-05-08 18:27:00
关键时刻掉链子!

从一开始你摆那么大架势就知道你弄不完,果然不出所料

有时间把模板简单讲一下吧,这是大家最要用的地方。

不要逐行分析,你那么讲太费劲,不过已经讲过的对初学者抛砖引玉的作用确实很好
昵称: 0110  时间: 2008-05-08 23:45:00
$CONFIG['enablephplog'] ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE);

function phpcms_error($errno, $errmsg, $filename, $linenum, $vars)

在执行这里的时候 调用了 phpcms_error 函数
那这些参数是怎么进去的呢 $errno, $errmsg, $filename, $linenum, $vars
不懂,请教,不要打我啊
昵称: jingangel  时间: 2008-05-21 00:22:00
事事不是绝对。。。寒兄不错。。有时间一定更新。。等待你。。。 。。。
昵称: tqyb  时间: 2008-05-21 12:12:00
看看set_error_handler怎么写的啊
哪个文件里的你也不说清楚
昵称: study  时间: 2008-05-21 13:58:00
小逆应该把流程图先画给大家看
昵称: hahajohn  时间: 2008-05-21 16:29:00
在不更新我越俎代庖了 啊
昵称: fan12  时间: 2008-05-23 11:58:00
非常欢迎,说不定你写得更易懂!!
昵称: ceallan  时间: 2008-05-23 19:42:00
引用:
本人菜鸟,想请教个问题:
/**
代码讲解分析: 逆雪寒. 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语句失效的啊?
请仔细看源代码啊!  $replace_arr = array('  union  ','  select  ','  update  ','
outfile ',' or ');
这里有 & n b s p 的  !!!!!!!!
我想是为了避免 select 这些与 sql语句里的其他字母 写在一起的吧
如:  selectID from  table

[ 本帖最后由 xiaobaby87 于 2008-6-22 09:47 编辑 ]
昵称: grasswen  时间: 2008-05-23 21:56:00
现在还没看完呢,太精彩,我一直想要一个这样的代码分析讲解!!!
谢谢分享!同时希望大大能再发几个着样的代码分析讲解!!
昵称: fan12  时间: 2008-05-30 19:58:00
终于看完了,楼主很强啊!

以前没见过楼主的头像,听大家说得这么 ->神<-
很想见识一下,有空贴出来看看阿!
昵称: 七月十五  时间: 2008-06-21 12:23:00
怎么也得出来个人把这样精华的帖子续个弦啊,楼下的看你了!!!
       难道就没人有这个心思继续下去吗?
昵称: fan12  时间: 2008-06-22 09:45:00
原来早就有高手这么详细的分析PHPCMS了,地球人都知道的帖子我今天才知道
昵称: aman  时间: 2008-06-22 13:49:00
强,这才发现差距!学习中...............
昵称: xiaobaby87  时间: 2008-06-22 14:21:00
这个是个好帖子啊,支持继续更新
昵称: most4  时间: 2008-06-22 15:46:00
引用:
原帖由 coolcool1265 于 2007-12-24 14:20 发表
dz 社区里面有个大哥超级牛的人
把dz分析的差不多了
你可以去找找呵呵
找了半天,找不着!
昵称: most4  时间: 2008-06-23 17:22:00
LZ一定要更新!!!!果然是强人!我要努力!
昵称: xiaobaby87  时间: 2008-06-23 23:36:00
到这儿续:
http://bbs.phpchina.com/thread-70366-1-1.html
昵称: inphpchinasky  时间: 2008-06-26 11:31:00
ding qi
昵称: papaxiong  时间: 2008-07-04 03:42:00

高手果然是高手啊,不能让好贴沉下去
昵称: yzy14533  时间: 2008-07-12 17:14:00
我来做个记号
昵称: dogshasha  时间: 2008-07-22 17:20:00
请问楼主可以在主帖编辑一下,标明后续的讲解内容在哪一楼或者哪一页好不好?
昵称: 如��  时间: 2008-08-06 12:17:00
写得好,只是有些看不明白
昵称: fan12  时间: 2008-08-06 18:37:00