先从SQL注入攻击说起吧。

前一段时间的SQL注入攻击可以说让国内以及国外大量网站沦陷,几个攻击变种中幸好是update而不是delete,否则众多网站损失更大,不过从犯罪的角度来说,并不是这些攻击者心慈手软,而是update才能置入网页木马,也才能在置入成功后获得预期的利润。此次大规模的SQL Injection是使用一个叫做Asprox的自动化工具来借助Google搜索引擎寻找目标网站并自动实施SQL注入的,就连趋势科技网站也未能幸免,惨被注入。此次SQL注入攻击风潮从3月份开始,进入6月份后被攻击的网站仍在大量沦陷。

在很多所谓的开发高手来看,SQL注入只是菜鸟才会犯的低级错误,其实不然。一个中大型的网站,在他不断发展的过程中,网站门户的程序都是Patch模式的逐步叠加,随着页面的增加以及版本的螺旋上升,SQL注入的危险百分比也会指数增长,尤其是国内各个网站开发的模式而言。当一个中大型网站的页面达到几万甚至几十万的时候,当这个网站的程序不断叠加积累,诸多历史页面已经处于失控的时候,如何避免SQL Inject攻击将会是一件令人非常头疼的事情,因为你此时是不可能完全重写整个网站或者完全对所有页面做代码安全审核的。

在这众多的历史页面代码中,一个微小的疏漏就导致你的DB完全向攻击者敞开,甚至威胁到服务器磁盘数据。不要侥幸的认为,你的漏洞页面有可能隐藏的很深,现在对于Google而言,什么都不是隐藏的,再加上SQL注入的自动化操作,你的历史页面越多,你的危险就越大。

我以SQL Injection为例就是为了说明其实Web威胁攻击并不是说需要多么高深的技术才可以进行实施,这些攻击往往是你在认为很简单就可以抵御的时候来进行实施的。另外一个极端就是,所谓的社会工程学攻击,各位可以Google一下就会了解。可以说 ,目前的各类攻击已经不再像很早以前那样为了显示自身技术而进行的有意或无意的攻击破坏了,现在大量的Web攻击都是带有利益驱使性的,也更具危害性。

这些Web攻击都是非常危险的,因为不论你的硬件防火墙或者入侵检测系统如何强大,是无法判断这类Web攻击的,因为它们都是合法的HTTP请求。所以根据统计,目前的Web攻击除了操作系统以及各类服务器端应用软件的漏洞外,绝大部分(70%以上)都是此类“合法的”Web攻击。

因此,抵御此类攻击一是需要检测你的应用程序代码,二是可以采用服务器端的针对访问请求以及内容的检测过滤。

点击查看更多内容 »

06月 30th, 2008c#语法之lock 语句

lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:

Object thisLock = new Object();
lock (thisLock)
{
    // Critical code section.
}

lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock (”myLock”) 违反此准则:

  • 如果实例可以被公共访问,将出现 lock (this) 问题。
  • 如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
  • 由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock(“myLock”) 问题。

点击查看更多内容 »

06月 30th, 2008C#语法之var类型

在方法范围中声明的变量可以具有隐式类型 var。隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。下面的两个 i 声明在功能上是等效的:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

过多使用 var 可能使源代码的可读性在他人眼里变差。建议仅在必要时使用 var,即仅在该变量将用于存储匿名类型或匿名类型集合时才使用它。

下面的示例演示了两个查询表达式。在第一个表达式中,允许但不需要使用 var,因为可以将查询结果的类型显式声明为 IEnumerable<string>。但是,在第二个表达式中必须使用 var,因为结果是一个匿名类型集合,而该类型的名称只有编译器本身可以访问。请注意,在第二个示例中,foreach 迭代变量 item 也必须转换为隐式类型。

// Example #1: var is optional because
// the select clause specifies a string
string[] words = { “apple”, “strwawberry”, “grape”, “peach”, “banana” };
var wordQuery = from word in words
            where word[0] == ‘g’
            select word;
 
// Because each element in the sequence is a string, 
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
    Console.WriteLine(s);
}
 
// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
            where cust.City == “Phoenix”
            select new { cust.Name, cust.Phone };
 
// var must be used because each item 
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
    Console.WriteLine(“Name={0}, Phone={1}”, item.Name, item.Phone);
}

06月 30th, 2008C#语法之event关键字

event 关键字用于在发行者类中声明事件。

下面的示例演示如何声明和引发将 EventHandler 用作基础委托类型的事件。

public class Publisher
{
    // Declare the delegate (if using non-generic pattern).
    public delegate void SampleEventHandler(object sender, SampleEventArgs e);
 
    // Declare the event.
    public event SampleEventHandler SampleEvent;
 
    // Wrap the event in a protected virtual method
    // to enable derived classes to raise the event.
    protected virtual void RaiseSampleEvent()
    {
        // Raise the event by using the () operator.
        SampleEvent(this, new SampleEventArgs(“Hello”));
    }
}
 

事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。

事件可标记为 public、private、protected、internal 或 protected internal。这些访问修饰符定义类的用户访问事件的方式。

下面的关键字可应用于事件。

 

 

关键字 说明
static 即使类没有实例,调用方也能在任何时候使用该事件。
virtual 允许派生类通过使用 override 关键字来重写事件行为。
sealed 指定对于派生类它不再属虚拟性质。
abstract 编译器不会生成 add 和 remove 事件访问器块,因此派生类必须提供自己的实现。

 

通过使用 static 关键字,可以将事件声明为静态事件。即使类没有任何实例,调用方也能在任何时候使用静态事件。通过使用 virtual 关键字,可以将事件标记为虚拟事件。这样,派生类就可以通过使用 override 关键字来重写事件行为。重写虚事件的事件也可以为 sealed,以表示其对于派生类不再是虚事件。最后,可以将事件声明为 abstract,这意味着编译器不会生成 add 和 remove 事件访问器块。因此派生类必须提供其自己的实现。

volatile 关键字指示一个字段可以由多个同时执行的线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。

volatile 修饰符通常用于由多个线程访问但不使用 lock 语句对访问进行序列化的字段。

volatile 关键字可应用于以下类型的字段:

  • 引用类型。
  • 指针类型(在不安全的上下文中)。请注意,虽然指针本身可以是可变的,但是它指向的对象不能是可变的。换句话说,您无法声明“指向可变对象的指针”。
  • 整型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。
  • 具有整数基类型的枚举类型。
  • 已知为引用类型的泛型类型参数。
  • IntPtr 和 UIntPtr。

可变关键字仅可应用于类或结构字段。不能将局部变量声明为 volatile。

下面的示例说明如何将公共字段变量声明为 volatile。

// csharp_volatile.cs
// Compile with: /target:library
class Test
{
   public volatile int i;
 
   Test(int _i)
   {
      i = _i;
   }
}

Tired of querying in antiquated SQL?

LINQPad支持C# 3.0 和 Framework 3.5的全部功能:

  • LINQ to SQL
  • LINQ to Objects
  • LINQ to XML

LINQPad 也是一个很好的学习LINQ的工具,包含《C# 3.0 in a Nutshell》一书中200个示例,可以使用LINQPad感受LINQ的超酷功能和函数编程。下面是 LINQPad的简单截图:

LINQPad 是完全免费的,无需安装,下载之后直接可以运行,只有2.12 MB大小。LINQPad 需要先安装.NET Framework 3.5,支持 SQL Express、SQL 2000、 SQL 2005和SQL 2008的有限功能。

LINQPad可以使用LINQ交互查询SQL数据库,无需再要SQL Management Studio了。

产品主页:http://www.linqpad.net/

   现在玩家讨论最多的话题也就是有关暴雪的“新闻”,一大堆的暴雪迷都在争先恐后的关注着暴雪官网上那图张神秘且不断在更新的图片和最新动,今天暴雪公司的游戏设计副总监Pob Pardo则向人们暗示将会有一个新游戏会被发布。 Pob Pardo在采访时说道:“你们是想让我在我们没有正式发布之前就宣布出来?”“你看,这里现在好像有300多个人的样子,我要是现在在这里就宣布了,那我肯定会在“即将于本周在巴黎举办的WWI大会”上被8000个人剁成肉泥。不过我在这里可以保证,真实宣布的时候到来的时候将会是非常激动人心的。到时候现场所有在场的人都会非常兴奋的”。

    而就在几乎是同一时间,自著名的暗黑论坛diabloii.net的消息称:他们已经从暴雪公司获取到内幕消息——暗黑破坏神3将于这个星期六在巴黎举行的暴雪全球邀请赛中公布。(http://www.diabloii.net/n/667423/diablo-3-announcement-at-wwi)这条消息在论坛上放出之后其影响力绝对非同凡响,马上就有一大堆的暴雪迷就围绕这一新闻开始推测其真实性。 

《丑闻》

如果没有武松,西门庆和潘金莲的结局会如何?韩国人的答案是:同归于尽灰飞烟灭。

《红字》

据说这个电影让美女李恩珠上演了一出真实版“不疯魔不成活”——陷入角色不能自拔最终在现实世界中自我了断香消玉殒,看了电影之后,我有点相信这个传言。

《周末同床》

婚姻是一种守旧且无谓的制度还是爱情最终的归宿?这个问题跟先有鸡还是先有蛋一样,属于根本性难题?

《快乐到死》

经济基础决定上层建筑,你快乐吗?我不快乐。

《美人》

美人如玉话儿如虹,看上去真的很美,包括死亡在内。

《青春》

你是处男吗?是的,我犹如雪一样纯洁。可是,雪其实很脏。

《密爱》

只有性,没有爱,可以叫做人生吗?可以,因为终究胜过了苍白的平淡。
  
《爱的色放》

两个男人和一个女人,一个男人喜欢从后面来,一个男人喜欢从前面来,女人喜欢后者,因为她觉得前者怯懦而后者勇敢。

1. [ PHP学习讨论 ]

● 超越PHP(http://www.phpe.net)国内比较早的PHP网站,关注PHP技术,同时它的技术资料非常的多,跟phpmore结合,不管新手还是老鸟都可以去看看,但是已经近半年没有更新。

● 喜悦国际村(http://www.phpx.com)目前国内最火的PHP讨论社区,注册人数数万,PHP版面讨论激烈,高手众多,而且很多公司直接在里面发布招聘信息。

● PHP&More (http://www.phpmore.com)国内唯一的PHP电子杂志PHP&More的官方网站,由一群国内很牛的高手维护,不过 PHP&More杂志好几个月没出啦。

● PHP5研究室(http://www.phpv.net)关注新技术的研究和跟踪,能够了解新技术,同时网站制作者比较热心,一些最新的手册总能在这里找到。

● PHP中文站(http://www.openphp.cn)深空同学的个人网站,常常介绍一些新技术,新书籍,新文章什么的,不过也是有一段时间没有更新啦。

● CSDN论坛(http://community.csdn.net) CSDN论坛的Web开发的PHP版里面是个具有良好讨论氛围的地方,方便提问和回答问题,里面有很多热心的高手或者菜鸟,我常常去。

● PHP China(http://www.phpchina.cn) Zend公司在国内的代理公司,算是半个Zend官方网站,能够获取最新Zend的一些新信息。

PS: 以上网站我都常上,都是事实求是,不为某个网站做广告或者贬低那个网站。

 

2. [ PHP教程 ]

● 西交天空(http://www1.xjtusky.com/article/htmldata/3/sort_3_1.html)西交天空的PHP版比较多的PHP资料,包括很老和很新的很多资料,PHP教程做的最专业,不过目前也是小半年没有更新了。

● 网页教学网(http://www.webjx.com/htmldata/sort/26.html)网页教学网总体是个教程比较多的网站,广告也不少,PHP版的教程比较多,而且更新比较迅速及时。

● 动态网站制作指南(http://www.knowsky.com/php.asp)该网站与上一个网站有点类似,也是教程收集类的网站,PHP版教程也比较多,更新迅速。

● IBM developerWorks中国(http://www-128.ibm.com/developerworks/cn/) IBM在中文的技术文章网站,主要关注Linux/Java/开源技术等,搜索PHP能够获取非常多经典的PHP文章,包括很多PHP高级技术,推荐有一定基础的用户去阅读。

3. [ PHP著名系统 ]

● Discuz!(http://www.discuz.com)国内最著名的PHP论坛,速度快,易于定制,能够支持非常多的在线人数。该论坛分为免费版和收费版。

● PHPWind (http://www.phpwind.com)国内发展最迅速的论坛,从03年至今,已经跟Discuz!论坛有一拼了,代码质量比较高,执行速度快,这是商业版,免费版叫做Ofstar(http://www.ofstar.net)。

● Molyx论坛(http://www.molyx.com)比较强的论坛,代码质量高,代码安全,同时官方开发了多套系统跟论坛相结合。遗憾的是它的代码使用Zend加密过,所以无法直接查看源代码。

● DeDe CMS(http://www.dedecms.com)目前使用比较广泛的内容管理系统 (CMS),能够生成静态,自定义模板等,最主要的是免费并且开源的,作者同时对中文分词也有研究。

● phpArticle (http://www.21ds.net)最老牌的文章管理系统,代码干净,作者代码功底扎实,具有很高的执行效率,是很多网站的首选,不过这个慢慢被DeDe CMS所替代,主要是它更新太慢了。

● Bo-blog (http://www.bo-blog.com)著名的文本Blog系统,更新非常迅速,能够定制模板,推荐喜欢文本数据库,或者PHP 空间不支持数据库的用户使用该blog系统。

● 安全天使Blog系统 (http://www.4ngel.net/)界面、功能简洁,但是代码非常安全,因为作者本身是专门研究PHP安全的,代码值得信赖。

PS: 目前的各种PHP系统日新月异,真是好事情,我上面总结的只是很小的一部分,还有很多需要自己去发现。

4. [ PHP源码下载 ]

● 中国站长站(http://down.chinaz.com)这个很多人都知道了,源代码下载最强得网站,PHP得源代码很多,很全,更新及时,网站广告巨多。

● 源码之家(http://www.mycodes.net)非常多源码,PHP源码也不少,广告同样也不少,跟中国站长站有一拼,值得浏览。

PS: 另外,其实还有很多源码网站,可以自行搜索

5. [ PHP空间主机(收费空间)]

● E洞网(www.edong.com)上海公司,算是做的比较老牌的公司,PHP空间维护的不错,价格也还不错,而且空间开通都是由系统自动的,非人工开通,服务器出现问题反应也比较迅速,支持免费试用, PHP空间使用Redhat Linux企业版操作系统。适合中小型公司、个人Blog、内容管理等大多数用户使用。

● 虎翼网(www.51.net)北京公司,非常老牌的虚拟主机提供商,早期提供免费空间,后来取消了,技术实力雄厚,主机维护的不错,但是主机速度比较慢,而且价格偏贵,适合想稳定的企业用户, PHP空间使用他们修改过的FreeBSD的操作系统。适合喜欢稳定的个人用户企业用户使用。

● 伯汉网络(www.woowoo.com)上海公司,早期提供JSP的空间,现在主要是提供PHP的空间,空间大,价格非常便宜,速度比较快,全自动开通,支持免费试用7天。最强的是空间支持Telnet,能够直接登陆到服务器上进行操作,适合有一定Unix/Linux使用经验的用户,可定制性比较强, PHP空间使用FreeBSD操作系统。适合小型下载、论坛、中型企业网站使用。

● 金玄网(www.phphost.cn)浙江公司,一个专门提供PHP空间的提供商,能够支持预装某些PHP程序,服务器速度不错,手工开通服务,能够支持月付费,价格中等,而且能够自己跟管理员加装某些Apache功能,当然,要加钱滴。空间使用FreeBSD系统。该空间适合论坛、聊天室、个人Blog等用户使用。

● 我要安家(www.512j.com)江西公司,价格非常便宜,而且支持1M等小空间购买,能够自己选择是否购买数据库空间,空间手工开通,使用Fedora Linux操作系统。适合个人或者网站入门初学者使用。

PS: 以上空间我都是凭着良心说话,也不想替那个空间商做广告,只是按实话说。

 

6. [ PHP书籍 ]

● 《PHP程序设计》(http://www.china-pub.com/computers/common/info.asp?id=18754)由PHP创始人参与编写的PHP书籍,书中讲了大多数文章都没有讲到的基础内容,分析透彻详细,图片清晰,适合入门者学习和高手当作参考手册使用。

● 《PHP高级编程》(http://www.china-pub.com/computers/common/info.asp?id=1806)适合具有一定基础的提高学习,该书比较老,但是还是能够学习到很多有用的知识,而且现在市面上有的这本书都非常便宜,值得一看。

● 《PHP和MYSQL WEB开发 (原书第3版)》(http://www.china-pub.com/computers/common/info.asp?id=25384)目前国内最新的一本PHP书籍,号称是PHP+Mysql圣经级的读物,内容射猎比较广,同时也有PHP 5的内容,值得一看。

● 《PHP技术内幕 》(http://www.china-pub.com/computers/common/info.asp?id=8636)比较老的书,但是里面有很多有趣的知识点,每个知识点都是联系实际需求来描述的,有兴趣可以读一读。

Quickskin其实很简单,基本上看它的example就能看懂。我写这篇东西的目的,只是想给自己的学习留下一个小小的脚印。

 

属性:

bool $reuse_code

默认值: false

是否将编译好的模板储存起来以便以后使用。如果被设置成false,那么QuickSkin在每次被使用的时候编译模板

string $template_dir

默认值: _skins/

模板读取目录。需要注意的是路径结尾的”/”是必需的!

string $extensions_dir

默认值: quickskin_extensions/

扩展类存放的路径。扩展类是可选的。如果不使用扩展类,那么没有必要修改这个设置。结尾的”/”是必须的

string $temp_dir

默认值: _skins_tmp/

编译之后的模板存放的目录。必须要保证PHP有写入该目录的权限。结尾的”/”是必须的

string $cache_dir

默认值: cache/

输出的缓存文件存放闻之。必须要保证PHP有写入该目录的权限。结尾的”/”是必须的

int $cache_lifetime

默认的输入缓存有效时间,单位是秒。

基本方法

1.void set()

用来设置QuickSkin一些属性,具体属性为第一部分的那些属性

2.void assign()

这个是QuickSkin中赋值的重要操作。主要用法有以下几种

  • $tpl->assign(’name’,$asdf); 这个操作将$asdf这个值赋给模板变量name,在模板中出现{name}的时候,以$asdf替换
  • $tpl->assign($array=array());这里$array是一个一维数组。这里没有模板变量名。其实这是一种比较省事的赋值办法。这里的赋值结果是模板变量名位数组的index,值就为index对应的content的内容。比如$array(“name”=>$name,”gender”=>$gender) 那么上面赋值就相当于$tpl->assign(“name”,$name);
    $tpl->assign(“gender”,$gender);
  • $tpl->assign(“first”,$array1=array());这个地方和上一个有些类似。但是first并非模板变量,而是命名空间。这种情况一般出现在两个数组index相同的情况下,为了区分。比如页面要显示两个人的资料,都有姓名,性别等内容。那么为了区分开,给每个数组一个命名空间,比如first和second。以上一例的数组为例,比如第一个人的姓名在模板中应该表示为{first.name},第二个就为{second.name}.主要的作用就是区分。
  • $tpl->assign(“list”,$list=array(array()));这里$list为一个二维数组,并且第一维的index为数字形式,比如$list[1].$list[2]这样子,二维字段保持一致。这种赋值方法是用在下面控制中,作为循环输出的(具体见控制结构

其实assign的用法不止这些,还有一些其他的,但是主要用法就这么四种,我在使用中也就用到这么四种。别的要么格式太怪,要么就是根本就不适用,所以没有写出,有兴趣可以看看QuickSkin官网的Example

PS:assign的用法可以混用的,具体还是要看需求而定。不过我在使用中都是把所有变量定义在一个多维数组中。只需要assign一次就可以完成。比如
$data['title']=“asdf”;
$data['list']=array(array(“name”=>”Lorry”,”gender”=>”male”),array(“name”=>”duckdull”,”gender”=>”female”);
$tpl->assign($data);

这样子一次性就完成了赋值,index就为模板变量名。比较好用

3.void addtpl()

将一个子模板加到主模版中。

个人觉得这个比较有用,一定程度上可以避免在模板中使用这种格式,使得所有页面问题都交给模板,模板不需要考虑逻辑问题。

举个简单的例子。VIP用户和非VIP用户的用户中心面板。除了侧边栏,其余的全部都相同。将侧边栏做成子模板,则可以在程序中判断加载拿一个子模板,达到VIP和非VIP侧边栏不同的效果。

4.void append()

追加模板变量的内容。模板变量可以为数组也可以为字符串。

举例$tpl->assign(“list”,array(“name”=>”Lorry”));

$tpl->append(“list”,array(“name”=>”duckdull”));

那么这个时候,上面两句话就相当于$tpl->assign(“list”,array(array(“name”=>”Lorry”),array(“name”=>”duckdull”)));

即,从一维数组append成二维数组

append也可以对字符串的变量进行操作,比如

$tpl->assign(“TITLE”,”Hello “);
$tpl->append(“TITLE”,”World”);
$tpl->append(“TITLE”,”!”);

上面就相当于$tpl->assign(“TITLE”,”HELLO World!”);

5.void use_cache()

设置quickskin使用缓存。当客户端在设置的缓存时间内进行页面请求时,直接读取缓存页面,而不是再次编译。需要设置cache_dir和cache_lifetime两个属性。

6.string result()

将模板生成的结果赋值给变量。

7.void output()

将模板生成结果输出到浏览器。

8.void debug()

我用了一下,没法使用,显示class.quickskinparse.php找不到。但是从changelog来看,应该是将class.quickskin.php和class.quickskinparse.php合并。所以个人怀疑这个所谓的项目改名就是将原先SmartTemplate改成了QuickSkin,其余的都保持没变。否则实在是不能解释为何出现class.quickskinparse.php丢失的情况。这个就是根据SmartTemplate的debug来写的的。Debug作用是将所有模板变量输出并且将生成的代码也输出。

控制结构(这个部分是写在模板中的)

打算分为三个部分说,有些单独说觉得很怪

1.IF模块

所有程序语言中都有if这个东西,条件判断的最基本的东西。QuickSkin中也有。语法是这样子


类似于HTML中的注释。这里需要注意的是,首先,IF,ELSE, ENDIF全部需要大写,而且要和前后的”-“有一个空格!这个是必须,否则就被当成注释了!

IF可以对模板变量有如下两个判断1.是否存在;2.是否等于(或者不等于某一个值)。分别举例如下判断id这个模板变量是否存在,也就是是否执行过$tpl->assign(“id”,$anything); 进行赋值过。而则是对name这个模板变量的值进行判断,看其是否等于Lorry。再比如就成了判断模板变量是不是不等于Lorry。PS:需要增加判断条件。如果一开始你用的是,那么就要写成注意,id要和后面的”-“有一个空格!!就没有什么好说的,和PHP、C之类的完全保持一致。

2.BEGIN…END模块

另一个控制模块登场!这个模块作用可是非常强大哦!!可以将一个二维数组循环输出。用上面说到的一个数组打个比方吧。

$tpl->assign(“list”,array(array(“name”=>”Lorry”,”gender”=>”male”),array(“name”=>”duckdull”,”gender”=>”female”)));

我们首先定义了一个模板变量,值为一个二维数组

然后再模板中我们怎么将他们书出来呢?

{name} {gender}

看看发生了什么?输出结果是:

Lorry male duckdull female

怎么样?我们只是定义了一个二维数组,用模板把它们完全打印出来了哦!是不是代码比较简洁呢?以前还需要写foreach,现在,不用了,代码简洁,维护起来也很方便哦!!

PS:BEGIN和END也要和前后的”-”有一个空格,并且END后面要加上BEGIN后面一样的模板变量哦!!

2.INCLUDE模块

INCLUDE模块的作用是将一个文件INCLUDE到当前的模板中,和PHP的include的作用基本相似。我总是觉得这个模块的功能完全可以由addtpl()代替了。不过直接INCLUDE代码效率也许会比addtpl要高,毕竟模板编译是需要时间的。个人倾向于addtpl。反正我觉得这就是SmartTemplate到QuickSkin的过度模块。个人认为而已,轻拍。

PS:INCLUDE也要和前后的”-”|有一个空格!

<!– BEGIN agent_list –>

   <!– END agent_list –>

<!– INCLUDE top.html –>

 <!– IF nullResult –><div style=”width:100%; text-align:left; font-size:12px;”>{nullResult}</div><!– ENDIF nullResult –>


© 2007 蜗牛博客 | iKon Wordpress Theme | Powered by Wordpress