﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-无所惧，无所悔,为梦想执着的拼搏-文章分类-PHPCMS整站代码讲解</title><link>http://www.blogjava.net/DreamFight/category/36571.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 03 May 2009 21:25:54 GMT</lastBuildDate><pubDate>Sun, 03 May 2009 21:25:54 GMT</pubDate><ttl>60</ttl><item><title>phpcms让房产中介交钱</title><link>http://www.blogjava.net/DreamFight/articles/268706.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sun, 03 May 2009 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/268706.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/268706.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/268706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/268706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/268706.html</trackback:ping><description><![CDATA[<div id="postmessage_333136" class="t_msgfont">
<div id="firstpost">在PHPCMS原有系统里面，中介在前台激活后是不用<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%C9%F3%BA%CB">审核</span>就可以在前台发布房产信息的，现在在这儿提供一下程序，实现让中介激活后必须通过管理员的审核才能在前台发表房产信息。<br />
<br />
&nbsp;&nbsp;第一步：在PHPCMS系统<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%BA%F3%CC%A8">后台</span>的会员管理中有个自定义字段，点击添加字段，设置字段属性如图：<br />
[attachimg]38[/attachimg]<br />
&nbsp; &nbsp;第二步：在PHPCMS系统中找到member/admin/templates，在该文件下面新建两个模板，命名分别为member_house_check.tpl.php和member_house_manage.tpl.php。然后具体操作这两个文件。在<font color="red">member_house_check.tpl.php</font>文件中复制会员审核<font color="red">member_check.tpl.php</font>的文件代码：<br />
进行一点点修改成为如下代码：（注意对比批量批准的action这个很重要哟o(&#8745;_&#8745;)o...在文章中我用红色标记，主要就这步，把批量删除这个按钮去掉，因为它们都在会员这块，删除就删除会员了；其它就是一些标题改动了，一看就明了！）
<div class="blockcode"><span class="headactions" onclick="copycode($('code0'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code0">&lt;?php <br />
defined('IN_PHPCMS') or exit('Access Denied');<br />
include admintpl('header');<br />
?&gt;<br />
&lt;body&gt;<br />
&lt;?=$menu?&gt;<br />
&lt;form method="post" name="myform"&gt;<br />
&lt;table cellpadding="2" cellspacing="1" class="tableborder"&gt;<br />
&nbsp;&nbsp;&lt;tr&gt;<br />
&nbsp; &nbsp; &lt;th colspan='10'&gt;待审核会员<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%C1%D0%B1%ED">列表</span>&lt;/th&gt;<br />
&nbsp;&nbsp;&lt;/tr&gt;<br />
&lt;tr align='center'&gt;<br />
&lt;td width="5%" class="tablerowhighlight"&gt;选中&lt;/td&gt;<br />
&lt;td width="5%" class="tablerowhighlight"&gt;ID&lt;/td&gt;<br />
&lt;td width="12%" class="tablerowhighlight"&gt;帐号&lt;/td&gt;<br />
&lt;td width="8%" class="tablerowhighlight"&gt;姓名&lt;/td&gt;<br />
&lt;td width="5%" class="tablerowhighlight"&gt;性别&lt;/td&gt;<br />
&lt;td width="15%" class="tablerowhighlight"&gt;所在地区&lt;/td&gt;<br />
&lt;td width="13%" class="tablerowhighlight"&gt;E-mail&lt;/td&gt;<br />
&lt;td width="12%" class="tablerowhighlight"&gt;注册<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CA%B1%BC%E4">时间</span>&lt;/td&gt;<br />
&lt;td width="10%" class="tablerowhighlight"&gt;注册IP&lt;/td&gt;<br />
&lt;td width="15%" class="tablerowhighlight"&gt;管理操作&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;?php <br />
if(is_array($members))<br />
{<br />
&nbsp; &nbsp; foreach($members as $member){ ?&gt;<br />
&lt;tr align="center" onMouseOut="this.style.backgroundColor='#F1F3F5'" onMouseOver="this.style.backgroundColor='#BFDFFF'" bgColor='#F1F3F5'&gt;<br />
&lt;td&gt;&lt;input type="checkbox" name="userid[]"&nbsp;&nbsp;id="userid[]" value="&lt;?=$member['userid']?&gt;"&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$member['userid']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;a href="&lt;?=$MOD['linkurl']?&gt;member.php?action=show&amp;username=&lt;?=urlencode($member['username'])?&gt;" tar<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=get">get</span>="_blank"&gt;&lt;?=$member['username']?&gt;&lt;/a&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$member['truename']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$genders[$member['gender']]?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$member['province']?&gt;-&lt;?=$member['city']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$member['email']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=date('Y-m-d', $member['regtime'])?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$member['regip']?&gt;&lt;/td&gt;<br />
&lt;td align="center"&gt;<br />
&lt;a href='?mod=&lt;?=$mod?&gt;&amp;file=member&amp;action=view&amp;userid=&lt;?=$member['userid']?&gt;' title="点击查看会员资料&#10最后登录时间：&lt;?=$member['lastlogintime']?&gt;&#10最后登录IP：&lt;?=$member['lastloginip']?&gt;&#10登录次数：&lt;?=$member['logintimes']?&gt;"&gt;查看&lt;/a&gt; | <br />
&lt;a href='?mod=&lt;?=$mod?&gt;&amp;file=member&amp;action=note&amp;userid=&lt;?=$member['userid']?&gt;' title="关于该会员的管理笔记都记在这里"&gt;备注&lt;/a&gt; | <br />
&lt;a href='?mod=&lt;?=$mod?&gt;&amp;file=member&amp;action=edit&amp;userid=&lt;?=$member['userid']?&gt;'&gt;修改&lt;/a&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;?php } <br />
}<br />
?&gt;<br />
&lt;/table&gt;<br />
&lt;table width="100%" height="25" border="0" cellpadding="0" cellspacing="0"&gt;<br />
&nbsp;&nbsp;&lt;tr&gt;<br />
&nbsp; &nbsp; &lt;td width="10%"&gt;&lt;input name='chkall' type='checkbox' id='chkall' onclick='checkall(this.form)' value='checkbox'&gt;全选/反选&lt;/td&gt;<br />
&nbsp; &nbsp; &lt;td&gt;<br />
&lt;input type="submit" name="submit" value="批量批准" onClick="document.myform.action='?mod=&lt;?=$mod?&gt;&amp;file=&lt;?=$file?&gt;&amp;action=check_house&amp;dosubmit=1'"&gt;&nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;table cellpadding="0" cellspacing="0" border="0" width="100%" height="30"&gt;<br />
&nbsp;&nbsp;&lt;tr&gt;<br />
&nbsp; &nbsp; &lt;td align="center"&gt;&lt;?=$pages?&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code></div>
<font color="red"></font><br />
<font color="red"><font color="#000000">在新建的页面</font> member_house_manage.tpl.php </font><font color="#000000">中同样复制<font color="red">member_check.tpl.php</font>文件的代码把代码中的和上面<font color="#ff0000">member_house_check.tpl.php</font></font><font color="#000000">中的代码大体一致只是<font color="#ff0000">action=check_house</font></font><font color="#000000">改为<font color="red">action=oncheck_house</font>OK了同样删除批量删除这个按钮，不然操作之伯会删除会员哟，按钮弄个批量取消批准，呵呵&#8230;&#8230;</font><br />
<font color="#000000">&nbsp; &nbsp; 第三步：在PHPCMS系统中找到member/admin/下找到<font color="red">member.inc.php</font>文件（注意这是关键中的关键哟）</font><br />
&nbsp; &nbsp; 在任何一个break；后面添加如下四个case
<div class="blockcode"><span class="headactions" onclick="copycode($('code1'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code1"><br />
//by xiuling&nbsp;&nbsp;房产审核！&nbsp;&nbsp;<br />
&nbsp;&nbsp;case 'house_check':<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if($dosubmit)<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;$member-&gt;check($userid);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;showmessage($LANG['operation_success'], $forward);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;$page = isset($page) ? intval($page) : 1;<br />
&nbsp; &nbsp;$pagesize = $PHPCMS['pagesize'] ? $PHPCMS['pagesize'] : 30;<br />
&nbsp; &nbsp;$offset = ($page-1)*$pagesize;<br />
&nbsp; &nbsp;$condition = " AND my_house_membertype=2 AND my_house_check=0";<br />
&nbsp; &nbsp;$r = $db-&gt;get_one("SELECT count(*) as num FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.userid=i.userid $condition");<br />
&nbsp; &nbsp;$pages = phppages($r['num'], $page, $pagesize);<br />
&nbsp; &nbsp;$members = $member-&gt;get_list($condition, $page, $pagesize);<br />
&nbsp; &nbsp;include admintpl('member_house_check');<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;break;<br />
//by xiuling&nbsp;&nbsp;批准中介<br />
&nbsp; &nbsp;&nbsp; &nbsp; case 'check_house':<br />
&nbsp;&nbsp;$userids = is_array($userid) ? implode(',', $userid) : $userid;<br />
&nbsp; &nbsp;&nbsp;&nbsp;if(!$userids) showmessage($LANG['select_account'], $PHP_REFERER);<br />
&nbsp;&nbsp;if($dosubmit)<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;$db-&gt;query("UPDATE ".TABLE_MEMBER_INFO." SET my_house_check=1 $sql WHERE userid IN($userids)");<br />
&nbsp; &nbsp;showmessage($LANG['operation_success'], $forward);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;$member = array();<br />
&nbsp; &nbsp;$result = $db-&gt;query("SELECT userid,username FROM ".TABLE_MEMBER_INFO." WHERE userid IN($userids)");<br />
&nbsp; &nbsp;while($r = $db-&gt;fetch_array($result))<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp; $member[$r['userid']] = $r['username'];<br />
&nbsp; &nbsp;}<br />
&nbsp; &nbsp;$groupids = showgroup('select', 'groupid', $groupid);<br />
&nbsp; &nbsp;include admintpl('member_house_check');<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;<br />
//by xiuling&nbsp;&nbsp;房产管理<br />
&nbsp;&nbsp;case 'house_manage':<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if($dosubmit)<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;$member-&gt;check($userid);<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;showmessage($LANG['operation_success'], $forward);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;$page = isset($page) ? intval($page) : 1;<br />
&nbsp; &nbsp;$pagesize = $PHPCMS['pagesize'] ? $PHPCMS['pagesize'] : 30;<br />
&nbsp; &nbsp;$offset = ($page-1)*$pagesize;<br />
&nbsp; &nbsp;$condition = " AND my_house_membertype=2 AND my_house_check=1";<br />
&nbsp; &nbsp;$r = $db-&gt;get_one("SELECT count(*) as num FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.userid=i.userid $condition");<br />
&nbsp; &nbsp;$pages = phppages($r['num'], $page, $pagesize);<br />
&nbsp; &nbsp;$members = $member-&gt;get_list($condition, $page, $pagesize);<br />
&nbsp; &nbsp;include admintpl('member_house_manage');<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;<br />
//by xiuling 批量取消批准<br />
&nbsp; &nbsp;&nbsp; &nbsp; <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;case 'oncheck_house':<br />
&nbsp;&nbsp;$userids = is_array($userid) ? implode(',', $userid) : $userid;<br />
&nbsp; &nbsp;&nbsp;&nbsp;if(!$userids) showmessage($LANG['select_account'], $PHP_REFERER);<br />
&nbsp;&nbsp;if($dosubmit)<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;$db-&gt;query("UPDATE ".TABLE_MEMBER_INFO." SET my_house_check=0 $sql WHERE userid IN($userids)");<br />
&nbsp; &nbsp;showmessage($LANG['operation_success'], $forward);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else<br />
&nbsp; &nbsp;&nbsp;&nbsp;{<br />
&nbsp; &nbsp;$member = array();<br />
&nbsp; &nbsp;$result = $db-&gt;query("SELECT userid,username FROM ".TABLE_MEMBER_INFO." WHERE userid IN($userids)");<br />
&nbsp; &nbsp;while($r = $db-&gt;fetch_array($result))<br />
&nbsp; &nbsp;{<br />
&nbsp; &nbsp; $member[$r['userid']] = $r['username'];<br />
&nbsp; &nbsp;}<br />
&nbsp; &nbsp;$groupids = showgroup('select', 'groupid', $groupid);<br />
&nbsp; &nbsp;include admintpl('member_house_manage');<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;</code></div>
这些代码和会员批量审核和批量取消审核是差不多的，呵呵&#8230;&#8230;只是稍加修改&#8230;&#8230;<br />
<br />
&nbsp;&nbsp;第四步：在member/admin/templates中找到<font color="red">left.tpl.php</font>文件中找到<font color="red">&lt;TBODY style="display:" id="member"&gt;<font color="#000000">在其下面加上如下代码：（注意红色的action和所建两个模板的文件名前部分勿必一样哟）</font><br />
</font>
<div class="blockcode"><span class="headactions" onclick="copycode($('code2'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code2">&nbsp; &nbsp; &lt;tr&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td height="22" bgcolor="#FFFFFF" onMouseOver="this.style.backgroundColor='#F8F8F8'" onMouseOut="this.style.backgroundColor='#FFFFFF'"&gt;&lt;a href="?mod=member&amp;file=member&amp;action=house_check" target="right"&gt;&lt;font color="#FF0000"&gt;审核房产中介&lt;/font&gt;&lt;/a&gt;&lt;/td&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;/tr&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&lt;tr&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td height="22" bgcolor="#FFFFFF" onMouseOver="this.style.backgroundColor='#F8F8F8'" onMouseOut="this.style.backgroundColor='#FFFFFF'"&gt;&lt;a href="?mod=member&amp;file=member&amp;action=house_manage" target="right"&gt;&lt;font color="#FF0000"&gt;房产中介管理&lt;/font&gt;&lt;/a&gt;&lt;/td&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;/tr&gt;</code></div>
<font color="#000000"><br />
好了，看累了吧，呵呵，希望对做房产的朋友挣中介的钱，呵呵，也希望对用PHPCMS建站的朋友对房产这方面的开发与应用有所帮助&#8230;&#8230;<br />
<br />
前台的调用待续，呵呵&#8230;&#8230;这主要是程序工作&#8230;&#8230;<br />
<br />
如有不清楚的，联系我，我们互相交流&#8230;&#8230;<br />
<br />
</font></div>
<script type="text/javascript">var tagarray = ['MySQL','专辑','视频','服务器托管','数据库','版主','站长','网通','安徽','盗链网','后台','搜索','机柜','郑州服务器托管','分享','活动','变量','javascript','daolian','文档','服务器','SEO','征集','网络','技术','基础','解析','时间','首页','微软','T恤','谷歌','历程','中国','Ajax','转换','时间戳','平台','公布','帖子','出售','手册','Sun','类型','知识','专题','账户','授权','语句','SNS','纪念','互联网','笑话','经验','get','数据','审核','设计','盗链','PPT','原则','入门','文化衫','列表','索引','详解','套件','培训','提示','获奖','CSS','策划人','导航','求助','全集','机房','悬赏','长短标题','排名','布尔','二次开发','资源','异步','网站','字符','落伍者','简介','社区','整站程序','用户','大型门户程序','COM','奖励','刘允','组织者','创意者','空白','体验','门户程序','图像'];var tagencarray = ['MySQL','%D7%A8%BC%AD','%CA%D3%C6%B5','%B7%FE%CE%F1%C6%F7%CD%D0%B9%DC','%CA%FD%BE%DD%BF%E2','%B0%E6%D6%F7','%D5%BE%B3%A4','%CD%F8%CD%A8','%B0%B2%BB%D5','%B5%C1%C1%B4%CD%F8','%BA%F3%CC%A8','%CB%D1%CB%F7','%BB%FA%B9%F1','%D6%A3%D6%DD%B7%FE%CE%F1%C6%F7%CD%D0%B9%DC','%B7%D6%CF%ED','%BB%EE%B6%AF','%B1%E4%C1%BF','javascript','daolian','%CE%C4%B5%B5','%B7%FE%CE%F1%C6%F7','SEO','%D5%F7%BC%AF','%CD%F8%C2%E7','%BC%BC%CA%F5','%BB%F9%B4%A1','%BD%E2%CE%F6','%CA%B1%BC%E4','%CA%D7%D2%B3','%CE%A2%C8%ED','T%D0%F4','%B9%C8%B8%E8','%C0%FA%B3%CC','%D6%D0%B9%FA','Ajax','%D7%AA%BB%BB','%CA%B1%BC%E4%B4%C1','%C6%BD%CC%A8','%B9%AB%B2%BC','%CC%FB%D7%D3','%B3%F6%CA%DB','%CA%D6%B2%E1','Sun','%C0%E0%D0%CD','%D6%AA%CA%B6','%D7%A8%CC%E2','%D5%CB%BB%A7','%CA%DA%C8%A8','%D3%EF%BE%E4','SNS','%BC%CD%C4%EE','%BB%A5%C1%AA%CD%F8','%D0%A6%BB%B0','%BE%AD%D1%E9','get','%CA%FD%BE%DD','%C9%F3%BA%CB','%C9%E8%BC%C6','%B5%C1%C1%B4','PPT','%D4%AD%D4%F2','%C8%EB%C3%C5','%CE%C4%BB%AF%C9%C0','%C1%D0%B1%ED','%CB%F7%D2%FD','%CF%EA%BD%E2','%CC%D7%BC%FE','%C5%E0%D1%B5','%CC%E1%CA%BE','%BB%F1%BD%B1','CSS','%B2%DF%BB%AE%C8%CB','%B5%BC%BA%BD','%C7%F3%D6%FA','%C8%AB%BC%AF','%BB%FA%B7%BF','%D0%FC%C9%CD','%B3%A4%B6%CC%B1%EA%CC%E2','%C5%C5%C3%FB','%B2%BC%B6%FB','%B6%FE%B4%CE%BF%AA%B7%A2','%D7%CA%D4%B4','%D2%EC%B2%BD','%CD%F8%D5%BE','%D7%D6%B7%FB','%C2%E4%CE%E9%D5%DF','%BC%F2%BD%E9','%C9%E7%C7%F8','%D5%FB%D5%BE%B3%CC%D0%F2','%D3%C3%BB%A7','%B4%F3%D0%CD%C3%C5%BB%A7%B3%CC%D0%F2','COM','%BD%B1%C0%F8','%C1%F5%D4%CA','%D7%E9%D6%AF%D5%DF','%B4%B4%D2%E2%D5%DF','%BF%D5%B0%D7','%CC%E5%D1%E9','%C3%C5%BB%A7%B3%CC%D0%F2','%CD%BC%CF%F1'];parsetag();</script></div>
<img src ="http://www.blogjava.net/DreamFight/aggbug/268706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-05-03 17:51 <a href="http://www.blogjava.net/DreamFight/articles/268706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文件150-174行代码分析 </title><link>http://www.blogjava.net/DreamFight/articles/248340.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Thu, 25 Dec 2008 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/248340.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/248340.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/248340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/248340.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/248340.html</trackback:ping><description><![CDATA[户大家自己试下。 意会下 <br />
phpcms_auth() 是加密和解密 函数, 因为cookie 是存在于客户端。十分危险呀。 你看连用户的密码也存在cookie 不加密能行吗。但是呢加密后又要能解密。因为用户名和用户密码我们往下操作要 <br />
获取的。 这个函数存在于 global.func.php 文件里面。大家想了解这个算法的自己去看下吧。挺简单的。 其实就是围绕着 $phpcms_auth_key 这个变量来加密解密和discuz 的cookie 机制差不。 <br />
$phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']); 看$PHPCMS['authkey'],估计后台有个 cookie 加密值让你填，然后以这个值和 $_SERVER['HTTP_USER_AGENT'](系统信息) <br />
*/ <br />
$_userid = intval($_userid); <br />
if($_userid &lt; 0) $_userid = 0; //读出的cookie 的用户id 如果是 小于0 <br />
if($_userid) //如果 cookie 保存的这个uid 存在，那么开始按照这个ID来查数据库用户表 来取出用户信息 <br />
{ <br />
$memberinfo = $db-&gt;get_one("SELECT username,password,groupid,arrgroupid,email,chargetype,begindate,enddate,money,point,credit,newmessages FROM ".TABLE_MEMBER." WHERE userid=$_userid LIMIT 0,1"); <br />
/** <br />
phpcms 封装好的数据库类，下篇开讲这个大家就大概看行了。 大家看下 select sql语句。 也可以学习下。 首先最好不要使用 select * from xx 的 * 形式，除非你想获取所有字段的记录。只罗列你要的字段。这样在数据量大的查询中。速度明显上去。 常量： TABLE_MEMBER 定义了表名。这样做有什么好处呢？想都知道了，为了以后变更表名方便而定义为常量。这个东西那里来的。估计在一个文件里面定义好的。遇到了再讲吧懒得找了。 <br />
*/ <br />
if($memberinfo &amp;&amp; $memberinfo['password'] == $_password) //用查询出来的密码和 cookie 中存在的密码想对比.为了在效率： 在比较前 先判断查询是否成功先。很多phper往往忽略。 <br />
{ <br />
if($memberinfo['groupid'] == 2) //如果用户属于的组的ID 为 2 那么这个用户是被管理员禁止访问的了。 <br />
{ <br />
mkcookie('auth', ''); // 清除cookie <br />
showmessage($LANG['userid_banned_by_administrator']); //提示出错菜单 <br />
} <br />
@extract($memberinfo, EXTR_PREFIX_ALL, ''); //又来这招，应该明白了吧各位老大：把字段 变成 我们能直接使用的变量 <br />
unset($memberinfo, $_password, $_answer); <br />
$_arrgroupid = $_arrgroupid ? array_filter(explode(',', $_arrgroupid)) : array(); //把 字段为 arrgroupid 值为 FALSE 过滤掉。array_filter()不带回调参数的用法,请看手册。 <br />
} <br />
else <br />
{ <br />
mkcookie('auth', ''); <br />
} <br />
/** <br />
经过上面的读cookie 和查数据库用户信息后。当确定这个用户信息是合法以后。就会自动登陆了。比如phpchina论坛。当你登陆后没注销。下次访问的时候还是登陆状态。就是这个原理。记得模仿哦 <br />
这里详细解释下 mkcookie ()函数 上菜: <br />
function mkcookie($var, $value = '', $time = 0) <br />
{ <br />
global $CONFIG,$PHP_TIME; <br />
$time = $time &gt; 0 ? $time : (empty($value) ? $PHP_TIME - 3600 : 0); <br />
$s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0; <br />
$var = $CONFIG['cookiepre'].$var; <br />
return setcookie($var, $value, $time, $CONFIG['cookiepath'], $CONFIG['cookiedomain'], $s); <br />
} <br />
$time 为cookie 的存活时间: 如果为 0 就是关闭浏览器 cookie 就自动失效 , $PHP_TIME 在前面定义了：当前时间。 $PHP_TIME -3600 减去3600秒。就是一个小时前的意思，那肯定是设置cookie 失效的意思了。 <br />
$s 变量是 获取 是否开启SSL安全传输的标致。 cookie 有一个参数是ssl传输的。如果服务器已经opensll 了那么我们肯定不能浪费这么好的安全资源了。 <br />
$var cookie名的前缀，主要防止混淆。 <br />
$CONFIG['cookiedomain'] 这个家伙在 config.inc.php里面已经配置的了。定义为: '/' 意思就是说 在当前域 的所有目录的PHP程序都能访问这个COOKIE ，还有限制目录访问COOKIE 的弄法。具体请看 setcookie () 函数手册上说明。 <br />
*/ <br />
<br />
} <br />
} <br />
unset($db_class, $db_file, $phpcms_auth, $phpcms_auth_key, $memberinfo); <br />
<br />
下章我就分析 PHPCMS 的数据库操作类文件和 PHPCMS的文本缓存机制. 希望大家继续支持哦第一
<img src ="http://www.blogjava.net/DreamFight/aggbug/248340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-25 22:03 <a href="http://www.blogjava.net/DreamFight/articles/248340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文件111-149行代码分析 </title><link>http://www.blogjava.net/DreamFight/articles/247243.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Thu, 18 Dec 2008 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/247243.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/247243.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/247243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/247243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/247243.html</trackback:ping><description><![CDATA[PHPCMS['enablebanip'] &amp;&amp; ip_banned($PHP_IP)) showmessage($LANG['administrator_banned_this_IP']); <br />
/** <br />
$PHPCMS['enablebanip']　是什么．不用说应该知道了吧．这个就是后台里面设置是否开启过滤ＩＰ访问的功能．(因为我没用过phpcms，我是按照代码猜的，不对的请指出)从这里就看出了文本缓存也有他的作用的。　ip_banned()函数是什么呢．上菜再说： <br />
function ip_banned($ip) <br />
{ <br />
global $PHP_TIME;　//前面定义过的．当前的时间 <br />
$ipbanneds = cache_read('banip.php'); <br />
if(!is_array($ipbanneds)) return FALSE; <br />
foreach($ipbanneds as $v) <br />
{ <br />
if($v['overtime'] &lt; $PHP_TIME) return FALSE; <br />
if($ip == $v['ip'] || preg_match("/^".str_replace('.', '[.]', $v['ip'])."$/", $ip)) return TRUE; <br />
} <br />
} <br />
里面也用到了 cache_read()　这个函数，还是读banip.php 这个文件．banip.php这个文件里面存着你在后台甚至的要过滤的ＩＰ列表． <br />
里面的逻辑比较简单．自己消化下了．不明白跟帖问 <br />
showmessage() 函数是提示出错信息封装好的一个函数．　国家化的 $LANG['administrator_banned_this_IP']这个看到了吧．这个就是读语言包里面的．这样我们就可以出好多个语言版本的程序拉． <br />
*/ <br />
$TEMP = $MOD = $CHA = $CATEGORY = $CAT = array(); <br />
$ftp = $enableftp = $tags = $html = 0; <br />
/** <br />
初始化变量．这个是好习惯我们要模仿． <br />
*/ <br />
if(!isset($mod)) <br />
{ <br />
$mod = 'phpcms'; //phpcms 是默认加载的模块 <br />
} <br />
elseif($mod != 'phpcms') <br />
{ <br />
isset($MODULE[$mod]) or exit($LANG['module_not_exists']);　//　从缓存中读加载的模块是否开启 <br />
/** <br />
这个写法，我十分喜欢，平时也用． xx &amp;&amp; dd ; xx and dd ;与运算要同时两边都为真整个公式才为真，就是利用这个原理．　； xx || dd ; xx or dd 或运算只要一个条件满足就不会执行下一个条件而继续执行下去．　这样写是不是很酷．　　 <br />
*/ <br />
$MOD = cache_read($mod.'_setting.php'); //开始加载这个模块的一些常用配置数值。 phpcms 对应的每个模块都有一个缓存配置文件。@@ 怪不得速度那么快 <br />
@include PHPCMS_ROOT.'/languages/'.(defined('IN_ADMIN') ? $CONFIG['adminlanguage'].'/'.$mod.'_admin.lang.php' : $CONFIG['language'].'/'.$mod.'.lang.php'); <br />
/** <br />
加载想对应的模块语言包． <br />
*/ <br />
} <br />
if(!isset($forward)) $forward = $PHP_REFERER; //记录前一个URL地址。估计以后下面程序有需要用这个变量 <br />
$dosubmit = isset($dosubmit) ? 1 : 0; //记录是否有表单提交过.也是以后有用 <br />
$channelid = isset($channelid) ? intval($channelid) : 0; //记录当前频道的id 如果$channelid 没有 isset 那么就为 0. intval() 十分有用。数字和数字的比较加减速度会快很多。记得哦 <br />
$skindir = PHPCMS_PATH.'templates/'.$CONFIG['defaulttemplate'].'/skins/'.$CONFIG['defaultskin']; //加载默认phpcms皮肤 <br />
if($PHPCMS['enablegzip'] &amp;&amp; function_exists('ob_gzhandler')) <br />
{ <br />
($CONFIG['phpcache'] || defined('SHOWJS')) ? ob_start() : ob_start('ob_gzhandler'); <br />
} <br />
else <br />
{ <br />
$PHPCMS['enablegzip'] = 0; <br />
ob_start(); <br />
} <br />
/** <br />
$PHPCMS['enablegzip'] 这个变量就是存在于 phpcms_setting.php 文件里。上面已经说过了。每个模块都有相对应的模块配置缓存文件(是从数据库copy过来的信息) 这个变量标致 是否开启 压缩传输。 <br />
压缩传输，听名字就知道。就是把数据按照一定的算法压缩小罗。然后再传送到客户端。这样就可以在有限的带宽中传输更大的数据拉。当然速度快了不少。压缩的数据到了你的浏览器，它就自动解压缩，老版本的一些浏览器不支持解压缩哦。不过现在还有谁用很久的浏览器呢。用法很简单的：看上面就知道： <br />
首先判断下，看客户老大们是否在后台选择了这个模块的压缩传输(如果是的话。自然的已经加载到了相对应的文本缓存文件里面拉) 标致：$PHPCMS['enablegzip'] 和 判断 回调函数 ob_gzhandler 是否开启, ob_gzhandler 其实不算是个函数。看手册说明。 就这么简单。它只是一个专门给 ob_start() 做回调使用的一个参数函数。详细请看下手册。别偷懒哦,在程序开头ob_start('ob_gzhandler')就算是开始压缩传输了;判断完了 如果为真。就继续下面的代码: <br />
<br />
($CONFIG['phpcache'] || defined('SHOWJS')) ? ob_start() : ob_start('ob_gzhandler'); <br />
看代码phpcms 是这样的： 如果用户在后台开启了压缩传输。而用户又开启了 页面缓存。那么就默认不使用压缩传输了。我也不知道为什么这样设计。我测试了下。后台开启压缩传输。又同时又使用页面缓存。没发现有什么问题。@@ <br />
如果没开启压缩传输，那么我们就ob_start(); 使用session 之前必须要 ob_start() ; 而且在ob_start() 之前不能有任何的 头文件发送和输出。比如：echo header等要不会出错的哦。 <br />
*/ <br />
$_userid = 0; <br />
$_username = ''; <br />
$_groupid = 3; <br />
$_arrgroupid = array(); <br />
$phpcms_auth = getcookie('auth'); <br />
/** <br />
$_userid,$_username,$_groupid 这几个记录用户信息的变量初始化，不初始化危险就太大了。@@ 如果给人家$_GET一个 _userid 变量过来。那么就会把我们这个变量覆盖。但是我们如果给这几个变量一个值， <br />
那么按照就近原则。就算你GET个变量过来。你也一样改不了我原来的变量值。大家好好自己想下。就会明白了。 <br />
getcookie() 这个自定义函数在 global.func.php文件里定义的。上菜： <br />
function getcookie($var) <br />
{ <br />
global $CONFIG; <br />
$var = $CONFIG['cookiepre'].$var; <br />
return isset($_COOKIE[$var]) ? $_COOKIE[$var] : FALSE; <br />
} <br />
这个函数用来提取我们设置的cookie 值. $CONFIG['cookiepre'] 在 config.inc.php 文件里面设置，cookie 名的前缀. 函数很简单。一看就明白不说了。 <br />
*/ <br />
if($phpcms_auth) <br />
{ <br />
$phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']); <br />
list($_userid, $_password, $_answer) = $phpcms_auth ? explode("\t", phpcms_auth($phpcms_auth, 'DECODE')) : array(0, '', ''); <br />
/** <br />
<img src ="http://www.blogjava.net/DreamFight/aggbug/247243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-18 23:29 <a href="http://www.blogjava.net/DreamFight/articles/247243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文件73-111行代码分析 </title><link>http://www.blogjava.net/DreamFight/articles/246968.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Wed, 17 Dec 2008 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/246968.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/246968.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/246968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/246968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/246968.html</trackback:ping><description><![CDATA[<div>&lt;?<br />
{ //如果缓存文件存在和缓存没有过期效，那么就返回缓存文件名 <br />
require $cachefile; <br />
exit; <br />
} <br />
} <br />
if($PHP_QUERYSTRING &amp;&amp; preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar)) //获取传递过来的变量。有什么用的呢？请看下面解释 <br />
{ <br />
parse_str(str_replace(array('/', '-', ' '), array('&amp;', '=', ''), $urlvar[1])); <br />
} <br />
} <br />
/** <br />
parse_str:本函数可将浏览器返回的 GET 方法的 QUERY_STRING 字符串解析。返回的变量名及值就依 QUERY_STRING 的名称及值.<br />
上面这部分相对复杂了点。但没关系。慢慢讲解．　首先缓存只针对前台．所以我们一开始就判断．这个脚本是运行在前台的而不是在后台 !defined('IN_ADMIN') 来判断． <br />
然后呢．再看客户配置 config.inc.php文件是否开启了缓存．　==2 就是开启了．　．接着开始用一系列的规则来找出缓存的文件名和目录： 以 脚本名：xx.php和后续传递的参数 ?xx=ee&amp;bb=jj 他两的字符窜的MD5　.以这个md5窜来定义出了缓存目录．和缓存文件　．接着再判断这个缓存文件是否存在和是否没过缓存有效期．如果没有就返回这个缓存文件的名字. <br />
然后到主菜了．　最后一个if逻辑是做什么的呢?　不知道大家有没见过　这样的网址：http://www.beihai.com/dd.php/xx－23/cc-22.html 　他们其实都算是伪静态．优化ＵＲＬ用的．咋看起来还很象静态．爽． 但你可能想．这样的地址．我们写ＰＨＰ程序的．怎么获取get 变量呢？　　最后if 就是解答这个问题的．　先剥离url来获取　 传递的字符窜.然后　str_replace 来把 '/' '-' 替换成标准的 '&amp;' '=' 好象: 　http://www.beihai.com/dd.php&amp;xx=23&amp;cc=22　 看这样你应该看明白了吧．然后用 parse_str() 函数来把xx 变　$xx=23 cc　变　$cc=22 php真是什么都给你想到了．强．看明白了吧．ＯＫ．过了． </div>
<div>&nbsp;</div>
<div><br />
恩.终于把common.inc.php 这个文件大概讲解完了. 这个文件里面包含了很多东西.都是些挺不错的思想.大家应该好好学习.这样我们写出来的PHP程序会更加强壮. <br />
,偶现在晚上都在边陪老婆边看电影边弄linux 的C,还是学习 阶段 所以时间有点紧.白天在公司挤点时间出来分析代码罗. </div>
<div>&nbsp;</div>
<div>对于phpcms 我也是第一次接触.以前没装过也没用过.现在也没详细用过.所以我看到代码讲什么我就讲什么.没具体讲PHPCMS的应用等.希望理解. </div>
<div>&nbsp;</div>
<div>如果我分析代码分析得不合理.请指出.功能进步学习.谢谢复制PHP内容到剪贴板PHP代码: */ <br />
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php';　//　包含数据库操作类,下章详说 <br />
require PHPCMS_ROOT.'/include/tag.func.php'; 　//遇到再说 <br />
require PHPCMS_ROOT.'/include/extension.inc.php';　//遇到再说 <br />
$db = new $db_class;　　　//　实例化数据库类 <br />
$db-&gt;connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']); //连接数据库＠＿＠ <br />
$db-&gt;iscache = $CONFIG['dbiscache'];　//是否开启ＳＱＬ缓存 <br />
$db-&gt;expires = $CONFIG['dbexpires'];　//缓存时间 <br />
if(!cache_read('table.php')) <br />
{ <br />
require_once PHPCMS_ROOT.'/include/cache.func.php'; <br />
cache_all(); //生成所有缓存 <br />
} <br />
/** <br />
cache_read() 函数　读缓存文件函数存在 global.func.php　里面．上菜先： <br />
function cache_read($file, $mode = 'i') <br />
{ <br />
$cachefile = PHPCMS_CACHEDIR.$file; <br />
if(!file_exists($cachefile)) return array(); <br />
return $mode == 'i' ? include $cachefile : file_get_contents($cachefile); //这一步是用来判断是不是本站内模块，如果没有传入值的话就调用这个缓存，反之则得到他的内容。<br />
} <br />
就这么简单．文本缓存，在一些大的开源的ＰＨＰ项目中经常见到．主要是为了减轻数据库的负荷的． 比如在程序启动文件里面，就把一些后台配置的常用信息缓存到php文件里面．然后在以后的程序就可以直接使用而不用每次都访问数据库了．但对经常要更新的信息．最好不要用文本缓存这形式，因为ＰＨＰ文件内置的文件锁flock()不是很好用．大系统中多用户同时写访问的时候有可能会把缓存文件破坏．大系统建议使用 memcached 　mysql5.1 分区　　mysql 主从　来实现负载均衡　@=@　废话太多了．　这个函数很简单．自己看下就明白了．如果缓存和模式变量 $mode 是否为 i 是就include 不是就　把文件以字符窜形式读到内存中． <br />
如果 cache_read()找不到缓存文件'table.php'就会返回false，那么就　加栽 cache.func.php 　文件．它里面是些创建缓存的一些函数. 然后呢执行 cache_all()函数生成所有的常用信息缓存． <br />
关于phpcms 的缓存更详细包括生成原理．打算在弄完启动文件common.inc.php 后再开篇写个详细的．　　 <br />
*/ <br />
$CACHE = cache_read('common.php'); <br />
/** <br />
加载　common.php　缓存文件里面的变量(数据)　这样我们不用从数据库读了每次．是吧 <br />
common.php 文件里面是什么来的呢？上菜： <br />
&lt;?php <br />
return array ( <br />
'module' =&gt; <br />
array ( <br />
'phpcms' =&gt; <br />
array ( <br />
'module' =&gt; 'phpcms', <br />
'name' =&gt; 'phpcms', <br />
'iscore' =&gt; '1', <br />
'iscopy' =&gt; '0', <br />
'isshare' =&gt; '0', <br />
'moduledir' =&gt; '', <br />
'linkurl' =&gt; '', <br />
), <br />
'member' =&gt; <br />
array ( <br />
'module' =&gt; 'member', <br />
'name' =&gt; '会员', <br />
'iscore' =&gt; '1', <br />
'iscopy' =&gt; '0', <br />
'isshare' =&gt; '0', <br />
'moduledir' =&gt; 'member', <br />
'linkurl' =&gt; '/phpcms/member/', <br />
), <br />
'article' =&gt; <br />
array ( <br />
'module' =&gt; 'article', <br />
'name' =&gt; '文章', <br />
'iscore' =&gt; '0', <br />
'iscopy' =&gt; '1', <br />
'isshare' =&gt; '0', <br />
'moduledir' =&gt; 'article', <br />
'linkurl' =&gt; '', <br />
) <br />
?&gt; <br />
看到了吧．这个就是全部从数据库里面生成的文本缓存信息．我们不用每次都连接数据库读数据库．而只要访问里面的数组就可以得到一些配置信息． <br />
这个就是文本缓存的作用了，至于怎么会生成这个文本缓存文件的．我会另外开一篇来介绍。 <br />
*/<br />
$MODULE = $CACHE['module'];　//把缓存中的数据（common.php）存放到数组中。 <br />
$CHANNEL = $CACHE['channel']; <br />
$PHPCMS = $CACHE['phpcms']; <br />
$FIELD = $CACHE['field']; <br />
unset($CACHE, $ipmatches, $CONFIG['timezone'], $CONFIG['cachedir'], $CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['pconnect'], $CONFIG['dbiscache'], $CONFIG['dbexpires']); <br />
/** <br />
unset 掉不需要用的变量． <br />
*/ </div>
<div>&nbsp;</div>
<div>?&gt;<br />
</div>
<img src ="http://www.blogjava.net/DreamFight/aggbug/246968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-17 21:33 <a href="http://www.blogjava.net/DreamFight/articles/246968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文件23-73行代码分析</title><link>http://www.blogjava.net/DreamFight/articles/245369.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Tue, 09 Dec 2008 15:25:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/245369.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/245369.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/245369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/245369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/245369.html</trackback:ping><description><![CDATA[<div>&lt;?php<br />
/*生成错误日志呢？这里phpcms 作者是动态生成一个ＸＭＬ文件来做错误日志的。不错不错. 他使用了 in_array() 函数来实现（因为比较简单，自己理解下）in_array()函数是检查数组中是否存在某个值，只记录　E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE 这三个级别的错误日志信息。\n 是文本换行符　　\t是制表符. 这里他使用了一个比较漂亮而不常用的函数 wddx_serialize_value () wddx 其实也是一种　xml 。　wddx_serialize_value()　这个函数就是把一般变量以ＸＭＬ格式输出。这样我们就不用自己模拟写xml了。方便吧。呵呵 第一个参数就是：　要格式输出的变量，第二个参数是输出的xml的介绍信息. 下面就是 error_log() 函数。这个函数十分有用了。就是生成错误日志ＸＭＬ文件。不需要我们fopen 了。方便吧。它还有很多功能。详细的看手册。chmod 设置日志文件的权限是　可读可写可执行。　　在php5中。我习惯使用 extends　Exception　来定义自己的出错信息。所以很少用 set_error_handle(). 如果没开启日志功能。那么　error_reporting(E_ERROR | E_WARNING | E_PARSE)　就运行了。他的作用是：配置错误信息回报的等级。这是我从手册中找出来的，参考一下。<br />
E_WARNING 通常都会显示出来，但不会中断程序的执行。这对除错很有效。例如：用有问题的正则表达式呼叫 ereg()。 <br />
E_ERROR 通常会显示出来，亦会中断程序执行。意即用这个遮罩无法追查到内存配置或其它的错误。 <br />
E_PARSE 从语法中解析错误。 <br />
E_CORE_ERROR 类似 E_ERROR，但不包括 PHP 核心造成的错误。 <br />
E_CORE_WARNING 类似 E_WARNING，但不包括 PHP 核心错误警告。 <br />
他的作用是把一般出错信息输出过来。 */<br />
if($CONFIG['sessionsavepath']) session_save_path($CONFIG['sessionsavepath']); <br />
/** <br />
定义session 的存储路径，session 其实　也是cookie 不过 session 是实现在服务器端的。安全但负载重点。这样做的好处？效率很好。如果你在虚拟主机的话。大家的session cookie 都放在了php.ini里面设置的默认地方。文件夹臃肿就会慢罗。是吧。第二就是安全罗。　记得一定要定义在 session_start()函数之前 <br />
*/ <br />
session_start(); <br />
if(function_exists('date_default_timezone_set')) date_default_timezone_set($CONFIG['timezone']); <br />
/** <br />
php5开始有时区的概念了。记得就行 <br />
*/ <br />
header('Content-type: text/html; charset='.$CONFIG['charset']); <br />
/** <br />
&nbsp;* <span style="color: red">标头 (header) 是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字符串，在标头与 HTML 文件之间尚需空一行分隔。<br />
设置页面编码. 　php编码有：　页面编码。数据库编码。文件内码。如果三码相同就一般不会出现乱码.　文件内码是什么呢？每个文件都有自己的内部编码。一般都用ＵＴＦ８比较爽。怎么改变文件内码？你用ＤＷ也行　　ＵＥ　也行。随便。　数据库编码那肯定是要指定的了。mysql5开始也有字符集模式这个最好也设置这样可以兼容更多平台。</span> <br />
页面编码：&lt;meta http-equiv="Content-Type" c /&gt;　　这句就是。一般的ＨＴＭＬ头文件都有。那 还需要header('Content-type: text/html; charset='.$CONFIG['charset']);吗？　　其实需要的。因为有些自己写的提示层呀。或是文件里没指定页面编码的。就很容易出现乱码那么我们就防范于未然。 header 一个编码过去。那就ＯＫ了。多好。 <br />
*/ <br />
if(getenv('HTTP_CLIENT_IP') &amp;&amp; strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) <br />
{ <br />
$PHP_IP = getenv('HTTP_CLIENT_IP'); <br />
} <br />
elseif(getenv('HTTP_X_FORWARDED_FOR') &amp;&amp; strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) <br />
{ <br />
$PHP_IP = getenv('HTTP_X_FORWARDED_FOR'); <br />
} <br />
elseif(getenv('REMOTE_ADDR') &amp;&amp; strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) <br />
{ <br />
$PHP_IP = getenv('REMOTE_ADDR'); <br />
} <br />
elseif(isset($_SERVER['REMOTE_ADDR']) &amp;&amp; $_SERVER['REMOTE_ADDR'] &amp;&amp; strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) <br />
{ <br />
$PHP_IP = $_SERVER['REMOTE_ADDR']; <br />
} <br />
preg_match("/[\d\.]{7,15}/", $PHP_IP, $ipmatches); //进行正则表达式匹配<br />
$PHP_IP = $ipmatches[0] ? $ipmatches[0] : 'unknown'; <br />
/** <br />
函数　getenv() 是获取环境变量。环境变量：HTTP_CLIENT_IP 是获取客户端的ＩＰ　。但有可能人家是通过代理来访问你的程序的呢。那么这时候就要用 环境变量： <br />
HTTP_X_FORWARDED_FOR 了。包括getenv('REMOTE_ADDR')　$_SERVER['REMOTE_ADDR']&nbsp;&nbsp; 都是获取人家ＩＰ的。反正碰罗。碰到那个能获取就大工告成。 <br />
*/ <br />
$PHP_TIME = time(); <br />
$PHP_SELF = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : (isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : $_SERVER['ORIG_PATH_INFO']); <br />
/** <br />
获取当前运行的脚本名: 　刚开始看是不是有点乱呢。　咋没用if else 呢。 看这样的东西。我们最好从右看到左。这样比较好明白点。$_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF'] $_SERVER['ORIG_PATH_INFO'] 这三个服务器全局变量都是获取　当前脚本名的。主要看服务器当前环境了。那个存在的就获取那个。 <br />
isset() 函数　十分有用。　测试一个变量是否已经定义。　注：　$a= NULL ; isset($a) 这样会返回false的哦。　注意　isset 和empty 两个函数的用法。用得不好会出大问题的。自己看手册。　　 <br />
*/ <br />
$PHP_QUERYSTRING = $_SERVER['QUERY_STRING']; <br />
$PHP_DOMAIN = $_SERVER['SERVER_NAME']; //获取服务器的名字。<br />
$PHP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; //获取访问的url包括文件名。<br />
$PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';　//测试服务器是否启动了ssl 连接如果是的话。就用https://安全连接来进行通信<br />
$PHP_PORT = $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT']; <br />
$PHP_SITEURL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.PHPCMS_PATH; <br />
$PHP_URL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.$PHP_SELF.($PHP_QUERYSTRING ? '?'.$PHP_QUERYSTRING : ''); <br />
/** <br />
获取当前脚本的ＵＲＬ <br />
*/ <br />
$db_file = $db_class = 'db_'.$CONFIG['database']; <br />
if(!defined('IN_ADMIN'))　//如果不是在后台。　常量　IN_ADMIN 是后台标志 <br />
{ <br />
if($CONFIG['dbiscache']) $db_file .= '_cache'; <br />
if($CONFIG['phpcache'] == '2')　// 如果在config.inc.php 里面开启了缓存 <br />
{ <br />
$cachefileid = md5($PHP_SELF.'?'.$PHP_QUERYSTRING); //把脚本名和后面的get信息　md5加密，以此来生成下面的缓存目录和缓存文件 <br />
$cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/';　//缓存目录 <br />
$cachefile = $cachefiledir.$cachefileid.'.html';　//缓存文件：　xxx.html 格式　 <br />
if(file_exists($cachefile) &amp;&amp; ($PHP_TIME &lt; @filemtime($cachefile) + $CONFIG['phpcacheexpires'])) </div>
<div>&nbsp;</div>
<div>//filemtime("file")这个函数是求得文件最后修改的时间的，$CONFIG['phpcacheexpires'])是系统设置的缓存在机器上存贮的时间，所以这两个时间加起来就是缓存文件实际的生存时间了。</div>
<div>&nbsp;</div>
<div>?&gt;<br />
</div>
<img src ="http://www.blogjava.net/DreamFight/aggbug/245369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-09 23:25 <a href="http://www.blogjava.net/DreamFight/articles/245369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文件21-32行代码分析</title><link>http://www.blogjava.net/DreamFight/articles/245363.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Tue, 09 Dec 2008 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/245363.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/245363.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/245363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/245363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/245363.html</trackback:ping><description><![CDATA[<div>&lt;?php<br />
/*步。 <br />
哈哈。我们要懂模仿。 */</div>
<div>&nbsp;</div>
<div>@extract($_POST, EXTR_OVERWRITE); <br />
@extract($_GET, EXTR_OVERWRITE); <br />
/** <br />
嘿。 extract 前面加个 @鸡蛋做什么呢？？抑制错误的。还不懂的话。自己百度了。 <br />
为什么用extract()函数呢. 他就是把$_GET、$_POST中的内容变成变量的形式，平时我们程序 是不是要常使用 $_POST $_GET来获取传递的变量呀。是不是感觉贼麻烦呀。 <br />
比如 $_POST['xx'] 这样接受是挺好。但写多了很麻烦是吧。我是感觉麻烦。我现在想直接就 $xx就可以获取传递过来的东西。那怎么办呢。 <br />
就用了 extract()函数来实现这么一个技巧。参数：EXTR_OVERWRITE的意思是如果有冲突，覆盖已有的变量。 这个技巧在discuz 论坛上也有应用。 <br />
*/ <br />
unset($_POST, $_GET); <br />
/** <br />
unset() 好处不用说了吧。 释放 $_POST $_GET 数组 ，因为已经不需要他们了。&nbsp; <br />
明天放假了．今天在写点罗．放假没空写了．要陪老婆，大家看了有什么不明白的．可以跟帖问．我懂的我会回答．谢谢 <br />
继续：： </div>
<div>&nbsp;</div>
<div>2007-12-21 </div>
<div>&nbsp;</div>
<div>吃完中午开始分析了点代码．时间不多．复制PHP内容到剪贴板PHP代码: */<br />
&nbsp;<br />
require PHPCMS_ROOT.'/config.inc.php'; <br />
/** <br />
加裁整站的配置参数文件。一般的程序都会有这个文件。做什么的呢？比如一些数据库连接地址。用户名，密码等。需要用到的参数都定义在这个文件里面。这样以后配置变了。我们只要改动下这个文件里面的 <br />
变量值就好。是不是很方便呢。呵呵. 在这里说下 require() 这个加载函数。 require 和 include 都是用来加载其他PHP文件用的。但他们是有区别的。 require 函数：是"预解释"函数。就是程序一加载，就执行了require函数。而include 呢。是个过程加载函数。我们可以在逻辑里比如：　if 里面使用include 来动态的加载其他程序片段。而require 就不行。<br />
*/ <br />
require PHPCMS_ROOT.'/languages/'.$CONFIG['language'].'/phpcms.lang.php'; <br />
/** <br />
顾名思义：　这个就是加载语言包了。ＰＨＰ的国际化目前做得最多的。就是直接用ＰＨＰ文件来实现。　在 phpcms.lang.php 文件里面定义程序中要用到的中文信息。然后在程序一开始就加载。那里程序里面 <br />
就可以使用这个文件里面的变量和一切。那么就简单了。模板上就不需要直接写中文信息了。直接用这个文件里面定义的变量等来替换。从而实现国际化。over!!!最好自己打开这个语言文件再加上自己思考下。就知道。原来如此简单。 <br />
*/ <br />
define('PHPCMS_PATH', $CONFIG['rootpath']); <br />
define('PHPCMS_CACHEDIR', $CONFIG['cachedir']); <br />
/** <br />
$CONFIG['rootpath'] 这个就是全局配置文件　config.inc.php 文件里面数据库信息。等全部配置信息。在这里把他们定义为　常量。　为什么需要定义为常量呢。因为作者感觉这样写爽罗。呵呵。其实因为后面 <br />
用到这两个变量多。所以干脆定义为常量。方便使用。再多说一个技巧：　$CONFIG['rootpath'] 其实也可以写成　$CONFIG[rootpath] 但是最好不要这样。为什么呢。因为ＰＨＰ引擎会先判断 rootpath 是不是常量。如果不是才会认定 　　　$CONFIG[rootpath] 是数组。　这样性能上就差了一点点了。　再多说一个技巧：　为什么程序多数都用　''　单引号呢而不用 "" 双引号呢。因为这样效率好, "" 双引号。 <br />
php引擎还会先检查里面是否有变量，如果有就解释。而 '' 单引号不会做这一步的检查。而直接就当成字符窜了。所以效率上也会有一点点影响哦。 <br />
*/ <br />
$CONFIG['enablephplog'] ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE); <br />
/*$CONFIG['enablephplog'] 是否开启错误日志设置。这个设置在全局配置文件里面.config.inc.php 。　这里使用了　三目运算符　　　偶最喜欢用了。一些简短的逻辑判断。可以使用　? : ；　来实现比较简洁 <br />
set_error_handler() 这个函数就大有来头了。php4里面的典型自定义程序出错后行为的一个函数。十分好用。怎么用呢？ set_error_handler(函数)　的参数也是一个函数。这个函数。反映了程序出错后行为的。 <br />
phpcms_error 函数存在，set_error_handler就是用用户自定义的错误处理函数来处理程序中的错误，phpcms_error 在global.func.php 全局函数里面。<br />
*/</div>
<div>&nbsp;</div>
<div>function phpcms_error($errno, $errmsg, $filename, $linenum, $vars) <br />
{ <br />
$filename = str_replace(PHPCMS_ROOT, '.', $filename); <br />
$filename = str_replace("\\", '/', $filename); // 　把win平台的 \\　换成　　/兼容常见系统的路径 <br />
if(!defined('E_STRICT')) define('E_STRICT', 2048); <br />
$dt = date('Y-m-d H:i:s'); <br />
$errortype = array (　　 <br />
E_ERROR =&gt; 'Error', <br />
E_WARNING =&gt; 'Warning', <br />
E_PARSE =&gt; 'Parsing Error', <br />
E_NOTICE =&gt; 'Notice', <br />
E_CORE_ERROR =&gt; 'Core Error', <br />
E_CORE_WARNING =&gt; 'Core Warning', <br />
E_COMPILE_ERROR =&gt; 'Compile Error', <br />
E_COMPILE_WARNING =&gt; 'Compile Warning', <br />
E_USER_ERROR =&gt; 'User Error', <br />
E_USER_WARNING =&gt; 'User Warning', <br />
E_USER_NOTICE =&gt; 'User Notice', <br />
E_STRICT =&gt; 'Runtime Notice' <br />
); <br />
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); <br />
$err = "&lt;errorentry&gt;\n"; <br />
$err .= "\t&lt;datetime&gt;" . $dt . "&lt;/datetime&gt;\n"; <br />
$err .= "\t&lt;errornum&gt;" . $errno . "&lt;/errornum&gt;\n"; <br />
$err .= "\t&lt;errortype&gt;" . $errortype[$errno] . "&lt;/errortype&gt;\n"; <br />
$err .= "\t&lt;errormsg&gt;" . $errmsg . "&lt;/errormsg&gt;\n"; <br />
$err .= "\t&lt;scriptname&gt;" . $filename . "&lt;/scriptname&gt;\n"; <br />
$err .= "\t&lt;scriptlinenum&gt;" . $linenum . "&lt;/scriptlinenum&gt;\n"; <br />
if (in_array($errno, $user_errors)) <br />
{ <br />
$err .= "\t&lt;vartrace&gt;" . wddx_serialize_value($vars, "Variables") . "&lt;/vartrace&gt;\n"; <br />
} <br />
$err .= "&lt;/errorentry&gt;\n\n"; <br />
echo $err; <br />
error_log($err, 3, PHPCMS_ROOT.'/data/php_error_log.xml'); <br />
chmod(PHPCMS_ROOT.'/data/php_error_log.xml', 0777); <br />
} <br />
/*就是这个鸟蛋。　现在我们慢慢来干掉他。呵呵　 这个自定义出错信息函数默认带有四个参数。　第一个参数　$errno 是程序出错的等级。　第二参数是程序出错的界面信息。第三是出现错误的程序文件名。 <br />
第四是　第几行出现错误。第五个参数。要不要都行是当前变量状态的快照.看吧。我们有这些信息后。想定义怎么样的错误信息给客户看都很容易了是吧？但现在我们是要上一<br />
*/<br />
?&gt;</div>
<img src ="http://www.blogjava.net/DreamFight/aggbug/245363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-09 22:42 <a href="http://www.blogjava.net/DreamFight/articles/245363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文件1-20行代码分析</title><link>http://www.blogjava.net/DreamFight/articles/245352.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Tue, 09 Dec 2008 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/245352.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/245352.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/245352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/245352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/245352.html</trackback:ping><description><![CDATA[<div>
<div>
<div>/*从今天开始.我会一有时间就对PHPCMS 整站的代码做一个详细的分析.目的很简单.让大家都能在phpchina 里面得到进步. </div>
<div>&nbsp;</div>
<div>谢谢. 代码讲解分析全部是本人.按照本人的知识水平来讲解.如果有说得不对的.请指正.也欢迎指正.大家一起进步.谢谢 </div>
<div>&nbsp;</div>
<div>希望大家支持哦 </div>
<div>&nbsp;</div>
<div>首先我对 PHPCMS 的 头程序文件开始讲解 : include/common.inc.php 这个文件是程序启动的核心文件.复制PHP内容到剪贴板PHP代码: <br />
*/<br />
&lt;?php <br />
/** <br />
代码讲解分析： DreamFight <br />
*/ <br />
$mtime = explode(' ', microtime()); <br />
$phpcms_starttime = $mtime[1] + $mtime[0]; <br />
/** <br />
microtime() 当前 Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。如果调用时不带可选参数，本函数以 "msec sec" 的格式返回一个字符串，其中 sec 是自 Unix 纪元（0:00:00 January 1, 1970 GMT）起到现在的秒数，msec 是微秒部分。字符串的两部分都是以秒为单位返回的。 <br />
在windows下他的反回结果是这样的形式：0.70312700 1230216275。<br />
explode(separator,string,limit)函数把字符串分割为数组。<br />
参数 描述 <br />
separator 必需。规定在哪里分割字符串。 <br />
string 必需。要分割的字符串。 <br />
limit 可选。规定所返回的数组元素的最大数目。 </div>
<div>&nbsp;</div>
<div>前边这两行的代码主要就是计算脚本开始运行的时间。很常见的写法。最后结算还在程序运行的终点位置。讲到了在给各位说。 <br />
*/ <br />
unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS); <br />
/** <br />
把 $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL 因为php4.1.0以上默认以 $_POST 来替代。unset后防止程序运行在低版本会出现安全等问题。比如变量注入 <br />
*/ <br />
set_magic_quotes_runtime(0); <br />
/*<br />
在php.ini的配置文件中，有个布尔值的设置，就是magic_quotes_runtime,当它打开时，php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。<br />
% S* i; @; k! D- n" p0 k. {7 Q* ~9 U1 i$ Y&amp; {' d4 R2 ]<br />
当然如果重复给溢出字符加反斜线，那么字符串中就会有多个反斜线，所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。. i% @5 ]' C&nbsp; N8 W. C4 u8 p<br />
6 a; Y" {6 W' H# _! o&nbsp; h. Z<br />
为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测设置状态秋决定是否要手工处理，或者在开始（或不需要自动转义的时候）用set_magic_quotes_runtime(0)关掉。&amp; O* W6 <br />
地球人都知道。就是关了字符窜入库自动转意 比如 my name is on'x 转成 my name is on \'x 为了最大的程序性能所以我们关掉吧~哈哈 <br />
*/<br />
define('IN_PHPCMS', TRUE); <br />
/** <br />
程序入口标记。为什么需要这个东西呢。就好比你进一个小区，保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。 <br />
防止你翻墙进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ，然后我在其他程序文件里面检查这个标记。如果不存在或不为真， <br />
那么就基本可以肯定你这个家伙是个小偷来的。 人可能翻墙进入。但程序怎么翻墙呢。只要在php.ini文件里面激活 allow_url_fopen选项，include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。 <br />
*/ <br />
define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8))); <br />
/** <br />
dirname(dirname(__FILE__));得到的是文件上一层目录名.因为common.inc.php是在include文件夹中的，所以dirname(dirname(__FILE__))的反回地址就是：你的phpcms所在的目录＋include,这里它做了substr(dirname(__FILE__), 0, -8))这么个处理，就去掉了include 所以得到的就是你这个phpcms所在机器上的目录了。<br />
要主意substr(dirname(__FILE__), 0, -8))它所得到的目录的路径是是带\的这样是在浏览器中访部一到的所在要把所有的\转成/.<br />
为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这样做哦 <br />
*/ <br />
require PHPCMS_ROOT.'/include/global.func.php'; <br />
/** <br />
包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。 常量 PHPCMS_ROOT 已经发挥作用。 这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。 <br />
自己好好理解下。。。。。 <br />
global.func.php这个页面等后边用到的时候来一一讲解。<br />
*/ <br />
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i"); <br />
/** <br />
("/ union /i") 这个是正则的写法？不懂正则的自己百度找教程来学。 这里不详细说了 <br />
*/ <br />
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or '); <br />
/** <br />
看这个意思很明了。 union ：连接两条SQL语句。 outfile : 主要用来导出数据库资料到其他介质上。 <br />
干啥要定义这两个变量呢？ 在 global.func.php 文件(前面已经加载)里面有个函数 strip_sql() 各位可以看下。 <br />
function strip_sql($string) <br />
{ <br />
global $search_arr,$replace_arr; <br />
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string); <br />
} <br />
函数里面定义了这两个变量为 global全局变量。 那么函数里就可以直接使用了。 先讲解下这个函数吧。 顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。 <br />
主要过滤那些SQL语句呢。 主要是这几个关键字: union select update outfile or 等。因为这几个SQL字是极度容易在$_GET传输中给截注. <br />
这个函数写得实在精妙。 is_array 来判断 $string 是否为数组。如果 是 就 array_map() 函数来递归过滤 <br />
当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了，因为$string已经不是数组而是字符窜。所以 执行 preg_replace()函数。这个函数很好理解了。就是替换了。 <br />
这个函数的作用就是把$_POST中的内容用一个strip_sql的方法来处理，<br />
**/ <br />
$_POST = strip_sql($_POST); <br />
$_GET = strip_sql($_GET); <br />
$_COOKIE = strip_sql($_COOKIE); <br />
/** <br />
使用strip_sql()函数来过滤 $_POST $_GET $_COOKIE; <br />
一般不是开源的站。很少过SQL关键字过滤。不过这个也是冒很大风险的。 <br />
来说一下strip_sql这个函数，它和里边的array_map函数一起实现了这个函数的递归调用，以来实现字符的替换。<br />
**/ <br />
unset($search_arr, $replace_arr); <br />
/** <br />
unset 使用过但以后不需要的变量。这个是很好的习惯。第一不会浪费内存。如果变量存了大量的数据字节，而后你的程序是一直不需要用的。那么 <br />
就会很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉。 <br />
*/ <br />
$magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()检测gpc是否系统自动转意。 gpc 是什么呢？ GET POST COOKIE 来来去去就这几个东西罗。会返回 真或假 <br />
if(!$magic_quotes_gpc) <br />
{ <br />
$_POST = new_addslashes($_POST); <br />
$_GET = new_addslashes($_GET); <br />
} <br />
/** <br />
判断一下系统是否打开了自动对gpc进行转意这个选择。如果是的话，就不需要我们自动转意了。如果不是那么还是要老百姓的手段。自己动手丰衣足食。 <br />
来看下也是在global.func.php 文件里面定义的这个函数： 其实是一个封装好的php的 addslashes() 函数的函数。PHP都自己有了为什么还要自己封装成函数呢？ <br />
理由很简单。为了以后的扩展更改容易罗。如果我们一开始就全部用 addslashes() 这个函数来对 ' 进行转意的话。那么以后随着程序的发展。我可能想多过滤个 ^ * ( )之类的 <br />
那如何是好呢？所以为了以后孩子的成长。我们还是最好封起来吧。 记住：以后有可能会边的东西。最好都封装成模块。函数 。类。 这样程序的灵活度就上去了。下面我们就来品一下<br />
这个函数。 <br />
function new_addslashes($string) <br />
{ <br />
if(!is_array($string)) return addslashes($string); <br />
foreach($string as $key =&gt; $val) $string[$key] = new_addslashes($val); <br />
return $string; <br />
} <br />
首先判断是不是数组，如果不是那么把该值用作addslashes()的参数，进行转意，并返回。<br />
如果是数组那么一次取出该数组中的值来让它转意。<br />
这个函数也是写得贼好。也是同时考虑过滤 字符窜或数组，也是使用了 传归。看下就应该明白了吧。这个不用说了。我们要学下这个思路这个方法方式哦。这样才能进 <br />
*/</div>
</div>
</div>
<img src ="http://www.blogjava.net/DreamFight/aggbug/245352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-09 22:19 <a href="http://www.blogjava.net/DreamFight/articles/245352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>