??xml version="1.0" encoding="utf-8" standalone="yes"?>激情小说亚洲图片,亚洲精品午夜无码电影网,亚洲精品NV久久久久久久久久http://m.tkk7.com/bluesky/category/6410.html做好软gZ? #gcc -c helloworld.c -o helloworld.o //~译目标文g #gcc helloworld.o -o helloworld //~译成可执行exe #helloworld //q行exezh-cnSun, 06 May 2007 14:19:57 GMTSun, 06 May 2007 14:19:57 GMT60CheckBox选中所有的[JavaScript]http://m.tkk7.com/bluesky/archive/2006/06/23/54751.htmlblueskyblueskyFri, 23 Jun 2006 09:51:00 GMThttp://m.tkk7.com/bluesky/archive/2006/06/23/54751.htmlhttp://m.tkk7.com/bluesky/comments/54751.htmlhttp://m.tkk7.com/bluesky/archive/2006/06/23/54751.html#Feedback2http://m.tkk7.com/bluesky/comments/commentRss/54751.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/54751.html<html>
<head>
<title>
</title>
<body>
<form name="Form1">

<input name="allbox" type="checkbox" onClick="TA();" title="选中或清除选中所有的目" tabindex="105">选中或清除选中所有的目

<br/>
<span class="X">
<input type="checkbox" name="ABC" class="A" onClick="TTA(this);">清明时节</span>
<br/>
<span class="X">
<input type="checkbox" name="DEF" class="A" onClick="TTA(this);">长江水啊</span>
<br/>
<span class="X">
<input type="checkbox" name="GHL" class="A" onClick="TTA(this);">嘿嘿试</span>
<br/>
</form>

<script language="javascript">
var frm = document.Form1;
</script>


<script language="JavaScript">

function TA(isO,noHL){
 var trk = 0;
 
 
 for(var i=0;i<frm.elements.length;i++){
  var e=frm.elements[i];

  if((e.name !='allbox') && (e.type == 'checkbox')){
    e.checked = frm.allbox.checked;
   if (frm.allbox.checked){
    //e.parentElement.className = "H"; //.parentElement不兼容firefox览器?br />    e.parentNode.className = "H";//调用讄父节点元素class改变背景?br />   
   }else{
    e.parentNode.className = "X";//调用讄父节点元素class改变背景?br />   }
  }
 }
}

function TTA(CB,noHL){
 if (CB.checked){
  CB.parentNode.className = "H";
 }else{
  CB.parentNode.className = "X";
 }

 

 var TB=TO=0;
 for (var i=0;i<frm.elements.length;i++){
  var e=frm.elements[i];
  if ((e.name != 'allbox') && (e.type=='checkbox')){
   TB++;
  if (e.checked)
   TO++;
  }
 }
 frm.allbox.checked=(TO==TB)?true:false;
 //如果不是所有项被选中则allbox讑֮未被选中
}


</script>

<style>
.H{
 background: #ADD8E6
}
.X{
 background: #FFFFFF
}

</style>


</body></html>



bluesky 2006-06-23 17:51 发表评论
]]>
CD代码[PHP]q代d数据?/title><link>http://m.tkk7.com/bluesky/archive/2006/06/23/54594.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Thu, 22 Jun 2006 16:09:00 GMT</pubDate><guid>http://m.tkk7.com/bluesky/archive/2006/06/23/54594.html</guid><wfw:comment>http://m.tkk7.com/bluesky/comments/54594.html</wfw:comment><comments>http://m.tkk7.com/bluesky/archive/2006/06/23/54594.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/bluesky/comments/commentRss/54594.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/bluesky/services/trackbacks/54594.html</trackback:ping><description><![CDATA[ <p> <br /><style></p> <p>input, select {<br /> font-size: 14px; <br /> color: #333333; <br /> padding-left:3px; <br /> background:#f6f6f6; <br /> border: #CCCCCC 1px solid;}<br /></style><br /><?php<br />require_once dirname(__FILE__) ."/headers.php";</p> <p>$i = 0;<br />  </p> <p>function category($category_parent_timestamp){<br />   global $db;<br />   global $i;<br />   $result = $db->get("{category_parent_timestamp} == " . $category_parent_timestamp,null,"categories",false,"category_time","desc"); <br />   sort($result);<br />  <br />   for($index=0;$index<count($result);$index++){          <br />     echo "<option>";<br />     for($x=0;$x<$i;$x++){<br />       echo "--";<br />      }      <br />     echo $result[$index]['category_title'];<br />     echo "&nbsp;";  <br />     $sub = $db->get("{category_parent_timestamp} == " .$result[$index]['category_timestamp'],null,"categories",false,"category_time","desc"); <br />     if(count($sub)!=0){<br />       $i++;<br />       category($result[$index]['category_timestamp']);//q代      <br />       $i--;<br />     }<br />     echo "</option>";<br />   }<br />   <br />}    <br /> <br />echo "<select>";<br />category("0"); <br />echo"</select>";<br />?></p> <img src ="http://m.tkk7.com/bluesky/aggbug/54594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/bluesky/" target="_blank">bluesky</a> 2006-06-23 00:09 <a href="http://m.tkk7.com/bluesky/archive/2006/06/23/54594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]PHP开发框架ȝhttp://m.tkk7.com/bluesky/archive/2006/04/18/41654.htmlblueskyblueskyTue, 18 Apr 2006 07:11:00 GMThttp://m.tkk7.com/bluesky/archive/2006/04/18/41654.htmlhttp://m.tkk7.com/bluesky/comments/41654.htmlhttp://m.tkk7.com/bluesky/archive/2006/04/18/41654.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/41654.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/41654.htmlhttp://blog.liu21st.com/index.php?job=art&articleid=a_20050111_231555

怿每个PHP开发h员都见过很多的PHP开发框Ӟ?a target="_blank">Symfony、Blueshoes和最q比较火?a target="_blank">Cake{,本站也曾l介l过不少q样?a target="_blank">开发框?/a>


攉整理了一些主要的PHP开发框架和CMSpȝq_Q在此一q作个ȝQ或总后会有补充?br />
开发框?/strong>
WACT http://wact.sourceforge.net/
老牌的PHP~程框架Q实C很多企业U的开发模?br />
Horde http://www.horde.org/horde/
提供了一些常用类库,可以满参数处理、数据压~、浏览器、链接跟t以?MIME。需要PEARcd的支持,提供了API参考?br />
Seagull http://seagull.phpkitchen.com/ 推荐
一个面向对象的PHP开发框Ӟ使用了PearcdQ其主要Ҏ有Q运用组件方式、简化数据访问、错误处理机制和权限认证理{?br />
studs http://mojavelinux.com/projects/studs/  推荐
Jakarta Strutsl构ULq来的PHP开发框Ӟ使用面向对象的开发结构和APIQ模拟了一个HTTP Servlet容器
和用了PHP服务面引擎技?br />
InterJinn http://www.interjinn.com/
有很多扩展模块提供下载,可惜配置文g使用的是inc格式

Php.MVC http://www.phpmvc.net/
知名的PHP开发框?Q基于Java的Struts

Phrame http://phrame.sourceforge.net/
虽然不大Q但用的很多Q也是基于Struts思想

Ambivalence http://amb.sourceforge.net/
ZMaverick思想实现的PHP开发框?br />
binarycloud http://www.binarycloud.com/
使用了Smarty模板引擎Q文档很完善

Prado http://www.xisc.com/
Zend获奖作品Q基于事仉动的PHP开发框?br />
rwfphp http://www.rwfphp.org/
面向对象和事仉动的php开发框?br />
Krysalis http://www.kompletecms.com/
把XML文档转换为XHTML文档的PHPpȝ

FastFrame  http://codejanitor.com/wp/apps/fastframe/
可以快速地实现表单提交

Blueshoes http://www.blueshoes.net/ 推荐
比较先进的一个frameworkQ提供了很多GUIlg

下面q些我也没有详细?br />Cgiapp http://weierophinney.net/matthew/download
Fuselogic  http://www.haltebis.com/index/wakka/main/FuseLogic
Copix http://copix.aston.fr/
logicreate http://www.logicreate.com/
booby http://www.nauta.be/booby/

主要的CMSpȝ
Drupal http://www.drupal.org/
Mambo http://www.mamboportal.com/
Nucleus http://nucleuscms.org/
Midgard http://www.midgard-project.org/
Pmachine http://www.pmachine.com/
PostNuke http://www.post-nuke.net/
sitellite http://www.sitellite.org/
eZPublish http://ez.no/
limb http://limb-project.com/
PSQ众多的Blogpȝ׃再这个范畴之内了Q不再列?/span>

bluesky 2006-04-18 15:11 发表评论
]]>
PHP文本数据库引?http://m.tkk7.com/bluesky/archive/2006/04/13/40827.htmlblueskyblueskyThu, 13 Apr 2006 02:58:00 GMThttp://m.tkk7.com/bluesky/archive/2006/04/13/40827.htmlhttp://m.tkk7.com/bluesky/comments/40827.htmlhttp://m.tkk7.com/bluesky/archive/2006/04/13/40827.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/40827.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/40827.htmlhttp://www.zengrong.net/25/

txtSQL

  1. 速度快(有四个主要的文本数据库速度比较Q?
  2. 基本上模拟了SQL的所有语?
  3. 强大的错误处?
  4. 完善的帮助文?
  5. 免费使用

txtdb

国h开发的一个小型文本数据库pȝ?/p>

Myupb的TextDB

txt db api

Flat-File SQL

TextDB



bluesky 2006-04-13 10:58 发表评论
]]>
WebErp不错~~http://m.tkk7.com/bluesky/archive/2006/03/02/33168.htmlblueskyblueskyThu, 02 Mar 2006 04:07:00 GMThttp://m.tkk7.com/bluesky/archive/2006/03/02/33168.htmlhttp://m.tkk7.com/bluesky/comments/33168.htmlhttp://m.tkk7.com/bluesky/archive/2006/03/02/33168.html#Feedback3http://m.tkk7.com/bluesky/comments/commentRss/33168.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/33168.html

http://www.weberp.org/ 主页


http://sourceforge.net/project/showfiles.php?group_id=70949

sourceforge下蝲不了,
扑ֈ了下边的q个链接

http://www.interdynamics.com.tw/webERP_3.04.zip

W一?安装数据?br />create database weberp;
把sql\mysql\weberp-demo.sql 插入数据?br />
W二?br />修改config.php
数据库用户名密码

W三?br />修改includes/LanguageSetup.php
W?7?br />This maybe reqiured in some stubborn installations(写死的设|?

 $Locale = setlocale (LC_CTYPE, $_SESSION['Language']);
 $Locale = setlocale (LC_MESSAGES, $_SESSION['Language']);
屏蔽?br />
$Locale = setlocale (LC_ALL, $_SESSION['Language']);
打开
修改
$Locale = setlocale (LC_ALL, $_SESSION['en_US']);


http://edwardleen.minidns.net/weberp/
q是人家汉化?好像没有开源汉化包包~~


bluesky 2006-03-02 12:07 发表评论
]]>
[转蝲]创造世界上最单的 PHP 开发模?/title><link>http://m.tkk7.com/bluesky/archive/2006/01/17/28316.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Tue, 17 Jan 2006 08:43:00 GMT</pubDate><guid>http://m.tkk7.com/bluesky/archive/2006/01/17/28316.html</guid><wfw:comment>http://m.tkk7.com/bluesky/comments/28316.html</wfw:comment><comments>http://m.tkk7.com/bluesky/archive/2006/01/17/28316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/bluesky/comments/commentRss/28316.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/bluesky/services/trackbacks/28316.html</trackback:ping><description><![CDATA[<P><A >http://sunswin.blogbus.com/logs/2005/09/1417144.html</A></P> <P><A >http://blog.csdn.net/hahawen/archive/2004/09/13/102557.aspx</A></P> <P> </P> <P>/*************************/<BR>/* author:大龄青年<BR>/* email :wenadmin@sina.com<BR>/* from: <A >http://blog.csdn.net/hahawen</A><BR>/*************************/</P> <P>原代码下? <A >http://club.phpe.net/index.php?s=&act=Attach&type=post&id=29432</A></P> <P>Q近来帮许多|友改程序,发现一个问题,是大家用php开发设计模式的非常的؜乱,所以写下这文章,希望对大安有帮助)</P> <P>php作ؓ“最单”的Web脚本语言, 在国内的市场来大Qphper来多Q但是感觉大多数人好像没有考虑到模式问题,什么样的设计模式才是最优的Q才是最适合自己目前工作的,毕竟效率是最重要的(用省下的旉打游戏,多美?..Q。MVC应该是首选,<A >www.sourceforge.net</A> 上有好多优秀的基于MVC的开源项目,大家可以冲过ȝI研I?/P> <P>前几天给自己公司|站改版Q主要还是文章发布系l,老板说后台我x么设计怎么设计Q唯一的前提就是快。于是自己搭Z一个简单的发布pȝ的框架。如果单U从文章发布pȝ上讲Q基本上可以满“中型”企业网站的文章发布pȝ的要求,后台的d的php代码不超q?00行,而且支持L扩充和plugin功能?/P> <P>废话不再说了Q下面把我的架构讲一下,希望Ҏ能有所帮助?/P> <P>注意Q在开始前Q需要您下蝲一个模板处理工LQ“smarttemplate”,q了解一些模板的单的使用?/P> <P>我的试环境Qwindows2k/apache2/php4.3.2/smarttemplatecd</P> <P>先讲一下整个web站点的文件的分布Q在后面的章节中陆l创建ƈ填充下面的目录和文g<BR>我的服务器的web的根目录?“C:/Apache2/htdocs/?BR>我在下面建立了一个文件夹“cmstest”作为我的网站的L件夹<BR>文g夹“cmstest”下面的子文件结构是Q?/P> <P>/config.inc.php<BR>/list1.php<BR>/list2.php<BR>/new.php<BR>/add.php<BR>/view.php<BR>/page.js<BR>/src/MysqlUtil.php<BR>/src/ArticleUtil.php<BR>/src/CoreUtil.php<BR>/src/ParseTpl.php<BR>/src/lib/smarttemplate/*.* q个目录用来存放smarttemplate的类库的<BR>/smart/template/list1.htm<BR>/smart/template/list2.htm<BR>/smart/template/new.htm<BR>/smart/template/add.htm<BR>/smart/template/view.htm<BR>/smart/cache/<BR>/smart/temp/</P> <P><BR>设计步骤Q?BR>1、考虑自己公司的网站的特点和已l设计的模板的结构,ȝ要实现的功能Q列出清单?/P> <P>2、分析功能清单,把功能分cR每一cȝ功能都是有共同点的,可以通过相同的方法实现的?/P> <P>3、根据功能,设计数据库的表结?/P> <P>4、设计一个配|文件config.inc.php, 用来记录|站的一些基本的信息,包括数据库名........</P> <P>5、ؓ每一cd能设计数据库查询的接口函敎ͼq样以后怼的操作只要调用这个接口就可以了。这样避免了以后可能发生的大量的代码重复的操作,也就辑ֈ了代码复用的目的?/P> <P>6、定义自己对模板工具的包装函敎ͼ以后调用的时候就不用模板工L使用问题了,只有往自己的包装函数里面塞数就可以了?/P> <P>7、基函数已经ok了,开始轻杄面实现和模板的处理了?/P> <P><BR>我们现在开始设计一个简单的pȝQ看看我是怎么一步一步地实现一个“最单的文章的发布系l”的Q当然只是我模拟的一个简单的目Q实际中一个项目可能比q要复杂的多?/P> <P><BR>一、分析我的案例:</P> <P>呵呵Q这个客户项目好单的啊,q福ing..........</P> <P>list1.phpQ有三个文章列表和一个按钮,“php开发文章列表”“php开发热Ҏ章列表”“asp开发最新文章”“添加新文章?BR>list2.phpQ有2个文章列表“asp开发文章列表”“asp开发热Ҏ章列表?BR>new.php: 一个添加文章的表单的页?BR>add.php: 处理new.php的表单的面<BR>view.php: 文章察看的页?/P> <P>二、分析功?</P> <P>“php开发文章列表”“asp开发文章列表?------按文章的发布序Q倒序排列昄Q每|C?文?BR>“php开发热Ҏ章列表”“asp开发热Ҏ章列表?------按文章的点击察看ơ数排序昄文章Q显C?文?BR>“asp开发最新文章”按文章的发布顺序,倒序排列昄Q显C?文?BR>“添加新文章?-----一个文章的发布功能, 包括文章标题/作?内容<BR>“文章察看?--------昄某篇文章内容</P> <P>l合的看一?对功能进行分cd?<BR>1、文章列表:正常的分列表、按点击数列表、按发布序的列?BR>2、文章发布:一个表单的输入和处?BR>3、文章察看:d昄文章内容</P> <P>呵呵Q功能的是太简单了些?/P> <P>三、设计数据库Q?/P> <P>数据库名Qcmstest</P> <P>数据表:</P> <P>CREATE TABLE `article` (<BR>`id` INT NOT NULL AUTO_INCREMENT,<BR>`title` VARCHAR( 100 ) NOT NULL ,<BR>`content` TEXT NOT NULL ,<BR>`datetime` DATETIME NOT NULL ,<BR>`clicks` INT( 11 ) ,<BR>`pid` TINYINT( 2 ) NOT NULL ,<BR>PRIMARY KEY ( `id` ) <BR>);</P> <P>CREATE TABLE `cat` (<BR>`cid` TINYINT( 2 ) NOT NULL ,<BR>`cname` VARCHAR( 20 ) NOT NULL ,<BR>PRIMARY KEY ( `cid` ) <BR>);</P> <P>------------------------------<BR>article表是文章内容表,<BR>----------------------------<BR>`id` 文章~号<BR>`title` 文章标题<BR>`content` 文章内容<BR>`datetime` 发布旉<BR>`clicks` 点击?BR>`pid` 分类表号<BR>------------------------------<BR>cat表是文章的类别表<BR>----------------------------<BR>`cid` 分类表号<BR>`cname` 分类名称<BR>----------------------------</P> <P>上面是表的数据库l构Q光有了q些q不够,q要有数?BR>INSERT INTO `cat` VALUES(1, "php开?),(2, "asp开?);<BR>INSERT INTO `article` VALUES(1, "php开?", "php开?内容", "2004-8-1 1:1:1", 0, 1);<BR>INSERT INTO `article` VALUES(2, "php开?", "php开?内容", "2004-8-2 1:1:1", 0, 1);<BR>INSERT INTO `article` VALUES(3, "php开?", "php开?内容", "2004-8-3 1:1:1", 4, 1);<BR>INSERT INTO `article` VALUES(4, "php开?", "php开?内容", "2004-8-4 1:1:1", 3, 1);<BR>INSERT INTO `article` VALUES(5, "php开?", "php开?内容", "2004-8-5 1:1:1", 2, 1);<BR>INSERT INTO `article` VALUES(6, "php开?", "php开?内容", "2004-8-6 1:1:1", 1, 1);<BR>INSERT INTO `article` VALUES(7, "php开?", "php开?内容", "2004-8-7 1:1:1", 0, 1);<BR>INSERT INTO `article` VALUES(8, "jsp开?", "jsp开?内容", "2004-8-1 1:1:1", 0, 2);<BR>INSERT INTO `article` VALUES(9, "jsp开?", "jsp开?内容", "2004-8-2 1:1:1", 0, 2);<BR>INSERT INTO `article` VALUES(10, "jsp开?", "jsp开?内容", "2004-8-3 1:1:1", 4, 2);<BR>INSERT INTO `article` VALUES(11, "jsp开?", "jsp开?内容", "2004-8-4 1:1:1", 3, 2);<BR>INSERT INTO `article` VALUES(12, "jsp开?", "jsp开?内容", "2004-8-5 1:1:1", 2, 2);<BR>INSERT INTO `article` VALUES(13, "jsp开?", "jsp开?内容", "2004-8-6 1:1:1", 1, 2);<BR>INSERT INTO `article` VALUES(14, "jsp开?", "jsp开?内容", "2004-8-7 1:1:1", 0, 2);</P> <P><BR>q样我们的数据库p计完了。接下来开始涉及到具体的实C?/P> <P>四、设计config.inc.php文g</P> <P>q个文g用来讄一些web上通用的数据信息和一些参敎ͼ其他的具体的实现面都通过q个面获取需要的数据Q下面是配置的清?/P> <P><BR>//数据库设|?BR>define('DB_USERNAME', 'root');<BR>define('DB_PASSWORD', '');<BR>define('DB_HOST', 'localhost');<BR>define('DB_NAME', 'cmstest');<BR>define('DB_PCONNECT', true);</P> <P>// web的基本\l设|?BR>define('CMS_ROOT', 'C:/Apache2/htdocs/cmstest/');<BR>define('CMS_SRCPATH', CMS_ROOT.'src/');</P> <P>//smarttemplate 模板解析工具的设|?BR>define('SMART_REUSE_CODE', false);<BR>define('SMART_TEMPLATE_DIR', CMS_ROOT.'smart/template/');<BR>define('SMART_TEMP_DIR', CMS_ROOT.'smart/temp/');<BR>define('SMART_CACHE_DIR', CMS_ROOT.'smart/cache/');<BR>define('SMART_CACHE_LIFETIME', 100);<BR>require_once(CMS_SRCPATH.'lib/smarttemplate/class.smarttemplate.php');</P> <P>//要包含的基础文g,里面都是一些基本的函数<BR>require_once CMS_SRCPATH.'MysqlUtil.php';<BR>require_once CMS_SRCPATH.'ArticleUtil.php';<BR>require_once CMS_SRCPATH.'CoreUtil.php';<BR>require_once CMS_SRCPATH.'ParseTpl.php';</P> <P>//session 控制<BR>session_cache_limiter('private_no_expire');<BR>session_start();</P> <P>?></P> <P>其中的define('CMS_ROOT', 'C:/Apache2/htdocs/cmstest/');路经Ҏ自己apach的web路经来改Q参照最开始介l文件夹l构的地ҎQ?/P> <P><BR>五、制作功能接口(1Q?/P> <P>首先对mysql数据库函数进行包装,化对数据库操作,|上有很多这L开源的cR但是这里我个hҎ自己的需求和习惯Q自己对mysql的函数进行了包装Q写得好坏就先不了。这个地方简单的看一下就可以了,不同的包装的cL作是不同的,而且q里的主要目的是理解q套“架构”,不用太扣代码?/P> <P>-------MysqlUtil.php--------</P> <P><BR>function dbConnect(){<BR>global $cnn;<BR>$cnn = (DB_PCONNECT? mysql_pconnect(DB_HOST, DB_NAME, DB_PASSWORD):<BR>mysql_connect(DB_HOST, DB_NAME, DB_PASSWORD)) or<BR>die('数据库连接错?);<BR>mysql_select_db(DB_NAME, $cnn) or die('数据库选择错误');<BR>mysql_query("SET AUTOCOMMIT=1");<BR>}</P> <P>function &dbQuery($sql){<BR>global $cnn;<BR>$rs = &mysql_query($sql, $cnn);<BR>while($item=mysql_fetch_assoc($rs)){<BR>$data[] = $item;<BR>}<BR>return $data;<BR>}</P> <P>function &dbGetRow($sql){<BR>global $cnn;<BR>$rs = mysql_query($sql) or die('sql语句执行错误');<BR>if(mysql_num_rows($rs)>0)<BR>return mysql_fetch_assoc($rs);<BR>else<BR>return null;<BR>}</P> <P>function dbGetOne($sql, $fildName){<BR>$rs = dbGetRow($sql);<BR>return sizeof($rs)==null? null: (isset($rs[$fildName])? $rs[$fildName]: null);<BR>}</P> <P>function &dbPageQuery($sql, $page=1, $pageSize=20){<BR>if($page===null) return dbQuery($sql);<BR>$countSql = preg_replace('|SELECT.*FROM|i','SELECT COUNT(*) count FROM', $sql);<BR>$n = (int)dbGetOne($countSql, 'count');<BR>$data['pageSize'] = (int)$pageSize<1? 20: (int)$pageSize;<BR>$data['recordCount'] = $n;<BR>$data['pageCount'] = ceil($data['recordCount']/$data['pageSize']);<BR>$data['page'] = $data['pageCount']==0? 0: ((int)$page<1? 1: (int)$page);<BR>$data['page'] = $data['page']>$data['pageCount']? $data['pageCount']:$data['page'];<BR>$data['isFirst'] = $data['page']>1? false: true;<BR>$data['isLast'] = $data['page']<$data['pageCount']? false: true;<BR>$data['start'] = ($data['page']==0)? 0: ($data['page']-1)*$data['pageSize']+1;<BR>$data['end'] = ($data['start']+$data['pageSize']-1);<BR>$data['end'] = $data['end']>$data['recordCount']? $data['recordCount']: $data['end'];<BR>$data['sql'] = $sql.' LIMIT '.($data['start']-1).','.$data['pageSize'];<BR>$data['data'] = &dbQuery($data['sql']);<BR>return $data;<BR>}</P> <P>function dbExecute($sql){<BR>global $cnn;<BR>mysql_query($sql, $cnn) or die('sql语句执行错误');<BR>return mysql_affected_rows($cnn);<BR>}</P> <P>function dbDisconnect(){<BR>global $cnn;<BR>mysql_close($cnn);<BR>}</P> <P>function sqlGetOneById($table, $field, $id){<BR>return "SELECT * FROM $table WHERE $field=$id";<BR>}</P> <P>function sqlMakeInsert($table, $data){<BR>$t1 = $t2 = array();<BR>foreach($data as $key=>$value){<BR>$t1[] = $key;<BR>$t2[] = "'".addslashes($value)."'";<BR>}<BR>return "INSERT INTO $table (".implode(",",$t1).") VALUES(".implode(",",$t2).")";<BR>}</P> <P>function sqlMakeUpdateById($table, $field, $id, $data){<BR>$t1 = array();<BR>foreach($data as $key=>$value){<BR>$t1[] = "$key='".addslashes($value)."'";<BR>}<BR>return "UPDATE $table SET ".implode(",", $t1)." WHERE $field=$id";<BR>}</P> <P>function sqlMakeDelById($table, $field, $id){<BR>return "DELETE FROM $table WHERE $field=$id";<BR>}</P> <P>?></P> <P>五、制作功能接口(2Q?/P> <P>下面来正式的看看Q我们共要实现的功能q行的包?/P> <P>------------ArticleUtil.php----------------<BR>//昄文章列表的函?BR>//getArticleList(文章cd, 排序Ҏ, 当前昄W几? 每页昄几条)<BR>function getArticleList($catId, $order, $page, $pageSize){<BR>$sql = "SELECT * FROM article WHERE pid=$catId ORDER BY $order";<BR>return dbPageQuery($sql, $page, $pageSize);<BR>}<BR>//查询某个文章的内?BR>//getArticle(文章~号)<BR>function getArticle($id){<BR>$sqlUpdate = "UPDATE article SET clicks=clicks+1 WHERE id=$id";<BR>dbExecute($sqlUpdate);<BR>$sql = "SELECT * FROM article WHERE art_id=$id";<BR>return dbGetRow($sql);<BR>}<BR>//d文章<BR>//addArticle(文章内容数组)<BR>function addArticle($data){<BR>$sql = sqlMakeInsert('article', $data);<BR>return dbExecute($sql);<BR>}<BR>?></P> <P>q段代码是不是就单多了啊Q这是自己对mysql函数q行包装的好处!<BR>下面来研I一下他们是怎么实现我们的功能的呢?BR>“php开发文章列表?-------getArticleList(1, "id DESC", $page, 5) <BR>“asp开发文章列表?-------getArticleList(2, "id DESC", $page, 5)<BR>“php开发热Ҏ章列表?---getArticleList(1, "clicks DESC, id DESC", 1, 3)<BR>“asp开发热Ҏ章列表?---getArticleList(2, "clicks DESC, id DESC", 1, 3)<BR>“asp开发最新文章?-------getArticleList(2, "id DESC", 1, 3)<BR>“添加新文章?------------addArticle($data)<BR>“察看文章?--------------getArticle($id)</P> <P><BR>六、对smarttemplatec进行包装(革命未成功Q同志仍d力)</P> <P>具体的smarttemplate的用这里就不讲了,不然口水讲没了,都讲不完。下面这个是具体的对包装函数</P> <P>-------------ParseTpl.php----------------</P> <P><BR>function renderTpl($viewFile, $data){<BR>$page = new SmartTemplate($viewFile);<BR>foreach($data as $key=>$value){<BR>if(isset($value[data])){<BR>$page->assign($key, $value[data]);<BR>unset($value[data]);<BR>$page->assign($key."_page", $value);<BR>} else {<BR>$page->assign($key, $value);<BR>}<BR>}<BR>$page->output();<BR>}</P> <P>?></P> <P>七:文章列表察看面实现和模板处理(万里长征的最后一步)</P> <P>先来看看面list1的实?在list1里面分页用了一个page.js文gQ这个文件是自己l自己写的一个js分页的函敎ͼ挺好用的<BR>---------------page.js---------------<BR>//--------?20 条记录,当前 86/99 ?[1]... [82] [83] [84] [85] [86] [87] [88] [89] [90] ...[99] GO-------------------<BR>//recordCount = 20;<BR>//show = 20<BR>//pageShow = 11;<BR>//pageCount = 100;<BR>//pageNow = 86;<BR>//pageStr = "?page=_page_";<BR>//document.write(showListPage(recordCount, show, pageCount, pageNow, pageStr));<BR>function showListPage(recordCount, show, pageShow, pageCount, pageNow, pageStr){<BR>if(pageCount<1) pageCount =0;<BR>if(pageNow<1) pageNow = 0;<BR>str = '?'+recordCount+' 条记录,当前 '+pageNow+'/'+pageCount+' ?';</P> <P>if(pageCount<=pageShow){<BR>startHave = false;<BR>endHave = false;<BR>startNum = 1;<BR>endNum = pageCount;<BR>} else if(pageNow-1 <= pageShow/2){<BR>startHave = false;<BR>endHave = true;<BR>startNum = 1;<BR>endNum = pageShow-1;<BR>} else if(pageCount-pageNow <= pageShow/2){<BR>startHave = true;<BR>endHave = false;<BR>startNum = pageCount - pageShow + 2;<BR>endNum = pageCount;<BR>} else {<BR>startHave = true;<BR>endHave = true;<BR>startNum = pageNow - Math.floor((pageShow-2)/2);<BR>endNum = startNum + pageShow - 3;<BR>}</P> <P>if(startHave){<BR>startStr = " [1]... ";<BR>str += startStr;<BR>}</P> <P>for(i=startNum; i<=endNum; i++){<BR>if(pageNow==i)<BR>str += "[" + i + "]";<BR>else<BR>str += " [" + i + "] ";<BR>}</P> <P>if(endHave){<BR>endStr = " ...[" + pageCount + "] ";<BR>str += endStr;<BR>}<BR>return str;<BR>}</P> <P><BR>--------------list1.htm----------------<BR>d新文?</P> <P><BR>--------------------------------------------------------------------------------</P> <P><BR> php开发文?</P> <P><BR> {id}--{title} </P> <P><BR> </P> <P> </P> <P> </P> <P>--------------------------------------------------------------------------------</P> <P><BR> php开发热Ҏ?</P> <P><BR> {id}--{title} </P> <P><BR> <BR>--------------------------------------------------------------------------------</P> <P><BR> asp开发最新文?</P> <P><BR> {id}--{title} </P> <P><BR> </P> <P><BR>--------------list1.php----------------</P> <P><BR>require_once "config.inc.php";</P> <P>dbConnect();<BR>$data = array();<BR>$data[phplist] = getArticleList(1, "id DESC", (int)$_GET[page], 5);<BR>$data[phphotlist] = getArticleList(1, "clicks DESC, id DESC", 1, 3);<BR>$data[aspnewlist] = getArticleList(2, "id DESC", 1, 3);<BR>dbDisconnect();</P> <P>renderTpl('list1.htm', $data);</P> <P>?></P> <P>q行的效果怎么P是不是实C要求的功能呢。现在我们再做一下改动,在里面加上“asp开发热Ҏ章列表”,实现代码如下</P> <P>--------------list1.htm----------------<BR>d新文?</P> <P><BR>--------------------------------------------------------------------------------</P> <P><BR> php开发文?</P> <P><BR> {id}--{title} </P> <P><BR> </P> <P> </P> <P> </P> <P>--------------------------------------------------------------------------------</P> <P><BR> php开发热Ҏ?</P> <P><BR> {id}--{title} </P> <P><BR> <BR>--------------------------------------------------------------------------------</P> <P><BR> asp开发最新文?</P> <P><BR> {id}--{title} </P> <P><BR> </P> <P> asp热点文章 </P> <P><BR> {id}--{title} </P> <P><BR> </P> <P><BR>--------------list1.php----------------</P> <P><BR>require_once "config.inc.php";</P> <P>dbConnect();<BR>$data = array();<BR>$data[phplist] = getArticleList(1, "id DESC", (int)$_GET[page], 5);<BR>$data[phphotlist] = getArticleList(1, "clicks DESC, id DESC", 1, 3);<BR>$data[aspnewlist] = getArticleList(2, "id DESC", 1, 3);<BR>$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);<BR>dbDisconnect();</P> <P>renderTpl('list1.htm', $data);</P> <P>?></P> <P>仔细观察一下前后的区别Qlist1.php里面只是单的加入了一行的代码Q就实现q个改动Q感觉怎么样啊Q是不是񔽎单?/P> <P>其实q种设计模式的好处还不只是这点:<BR>1、可以把E序的核心代码隔d理Q便于以后程序的理l护<BR>2、对于程序的可扩展性也很好Q假设list1.php中要加入产品列表Q我是不是也可以q么做呢Q把对品的理也写成统一的数据库操作接口Q然后简单的修改模板文g加入产品列表部分Q最后在list1.php中加入一行函数调用的代码Q就可以实现?BR>3、代码复用,如果您是做中型企业|站的,那这么做Ҏ的好处是最大的Q因U类型的|站的设计结构几乎是一LQ您可能只需要更改一下模板的样式Q就可以赚到钞票了?/P> <P>q么看来q种模式是不是给您带来了很多的好处呢Q?/P> <P><BR>-----------lsit2.htm---------------<BR>d新文?</P> <P> </P><img src ="http://m.tkk7.com/bluesky/aggbug/28316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/bluesky/" target="_blank">bluesky</a> 2006-01-17 16:43 <a href="http://m.tkk7.com/bluesky/archive/2006/01/17/28316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]PHP ~码规范http://m.tkk7.com/bluesky/archive/2006/01/17/28315.htmlblueskyblueskyTue, 17 Jan 2006 08:34:00 GMThttp://m.tkk7.com/bluesky/archive/2006/01/17/28315.htmlhttp://m.tkk7.com/bluesky/comments/28315.htmlhttp://m.tkk7.com/bluesky/archive/2006/01/17/28315.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/28315.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/28315.htmlPHP ~码规范TAGQ?A >web PHP

原文Q?A target=_blank>http://pear.php.net/manual/en/standards.php

译Q廖宇雷

最后更新日期:2003/05/06

 

内容列表


~进

~进使用4个空|而不?tab。如果你使用 Emacs ~辑 PEAR 代码Q你应该讄 indent-tabs-mode ?nil。下面是一?mode hook 的示例,用于讄 Emacs W合~进标准Q你必须保在编?PHP 文gӞq些讄发生作用Q:

  (defun php-mode-hook ()
  (setq tab-width 4
        c-basic-offset 4
        c-hanging-comment-ender-p nil
        indent-tabs-mode
        (not
         (and (string-match "/\\(PEAR\\|pear\\)/" (buffer-file-name))
              (string-match "\.php$" (buffer-file-name))))))

q里是同{效果的 vim 规则Q?/P>

  set expandtab
  set shiftwidth=4
  set softtabstop=4
  set tabstop=4


控制l构

控制l构包含 if、for、while、switch {。这里有一?if 语句的示例和一?switch 语句的示例:

if 语句的示例:

<?php
if ((condition1) || (condition2)) {
    action1;
} elseif ((condition3) && (condition4)) {
    action2;
} else {
    defaultaction;
}
?>

switch 语句的示例:

<?php
switch (condition) {
case 1:
    action1;
    break;
case 2:
    action2;
    break;
default:
    defaultaction;
    break;
}
?>

控制语句应该在控制关键词和开始的圆括号之间应该有一个空|以此和函数调用进行区别?/P>

强烈你L使用花括号将控制l构各部分标识出来。即使是在技术上可以不用花括号的地斏V这可以增加代码的可L,同时避免在结构部分增加新行后引入逻辑上的错误?/P>

原始代码Q?/P>

if (condition)
    return true;
else
    return
false;

修改后的代码Q?/P>

if (condition)
    do something; // 出现逻辑错误
    return true;
else
    return
false;

正确的做法:

if (condition) {
    do something;
    return true;
} else {
    return
false
;
}


函数调用

调用函数Ӟ函数名和开始的括号之间不应该有I白字符。参数和开始及l束的括号之间不应有I格。而除W一个参数外Q其他参数都应该用一个空格分隔。这里有一个示例:

<?php
$var = foo($bar, $baz, $quux);
?>

像上面的CZ代码Q赋D等号两辚w应该使用一个空根{如果是相关的赋D,应该采用下面的Ş式以提供更好的可L:

<?php
$short = foo($bar);
$long_variable = foo($baz);
?>


函数定义

按照“one true brace”约定声明函敎ͼ

<?php
function fooFunction($arg1, $arg2 = '')
{
    if (condition) {
        statement;
    }
    return
$val;
}
?>

“one true brace”约定就是开始的花括号单独占一行,而不是跟在其他语句后面?/P>

h默认值的参数应该位于参数列表的后面(事实?PHP 语言定义也要求如此)。如果适合Q函数应该Lq回一个有意义的倹{这里有一个稍微长一点的CZQ?/P>

<?php
function connect(&$dsn, $persistent = false)
{
    if (is_array($dsn)) {
        $dsninfo = &$dsn;
    } else {
        $dsninfo = DB::parseDSN($dsn);
    }

    if (!$dsninfo || !$dsninfo['phptype']) {
        return $this->raiseError();
    }
    return
true
;
}
?>


注释

cdQclassQ的联机文档应该W合 PHPDocQ类g JavaDocQ的U定。更多关?PHPDoc 的信息可以访?http://www.phpdoc.de/ 获得?/P>

此外Q强烈鼓׃用非文档注释。一般性规则是对于那些Ҏ忘记作用的代码添加简短的介绍性注释?/P>

推荐使用 C 样式的注释(/* */Q和标准 C++ 注释Q?/)Q而不应该使用 Perl/shell 样式的注释(#Q?/P>


包含代码

无论在什么地Ҏ条g包含一个类型文Ӟ应该使用 require_once()。如果有条g的包含一个类型文Ӟ例如使用工厂ҎQ,应该使用 include_once()。用两者中的Q何一个都能够保cd文g只包含一ơ。它们共享一个文件列表,因此你不需要担心؜淆他?—?一个文件?require_once() 包含后不会在 include_once() 中再一ơ被包含?/P>

备注Q?SPAN class=input>include_once() ?require_once() 是一个声明,而不是函数。你不需要用圆括号文件名扩v来(不过使用括号也不会出现错误)?/P>


PHP 代码标记

L使用 <?php ?> 来界?PHP 代码Q而不要?<? ?> 速记方式。这是ؓ了符?PEAR 一致性所必须的,同时也是在不同操作系l和不同安装讄环境下移?PHP 代码所要求的?/P>


头注释块

PEAR 发布的所有源代码文g头部都应该包含下面的注释块:

<?php
/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Original Author <author@example.com>                        |
// | Your Name <you@example.com>                                          |
// +----------------------------------------------------------------------+
//
// $ Id $

?>

q里没有性规定要一个代码A献者的名字d到文件注释的作者列表中。一般情况下Q他们的更改属于“substantial”目录(意味大约10%?0%的代码被改写Q。有一个例外就是代码A献者重写了函数或者A献了新的E序逻辑?/P>

单的代码重组?bug 修复不应该增加新作者,q是不恰当的?/P>

不在核心 PEAR 仓库中的文g应该有一个类似的注释块来说明版权、许可协议和作者。所有文件应该包含一个模式行QmodelineQ用?vim ?emacsQ以保一致性?/P>


使用 CVS

q个节的内容仅仅适用?cvs.php.net 上?CVS 的包?/P>

在每一个文件中包含 $Id $Q两?$ W号之间的关键字不能够有I格Q但׃此文档也是用 CVS 理Q因此只好加个空|避免?CVS 替换掉) CVS 关键字,以便查看文g当前状态和最后修Ҏ间等信息。如果已l存在“Last Modified:”这L信息Q则替换?$Id $ 标记?/P>

q个节的其他内容假定你有关?CVS 标记和分支(branchesQ的基本知识?/P>

CVS 标记用于标识你包中的文g释放之前所作的修订。下面的列表是必需使用和徏议用的 CVS 标记Q?/P>

RELEASE_n_n

Q必需的)用于标记一个释攄本。如果你没有使用q个标记Q别人就没有办法在你发布一个释攄本时?CVS 服务器获取你的包?/P>

QA_n_n

Q分支,可选)如果你觉得在发布释放版本之前要提供一个候选释攄本,那么一个好L是增加一个分支。这个分支可以让你将释放版本隔离出来Qƈ在正式发布释攄本之前可以ؓq些分支单独应用更新。期_正常的开发工作可以在d上l进行?/P>

MAINT_n_n

Q分支,可选)如果你需要创Z个较修改的释放版本Q例如在 1.2 之后发布 1.2.1Q。那么你可以创徏一个分支来辑ֈ目的?/P>

仅有 RELEASE 标记是必ȝQ其他标Cؓ了方便推荐你使用?/P>

下面是一个如何ؓ "Money_Fast" ?1.2 释放版本增加标记的示例:

$ cd pear/Money_Fast
$ cvs tag RELEASE_1_2
T Fast.php
T README
T package.xml

l过上面的操作,可以在 PEAR Web |站上获取你的一pd释放版本了?/P>

q里是一个如何徏?QA 分支的示例:

$ cvs tag QA_2_0_BP
...
$ cvs rtag -b -r QA_2_0_BP QA_2_0
$ cvs update -r QA_2_0
$ cvs tag RELEASE_2_0RC1
...and then the actual release, from the same branch:
$ cvs tag RELEASE_2_0

"QA_2_0_BP" 标记是一?"branch point" 标记Q用于标记分支的开始。L用这L标记来标明分支的开始是一个好L。MAINT 分支可以使用 RELEASE 标记作ؓ它的分支L?/P>


CZ中的 URL

所有示例中用到?URL 地址都应该是 "example.com"?example.org"?example.net"?/P>


命名U定

一般而言Qclass、函数和变量的名字应该L能够描述让代码阅读者能够容易的知道q些代码的作用?/P>

Classes

class 应该h一个描q性的名字。可能时应该避免使用~写。class 名字应该L用一个大写字母开始。从 class 名字中也能够反映?PEAR class 的层ơ。层ơ中的每个别都用下划线q行分隔。好?class 名字CZ如下Q?/P>

Log
Net_Finger
HTML_Upload_Error

函数和方?/P>

函数和方法应该?"studly caps" 样式命名。函数应该将所在包的名字作为前~Q以避免与其他包的函数发生名字冲H。名字的受字母(前缀之后Q应该是写Q每一个新单词应该以大写字母开头。下面是一些示例:

connect()
getData()
buildSomeWidget()
XML_RPC_serializeData()

U有 class 成员和属性(意味着 class 成员和属性只应该由同一?class 中声明的成员使用。不q?PHP q不支持强制性的U有命名I间Q应该用一个下划线开头。示例:

_sort()
_initTree()
$this->_status

常数

常数应该L全部使用大写字母命名Q用下划U来分隔单词。常数名字的前缀应该使用大写?class/?名字。例如:DB:: 包用的所有常数都?DB_ 开头?/P>

全局变量

如果你的包需要定义全局变量Q那么应该用下划U跟上包的名字和另一个下划线作ؓ开头。例如,PEAR 包用一个全局变量名ؓ $_PEAR_destructor_object_list?/P>

预定义的?true、false ?null

PHP 的内建?true、false ?null 必须全部用小写字母书写?/P>

bluesky 2006-01-17 16:34 发表评论
]]>
[转蝲]重新装的PHPLib DBc?/title><link>http://m.tkk7.com/bluesky/archive/2005/12/31/26147.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Sat, 31 Dec 2005 01:40:00 GMT</pubDate><guid>http://m.tkk7.com/bluesky/archive/2005/12/31/26147.html</guid><wfw:comment>http://m.tkk7.com/bluesky/comments/26147.html</wfw:comment><comments>http://m.tkk7.com/bluesky/archive/2005/12/31/26147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/bluesky/comments/commentRss/26147.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/bluesky/services/trackbacks/26147.html</trackback:ping><description><![CDATA[     摘要: http://dev.csdn.net/article/81/81559.shtm [  q接数据?nbsp;]//包含数据库处理类文ginclude_once("database.inc.php");//本地数据库配|define("DB_HOST",    "localhost"); //数据库服务器define("DB...  <a href='http://m.tkk7.com/bluesky/archive/2005/12/31/26147.html'>阅读全文</a><img src ="http://m.tkk7.com/bluesky/aggbug/26147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/bluesky/" target="_blank">bluesky</a> 2005-12-31 09:40 <a href="http://m.tkk7.com/bluesky/archive/2005/12/31/26147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]几个PHP函数http://m.tkk7.com/bluesky/archive/2005/12/30/26067.htmlblueskyblueskyFri, 30 Dec 2005 07:30:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/30/26067.htmlhttp://m.tkk7.com/bluesky/comments/26067.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/30/26067.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/26067.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/26067.html作者主?/FONT>
http://phpu.blogchina.com/

 

获取数字随机?nbsp;

之前用过的一些函敎ͼ最q会陆箋做些整理?/FONT>

获得最和最大g间随机数Q位C?BR>


 #-------------------------------------------
 # 获得最和最大g间随机数Q位C?BR> #-------------------------------------------
 
Function getRandNumber ($fMin, $fMax
) { 
 
srand((double)microtime()*1000000
);
 
$fLen = "%0".strlen($fMax)."d"
;
  Return
sprintf($fLen, rand($fMin,$fMax
));
 }


判断数字大小

判断数字的大是否在某个范围内,如果仅仅是判断是否ؓ数字无需使用?BR>

 #---------------------------------------------------------- 
 # 判断数字大小Q无大小的判断可以用pȝ带的 is_numeric($str)
 #----------------------------------------------------------
 Function isNumber ($fNum
, $fMin="", $fMax="") { 
  if ( eregi(
"^[0-9]+$", $fNum) ) { 
   if ( 
"" == $fMax && "" == $fMin ) { 
   Return True
;
   } elseif ( "" == $fMin && $fNum <= $fMax ) { 
   Return True
;
   } elseif ( "" == $fMax && $fNum >= $fMin ) { 
   Return True
;
   } elseif ( $fNum >= $fMin && $fNum <= $fMax ) { 
   Return True
;
   } else { 
   Return False
;
   }
  } else { 
  Return False
;
  }
 } 

 随机生成囑փ验证?nbsp;
Ҏ以前的验证码生成修改而来Q需要GD库的支持
特点Q?BR>
1 安全性较强,随机背景加随机像素点l制
2 生成四位随机数字Q可重定义)
3 验证码存入sessionQ直接取值即可比?BR>4 可以带参数调用。(默认?4×22的png囑փQ?BR>       t 囑փ格式 png gif jpeg {?BR>       w 囑փ宽度
       h 囑փ高度

调用方式如下Q?BR>
<img src
="verify.php?t=gif&w=60&h=25" border="0" alt="">

代码如下Q?BR><?PHP
 #----------------------------------------------
 # ?nbsp;   ? verify.php
 # ?nbsp;   ? 认证码显C?BR> #           Liu21st
,liu21st@126.com
 # 最后修? 
2004-05-07 10:57:30 Liu21st
 #----------------------------------------------
  
 $type
=($_GET['t'])?($_GET['t']):'png';
 $width=($_GET['w'])?($_GET['w']):54;
 $height=($_GET['h'])?($_GET['h']):22;
 session_start();
 Header("Content-type: image/".$type);
 srand((double)microtime()*1000000);
 
 $randval 
= sprintf("%04d", rand(0,9999));
 session_register('session_verify');
 if ( is_array($_SESSION) ) { 
  $_SESSION
['session_verify'] = $randval;
  $session_verify =$_SESSION['session_verify'];
 }
 else { 
  $session_verify 
= $randval;
 }
 
if ( $type!
='gif' && function_exists('imagecreatetruecolor')) { 
$im 
= @imagecreatetruecolor($width,$height);
 }else { 
  $im 
= @imagecreate($width,$height);
 }
 $r 
= Array(225,255,255,223);
 $g = Array(225,236,237,255);
 $b = Array(225,236,166,125);
 
 $key 
= rand(0,3);
  
 $backColor 
= ImageColorAllocate($im, $r[$key],$g[$key],$b[$key]);//背景Ԍ随机Q?/SPAN>
 $borderColor = ImageColorAllocate($im, 0, 0, 0);//Ҏ?/SPAN>
 $pointColor = ImageColorAllocate($im, 0, 255, 255);//炚w?/SPAN>
 
 @imagefilledrectangle($im
, 0, 0, $width - 1, $height - 1, $backColor);
 @imagerectangle($im, 0, 0, $width-1, $height-1, $borderColor);
 $stringColor = ImageColorAllocate($im, 255,51,153);
 for($i=0;$i<=10;$i++){ 
  $pointX = rand(2,$width-2);
  $pointY = rand(2,$height-2);
  @imagesetpixel($im, $pointX, $pointY, $pointColor);
 }
 
 @imagestring($im
, 5, 8, 3, $randval, $stringColor);
 $ImageFun='Image'.$type;
 $ImageFun($im);
 @ImageDestroy($im);
 
?> 

 PHP随机密码生成 
产生随机字串Q可用来自动生成密码?BR>特点Q?BR>
1. 可以指定密码包含数字或字W,默认为؜和模?BR>2. 指定随意密码长度Q默认长度ؓ6?BR>


代码如下Q?BR>#-------------------------------------------
# 产生随机字串Q可用来自动生成密码 
# 默认长度6?nbsp;字母和数字؜?BR># $format ALL NUMBER CHAR 字串l成格式
#-------------------------------------------
 function randStr($len
=6,$format='ALL') { 
 switch($format) { 
 case 'ALL':
 $chars
='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-@#~'; break;
 case 'CHAR':
 $chars
='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-@#~'; break;
 case 'NUMBER':
 $chars
='0123456789'; break;
 default :
 $chars
='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-@#~'; 
 break;
 }
 mt_srand((double)microtime()*
1000000*getmypid()); 
 $password="";
 while(strlen($password)<$len)
    $password.
=substr($chars,(mt_rand()%strlen($chars)),1);
 return $password;
 } 



bluesky 2005-12-30 15:30 发表评论
]]>smarty循环array-map昄http://m.tkk7.com/bluesky/archive/2005/12/30/26053.htmlblueskyblueskyFri, 30 Dec 2005 06:22:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/30/26053.htmlhttp://m.tkk7.com/bluesky/comments/26053.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/30/26053.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/26053.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/26053.html
                    <ul>
                    {{{section name=item loop=$menu_item}}}
                        
<li><href="{{{$menu_item[item][0]}}}">{{{$menu_item[item][1]}}}</a></li>
                    {{{/section}}}
                    
                        
<!--
                        格式
                             <li><a href="#">Index</a></li>
                            <li><a href="#">Selected Content</a></li>
                            <li><a href="#">Guestbook</a></li>
                            <li><a href="#">Toggle Sidebar</a></li>
                            <li><a href="#">Login</a></li>
                        
-->
                    
</ul>

head.php
<?php

require 'lib/Smarty-2.6.11/libs/Smarty.class.php';

$smarty = new Smarty;

//$smarty->compile_check = true;
//$smarty->debugging = true;

$smarty->left_delimiter = "{{{"
$smarty->right_delimiter = "}}}"

$site_title ="中文";
?>
ini.php
<?php
define('SITE_TITLE','中文');
define('SITE_LINK','');
define('AUTHER','bluesky');
define('BABY','');
define('WATCH','');
define('BLOG_TITLE','HELLOWORLD,BLOG');
define('BLOG_INDEX_LINK','HTTP://localhost:88/yy/xy.php');
?>

xy.php
<?php

//echo dirname(__FILE__);

require 'head.php';
require 'ini.php';

$page = 'y.html';
define('PAGE_TITLE','中国');
$smarty->assign('site_title',SITE_TITLE);
$smarty->assign('page_title',PAGE_TITLE);
$smarty->assign('blog_title',BLOG_TITLE);
$smarty->assign('blog_index_link',BLOG_INDEX_LINK);

$href = array();
$value = array();
$href[1= 'index.php'$value[1= '首页';
$href[2= 'guest.php'$value[2= '留言?/SPAN>';
$href[3= 'about.php'$value[3= '关于';
$href[4= 'link.php';  $value[4= '链接';


$map = array_map(null,$href,$value);

for($index=0;$index<count($c);$index++){
    
//echo "<a href=".$c[$index][0].">";
    //echo $c[$index][1]."</a><br/>";

}

//return;
$smarty->assign('menu_item',$map);

$smarty->display($page);
?>


bluesky 2005-12-30 14:22 发表评论
]]>
PHP用smarty之后q问题http://m.tkk7.com/bluesky/archive/2005/12/30/26043.htmlblueskyblueskyFri, 30 Dec 2005 05:10:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/30/26043.htmlhttp://m.tkk7.com/bluesky/comments/26043.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/30/26043.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/26043.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/26043.html

文g格式是utf8格式?/SPAN>,assign后会是显CZؕ?/SPAN>,外部css文g格式好像也不能是utf-8格式

用记事本打开,另存成编码ANSI格式的就好了
icq81.gif

bluesky 2005-12-30 13:10 发表评论
]]>
PHP数组和explode函数http://m.tkk7.com/bluesky/archive/2005/12/29/25899.htmlblueskyblueskyThu, 29 Dec 2005 08:35:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/29/25899.htmlhttp://m.tkk7.com/bluesky/comments/25899.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/29/25899.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/25899.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/25899.html<?php
$province 
= array("北京","上v","天|","重庆","沛_","p","内蒙?/SPAN>","辽宁","吉林","黑龙?/SPAN>","江苏","","安徽","","江西","׃","沛_","湖北","湖南","q东","q西","","四川","贵州","云南","西藏","陕西","甘肃","宁夏","青v","新疆","香港","澳门","台湾","其他");
echo count($province);//数组成员个数
echo "<br/>";

if(is_array($province)){//变量是否是数组
    echo 
"?真是个数l啊";
}
echo 
"</br>";

for($index
=0;$index<count($province);$index++){//数组循环
echo $province[$index];
echo "</br>";
}
?>

<?php
//利用 explode 函数分割字符串到数组
$source 
= "hello1,hello2,hello3,hello4,hello5";//按逗号分离字符?/SPAN>
$hello = explode(',',$source); 

for($index
=0;$index<count($hello);$index++){
echo $hello[$index];echo "</br>";
}

?>

<?php
//函数挺实用的
// 分隔W可以是斜线Q点Q或横线
$date 
= "04/30/1973";
list($month, $day, $year) = split ('[/.-]', $date);
echo "Month: $month; Day: $day; Year: $year<br />\n";
?> 


bluesky 2005-12-29 16:35 发表评论
]]>
PHP写了个连接Mysql数据库的c?/title><link>http://m.tkk7.com/bluesky/archive/2005/12/28/25729.html</link><dc:creator>bluesky</dc:creator><author>bluesky</author><pubDate>Wed, 28 Dec 2005 07:34:00 GMT</pubDate><guid>http://m.tkk7.com/bluesky/archive/2005/12/28/25729.html</guid><wfw:comment>http://m.tkk7.com/bluesky/comments/25729.html</wfw:comment><comments>http://m.tkk7.com/bluesky/archive/2005/12/28/25729.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/bluesky/comments/commentRss/25729.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/bluesky/services/trackbacks/25729.html</trackback:ping><description><![CDATA[class.mysqlconnector.php<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><?</span><span style="COLOR: #000000">php<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> MysqlConnector{<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$dbname</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">数据库名U?/span><span style="COLOR: #008000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$dbhost</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">数据库地址</span><span style="COLOR: #008000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$dbusername</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">数据库用户名</span><span style="COLOR: #008000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$dbpassword</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">数据库密?/span><span style="COLOR: #008000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> MysqlConnector(){<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">dbname </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">q是惛_个set()Ҏ来封?U有"变量</span><span style="COLOR: #008000"><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">dbhost </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">localhost</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">dbusername </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">dbpassword </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>    }<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> connectMySql(){<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #800080">$openconn</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">mysql_pconnect</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">dbhost</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">dbusername</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000"><span style="COLOR: #000000">dbpassword </span>) or </span><span style="COLOR: #0000ff">die</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">can not connect to mysql database!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #008080">mysql_select_db</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$this</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">dbname</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$openconn</span><span style="COLOR: #000000">);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$openconn</span><span style="COLOR: #000000">;<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>    }<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">?></span></div> <br>test.php<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><?</span><span style="COLOR: #000000">php<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">require</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">class.mysql.connector.php</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">$mysql_connector</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> MysqlConnector();<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">$conn</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800080">$mysql_connector</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">connectMySql();<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #800080">$rs</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">mysql_query</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">select * from student</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$conn</span><span style="COLOR: #000000">);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$row</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #008080">mysql_fetch_object</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$rs</span><span style="COLOR: #000000">)){<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> (</span><span style="COLOR: #800080">$row</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">id </span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><img src="http://m.tkk7.com/Images/dot.gif">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$row</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><img src="http://m.tkk7.com/Images/dot.gif">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$row</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">age</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br/></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">?></span></div> <br>student.sql<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> student (<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>     id </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">) unsigned </span><span style="COLOR: #808080">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">0</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>     name </span><span style="FONT-WEIGHT: bold; COLOR: #000000">varchar</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">),<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>     age </span><span style="FONT-WEIGHT: bold; COLOR: #000000">varchar</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">)<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top>     );<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> student </span><span style="COLOR: #0000ff">values</span><span style="COLOR: #000000"> (</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">xiaoli</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">23</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> student </span><span style="COLOR: #0000ff">values</span><span style="COLOR: #000000"> (</span><span style="FONT-WEIGHT: bold; COLOR: #800000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">xiaoshi</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">23</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);   <br><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000"> student </span><span style="COLOR: #0000ff">values</span><span style="COLOR: #000000"> (</span><span style="FONT-WEIGHT: bold; COLOR: #800000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">xiaobai</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">24</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);        </span></div> <br>试环境<br><a ><font style="BACKGROUND-COLOR: #f5f5dc">http://jaist.dl.sourceforge.net/sourceforge/appserv/appserv-win32-2.5.5.exe<br></font></a><br><a ><font style="BACKGROUND-COLOR: #f5f5dc">http://www.appservnetwork.com/</font></a><br><br><font style="BACKGROUND-COLOR: #f5f5dc">Apache 2.0.55<br>MySQL 5.0.15<br>PHP 5.1.1<br>phpMyAdmin-2.6.4-pl4</font><br><br><font color=#ffa500 size=6><strong>q行效果</strong></font><br><img height=348 alt={2117F59D-8885-4110-AE41-85CB4E04D9FE}0.jpg src="http://m.tkk7.com/images/blogjava_net/bluesky/images/php/{2117F59D-8885-4110-AE41-85CB4E04D9FE}0.jpg" width=462 border=0><br> <img src ="http://m.tkk7.com/bluesky/aggbug/25729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/bluesky/" target="_blank">bluesky</a> 2005-12-28 15:34 <a href="http://m.tkk7.com/bluesky/archive/2005/12/28/25729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C个PHP函数http://m.tkk7.com/bluesky/archive/2005/12/27/25633.htmlblueskyblueskyTue, 27 Dec 2005 14:45:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/27/25633.htmlhttp://m.tkk7.com/bluesky/comments/25633.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/27/25633.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/25633.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/25633.htmlfileicq81.gif

http://cn.php.net/manual/zh/function.file.php

<?php
// 一个文件读入数l。本例中通过 HTTP ?nbsp;URL 中取?nbsp;HTML 源文件?BR>$lines 
= file('http://www.example.com/');
// 在数l中循环Q显C?nbsp;HTML 的源文gq加上行受?BR>foreach ($lines as $line_num => $line) {
   echo 
"Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
// 另一个例子将 web 面d字符丌Ӏ参?nbsp;file_get_contents()?BR>$html 
= implode('', file ('http://www.example.com/'));
?> 

正则表达?/STRONG>查找替换
http://cn.php.net/manual/zh/function.preg-replace.php

<?php
$string 
= "April 15, 2003";
$pattern = "/(\w+) (\d+), (\d+)/i";
$replacement = "\${1}1,\$3";
print preg_replace($pattern, $replacement, $string);

/* Output
   
======

April1
,2003

 */
?> 


bluesky 2005-12-27 22:45 发表评论
]]>
[转蝲]PHP模板引擎SMARTYhttp://m.tkk7.com/bluesky/archive/2005/12/27/25575.htmlblueskyblueskyTue, 27 Dec 2005 07:24:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/27/25575.htmlhttp://m.tkk7.com/bluesky/comments/25575.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/27/25575.html#Feedback2http://m.tkk7.com/bluesky/comments/commentRss/25575.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/25575.html出处
http://www.5ivb.net/Info/130/Info39210/

用PHP实现MVC开发模式的逻辑层和表示层有多种模板引擎可供选择Q?但是官方引擎SMARTY诞生后,选择有了变化。它的理念和实现都是 相当"前卫"的。本文主要讨论SMARTY之于其他模板引擎的不同特点, 要介l了该引擎的安装及用,q用一个小的测试案例对比了 SMARTY和PHPLIB template的速度和易用性?

一、MVC需要模?
MVC最早是在SmallTalk语言的开发过E中ȝ出的一U设计模式,MVC分别?表了"模型"?视图"?控制"Q目的就是让不同的开发角色在大中型项目中各司 其职。在|络应用E序的开发中Q可以用下图来表C各概念之间的关pR?


该图展示了一个简单的WEB应用E序Q用户在览器上看到信息是数据库服务 器上的内容,但在q之前经q了应用服务器加工。开发h员负责的是建立?据结构、处理数据的逻辑以及表示数据的方法?

96qCGI在中国开始流行的时候,早期的WEBE序员都是从HTML开始自学成?的,在PERL中print一行行的HTMLq不是一仉事,但是随着|络的一步步?速,面大小也从当初的二、三十K暴涨了十倍。写CGIE序׃生了一个迫?的要求:分开PERL和HTML源码。于是,C会q步体现在开发小l内部的分工 上。由于美工和E序员对互相的工作ƈ不是十分熟悉Q在q行合作的过E中需 要用一U约定的"语言"q行交流?

q种语言q不是我们的母语或者英语,术语叫做"模板"Q逻辑和表CZ靠它?pR它是结合了HTML和脚本语a特征的一U表达方式。通过q种方式Q表C层 可以按照用户所希望的格式来昄l过逻辑层处理过的数据。如果你?Windowsq_下MFC的开发经?那么一定会很熟悉Document/Document Template/View的封装,q就是一个很典型的MVC例子。对于Web应用来说Q个 为J2EE中的EJB/servlets/JSP是最强大的,当然q有z优的Structs?另一个很有名的实现就是COM/DCOM+ASPQ这个组合在我国是最多h使用 的?

通过几种MVC实现在WEB应用E序里的ҎQ可以得C个关于模板的概念Q?一l插入了HTML的脚本或者说是插入了脚本HTMLQ通过q种插入的内Ҏ?C变化的数据。下面给Z个模板文件的例子Q这个模板经q处理后在浏览器 里显C?Hello, world!"

引言Q?
<html> 
<head> 
<title>$greetings</title> 
</head> 
<body> 
$greetings 
<body> 
</html> 

q里暂且省略处理方式Q在后面做专门对比讨论?

二、ؓ什么选SMARTY?
对PHP来说Q有很多模板引擎可供选择Q比如最早的PHPLIB template和后起之 UFast templateQ经q数ơ升U,已经相当成熟E_。如果你对目前手中的?板引擎很满意Q那?.....也请往下看Q相信你作ؓ一个自pY件爱好者或者追?效率和优雅的开发者,下面的SMARTY介绍多少会有Ҏ思?

除了个h偏好的媄响,我一直們֐于用官Ҏ准的实现Q比如APACHE的XML 引擎Axis。好处就是可以获得尽可能好的兼容?比如早期MFC对于Win3x的兼 Ҏ就比其它的应用E序框架好,当然现在各种版本都很完善?。SMARTY?布之前我一直用的是PEAR 中的Integrated Template eXtension。这个引擎和 PHPLIB template、Fast template几乎是兼容的Q从模板的语法到Ҏ板的处理 同出一辙:都是模板读入内存然后调用parse()函数Q用数据寚w|的标记q?行替换?

下面看看SMARTY是怎么做的。接到request后,先判断是否第一ơ请求该urlQ?如果是,该url所需的模板文?~译"成php脚本Q然后redirectQ如果不是, 是说该url的模板已l被"~译"q了Q检查不需要重~译后可以马上redirectQ?重编译条件可以自p定ؓ固定旉Q默认的是模板文件被修改?

怎么P看v来是不是有点眼熟Q想h了──q不是JSP的原理嘛Q的, q种"~译"用在PHPq样的解释性脚本引擎上昑־匪夷所思,但是仔细?惻IJAVA不也是由JVM解释执行的吗Q这叫"没有做不刎ͼ只有想不??

既然谈到了JAVAQ就再对PHP的未来发表一点看法。PHP官方|站上宣布了??003q年底发布PHP5.0版。这个版本拥有很多崭新的Ҏ:比如异常处理Q?命名I间Q更加面向对象等{。可以说来向JAVA靠拢QSMARTY也是新特 性之一Q得PHP更适用于大中型目的开发。但是似乎离我当初选择它的?因──灵y易用──来远了。但׃个Y件的生存周期来看QPHP正处?成长期,开发者赋予它更多的功能,以期能胜d业应用是利大于弊的。作?PHP的忠实用P肯定不希望PHPL被h指责"能力不"吧?

Z么选择SMARTYQ仅仅因为它很像JSPQ当然有更ؓ充分的理由。首先,?了第一ơ编译的成本比较高之外,只要不修Ҏ板文Ӟ~译好的cache脚本?随时可用Q省M大量的parse()旉Q其ơSMARTY像PHP一h丰富的函?库,从统计字数到自动~进、文字环l以及正则表辑ּ都可以直接用;如果 觉得不够Q比如需要数据结果集分页昄的功能,SMARTYq有很强的扩展能 力,可以通过插g的Ş式进行扩充?

事实胜于雄辩。我设计了一个测试程序,通过速度和开发难度这两个因素Ҏ 了一下SMARTY和PHPLIB templateQ选PHPLIB template的原因是在patrick?文章《在PHP世界中选择最合适的模板》中有一个PHPLIB template对Fast template 的竞赛,l果PHPLIB template大获全胜Q这使得SMARTY有了一个很好的?手。在试之前Q先谈一下在安装q程中需要注意的问题?

三、可能遇到的问题
在SMARTY的官方网站上Q有详尽的用h册,可以选择在线HTML和PDF格式 的版本。这里就不再涉及手册上已有的内容Q只是把初次使用可能遇到的问?做个解释?

W一个问题就很要命:提示说找不到所需文gQƈ不是每一个h都按?SMARTY默认目录l构来写应用的。这里需要手工指定,假设目录l构如下Q?


需要在index.php里指定目录结构:
引言Q?nbsp;

$smart->template_dir = "smarty/templates/"; 
$smart->compile_dir = "smarty/templates_c/"; 
$smart->config_dir = "smarty/configs/"; 
$smart->cache_dir = "smarty/cache/"; 

W一个问题解决了Q紧接着是W二个:我刚用Dreamweaver生成的漂亮模?怎么不能用?q不是模板文件有什么问题,而是因ؓSMARTY默认的标记分?W是{}Q不巧的是Javascript肯定包含q个标记。好在我们可以用L字符当作 分隔W,再加上这两句Q?
引言Q?

$smart->left_delimiter = "{/"; 
$smart->right_delimiter = "/}"; 

q下安装基本完成,没问题了?

四、反衬和cL
先构思一下对试的设计。主要的评比因素当然是速度了。ؓ了进行速度?试,采取了算术^均数的作法。在试面中重复将面生成N遍,再对比总页 面生成时间。另一个重要因素是易用?至于扩展性不用比较已l有l果?Q所 以用的模板不能太小。我用的是我个h主页的的面Q一个用 Firework+Dreamweaver生成的HTML文gQ大约7K。其中的变量讄也采?最常用的区块,在PHPLIB template里叫block,而SMARTY则称section。别看 q称呼的不同Q易用性标准分两块Q模板文件和脚本文g的语法是否简明易 用?


下面深入到试中来。先看看两种模板文g的语法:蓝条左边是PHPLIB template的模板,双属于SMARTY。个人偏好是不一LQ所以这里不作评 论。着重对比一下脚本里的处理语句,先看PHPLIB template?
引言Q?

$tpl->set_file(''phplib'', ''bigfile.htm''); 
$tpl->set_block(''phplib'', ''row'', ''rows''); 
for ($j = 0; $j < 10; $j++){ 
$tpl->set_var(''tag'' ,"$j"); 
$tpl->parse(''rows'', ''row'', true); 

$tpl->parse(''out''
, ''phplib''); 
$tpl->p(''out''); 


下面是SMARTY的:

引言Q?

$smart->assign(''row'',$row); 
$smart->display(''bigfile.htm''); 


SMARTY只用了tags和row两个变量Q而PHPLIB template则多了模板文件的 handlerQ还有一个莫名其妙的out。说实在的这个out我当初学的时候就不知?Z么要存在Q现在看hQ还是别扭。ؓ什么SMARTY那么多处理语句 呢?{案是工作由引擎完成了。如果你喜欢ȝ源程序,可以发现?Smarty_compiler.class.php里有一个名叫_compile_tag()的函敎ͼ由它负责?sectionq个标签转换成php语句。这不是一个普通的标签Q它带有参数和数 据,节省了脚本编E的工作量,而模板标{上的工作量相差又不大,可以判定 在易用性上SMARTY高出一畴?

下面该轮到我们最x的速度了,毕竟对于一个熟l的web开发者来_掌握?困难的工具不q是旉问题Q何冉|板引擎这U学习曲U^~的技术。而速度 则是web应用E序的生命,其是模板引擎用在q发讉K量很大的站点上,q?点就更重要了。测试开始前Q我觉得PHPLIB template会在q一环节上胜出,?为它l历了很多次升Q已l基本没有什么bug,而且SMARTY的引擎个头太 大,不像它的Ҏ只有两个文g?

果然Q测试结果如下图QPHPLIB template?5%的速度优势Q?


但不会一直这P我又按了一ơ刷斎ͼq次得到了不一Ll果Q?


PHPLIB基本没变化,但是SMARTY提高?5%的速度。l刷斎ͼ得到的都?cM于第二次的结果:SMARTY比PHPLIB template 快上q?0%。我惌是~?译型比解释型快的原理了。SMARTY引擎本n很大,加上q要把模板编译成 php文gQ速度当然比不上小巧的PHPLIB template。但q只是第一ơ的情况?W二ơ接到请求的时候,SMARTY发现该模板已l被~译q了Q于是最耗时?一步被跌了,而对手还要按部就班地q行查找和替换工作。这是编译原理里 讲到的很l典?用空间换旉"例子?

五、结?
l论是如果你已l爱上SMARTY了,那么q等什么呢Q当然ƈ不是说它全 能,如同我用MVC模式来写我的个h|站Q非但没有减工作量Q反而L 要ؓ不同层次间的耦合劳神?

SMARTY不适合什么呢QD个手册里的经怾子:天气预报|站。我q想C 个:股市大盘。在q种|站上用SMARTY会由于经常的重编译而效率偏低,q?是PHPLIB template更ؓ适合?

本文q不是ؓ了对比两U引擎,而是Z说明SMARTY的优ѝ用它最有意 义之处在于它是PHPCpȝ一部䆾Q作Z支独立的力量Q除?NET和JAVA ONEq两大体pM外,大中型web开发还有别的选择。这对于GNU目来说Q?其意义无异于刘邓大军千里跃进大别山?

参考文?

SMARTY官方站点Qsmarty.php.net
王晨Q《在PHP世界中选择最合适的模板?
本文中测试程序下载:test.tar.bz2
http://phpe.net/uploads/attach/article_1058233528.bz2
About the author
于博,W名于莱来自对外l济贸易大学信息学院。GNU痴迷者,喜欢l习各种~程?aQ研I各U体pL架?

发帖敎ͼ1275 回复Q與a多的PHP script 都將使用Smarty為核心引?而Smarty到底是甚? 2003-08-10 14:07

在PHP世界中选择最合适的模板--比较PHPLIB Template和FastTemplate



PHP工程中的模板应用Q是q行中型乃至大型目中徏议采用的处理表现层的好办法。但 是具体到模板的实施,采用何种现有的模板技术却需要进行一番比较?

PHP世界中比较受x的模板处理有PHPLIB Template和FastTemplate两种Q我们对技术的易用性和?度进行了评测--想知道结果吗Q?

事情的v因:你用qFastTemplate吗?
对于PHP工程中的模板应用Q其实我和我的同事们已经在许多的目中接触过--关于它的好处Q我x?是在实际开发阶D还是上升到设计模式的角度都已经有很?前辈先哲"讨论q了。就目实施而言Q在一 些中型甚臛_型的目中,有效的将HTMLQ还有其他文本Ş式的表现层)和PHP代码分开Q不仅在开?阶段可以分别提高界面设计人员和应用程序编写h员的工作效率Q更会给目的测试和l护带来巨大的便 利?

但是--本文的目的不是讨论模板的优缺点,也不是作为指导性的教程讲授如何在PHP目中用模板,?是以应用的视角比较两UPHP世界中最为流行的模板处理方式Q其实只不过是两U模板类Q:PHPLIB Template和FastTemplate?

其实我一直都?安静"的用着PHPLIB Template--很稳定而且看上去速度也不错,以至于我q不惛_?不安的寻扑֏能更好的替代?-虽然我也知道q个地球上还有FastTemplateq样的东西(而且q在Perl?世界中大名鼎鼎)。直到有一天,有一个同事问我:"不知道FastTemplate怎么PZ么我们不试试 FastTemplate呢?"

"好吧Q就让我们试试!"不过作ؓ一个稳妥的ҎQ在M新的模式或者方法引入项目之前,最好能够更 加全面的了解它,以及扑ֈ一个或者几个够说服自己和同事去采用它的理?-对于FastTemplate也不?外?

主角出场Q了解PHPLIB Template以及FastTemplate
前面已经说过Q我已经使用PHPLIB有一D|间了--我想屏幕前的你也许和我一P也对q个优秀的工L 库印象很深吧Q同P当我开始寻求模板的解决办法Ӟ很自然的׃在最接近w边的工L里搜寻,?是我扑ֈ了PHPLIB中的TemplatecR在最初的很快览完它提供的API之后Q当然还得感谢PHPLIB详尽 的文档)Q我开始了使用它的历程--直到现在?

而FastTemplateg名气更响亮一些,在其发迹的Perl世界中自然是q样Q在PHP世界中似乎也是,单单 从这一点上p够让人相信它的能力了?

关于两者的使用办法Q本来我惛_q里多废话几句的Q但是毕竟觉得自己恐怕专门写Z教E来也没?现有的教E受Ƣ迎--在本文的参考资料中有关于PHPLIB Template和FastTemplate的有名教E,如果你自 认还没有对这两种模板或者其中的一U有所认识Q徏议你先去看看那两文章,应该会得C有益的?板应用知识?

Q一番鼠标点M及眼球{动甚至亲自编写测试代码之后,Q现在你对两U模杉K有了一些了解,也许?l发C它们之间的很多相g处,在下面我׃这些地方归U一下?

变量的设|?
很明显,{FOO}或者{BAR}的Ş式在两种模板中都是指定的形式Q也是_两种模板处理方式 中,模板文g本n的外貌应该可以是一致的Q比如都是HTML文g中间含有要被替换的以{}标识 的变量)?
模板cȝ初始化(cȝ构徏器)
都需要在构徏模板cȝ时候指定模板文件存在的目录位置?
变量的替?
模板处理中最常用的就是变量替换,两种方式除了Ҏ名不同之外(PHPLIB Template采用 set_var()Q而FastTemplate采用assign()Q,用法几乎也是一致的--可以采用(key, value)的方式, 也可以直接传递一个数l?array(key=>value))?
模板文g的处?
都是采用为每一个模板文件指定一个句柄(handlerQ的办法Q同时句柄也可以作ؓ变量的值替?另一模板文g中的变量?
解析、输E?
都是需要调用parse()ҎQ这个方法名竟然是相同的Q将需要输出的模板文g解析后赋值给一?句柄Q然后调用各自输出的ҎQPHPLIB Template中是p()QFastTemplate中是FastPrint()Q输 句柄的内容ƈl束处理?
重复解析的过E?
比如从数据库中取出几条记录需要显C模板文件只有可替换的一行变量的时候,很需要这L 功能。两者都hq样的功能,只是使用时稍E有些不同而已QPHPLIB Template采用 parse(handler, value, true)Q而FastTemplate采用parse(handler, .value)在值的前面多加一?点)Q应该说PHPLIB Template的方法构造得相对优美一炏V?
区块解析的过E(或者可以称作动态解析)
惛_一下你需要从数据库中取出W合条g的数据ƈ昄在网中--但是因ؓ条g会不相同,你ƈ 不能明确的知道会有多条数据--q时候如果你又要采用模板Q那么区块就是最好的选择。它是在 模板中用特定的符号定义的部分Q这一部分可以反复的被解析q添加到Q而不是前一ơ的解析被后 一ơ覆盖)输出|页中。区块也许就像下面显C的一P左边是PHPLIB Template采用的区块设 |,而右边则是FastTemplate采用的)Q?



好吧Q如果你对以上苍白的文字介绍q是有些怸着头脑Q那么我们就来看看两个详的模板处理的例E?吧!Q如果你有兴对后面的测试代码进行发掘,׃发现其实以下的两个例子都来自那里Q?


怎么P是不是感觉几乎是一致的Q下面是区块解析的例子,你也会发现同L效果Q?


我们的测试目标和l果
l束了对PHPLIB Template和FastTemplate的了解,应该可以q入本文的正题了--在应用环境中当然应该 选择易于使用同时速度理想的部件构建系l,那么对于q样的两U类似技术,q行评测非常有必要。评?应该是由两部分组成:技术的使用隑ֺ和速度的快慢程?-前者是评论的部分,而后者是试的部分。对 于前者,我们主要针对两个cL供的APIq行评论Q对于后者,我们会让试的数据来说话Q当然这中间 免不了需要编写一些简单的试代码?

回合一Q技术的易用?
q一回合主要是探讨PHPLIB Template和FastTemplate提供的API的用情c应该说Q前者提供的API 更符合PHP的一些常见编码惯例(特别是当你的目中采用了PHPLIB的其他类Ӟq样的规范性会Ҏ 个项目有好的影响Q;而后者的一些方法名总觉得有些别扭(希望你不要觉得这只是我的狭隘看法Q比?FastPrint(){等Q,同时Ҏ的参C不是非常"地道"Q这一点你也可以从刚才的代码看出来?

另外一炚w要指出的是,对于模板区块的解析,FastTemplate直到最q的版本才开始支持。也是_?果你采用了之前的版本Q在处理诸如数据库中记录的输出等内容Ӟ不得不把q块内容独立存储在某处, 然后在模板分析处理时附加上这个文?-真是一件让人难受的事情Q尤其是对网设计h员而言?

当然q有一炚w要考察--那就是对于PHP版本的支持。PHPLIB产生在PHP3的时代,q一点和 FastTemplate差不多;但是Ҏ我们的应用,PHPLIB在现在的PHP4环境下运行相当好Q?FastTemplate的网上则显CZ一些信息表明对于PHP4也许它还有一些BUG存在?

好了Q讲了这么多Q也怽会觉得都是FastTemplate的坏话)Q这个回合的胜利者很明显QPHPLIB TemplateQ尤其是你同时在使用PHPLIB的其他类Ӟq样的技术易用性更加明显(你将不会对这些出?同一个开发小l的API感到陌生Q?

回合二:处理速度
也许q才是很多h最x的部?-在这个回合中Q我们会采用两种模板处理的方式:一U是常规的分析?替换Q另一U是对区块的解析、替?-同时q样的两U方式也是在实际pȝ中应用最多的Q前者是一般的 面处理Q后者是关于数据库内容的输出处理。同Ӟ׃两种模板c采用的模板文g的格式基本相同, 使得我们可以提供几乎一致的模板文g分别供两U模板解析,更增加了试的可信度?

开展这L速度试之前会拟定一个测试方案,单说来就是对于两U处理方式分别编写两个PHP试?面,同时有一个控制测试的面多次调用q两个页面ƈ记录旉供采集测试数据。(如果有兴你q可?参考以下详l的试ҎQ也怼对你深入了解q次试有所帮助Q?

结--在整个测试系l完成之后,我们应该能够得到/test目录中如下的文g清单Q?

Q有点复杂的试ҎQ?

首先是确定测试的g和Y件环?-g肯定是自q机器了,Intel Celeron 733MHzQ?256M RAMQ?0G HDDQY件^COS为Win2K ProQWeb服务器ؓApache+PHPQ且?模块方式q行?

其次是规划这ơ测试的pȝ--当然先在Web服务器的文档根目录下开一个tpl_test的新目录?以放|这个测试的所有文Ӟ然后?tpl_test下徏立include目录以存放两个模板类文gQ我 们测试的核心Q以.inc.php为文件扩展名Q以及一个测试类文gQ包括了计时和记录日志以 及读取日志ƈ分析{功能,?inc.php为文件扩展名Q和一个数据文Ӟ为区块解析的试 做准备,主要包含了一个二l数l,同样?inc.php为文件扩展名Q,建立ihtml目录存放?用的模板文gQ需要被解析的模板文Ӟ?ihtml为文件扩展名Q,建立logs目录存放试?生的日志Q后面就是发玎ͼ其实试的数据就是由对这些日志的分析得到的,?log为文?扩展名)。当Ӟ两种模板的处理PHP文g放?test目录下。这ơ测试最关键的一ҎQ?q需要徏立一个PHP文gQ对以上提到的负责模板处理的文gq行数次调用Q比如一个文?fast_test.php是采用FastTemplate解析模板的,而phplib_test.php是采用PHPLIB Template 解析的,那么q个得出l果的PHP文gp责多ơ以HTTP的方式请求以上的两个面以获 得测试数据?

选择待解析的模板和PHPE序~写--因ؓ两种模板处理方式对于模板文g本n的格式要求几 乎一_比如待替换变量都采用{VAR}的Ş式等{)Q因此可以尽量保证同一试中两者?用的模板可能相同以谋求试的最大公正性;同时在前文提刎ͼ为模拟现实系l中常用?两种模板应用Q一般的面处理和对数据库内容的输出处理Q测试用的模板文g也分成两 U:一U是普通的带有一些待替换变量的模板文Ӟ另一U是带有区块的需要根据应输出?内容反复替换的模板文件。同样对于这两种模板文gQ也需要分别编写两U不同的PHP文g q行解析?

试Ҏ--在浏览器中向/test/result.php提出hQ需要带参数type=[simple|complex]Q在 q回的结果中卛_看到两种模板在简单或者复杂模式下的测试结果?

Level 1
Level 2
Level 3
Remark

/test


试pȝ的根目录







result.php

q行试q生结果的PHP文gQ测 试时只需要在览器中h该页面即 可获得测试信?


simple__test_phplib.php

使用PHPLIB Template对一般模板进 行分析的PHP文g


simple__test_fast.php

使用FastTemplate对一般模板进行分 析的PHP文g


complex__test_phplib.php

使用PHPLIB Template对带区块模板 q行分析的PHP文g


complex__test_fast.php

使用FastTemplate对带区块模板q行 分析的PHP文g







/include

包含PHPcL?inc.php



phplibTemplate.inc.php
PHPLIB TemplatecL?



FastTemplate.inc.php
FastTemplatecL?



TplTest.inc.php
试中需要用的试c,包含诸如 计时、读?分析日志{方法?



data.inc.php
试带区块模板时采用的数据文件?







/ihtml

包含模板文g.ihtml



simple_phplib.ihtml
采用PHPLIB Template处理的一般模 板文?



simple_fast.ihtml
采用FastTemplate处理的一般模板文 ?



complex_phplib.ihtml
采用PHPLIB Template处理的带区块 的模板文?



complex_fast.ihtml
采用FastTemplate处理的带区块的模 板文?







/logs

包含日志文g.log



simple_phplib.log
采用PHPLIB Template处理一般模?生成的日?



simple_fast.log
采用FastTemplate处理一般模板生?的日?



complex_phplib.log
采用PHPLIB Template处理带区块模 板生成的日志



complex_fast.log
采用FastTemplate处理带区块模板生 成的日志

l过了测试系l的设计和编写,q且向负责网设计的同事讨来两个模板之后Q我们就可以讉Kq个pȝ ?-前期的辛勤劳动得现在观看结果的工作只需要在览器的地址栏中打入 http://localhost/tpl_test/ result.php?type=[simple|complex] Q如果你是在其他的非本地服务器中q行q个试Q那么域名应采用 所在服务器的域?-比如我自q机器叫做patrick{等Q。下面是我自己在某一ơ的试中获得的l?果:Q测试结果数据解释)

名称
解释
备注

amount
试LQ连l请求该面LQ?
该参数可在result.php文g中修?

max_seq
最大处理时间的序号
范围?Qamount之间

max_value
最大处理时间的?
峰值数据供参?

min_seq
最处理时间的序号
范围?Qamount之间

min_value
最处理时间的?
峰值数据供参?

average
q_处理旉
试中最有h值的数据


当然Q如果你觉得一ơ测试的l果q不可靠Q可以反复按下浏览器的刷新按钮,p够观察到不同试?

l果Q理Z应该是相差无几)?

试l果以及颁发"XX选择?
好了Q在偏重速度试的回合二中PHPLIB Template以惊人的2倍的速度战胜了FastTemplateQ而同时在 W一回合中PHPLIB Template有以良好的API设计和易用性占得上风。结果显而易?-我们的选择奖当焉 发给了PHPLIB TemplateQ同时这ơ的试也让我们对PHPLIBq个cd设计有了更深的了解?

主观评h
既然有了l果Q那么FastTemplate自然也就不能q入我们的项目了--虽然从结果上看来我们p了半天的 旉得到了一个毫无变化的l果QPHPLIB Templatel箋很好的在目中用)Q但是测试的q程却是?有h值的Q特别是采用PHPq行试的方法,应该会在以后的类似决{中起到一定参考作用?


bluesky 2005-12-27 15:24 发表评论
]]>我用PHP写了个类,装Ҏ-POPO传统的旧的PHP对象?http://m.tkk7.com/bluesky/archive/2005/12/27/25569.htmlblueskyblueskyTue, 27 Dec 2005 06:36:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/27/25569.htmlhttp://m.tkk7.com/bluesky/comments/25569.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/27/25569.html#Feedback1http://m.tkk7.com/bluesky/comments/commentRss/25569.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/25569.html
<?php
class People{
    
var $name;
    
var $age;
    
function People($name,$age){
        
$this->setName($name);
        
$this->setAge($age);
        
    }
    
function getName(){
        
return $this->name;
    }
    
function setName($name){
        
$this->name = $name;
    }    
    
function getAge(){
        
return $this->age;
    }
    
function setAge($age){
        
$this->age = $age;
    }
    
}
?>
index.php调用q个c?BR>
<?php
require("class.people.php");
$xiaoli = new People("?/SPAN>",23);
echo "His name is".$xiaoli->getName();
echo "His age is".$xiaoli->getAge();
?>


bluesky 2005-12-27 14:36 发表评论
]]>
安装phpwikihttp://m.tkk7.com/bluesky/archive/2005/12/26/25497.htmlblueskyblueskyMon, 26 Dec 2005 13:28:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/26/25497.htmlhttp://m.tkk7.com/bluesky/comments/25497.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/26/25497.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/25497.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/25497.htmlPhpWiki - PhpWiki is a WikiWikiWeb clone written in PHP. A Wiki is a Web site where anyone can edit or create the pages through the Web browser, with no authentication. PhpWiki works right out of the box with zero configuration, and comes with a set of default pages. It's useful for collaborating on documentation on a project, having freeform discussions, and easy editing and searching.


来源Qhttp://freshmeat.net/projects/phpwiki/?topic_id=22%2C27%2C92%2C847%2C90
PhpWiki是一个用PHP写的WikiWikiWeb的克隆品。Wiki是一个Web 站点QQ何h可以通过一个浏览器~辑和修改网cPhpWiki无需复杂的设|,生成默认面Q它使合作项目变得更加方便,可以自由的讨论,方便的编辑和索?nbsp;



我安装时候的问题


Fatal error: Cannot redeclare gettext()


baidu到的,原文不见了~?/P>
试安装phpwikiQ下边的是我的步骤?BR>


修改config/config.iniQ可以以config-default.ini本,以config-dist.ini里的注释作ؓ参考?BR>
讄DEBUG
=1Q可以在面下方昄xhtml和css的标CZ及页面加载时_

讄WIKI_NAME
=CrisperWikiQ之后,可以自qlogo和signature命名为CrisperWikiLogo.png和CrisperWikiSignature.pngQ放到theme/default/images下。参见lib/interwiki.map的例子来q行命名Q?BR>
讄ADMIN_USER和ADMIN_PASSWDQ可以用passencrypt.php来加密密码,如果加密了密码,那么一定要讄ENCRYPTED_PASSWD 
= trueQ?BR>
如果不想生成讉K日志Q那p|ACCESS_LOG 
= ""Q?BR>

讄DATABASE_TYPE 
= SQLQ如果想使用PEAR DB lib来访问某USQL数据库;

讄DATABASE_PREFIX 
= phpwiki_Q?BR>
如果使用mysql数据库,那么这一行:mysql://user:password@host/databasename讄好,替换q一行中的对应部分:DATABASE_DSN 
= "mysql://guest@unix(/var/lib/mysql/mysql.sock)/test"Q?BR>
如果使用SQL数据库,那就这两行注释掉:DATABASE_DIRECTORY 
= /tmp和DATABASE_DBA_HANDLER = gdbmQ?BR>

如果不想让Q何一个h查看wiki面Q将ALLOW_ANON_USERQALLOW_ANON_EDIT和ALLOW_BOGO_LOGIN讄成falseQ设|ALLOW_USER_PASSWORDS 
= trueQ?BR>
讄USER_AUTH_ORDER 
= "Db"用数据库来进行用戯证;

讄PASSWORD_LENGTH_MINIMUM 
= 4来保证密码至四位长Q?BR>
׃讄USER_AUTH_POLICY 
= old用所有可能的Ҏ来进行用戯证,会比较慢Q所以设|USER_AUTH_POLICY = first-only来确保只使用W一U方法,也就是数据库的方法;

׃不用其他认证(LDAPQIMAPQPOP3QFileQ)Q所以将所有其他的认证的选项全部注释掉;

讄AUTH_SESS_USER 
= useridQ这是已认证用户的sessionidQ设|AUTH_SESS_LEVEL = 2Q保证用带密码的认证方式;

讄GROUP_METHOD 
= DBQ将从数据库中读取用L信息Q?BR>
DBAUTH_AUTH_CHECKQDBAUTH_AUTH_CRYPT_METHOD和DBAUTH_AUTH_USER_EXISTS讄好,我都是直接用的default|用plain的密码;同时把DBAUTH_AUTH_UPDATE也设|好Q?BR>
DBAUTH_PREF_SELECT讄Z用pref表,q样p从专门的表中取得用户的preferenceQ同时把DBAUTH_PREF_UPDATE也设|好Q?BR>
讄group和user的对应关p,我用的是1:n的关p,Lonly one group per user (
1:n)后面三行的注释;



讄完成之后Q试图运行,却发现无论如何用SQL方式的数据库是无法q接Q暂时不知道原因Q最后用dbm的方式,使wikiq行h了(配置文g的相应地方要做修改)。但是却发现对中文的支持很差……于是放弃?BR>



引用?http://prdownloads.sourceforge.net/phpwiki/
 



bluesky 2005-12-26 21:28 发表评论
]]>
想用wordpress的Permalink,但是I间不支持mod_rewrite,qindex.php也不行~~http://m.tkk7.com/bluesky/archive/2005/12/26/25453.htmlblueskyblueskyMon, 26 Dec 2005 08:09:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/26/25453.htmlhttp://m.tkk7.com/bluesky/comments/25453.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/26/25453.html#Feedback0http://m.tkk7.com/bluesky/comments/commentRss/25453.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/25453.html用了index.php/%year%/%monthnum%/%day%/%postname%/
讉K不会出错但是不会跌{到正常的面,所以我想了个方?BR>
理论上的代码,q没有实?IMG height=19 src="http://m.tkk7.com/Emoticons/71_71.gif" width=19 border=0>

<?php
#$base_uri = index.php/page/welcome.html 面标志 = page
#
$base_uri = index.php/entity/2005/12/25/4.index.html 面标志 = entity
#
$base_uri = index.php/catalog/wordpress.html 面标志 = catalog
$base_uri = $_SERVER['REQUEST_URI'];


#通过面码字W串处理得到下边两个?/SPAN>
$remark = "";//拿到面的标志参?/SPAN>
$id = ""//拿到参数?/SPAN>


if($remark == "page"){
    
include "index.php?page=".$id;
    
return;
}
else if($remark == "category"){
    
include "index.php?catalog=".$id;
    
return;
}
else if($remak == "entity"){
    
include = "index.php?p=".$id;
}

?>



bluesky 2005-12-26 16:09 发表评论
]]>
PHP获取当前url的函数[l于让我扑ֈ了]http://m.tkk7.com/bluesky/archive/2005/12/26/25421.htmlblueskyblueskyMon, 26 Dec 2005 04:59:00 GMThttp://m.tkk7.com/bluesky/archive/2005/12/26/25421.htmlhttp://m.tkk7.com/bluesky/comments/25421.htmlhttp://m.tkk7.com/bluesky/archive/2005/12/26/25421.html#Feedback3http://m.tkk7.com/bluesky/comments/commentRss/25421.htmlhttp://m.tkk7.com/bluesky/services/trackbacks/25421.html
http://blog.chinaunix.net/article.php?articleId=36512&blogId=1184


[php]预定义变?一) $_SERVER (附:获取当前URL地址例子)

例:  我需?获取当前?的URL  地址

$url_this =  "http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
echo $url_this;


则显C?Q?nbsp;  http://localhost/lu.php

服务器变量:$_SERVER

? ?PHP 4.1.0 及以后版本用。之前的版本Q?$HTTP_SERVER_VARS?

$_SERVER 是一个包含诸如头?headers)、\?paths)和脚本位|?script locations)的数l。数l的实体?web 服务器创建。不能保证所有的服务器都能生所有的信息Q服务器可能忽略了一些信息,或者生了一些未在下面列出的新的信息。这意味着Q大量的q些变量?CGI 1.1 specification 中说明,所以您应该仔细研究它?

q是一个“superglobal”,或者可以描qCؓ自动全局变量。这只不q意呌它在所有的脚本中都有效。在函数或方法中您不需要?global $_SERVER; 讉K它,如同?$HTTP_SERVER_VARS 一栗?

$HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量。(注意Q?$HTTP_SERVER_VARS ?$_SERVER 是不同的变量QPHP 处理它们的方式不同。)

如果讄?register_globals 指oQ这些变量也在所有脚本中可用Q也是Q分M $_SERVER ?$HTTP_SERVER_VARS 数组。相关信息,请参阅安全的相关章节 使用 Register Globals。这些单独的全局变量不是自动全局变量?

您或怼发现下面列出的某?$_SERVER 元素q不可用。注意,如果以命令行方式q行 PHPQ下面列出的元素几乎没有有效的(或是没有M实际意义的)?

“PHP_SELF?BR>当前正在执行脚本的文件名Q与 document root相关。D例来_在URL地址?http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 会得到 /test.php/foo.bar q个l果?

如果 PHP 以命令行方式q行Q该变量无效?

“argv?BR>传递给该脚本的参数。当脚本q行在命令行方式Ӟargv 变量传递给E序 C 语言样式的命令行参数。当调用 GET ҎӞ该变量包含请求的数据?

“argc?BR>包含传递给E序的命令行参数的个敎ͼ如果q行在命令行模式Q?

“GATEWAY_INTERFACE?BR>服务器用的 CGI 规范的版本。例如,“CGI/1.1”?

'SERVER_NAME'
当前q行脚本所在服务器L的名U。如果该脚本q行在一个虚拟主ZQ该名称是由那个虚拟L所讄的值决定?

'SERVER_SOFTWARE'
服务器标识的字串Q在响应h时的头部中给出?

“SERVER_PROTOCOL?BR>h面旉信协议的名U和版本。例如,“HTTP/1.0”?

“REQUEST_METHOD?BR>讉K面时的hҎ。例如:“GET”、“HEAD”,“POST”,“PUT”?

“QUERY_STRING?BR>查询(query)的字W串?

“DOCUMENT_ROOT?BR>当前q行脚本所在的文档根目录。在服务器配|文件中定义?

“HTTP_ACCEPT?BR>当前h?Accept: 头部的内宏V?

“HTTP_ACCEPT_CHARSET?BR>当前h?Accept-Charset: 头部的内宏V例如:“iso-8859-1,*,utf-8”?

“HTTP_ACCEPT_ENCODING?BR>当前h?Accept-Encoding: 头部的内宏V例如:“gzip”?

“HTTP_ACCEPT_LANGUAGE?BR>当前h?Accept-Language: 头部的内宏V例如:“en”?

“HTTP_CONNECTION?BR>当前h?Connection: 头部的内宏V例如:“Keep-Alive”?

“HTTP_HOST?BR>当前h?Host: 头部的内宏V?

“HTTP_REFERER?BR>链接到当前页面的前一面?URL 地址。不是所有的用户代理Q浏览器Q都会设|这个变量,而且有的q可以手工修?HTTP_REFERER。因此,q个变量不L正确真实的?

“HTTP_USER_AGENT?BR>当前h?User_Agent: 头部的内宏V该字符串表明了讉K该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。您也可以?get_browser() 得到q个信息?

“REMOTE_ADDR?BR>正在览当前面用户?IP 地址?

'REMOTE_HOST'
正在览当前面用户的主机名。反向域名解析基于该用户?REMOTE_ADDR?

? 必须配置 Web 服务器来建立此变量。例?Apache 需要在 httpd.conf 中有 HostnameLookups On。参?gethostbyaddr()?

“REMOTE_PORT?BR>用户q接到服务器时所使用的端口?

“SCRIPT_FILENAME?BR>当前执行脚本的绝对\径名?

“SERVER_ADMIN?BR>该值指明了 Apache 服务器配|文件中?SERVER_ADMIN 参数。如果脚本运行在一个虚拟主ZQ则该值是那个虚拟L的倹{?

“SERVER_PORT?BR>服务器所使用的端口。默认ؓ?0”。如果你使用 SSL 安全q接Q则q个gؓ您所讄?HTTP 端口?

“SERVER_SIGNATURE?BR>包含服务器版本和虚拟L名的字符丌Ӏ?

“PATH_TRANSLATED?BR>当前脚本所在文件系l(不是文档根目录)的基本\径。这是在服务器进行虚拟到真实路径的映像后的结果?

“SCRIPT_NAME?BR>包含当前脚本的\径。这在页面需要指向自己时非常有用?

“REQUEST_URI?BR>讉K此页面所需?URI。例如,?index.html”?

“PHP_AUTH_USER?BR>?PHP q行?Apache 模块方式下,q且正在使用 HTTP 认证功能Q这个变量便是用戯入的用户名?

“PHP_AUTH_PW?BR>?PHP q行?Apache 模块方式下,q且正在使用 HTTP 认证功能Q这个变量便是用戯入的密码?

“AUTH_TYPE?BR>?PHP q行?Apache 模块方式下,q且正在使用 HTTP 认证功能Q这个变量便是认证的cd?/FONT>



bluesky 2005-12-26 12:59 发表评论
]]>
վ֩ģ壺 ۲ݳѹۿ| ˬaëƬ| ֳִִӲ3pƵ| պӰ߹ۿĻ | ɫɫwww| һŮ18ëƬ| һ| ҹAV| ҹҹˬ޾Ʒ| ޻ɫվ| Ѷ| ޹һ| 2019Ļmvѿ| Ʒ޾Ʒպ| ߾ƷaaaƬ| ղһ| 3344ѲŹۿƵ| þ99޸ۿҳ| 99aƷ| av2018| ޹va߹ۿַ| վ| պĻۺ| ˳Ƶx8x8| ձVAҹߵӰ| ˬˬƵѿԿ| þ޾Ʒרɫ| ҹƵѹۿ| ssswwwձվƬ| ¶㼤| ȫӰѹۿȫ| yellowƵѿ| þþþAVרJN| õ788Ƶ| վƵwww| avһ| 2019Ļѿ | ޼Ůۺ99| þøݾƷԴվ| ޳վ| hsѸ߹ۿ|