??xml version="1.0" encoding="utf-8" standalone="yes"?>色婷婷亚洲一区二区三区,亚洲黄色网址大全,亚洲AV福利天堂一区二区三http://www.tkk7.com/DreamFight/category/36571.htmlzh-cnSun, 03 May 2009 21:25:54 GMTSun, 03 May 2009 21:25:54 GMT60phpcms让房产中介交?/title><link>http://www.tkk7.com/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.tkk7.com/DreamFight/articles/268706.html</guid><wfw:comment>http://www.tkk7.com/DreamFight/comments/268706.html</wfw:comment><comments>http://www.tkk7.com/DreamFight/articles/268706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/DreamFight/comments/commentRss/268706.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/DreamFight/services/trackbacks/268706.html</trackback:ping><description><![CDATA[<div class="fmyvbqz" id="postmessage_333136" class="t_msgfont"> <div class="olzvstc" id="firstpost">在PHPCMS原有pȝ里面Q中介在前台Ȁzd是不?span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%C9%F3%BA%CB">审核</span>可以在前台发布房信息的,现在在这儿提供一下程序,实现让中介激zd必须通过理员的审核才能在前台发表房产信息?br /> <br />   W一步:在PHPCMSpȝ<span id="yyxdiac" class="t_tag" onclick="tagshow(event)" href="tag.php?name=%BA%F3%CC%A8">后台</span>的会员管理中有个自定义字D,点击d字段Q设|字D属性如图:<br /> [attachimg]38[/attachimg]<br />    W二步:在PHPCMSpȝ中找到member/admin/templatesQ在该文件下面新Z个模板,命名分别为member_house_check.tpl.php和member_house_manage.tpl.php。然后具体操作这两个文g。在<font color="red">member_house_check.tpl.php</font>文g中复制会员审?font color="red">member_check.tpl.php</font>的文件代码:<br /> q行一点点修改成ؓ如下代码Q(注意Ҏ扚w批准的actionq个很重要哟o(∩_∩)o...在文章中我用U色标记Q主要就q步Q把扚w删除q个按钮LQ因为它们都在会员这块,删除删除会员了Q其它就是一些标题改动了Q一看就明了Q) <div id="dsytszr" class="blockcode"><span id="zvfpdgf" class="headactions" onclick="copycode($('code0'));">复制内容到剪贴板</span> <h5>代码:</h5> <code id="code0"><?php <br /> defined('IN_PHPCMS') or exit('Access Denied');<br /> include admintpl('header');<br /> ?><br /> <body><br /> <?=$menu?><br /> <form method="post" name="myform"><br /> <table cellpadding="2" cellspacing="1" class="tableborder"><br />   <tr><br />     <th colspan='10'>待审怼?span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%C1%D0%B1%ED">列表</span></th><br />   </tr><br /> <tr align='center'><br /> <td width="5%" class="tablerowhighlight">选中</td><br /> <td width="5%" class="tablerowhighlight">ID</td><br /> <td width="12%" class="tablerowhighlight">帐号</td><br /> <td width="8%" class="tablerowhighlight">姓名</td><br /> <td width="5%" class="tablerowhighlight">性别</td><br /> <td width="15%" class="tablerowhighlight">所在地?lt;/td><br /> <td width="13%" class="tablerowhighlight">E-mail</td><br /> <td width="12%" class="tablerowhighlight">注册<span id="ewgqpsr" class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CA%B1%BC%E4">旉</span></td><br /> <td width="10%" class="tablerowhighlight">注册IP</td><br /> <td width="15%" class="tablerowhighlight">理操作</td><br /> </tr><br /> <?php <br /> if(is_array($members))<br /> {<br />     foreach($members as $member){ ?><br /> <tr align="center" onMouseOut="this.style.backgroundColor='#F1F3F5'" onMouseOver="this.style.backgroundColor='#BFDFFF'" bgColor='#F1F3F5'><br /> <td><input type="checkbox" name="userid[]"  id="userid[]" value="<?=$member['userid']?>"></td><br /> <td><?=$member['userid']?></td><br /> <td><a href="<?=$MOD['linkurl']?>member.php?action=show&username=<?=urlencode($member['username'])?>" tar<span id="znwrihr" class="t_tag" onclick="tagshow(event)" href="tag.php?name=get">get</span>="_blank"><?=$member['username']?></a></td><br /> <td><?=$member['truename']?></td><br /> <td><?=$genders[$member['gender']]?></td><br /> <td><?=$member['province']?>-<?=$member['city']?></td><br /> <td><?=$member['email']?></td><br /> <td><?=date('Y-m-d', $member['regtime'])?></td><br /> <td><?=$member['regip']?></td><br /> <td align="center"><br /> <a href='?mod=<?=$mod?>&file=member&action=view&userid=<?=$member['userid']?>' title="点击查看会员资料 最后登录时_<?=$member['lastlogintime']?> 最后登录IPQ?lt;?=$member['lastloginip']?> dơ数Q?lt;?=$member['logintimes']?>">查看</a> | <br /> <a href='?mod=<?=$mod?>&file=member&action=note&userid=<?=$member['userid']?>' title="关于该会员的理W记都记在这?>备注</a> | <br /> <a href='?mod=<?=$mod?>&file=member&action=edit&userid=<?=$member['userid']?>'>修改</a><br /> </td><br /> </tr><br /> <?php } <br /> }<br /> ?><br /> </table><br /> <table width="100%" height="25" border="0" cellpadding="0" cellspacing="0"><br />   <tr><br />     <td width="10%"><input name='chkall' type='checkbox' id='chkall' onclick='checkall(this.form)' value='checkbox'>全?反?lt;/td><br />     <td><br /> <input type="submit" name="submit" value="扚w批准" onClick="document.myform.action='?mod=<?=$mod?>&file=<?=$file?>&action=check_house&dosubmit=1'">    </td><br />   </tr><br /> </table><br /> <table cellpadding="0" cellspacing="0" border="0" width="100%" height="30"><br />   <tr><br />     <td align="center"><?=$pages?></td><br />   </tr><br /> </table><br /> </form><br /> </body><br /> </html></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>文g的代码把代码中的和上?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了同样删除批量删除这个按钮,不然操作之伯会删除会员哟Q按钮弄个批量取消批准,呵呵……</font><br /> <font color="#000000">    W三步:在PHPCMSpȝ中找到member/admin/下找?font color="red">member.inc.php</font>文gQ注意这是关键中的关键哟Q?/font><br />     在Q何一个breakQ后面添加如下四个case <div id="yuaajxa" class="blockcode"><span id="xwrfmon" class="headactions" onclick="copycode($('code1'));">复制内容到剪贴板</span> <h5>代码:</h5> <code id="code1"><br /> //by xiuling  房审核Q?nbsp; <br />   case 'house_check':<br />         if($dosubmit)<br />      {<br />             $member->check($userid);<br />             showmessage($LANG['operation_success'], $forward);<br />   }<br />   else<br />      {<br />    $page = isset($page) ? intval($page) : 1;<br />    $pagesize = $PHPCMS['pagesize'] ? $PHPCMS['pagesize'] : 30;<br />    $offset = ($page-1)*$pagesize;<br />    $condition = " AND my_house_membertype=2 AND my_house_check=0";<br />    $r = $db->get_one("SELECT count(*) as num FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.userid=i.userid $condition");<br />    $pages = phppages($r['num'], $page, $pagesize);<br />    $members = $member->get_list($condition, $page, $pagesize);<br />    include admintpl('member_house_check');<br />   }<br />   break;<br /> //by xiuling  批准中介<br />        case 'check_house':<br />   $userids = is_array($userid) ? implode(',', $userid) : $userid;<br />      if(!$userids) showmessage($LANG['select_account'], $PHP_REFERER);<br />   if($dosubmit)<br />      {<br />   <br />             $db->query("UPDATE ".TABLE_MEMBER_INFO." SET my_house_check=1 $sql WHERE userid IN($userids)");<br />    showmessage($LANG['operation_success'], $forward);<br />   }<br />   else<br />      {<br />    $member = array();<br />    $result = $db->query("SELECT userid,username FROM ".TABLE_MEMBER_INFO." WHERE userid IN($userids)");<br />    while($r = $db->fetch_array($result))<br />    {<br />     $member[$r['userid']] = $r['username'];<br />    }<br />    $groupids = showgroup('select', 'groupid', $groupid);<br />    include admintpl('member_house_check');<br />   }<br />   break;<br />   <br /> //by xiuling  房񔽎理<br />   case 'house_manage':<br />         if($dosubmit)<br />      {<br />             $member->check($userid);<br />             showmessage($LANG['operation_success'], $forward);<br />   }<br />   else<br />      {<br />    $page = isset($page) ? intval($page) : 1;<br />    $pagesize = $PHPCMS['pagesize'] ? $PHPCMS['pagesize'] : 30;<br />    $offset = ($page-1)*$pagesize;<br />    $condition = " AND my_house_membertype=2 AND my_house_check=1";<br />    $r = $db->get_one("SELECT count(*) as num FROM ".TABLE_MEMBER." m,".TABLE_MEMBER_INFO." i WHERE m.userid=i.userid $condition");<br />    $pages = phppages($r['num'], $page, $pagesize);<br />    $members = $member->get_list($condition, $page, $pagesize);<br />    include admintpl('member_house_manage');<br />   }<br />   break;<br />   <br /> //by xiuling 扚w取消批准<br />        <br />   <br />   <br />   case 'oncheck_house':<br />   $userids = is_array($userid) ? implode(',', $userid) : $userid;<br />      if(!$userids) showmessage($LANG['select_account'], $PHP_REFERER);<br />   if($dosubmit)<br />      {<br />             $db->query("UPDATE ".TABLE_MEMBER_INFO." SET my_house_check=0 $sql WHERE userid IN($userids)");<br />    showmessage($LANG['operation_success'], $forward);<br />   }<br />   else<br />      {<br />    $member = array();<br />    $result = $db->query("SELECT userid,username FROM ".TABLE_MEMBER_INFO." WHERE userid IN($userids)");<br />    while($r = $db->fetch_array($result))<br />    {<br />     $member[$r['userid']] = $r['username'];<br />    }<br />    $groupids = showgroup('select', 'groupid', $groupid);<br />    include admintpl('member_house_manage');<br />   }<br />   break;<br />   </code></div> q些代码和会员批量审核和扚w取消审核是差不多的,呵呵……只是E加修改……<br /> <br />   W四步:在member/admin/templates中找?font color="red">left.tpl.php</font>文g中找?font color="red"><TBODY style="display:" id="member"><font color="#000000">在其下面加上如下代码Q(注意U色的action和所Z个模板的文g名前部分勿必一样哟Q?/font><br /> </font> <div id="fxoytlk" class="blockcode"><span id="nffwyid" class="headactions" onclick="copycode($('code2'));">复制内容到剪贴板</span> <h5>代码:</h5> <code id="code2">    <tr><br />                     <td height="22" bgcolor="#FFFFFF" onMouseOver="this.style.backgroundColor='#F8F8F8'" onMouseOut="this.style.backgroundColor='#FFFFFF'"><a href="?mod=member&file=member&action=house_check" target="right"><font color="#FF0000">审核房中介</font></a></td><br />                   </tr><br />       <tr><br />                     <td height="22" bgcolor="#FFFFFF" onMouseOver="this.style.backgroundColor='#F8F8F8'" onMouseOut="this.style.backgroundColor='#FFFFFF'"><a href="?mod=member&file=member&action=house_manage" target="right"><font color="#FF0000">房中介理</font></a></td><br />                   </tr></code></div> <font color="#000000"><br /> 好了Q看累了吧,呵呵Q希望对做房产的朋友挣中介的钱,呵呵Q也希望对用PHPCMS建站的朋友对房q方面的开发与应用有所帮助……<br /> <br /> 前台的调用待l,呵呵……q主要是E序工作……<br /> <br /> 如有不清楚的Q联pLQ我们互怺?#8230;…<br /> <br /> </font></div> <script type="text/javascript">var tagarray = ['MySQL','专辑','视频','服务器托?,'数据?,'版主','站长','|?,'安徽','盗链|?,'后台','搜烦','机柜','郑州服务器托?,'分n','zd','变量','javascript','daolian','文','服务?,'SEO','征集','|络','技?,'基础','解析','旉','首页','微Y','T?,'h','历程','中国','Ajax','转换','旉?,'q_','公布','帖子','出售','手册','Sun','cd','知识','专题','账户','授权','语句','SNS','U念','互联|?,'W话','l验','get','数据','审核','设计','盗链','PPT','原则','入门','文化?,'列表','索引','详解','套g','培训','提示','获奖','CSS','{划?,'D','求助','全集','机房','悬赏','长短标题','排名','布尔','二次开?,'资源','异步','|站','字符','落伍?,'?,'C֌','整站E序','用户','大型门户E序','COM','奖励','刘允','l织?,'创意?,'I白','体验','门户E序','囑փ'];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.tkk7.com/DreamFight/aggbug/268706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/DreamFight/" target="_blank">DreamFight</a> 2009-05-03 17:51 <a href="http://www.tkk7.com/DreamFight/articles/268706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文g150-174行代码分?http://www.tkk7.com/DreamFight/articles/248340.htmlDreamFightDreamFightThu, 25 Dec 2008 14:03:00 GMThttp://www.tkk7.com/DreamFight/articles/248340.htmlhttp://www.tkk7.com/DreamFight/comments/248340.htmlhttp://www.tkk7.com/DreamFight/articles/248340.html#Feedback0http://www.tkk7.com/DreamFight/comments/commentRss/248340.htmlhttp://www.tkk7.com/DreamFight/services/trackbacks/248340.html phpcms_auth() 是加密和解密 函数, 因ؓcookie 是存在于客户端。十分危险呀?你看q用L密码也存在cookie 不加密能行吗。但是呢加密后又要能解密。因为用户名和用户密码我们往下操作要
获取的?q个函数存在?global.func.php 文g里面。大家想了解q个法的自己去看下吧。挺单的?其实是围绕着 $phpcms_auth_key q个变量来加密解密和discuz 的cookie 机制差不?
$phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']); ?PHPCMS['authkey'],估计后台有个 cookie 加密D你填Q然后以q个值和 $_SERVER['HTTP_USER_AGENT'](pȝ信息)
*/
$_userid = intval($_userid);
if($_userid < 0) $_userid = 0; //d的cookie 的用户id 如果?于0
if($_userid) //如果 cookie 保存的这个uid 存在Q那么开始按照这个ID来查数据库用戯 来取出用户信?
{
$memberinfo = $db->get_one("SELECT username,password,groupid,arrgroupid,email,chargetype,begindate,enddate,money,point,credit,newmessages FROM ".TABLE_MEMBER." WHERE userid=$_userid LIMIT 0,1");
/**
phpcms 装好的数据库类Q下开讲这个大家就大概看行了?大家看下 select sql语句?也可以学习下?首先最好不要?select * from xx ?* 形式Q除非你惌取所有字D늚记录。只|列你要的字Dc这样在数据量大的查询中。速度明显上去?帔RQ?TABLE_MEMBER 定义了表名。这样做有什么好处呢Q想都知道了Qؓ了以后变更表名方便而定义ؓ帔R。这个东襉K里来的。估计在一个文仉面定义好的。遇C再讲吧懒得找了?
*/
if($memberinfo && $memberinfo['password'] == $_password) //用查询出来的密码?cookie 中存在的密码惛_?Z在效率: 在比较前 先判断查询是否成功先。很多phper往往忽略?
{
if($memberinfo['groupid'] == 2) //如果用户属于的组的ID ?2 那么q个用户是被理员禁止访问的了?
{
mkcookie('auth', ''); // 清除cookie
showmessage($LANG['userid_banned_by_administrator']); //提示出错菜单
}
@extract($memberinfo, EXTR_PREFIX_ALL, ''); //又来q招Q应该明白了吧各位老大Q把字段 变成 我们能直接用的变量
unset($memberinfo, $_password, $_answer);
$_arrgroupid = $_arrgroupid ? array_filter(explode(',', $_arrgroupid)) : array(); //?字段?arrgroupid gؓ FALSE qo掉。array_filter()不带回调参数的用?L手册?
}
else
{
mkcookie('auth', '');
}
/**
l过上面的读cookie 和查数据库用户信息后。当定q个用户信息是合法以后。就会自动登陆了。比如phpchina论坛。当你登陆后没注销。下ơ访问的时候还是登陆状态。就是这个原理。记得模仿哦
q里详细解释?mkcookie ()函数 上菜:
function mkcookie($var, $value = '', $time = 0)
{
global $CONFIG,$PHP_TIME;
$time = $time > 0 ? $time : (empty($value) ? $PHP_TIME - 3600 : 0);
$s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0;
$var = $CONFIG['cookiepre'].$var;
return setcookie($var, $value, $time, $CONFIG['cookiepath'], $CONFIG['cookiedomain'], $s);
}
$time 为cookie 的存zL? 如果?0 是关闭览?cookie p动失?, $PHP_TIME 在前面定义了Q当前时间?$PHP_TIME -3600 减去3600U。就是一个小时前的意思,那肯定是讄cookie 失效的意思了?
$s 变量?获取 是否开启SSL安全传输的标致?cookie 有一个参数是ssl传输的。如果服务器已经opensll 了那么我们肯定不能浪费这么好的安全资源了?
$var cookie名的前缀Q主要防止؜淆?
$CONFIG['cookiedomain'] q个家伙?config.inc.php里面已经配置的了。定义ؓ: '/' 意思就是说 在当前域 的所有目录的PHPE序都能讉Kq个COOKIE Q还有限制目录访问COOKIE 的弄法。具体请?setcookie () 函数手册上说明?
*/

}
}
unset($db_class, $db_file, $phpcms_auth, $phpcms_auth_key, $memberinfo);

下章我就分析 PHPCMS 的数据库操作cL件和 PHPCMS的文本缓存机? 希望大家l箋支持哦第一

DreamFight 2008-12-25 22:03 发表评论
]]>
common.inc.php文g111-149行代码分?http://www.tkk7.com/DreamFight/articles/247243.htmlDreamFightDreamFightThu, 18 Dec 2008 15:29:00 GMThttp://www.tkk7.com/DreamFight/articles/247243.htmlhttp://www.tkk7.com/DreamFight/comments/247243.htmlhttp://www.tkk7.com/DreamFight/articles/247243.html#Feedback0http://www.tkk7.com/DreamFight/comments/commentRss/247243.htmlhttp://www.tkk7.com/DreamFight/services/trackbacks/247243.html /**
$PHPCMS['enablebanip'] 是什么.不用说应该知道了吧.q个是后台里面讄是否开启过滤テQ访问的功能Q?因ؓ我没用过phpcmsQ我是按照代码猜的,不对的请指出)从这里就看出了文本缓存也有他的作用的。 ip_banned()函数是什么呢Q上菜再_
function ip_banned($ip)
{
global $PHP_TIME; //前面定义q的Q当前的旉
$ipbanneds = cache_read('banip.php');
if(!is_array($ipbanneds)) return FALSE;
foreach($ipbanneds as $v)
{
if($v['overtime'] < $PHP_TIME) return FALSE;
if($ip == $v['ip'] || preg_match("/^".str_replace('.', '[.]', $v['ip'])."$/", $ip)) return TRUE;
}
}
里面也用C cache_read() q个函数Q还是读banip.php q个文gQbanip.phpq个文g里面存着你在后台甚至的要qo的テQ列表.
里面的逻辑比较单.自己消化下了Q不明白跟帖?
showmessage() 函数是提C出错信息封装好的一个函敎ͼ 国家化的 $LANG['administrator_banned_this_IP']q个看到了吧Q这个就是读语言包里面的Q这h们就可以出好多个语言版本的程序拉Q?
*/
$TEMP = $MOD = $CHA = $CATEGORY = $CAT = array();
$ftp = $enableftp = $tags = $html = 0;
/**
初始化变量.q个是好习惯我们要模仿.
*/
if(!isset($mod))
{
$mod = 'phpcms'; //phpcms 是默认加载的模块
}
elseif($mod != 'phpcms')
{
isset($MODULE[$mod]) or exit($LANG['module_not_exists']); // 从缓存中d载的模块是否开?
/**
q个写法Q我十分喜欢Q^时也用. xx && dd ; xx and dd ;与运要同时两边都ؓ真整个公式才为真Q就是利用这个原理. Q?xx || dd ; xx or dd 或运只要一个条件满_不会执行下一个条件而l执行下去. q样写是不是很酷Q  
*/
$MOD = cache_read($mod.'_setting.php'); //开始加载这个模块的一些常用配|数倹{?phpcms 对应的每个模块都有一个缓存配|文件。@@ 怪不得速度那么?
@include PHPCMS_ROOT.'/languages/'.(defined('IN_ADMIN') ? $CONFIG['adminlanguage'].'/'.$mod.'_admin.lang.php' : $CONFIG['language'].'/'.$mod.'.lang.php');
/**
加蝲惛_应的模块语言包.
*/
}
if(!isset($forward)) $forward = $PHP_REFERER; //记录前一个URL地址。估计以后下面程序有需要用q个变量
$dosubmit = isset($dosubmit) ? 1 : 0; //记录是否有表单提交过.也是以后有用
$channelid = isset($channelid) ? intval($channelid) : 0; //记录当前频道的id 如果$channelid 没有 isset 那么׃ؓ 0. intval() 十分有用。数字和数字的比较加减速度会快很多。记得哦
$skindir = PHPCMS_PATH.'templates/'.$CONFIG['defaulttemplate'].'/skins/'.$CONFIG['defaultskin']; //加蝲默认phpcms皮肤
if($PHPCMS['enablegzip'] && function_exists('ob_gzhandler'))
{
($CONFIG['phpcache'] || defined('SHOWJS')) ? ob_start() : ob_start('ob_gzhandler');
}
else
{
$PHPCMS['enablegzip'] = 0;
ob_start();
}
/**
$PHPCMS['enablegzip'] q个变量是存在?phpcms_setting.php 文g里。上面已l说q了。每个模块都有相对应的模块配|缓存文?是从数据库copyq来的信? q个变量标致 是否开?压羃传输?
压羃传输Q听名字q道。就是把数据按照一定的法压羃罗。然后再传送到客户端。这样就可以在有限的带宽中传输更大的数据拉。当焉度快了不少。压~的数据C你的览器,它就自动解压~,老版本的一些浏览器不支持解压羃哦。不q现在还有谁用很久的览器呢。用法很单的Q看上面q道:
首先判断下,看客戯大们是否在后台选择了这个模块的压羃传输(如果是的话。自然的已经加蝲C相对应的文本~存文g里面? 标致Q?PHPCMS['enablegzip'] ?判断 回调函数 ob_gzhandler 是否开? ob_gzhandler 其实不算是个函数。看手册说明?p么简单。它只是一个专门给 ob_start() 做回调用的一个参数函数。详l请看下手册。别h?在程序开头ob_start('ob_gzhandler')q是开始压~传输了;判断完了 如果为真。就l箋下面的代?

($CONFIG['phpcache'] || defined('SHOWJS')) ? ob_start() : ob_start('ob_gzhandler');
看代码phpcms 是这LQ?如果用户在后台开启了压羃传输。而用户又开启了 面~存。那么就默认不用压~传输了。我也不知道Z么这栯计。我试了下。后台开启压~传输。又同时又用页面缓存。没发现有什么问题。@@
如果没开启压~传输,那么我们ob_start(); 使用session 之前必须?ob_start() ; 而且在ob_start() 之前不能有Q何的 头文件发送和输出。比如:echo header{要不会出错的哦?
*/
$_userid = 0;
$_username = '';
$_groupid = 3;
$_arrgroupid = array();
$phpcms_auth = getcookie('auth');
/**
$_userid,$_username,$_groupid q几个记录用户信息的变量初始化,不初始化危险太大了。@@ 如果lh?_GET一?_userid 变量q来。那么就会把我们q个变量覆盖。但是我们如果给q几个变量一个|
那么按照p原则。就你GET个变量过来。你也一h不了我原来的变量倹{大家好好自己想下。就会明白了?
getcookie() q个自定义函数在 global.func.php文g里定义的。上菜:
function getcookie($var)
{
global $CONFIG;
$var = $CONFIG['cookiepre'].$var;
return isset($_COOKIE[$var]) ? $_COOKIE[$var] : FALSE;
}
q个函数用来提取我们讄的cookie ? $CONFIG['cookiepre'] ?config.inc.php 文g里面讄Qcookie 名的前缀. 函数很简单。一看就明白不说了?
*/
if($phpcms_auth)
{
$phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']);
list($_userid, $_password, $_answer) = $phpcms_auth ? explode("\t", phpcms_auth($phpcms_auth, 'DECODE')) : array(0, '', '');
/**


DreamFight 2008-12-18 23:29 发表评论
]]>
common.inc.php文g73-111行代码分?http://www.tkk7.com/DreamFight/articles/246968.htmlDreamFightDreamFightWed, 17 Dec 2008 13:33:00 GMThttp://www.tkk7.com/DreamFight/articles/246968.htmlhttp://www.tkk7.com/DreamFight/comments/246968.htmlhttp://www.tkk7.com/DreamFight/articles/246968.html#Feedback0http://www.tkk7.com/DreamFight/comments/commentRss/246968.htmlhttp://www.tkk7.com/DreamFight/services/trackbacks/246968.html<?
{ //如果~存文g存在和缓存没有过期效Q那么就q回~存文g?
require $cachefile;
exit;
}
}
if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar)) //获取传递过来的变量。有什么用的呢Q请看下面解?
{
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
}
}
/**
parse_str:本函数可浏览器q回?GET Ҏ?QUERY_STRING 字符串解析。返回的变量名及值就?QUERY_STRING 的名U及?
上面q部分相对复杂了炏V但没关pR慢慢讲解. 首先~存只针对前収ͼ所以我们一开始就判断Q这个脚本是q行在前台的而不是在后台 !defined('IN_ADMIN') 来判断.
然后呢.再看客户配置 config.inc.php文g是否开启了~存Q ==2 是开启了Q Q接着开始用一pd的规则来扑և~存的文件名和目录: ?脚本名:xx.php和后l传递的参数 ?xx=ee&bb=jj 他两的字W窜的MD5 .以这个md5H来定义Z~存目录Q和~存文g Q接着再判断这个缓存文件是否存在和是否没过~存有效期.如果没有p回这个缓存文件的名字.
然后C菜了Q 最后一个if逻辑是做什么的? 不知道大家有没见q q样的网址Qhttp://www.beihai.com/dd.php/xxQ?3/cc-22.html  他们其实都算是伪静态.优化QRQ用的.咋看hq很象静态.爽. 但你可能惻Iq样的地址Q我们写QͿQ程序的Q怎么获取get 变量呢?  最后if 是解答q个问题的. 先剥url来获取  传递的字符H?然后 str_replace 来把 '/' '-' 替换成标准的 '&' '=' 好象:  http://www.beihai.com/dd.php&xx=23&cc=22  看这样你应该看明白了吧.然后?parse_str() 函数来把xx 变 $xx=23 cc 变 $cc=22 php真是什么都l你惛_了.强.看明白了吧.QOQ过了.
 

?l于把common.inc.php q个文g大概讲解完了. q个文g里面包含了很多东?都是些挺不错的思想.大家应该好好学习.q样我们写出来的PHPE序会更加强?
,偶现在晚上都在边陪老婆边看电媄边弄linux 的C,q是学习 阶段 所以时间有点紧.白天在公司挤Ҏ间出来分析代码罗.
 
对于phpcms 我也是第一ơ接?以前没装q也没用q?现在也没详细用过.所以我看到代码讲什么我p什?没具体讲PHPCMS的应用等.希望理解.
 
如果我分析代码分析得不合?h?功能q步学习.谢谢复制PHP内容到剪贴板PHP代码: */
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php'; // 包含数据库操作类,下章详说
require PHPCMS_ROOT.'/include/tag.func.php';  //遇到再说
require PHPCMS_ROOT.'/include/extension.inc.php'; //遇到再说
$db = new $db_class;   // 实例化数据库c?
$db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']); //q接数据库@Q@
$db->iscache = $CONFIG['dbiscache']; //是否开启SQL~存
$db->expires = $CONFIG['dbexpires']; //~存旉
if(!cache_read('table.php'))
{
require_once PHPCMS_ROOT.'/include/cache.func.php';
cache_all(); //生成所有缓?
}
/**
cache_read() 函数 ȝ存文件函数存?global.func.php 里面Q上菜先Q?
function cache_read($file, $mode = 'i')
{
$cachefile = PHPCMS_CACHEDIR.$file;
if(!file_exists($cachefile)) return array();
return $mode == 'i' ? include $cachefile : file_get_contents($cachefile); //q一步是用来判断是不是本站内模块Q如果没有传入值的话就调用q个~存Q反之则得到他的内容?br /> }
p么简单.文本~存Q在一些大的开源的QͿQ项目中l常见到Q主要是Z减轻数据库的负荷的. 比如在程序启动文仉面,把一些后台配|的常用信息~存到php文g里面Q然后在以后的程序就可以直接使用而不用每ơ都讉K数据库了Q但对经常要更新的信息.最好不要用文本~存qŞ式,因ؓQͿQ文件内|的文g锁flock()不是很好用.大系l中多用户同时写讉K的时候有可能会把~存文g破坏Q大pȝ使用 memcached  mysql5.1 分区  mysql M 来实现负载均衡 @=@ 废话太多了. q个函数很简单.自己看下明白了Q如果缓存和模式变量 $mode 是否?i 是就include 不是 把文件以字符HŞ式读到内存中Q?
如果 cache_read()找不到缓存文?table.php'׃q回falseQ那么就 加栽 cache.func.php  文gQ它里面是些创徏~存的一些函? 然后呢执?cache_all()函数生成所有的常用信息~存Q?
关于phpcms 的缓存更详细包括生成原理Q打在弄完启动文gcommon.inc.php 后再开写个详l的Q  
*/
$CACHE = cache_read('common.php');
/**
加蝲 common.php ~存文g里面的变?数据) q样我们不用从数据库M每次Q是?
common.php 文g里面是什么来的呢Q上菜:
<?php
return array (
'module' =>
array (
'phpcms' =>
array (
'module' => 'phpcms',
'name' => 'phpcms',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => '',
'linkurl' => '',
),
'member' =>
array (
'module' => 'member',
'name' => '会员',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => 'member',
'linkurl' => '/phpcms/member/',
),
'article' =>
array (
'module' => 'article',
'name' => '文章',
'iscore' => '0',
'iscopy' => '1',
'isshare' => '0',
'moduledir' => 'article',
'linkurl' => '',
)
?>
看到了吧Q这个就是全部从数据库里面生成的文本~存信息Q我们不用每ơ都q接数据库读数据库.而只要访问里面的数组可以得C些配|信息.
q个是文本~存的作用了Q至于怎么会生成这个文本缓存文件的Q我会另外开一来介绍?
*/
$MODULE = $CACHE['module']; //把缓存中的数据(common.phpQ存攑ֈ数组中?
$CHANNEL = $CACHE['channel'];
$PHPCMS = $CACHE['phpcms'];
$FIELD = $CACHE['field'];
unset($CACHE, $ipmatches, $CONFIG['timezone'], $CONFIG['cachedir'], $CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['pconnect'], $CONFIG['dbiscache'], $CONFIG['dbexpires']);
/**
unset 掉不需要用的变量.
*/
 
?>


DreamFight 2008-12-17 21:33 发表评论
]]>
common.inc.php文g23-73行代码分?/title><link>http://www.tkk7.com/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.tkk7.com/DreamFight/articles/245369.html</guid><wfw:comment>http://www.tkk7.com/DreamFight/comments/245369.html</wfw:comment><comments>http://www.tkk7.com/DreamFight/articles/245369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/DreamFight/comments/commentRss/245369.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/DreamFight/services/trackbacks/245369.html</trackback:ping><description><![CDATA[<div><?php<br /> /*生成错误日志呢?q里phpcms 作者是动态生成一个QL文g来做错误日志的。不错不? 他用了 in_array() 函数来实玎ͼ因ؓ比较单,自己理解下)in_array()函数是检查数l中是否存在某个|只记录 E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE q三个别的错误日志信息。\n 是文本换行符  \t是制表符. q里他用了一个比较漂亮而不常用的函?wddx_serialize_value () wddx 其实也是一U xml 。 wddx_serialize_value() q个函数是把一般变量以Q݋Q格式输出。这h们就不用自己模拟写xml了。方便吧。呵?W一个参数就是: 要格式输出的变量Q第二个参数是输出的xml的介l信? 下面是 error_log() 函数。这个函数十分有用了。就是生成错误日志QL文g。不需要我们fopen 了。方便吧。它q有很多功能。详l的看手册。chmod 讄日志文g的权限是 可读可写可执行。  在php5中。我习惯使用 extends Exception 来定义自q出错信息。所以很用 set_error_handle(). 如果没开启日志功能。那么 error_reporting(E_ERROR | E_WARNING | E_PARSE) p行了。他的作用是Q配|错误信息回报的{。这是我从手册中扑և来的Q参考一下?br /> E_WARNING 通常都会昄出来Q但不会中断E序的执行。这寚w错很有效。例如:用有问题的正则表辑ּ呼叫 ereg()?<br /> E_ERROR 通常会显C出来,亦会中断E序执行。意即用q个遮罩无法q查到内存配|或其它的错误?<br /> E_PARSE 从语法中解析错误?<br /> E_CORE_ERROR cM E_ERRORQ但不包?PHP 核心造成的错误?<br /> E_CORE_WARNING cM E_WARNINGQ但不包?PHP 核心错误警告?<br /> 他的作用是把一般出错信息输来?*/<br /> if($CONFIG['sessionsavepath']) session_save_path($CONFIG['sessionsavepath']); <br /> /** <br /> 定义session 的存储\径,session 其实 也是cookie 不过 session 是实现在服务器端的。安全但负蝲重点。这样做的好处?效率很好。如果你在虚拟主机的话。大家的session cookie 都放在了php.ini里面讄的默认地斏V文件夹臃肿׃慢罗。是吧。第二就是安全罗。 记得一定要定义?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 />  * <span style="color: red">标头 (header) 是服务器?HTTP 协议?HTML 资料到浏览器前所送出的字W串Q在标头?HTML 文g之间需IZ行分隔?br /> 讄面~码.  php~码有: 面~码。数据库~码。文件内码。如果三码相同就一般不会出Cؕ? 文g内码是什么呢Q每个文仉有自q内部~码。一般都用UQ_uQ比较爽。怎么改变文g内码Q你用DQ也行  QI 也行。随ѝ 数据库编码那肯定是要指定的了。mysql5开始也有字W集模式q个最好也讄q样可以兼容更多q_?/span> <br /> 面~码Q?lt;meta http-equiv="Content-Type" c />  q句是。一般的QTQL头文仉有。那 q需要header('Content-type: text/html; charset='.$CONFIG['charset']);吗?  其实需要的。因为有些自己写的提C层呀。或是文仉没指定页面编码的。就很容易出Cؕ码那么我们就防范于未然?header 一个编码过厅R那OQ了。多好?<br /> */ <br /> if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) <br /> { <br /> $PHP_IP = getenv('HTTP_CLIENT_IP'); <br /> } <br /> elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) <br /> { <br /> $PHP_IP = getenv('HTTP_X_FORWARDED_FOR'); <br /> } <br /> elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) <br /> { <br /> $PHP_IP = getenv('REMOTE_ADDR'); <br /> } <br /> elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) <br /> { <br /> $PHP_IP = $_SERVER['REMOTE_ADDR']; <br /> } <br /> preg_match("/[\d\.]{7,15}/", $PHP_IP, $ipmatches); //q行正则表达式匹?br /> $PHP_IP = $ipmatches[0] ? $ipmatches[0] : 'unknown'; <br /> /** <br /> 函数 getenv() 是获取环境变量。环境变量:HTTP_CLIENT_IP 是获取客L的テQ 。但有可能h家是通过代理来访问你的程序的呢。那么这时候就要用 环境变量Q?<br /> HTTP_X_FORWARDED_FOR 了。包括getenv('REMOTE_ADDR') $_SERVER['REMOTE_ADDR']   都是获取人家QP的。反正碰|。碰到那个能获取大工告成?<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 /> 获取当前q行的脚本名:  刚开始看是不是有点ؕ呢。 咋没用if else 呢?看这L东西。我们最好从右看到左。这h较好明白炏V?_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF'] $_SERVER['ORIG_PATH_INFO'] q三个服务器全局变量都是获取 当前脚本名的。主要看服务器当前环境了。那个存在的p取那个?<br /> isset() 函数 十分有用。 试一个变量是否已l定义。 注: $a= NULL ; isset($a) q样会返回false的哦。 注意 isset 和empty 两个函数的用法。用得不好会出大问题的。自q手册。   <br /> */ <br /> $PHP_QUERYSTRING = $_SERVER['QUERY_STRING']; <br /> $PHP_DOMAIN = $_SERVER['SERVER_NAME']; //获取服务器的名字?br /> $PHP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; //获取讉K的url包括文g名?br /> $PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; //试服务器是否启动了ssl q接如果是的话。就用https://安全q接来进行通信<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 /> 获取当前脚本的UQԌ <br /> */ <br /> $db_file = $db_class = 'db_'.$CONFIG['database']; <br /> if(!defined('IN_ADMIN')) //如果不是在后台。 帔R 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加密Q以此来生成下面的缓存目录和~存文g <br /> $cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/'; //~存目录 <br /> $cachefile = $cachefiledir.$cachefileid.'.html'; //~存文gQ xxx.html 格式  <br /> if(file_exists($cachefile) && ($PHP_TIME < @filemtime($cachefile) + $CONFIG['phpcacheexpires'])) </div> <div> </div> <div>//filemtime("file")q个函数是求得文件最后修改的旉的,$CONFIG['phpcacheexpires'])是系l设|的~存在机器上存贮的时_所以这两个旉加v来就是缓存文件实际的生存旉了?/div> <div> </div> <div>?><br /> </div> <img src ="http://www.tkk7.com/DreamFight/aggbug/245369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/DreamFight/" target="_blank">DreamFight</a> 2008-12-09 23:25 <a href="http://www.tkk7.com/DreamFight/articles/245369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文g21-32行代码分?/title><link>http://www.tkk7.com/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.tkk7.com/DreamFight/articles/245363.html</guid><wfw:comment>http://www.tkk7.com/DreamFight/comments/245363.html</wfw:comment><comments>http://www.tkk7.com/DreamFight/articles/245363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/DreamFight/comments/commentRss/245363.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/DreamFight/services/trackbacks/245363.html</trackback:ping><description><![CDATA[<div><?php<br /> /*步?<br /> 哈哈。我们要懂模ѝ?*/</div> <div> </div> <div>@extract($_POST, EXTR_OVERWRITE); <br /> @extract($_GET, EXTR_OVERWRITE); <br /> /** <br /> ѝ?extract 前面加个 @鸡蛋做什么呢Q?抑制错误的。还不懂的话。自q度了?<br /> Z么用extract()函数? 他就是把$_GET?_POST中的内容变成变量的Ş式,qx我们E序 是不是要怋?$_POST $_GET来获取传递的变量呀。是不是感觉贼麻烦呀?<br /> 比如 $_POST['xx'] q样接受是挺好。但写多了很ȝ是吧。我是感觉麻烦。我现在想直接就 $xx可以获取传递过来的东西。那怎么办呢?<br /> q?extract()函数来实现这么一个技巧。参敎ͼEXTR_OVERWRITE的意思是如果有冲H,覆盖已有的变量?q个技巧在discuz 论坛上也有应用?<br /> */ <br /> unset($_POST, $_GET); <br /> /** <br /> unset() 好处不用说了吧?释放 $_POST $_GET 数组 Q因为已l不需要他们了?nbsp; <br /> 明天攑ց了.今天在写点罗Q放假没I写了.要陪老婆Q大家看了有什么不明白的.可以跟帖问.我懂的我会回{.谢谢 <br /> l箋Q: </div> <div> </div> <div>2007-12-21 </div> <div> </div> <div>吃完中午开始分析了点代码.旉不多Q复制PHP内容到剪贴板PHP代码: */<br />  <br /> require PHPCMS_ROOT.'/config.inc.php'; <br /> /** <br /> 加裁整站的配|参数文件。一般的E序都会有这个文件。做什么的呢?比如一些数据库q接地址。用户名Q密码等。需要用到的参数都定义在q个文g里面。这样以后配|变了。我们只要改动下q个文g里面?<br /> 变量值就好。是不是很方便呢。呵? 在这里说?require() q个加蝲函数?require ?include 都是用来加蝲其他PHP文g用的。但他们是有区别的?require 函数Q是"预解?函数。就是程序一加蝲Q就执行了require函数。而include 呢。是个过E加载函数。我们可以在逻辑里比如: if 里面使用include 来动态的加蝲其他E序片段。而require ׃行?br /> */ <br /> require PHPCMS_ROOT.'/languages/'.$CONFIG['language'].'/phpcms.lang.php'; <br /> /** <br /> ֐思义Q q个是加蝲语言包了。PQP的国际化目前做得最多的。就是直接用QͿQ文件来实现。 ?phpcms.lang.php 文g里面定义E序中要用到的中文信息。然后在E序一开始就加蝲。那里程序里?<br /> 可以用这个文仉面的变量和一切。那么就单了。模板上׃需要直接写中文信息了。直接用q个文g里面定义的变量等来替换。从而实现国际化。over!!!最好自己打开q个语言文g再加上自己思考下。就知道。原来如此简单?<br /> */ <br /> define('PHPCMS_PATH', $CONFIG['rootpath']); <br /> define('PHPCMS_CACHEDIR', $CONFIG['cachedir']); <br /> /** <br /> $CONFIG['rootpath'] q个是全局配置文g config.inc.php 文g里面数据库信息。等全部配置信息。在q里把他们定义ؓ 帔R。 Z么需要定义ؓ帔R呢。因Z者感觉这样写爽罗。呵c其实因为后?<br /> 用到q两个变量多。所以干脆定义ؓ帔R。方便用。再多说一个技巧: $CONFIG['rootpath'] 其实也可以写成 $CONFIG[rootpath] 但是最好不要这栗ؓ什么呢。因为PQP引擎会先判断 rootpath 是不是常量。如果不是才会认?   $CONFIG[rootpath] 是数l。 q样性能上就差了一点点了。 再多说一个技巧: Z么程序多数都用 '' 单引号呢而不?"" 双引号呢。因h率好, "" 双引受?<br /> php引擎q会先检查里面是否有变量Q如果有p释。?'' 单引号不会做q一步的查。而直接就当成字符H了。所以效率上也会有一点点影响哦?<br /> */ <br /> $CONFIG['enablephplog'] ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE); <br /> /*$CONFIG['enablephplog'] 是否开启错误日志设|。这个设|在全局配置文g里面.config.inc.php 。 q里使用了 三目q算W   偶最喜欢用了。一些简短的逻辑判断。可以用 ? : Q 来实现比较简z?<br /> set_error_handler() q个函数大有来头了。php4里面的典型自定义E序出错后行为的一个函数。十分好用。怎么用呢Q?set_error_handler(函数) 的参C是一个函数。这个函数。反映了E序出错后行为的?<br /> phpcms_error 函数存在Qset_error_handler是用用戯定义的错误处理函数来处理E序中的错误Qphpcms_error 在global.func.php 全局函数里面?br /> */</div> <div> </div> <div>function phpcms_error($errno, $errmsg, $filename, $linenum, $vars) <br /> { <br /> $filename = str_replace(PHPCMS_ROOT, '.', $filename); <br /> $filename = str_replace("\\", '/', $filename); //  把winq_?\\ 换成  /兼容常见pȝ的\?<br /> if(!defined('E_STRICT')) define('E_STRICT', 2048); <br /> $dt = date('Y-m-d H:i:s'); <br /> $errortype = array (   <br /> E_ERROR => 'Error', <br /> E_WARNING => 'Warning', <br /> E_PARSE => 'Parsing Error', <br /> E_NOTICE => 'Notice', <br /> E_CORE_ERROR => 'Core Error', <br /> E_CORE_WARNING => 'Core Warning', <br /> E_COMPILE_ERROR => 'Compile Error', <br /> E_COMPILE_WARNING => 'Compile Warning', <br /> E_USER_ERROR => 'User Error', <br /> E_USER_WARNING => 'User Warning', <br /> E_USER_NOTICE => 'User Notice', <br /> E_STRICT => 'Runtime Notice' <br /> ); <br /> $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); <br /> $err = "<errorentry>\n"; <br /> $err .= "\t<datetime>" . $dt . "</datetime>\n"; <br /> $err .= "\t<errornum>" . $errno . "</errornum>\n"; <br /> $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n"; <br /> $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n"; <br /> $err .= "\t<scriptname>" . $filename . "</scriptname>\n"; <br /> $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n"; <br /> if (in_array($errno, $user_errors)) <br /> { <br /> $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n"; <br /> } <br /> $err .= "</errorentry>\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 /> /*是q个鸟蛋。 现在我们慢慢来干掉他。呵c q个自定义出错信息函数默认带有四个参数。 W一个参数 $errno 是程序出错的{。 W二参数是程序出错的界面信息。第三是出现错误的程序文件名?<br /> W四是 W几行出现错误。第五个参数。要不要都行是当前变量状态的快照.看吧。我们有q些信息后。想定义怎么L错误信息l客L都很Ҏ了是吧?但现在我们是要上一<br /> */<br /> ?></div> <img src ="http://www.tkk7.com/DreamFight/aggbug/245363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/DreamFight/" target="_blank">DreamFight</a> 2008-12-09 22:42 <a href="http://www.tkk7.com/DreamFight/articles/245363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>common.inc.php文g1-20行代码分?/title><link>http://www.tkk7.com/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.tkk7.com/DreamFight/articles/245352.html</guid><wfw:comment>http://www.tkk7.com/DreamFight/comments/245352.html</wfw:comment><comments>http://www.tkk7.com/DreamFight/articles/245352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/DreamFight/comments/commentRss/245352.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/DreamFight/services/trackbacks/245352.html</trackback:ping><description><![CDATA[<div> <div> <div>/*从今天开?我会一有时间就对PHPCMS 整站的代码做一个详l的分析.目的很简?让大安能在phpchina 里面得到q步. </div> <div> </div> <div>谢谢. 代码讲解分析全部是本?按照本h的知识水qx讲解.如果有说得不对的.h?也欢q指?大家一赯?谢谢 </div> <div> </div> <div>希望大家支持?</div> <div> </div> <div>首先我对 PHPCMS ?头程序文件开始讲?: include/common.inc.php q个文g是程序启动的核心文g.复制PHP内容到剪贴板PHP代码: <br /> */<br /> <?php <br /> /** <br /> 代码讲解分析Q?DreamFight <br /> */ <br /> $mtime = explode(' ', microtime()); <br /> $phpcms_starttime = $mtime[1] + $mtime[0]; <br /> /** <br /> microtime() 当前 Unix 旉戳以及微U数。本函数仅在支持 gettimeofday() pȝ调用的操作系l下可用。如果调用时不带可选参敎ͼ本函C "msec sec" 的格式返回一个字W串Q其?sec 是自 Unix U元Q?:00:00 January 1, 1970 GMTQv到现在的U数Qmsec 是微U部分。字W串的两部分都是以秒为单位返回的?<br /> 在windows下他的反回结果是q样的Ş式:0.70312700 1230216275?br /> explode(separator,string,limit)函数把字W串分割为数l?br /> 参数 描述 <br /> separator 必需。规定在哪里分割字符丌Ӏ?<br /> string 必需。要分割的字W串?<br /> limit 可选。规定所q回的数l元素的最大数目?</div> <div> </div> <div>前边q两行的代码主要是计算脚本开始运行的旉。很常见的写法。最后结还在程序运行的l点位置。讲C在给各位说?<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的配|文件中Q有个布值的讄Q就是magic_quotes_runtime,当它打开Ӟphp的大部分函数自动的给从外部引入的(包括数据库或者文?数据中的溢出字符加上反斜Uѝ?br /> % S* i; @; k! D- n" p0 k. {7 Q* ~9 U1 i$ Y& {' d4 R2 ]<br /> 当然如果重复l溢出字W加反斜U,那么字符串中׃有多个反斜线Q所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()讄和检php.ini文g中magic_quotes_runtime状态? i% @5 ]' C  N8 W. C4 u8 p<br /> 6 a; Y" {6 W' H# _! o  h. Z<br /> Z使自qE序不管服务器是什么设|都能正常执行。可以在E序开始用get_magic_quotes_runtime设|状态秋军_是否要手工处理,或者在开始(或不需要自动{义的时候)用set_magic_quotes_runtime(0)x?amp; O* W6 <br /> 地球人都知道。就是关了字W窜入库自动转意 比如 my name is on'x 转成 my name is on \'x Z最大的E序性能所以我们关掉吧~哈哈 <br /> */<br /> define('IN_PHPCMS', TRUE); <br /> /** <br /> E序入口标记。ؓ什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门q来的?<br /> 防止你翻墙进入去偷东西搞破坏。这个入口标C有这个功能?在这里定义了一个常?IN_PHPCMS ?TRUE Q然后我在其他程序文仉面检查这个标记。如果不存在或不为真Q?<br /> 那么基本可以肯定你q个家伙是个偷来的?人可能翻墙进入。但E序怎么d呢。只要在php.ini文g里面Ȁz?allow_url_fopen选项Qinclude() 可以包?URL 地址了。你想下如果你有?攑֯码的PHP文g。如果给人家include 了以后。你怕不怕?<br /> */ <br /> define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8))); <br /> /** <br /> dirname(dirname(__FILE__));得到的是文g上一层目录名.因ؓcommon.inc.php是在include文g夹中的,所以dirname(dirname(__FILE__))的反回地址是Q你的phpcms所在的目录Qinclude,q里它做了substr(dirname(__FILE__), 0, -8))q么个处理,去掉了include 所以得到的是你这个phpcms所在机器上的目录了?br /> 要主意substr(dirname(__FILE__), 0, -8))它所得到的目录的路径是是带\的这h在浏览器中访部一到的所在要把所有的\转成/.<br /> ZE序产品的跨q_。自动获取程序的安装目录路径 ,定义?PHPCMS_ROOT 帔R。方便以后程序用。徏议大安q样做哦 <br /> */ <br /> require PHPCMS_ROOT.'/include/global.func.php'; <br /> /** <br /> 包含 全局函数 global.func.php 文g。里面放了些E序全局都有需要用的函?大家看到了吧?帔R PHPCMS_ROOT 已经发挥作用?q样E序lh家发布到?二目录下。也不需要h家手动改整站根目录\径了?<br /> 自己好好理解下。。。。?<br /> global.func.phpq个面{后边用到的时候来一一讲解?br /> */ <br /> $search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i"); <br /> /** <br /> ("/ union /i") q个是正则的写法Q不懂正则的自己癑ֺ找教E来学?q里不详l说?<br /> */ <br /> $replace_arr = array(' union ',' select ',' update ',' outfile ',' or '); <br /> /** <br /> 看这个意思很明了?union Q连接两条SQL语句?outfile : 主要用来导出数据库资料到其他介质上?<br /> q啥要定义这两个变量呢? ?global.func.php 文g(前面已经加蝲)里面有个函数 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全局变量?那么函数里就可以直接使用了?先讲解下q个函数吧?֐思义q个函数是过滤字W窜里面的SQL语句使得关键的SQL语句单词失效?<br /> 主要qo那些SQL语句呢?主要是这几个关键? union select update outfile or {。因几个SQL字是极度Ҏ?_GET传输中给截注. <br /> q个函数写得实在_֦?is_array 来判?$string 是否为数l。如???array_map() 函数来递归qo <br /> 当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,因ؓ$string已经不是数组而是字符H。所?执行 preg_replace()函数。这个函数很好理解了。就是替换了?<br /> q个函数的作用就是把$_POST中的内容用一个strip_sql的方法来处理Q?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关键字过滤。不q这个也是冒很大风险的?<br /> 来说一下strip_sqlq个函数Q它和里边的array_map函数一起实Cq个函数的递归调用Q以来实现字W的替换?br /> **/ <br /> unset($search_arr, $replace_arr); <br /> /** <br /> unset 使用q但以后不需要的变量。这个是很好的习惯。第一不会费内存。如果变量存了大量的数据字节Q而后你的E序是一直不需要用的。那?<br /> ׃很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉?<br /> */ <br /> $magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()gpc是否pȝ自动转意?gpc 是什么呢Q?GET POST COOKIE 来来dp几个东西|。会q回 真或?<br /> if(!$magic_quotes_gpc) <br /> { <br /> $_POST = new_addslashes($_POST); <br /> $_GET = new_addslashes($_GET); <br /> } <br /> /** <br /> 判断一下系l是否打开了自动对gpcq行转意q个选择。如果是的话Q就不需要我们自动{意了。如果不是那么还是要老百姓的手段。自己动手丰食?<br /> 来看下也是在global.func.php 文g里面定义的这个函敎ͼ 其实是一个封装好的php?addslashes() 函数的函数。PHP都自己有了ؓ什么还要自己封装成函数呢? <br /> 理由很简单。ؓ了以后的扩展更改Ҏ|。如果我们一开始就全部?addslashes() q个函数来对 ' q行转意的话。那么以后随着E序的发展。我可能惛_qo?^ * ( )之类?<br /> 那如何是好呢Q所以ؓ了以后孩子的成长。我们还是最好封h吧?CQ以后有可能会边的东ѝ最好都装成模块。函?。类?q样E序的灵zd׃M。下面我们就来品一?br /> q个函数?<br /> function new_addslashes($string) <br /> { <br /> if(!is_array($string)) return addslashes($string); <br /> foreach($string as $key => $val) $string[$key] = new_addslashes($val); <br /> return $string; <br /> } <br /> 首先判断是不是数l,如果不是那么把该值用作addslashes()的参敎ͼq行转意Qƈq回?br /> 如果是数l那么一ơ取数组中的值来让它转意?br /> q个函数也是写得贼好。也是同时考虑qo 字符H或数组Q也是用了 传归。看下就应该明白了吧。这个不用说了。我们要学下q个思\q个Ҏ方式哦。这h能进 <br /> */</div> </div> </div> <img src ="http://www.tkk7.com/DreamFight/aggbug/245352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/DreamFight/" target="_blank">DreamFight</a> 2008-12-09 22:19 <a href="http://www.tkk7.com/DreamFight/articles/245352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://aa2176.com" target="_blank">޸һѿ</a>| <a href="http://leeszewan.com" target="_blank">Ʒ_Ʒ</a>| <a href="http://ccc16938.com" target="_blank">ҹƵ</a>| <a href="http://43sihu.com" target="_blank">av뾫Ʒ4</a>| <a href="http://wangdei.com" target="_blank">Ļղapp</a>| <a href="http://19520888.com" target="_blank">ůůձƵ</a>| <a href="http://niutextile.com" target="_blank">ѹۿɫƵվbd </a>| <a href="http://456qqq.com" target="_blank">wŷs</a>| <a href="http://wwwaa875.com" target="_blank">caopornƷ</a>| <a href="http://taiyu18.com" target="_blank">þþþ޹AV鶹</a>| <a href="http://chch12.com" target="_blank">Ƶ߹ۿƵ</a>| <a href="http://huahui1866.com" target="_blank">޹AVרAV</a>| <a href="http://by7258.com" target="_blank">һA</a>| <a href="http://959901cc.com" target="_blank">˾Ʒֱ </a>| <a href="http://99999pp.com" target="_blank">ۺɫ߹ۿ</a>| <a href="http://fangdazd.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://142121.com" target="_blank">þþƷavĻ</a>| <a href="http://qzapp88.com" target="_blank">Ļߵ</a>| <a href="http://yuejiju.com" target="_blank">޾ƷƷþ99</a>| <a href="http://xwy2.com" target="_blank">޵һƵ߹ۿ</a>| <a href="http://kdp44.com" target="_blank">AëƬA</a>| <a href="http://600c20.com" target="_blank">˾ƷƵȫ弶</a>| <a href="http://www789789.com" target="_blank">ѹۿһëƬ</a>| <a href="http://trgod.com" target="_blank">˳վ߿</a>| <a href="http://tv886.com" target="_blank">߹ۿѲ </a>| <a href="http://by9277.com" target="_blank">ɫٸŮ11p</a>| <a href="http://szhszszy.com" target="_blank">լоƷһ߹ۿ</a>| <a href="http://cn-zggx.com" target="_blank">˳ɻ߹ۿ</a>| <a href="http://zjyxc.com" target="_blank">޹ƷþþþϼӰԺ</a>| <a href="http://mmm19.com" target="_blank">ۺϾþ123</a>| <a href="http://9898vip.com" target="_blank">ʪôýˬƵ</a>| <a href="http://zhaosaohuo.com" target="_blank">޾Ƶ</a>| <a href="http://szicon.com" target="_blank">ɫëƬ߹ۿ</a>| <a href="http://liulian88.com" target="_blank">߹۹Ļ </a>| <a href="http://788qj.com" target="_blank">޹Ů߹ۿ</a>| <a href="http://jte-sh.com" target="_blank">޹Ƶֻ</a>| <a href="http://sewo66.com" target="_blank">91޾Ʒ߹ۿ</a>| <a href="http://tedegold.com" target="_blank">˳7777Ӱ߹ۿ</a>| <a href="http://lcqkp.com" target="_blank"> ŷ Ƶ С˵</a>| <a href="http://8mav1007.com" target="_blank">뿨ͨҰ</a>| <a href="http://whxhjc.com" target="_blank">޾Ʒ͵</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>