用户
 找回密码
 入住 CI 中国社区
搜索
查看: 42032|回复: 32
收起左侧

使用 CodeIgniter 框架快速开发 PHP 应用(一)

    [复制链接]
发表于 2008-1-23 11:08:13 | 显示全部楼层 |阅读模式
作者: chenz1117

对 CodeIgniter 的介绍

大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事。这篇文章是有关 CodeIgniter的(以后简称CI),CI是一个达成上面目的的所谓框架。

如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI是你最好的朋友。

CI有很多优点:免费, 轻量级, 容易安装, 它能使你的编程生涯变得很轻松。 这一章我们会告诉你:

. CI 能为你做什么?

. 什么是“框架” ?CI 为什么能被称为框架?

. “开源”商业模式

. CI的某些不足(是的, 它不完美)


CodeIgniter 能为你做什么?

如果你已经是一位PHPer, 开发过PHP应用, CodeIgniter 将会帮助你做得更好, 更容易达成目标。 CI会减少你的代码数量。你的脚本可读性也会更好,更容易升级。它会使你的网站结构更紧凑,代码更强健, 如果不是很好地研究CI的源代码的话,你可能还无法察觉到它的强健。

对大多数兄弟来讲,你可能已经花了不少时间, 系统地学习了PHP、HTML和CSS,当然还有MySQL什么的。不过如果使用CI,你只需要一些基本的LAMP(WAMP)知识, 你没有必要先成为一个专家才能使用CI。 你完全可以先借助于CI或别的什么框架软件,成为一个有生产力的PHP程序员,拿着高薪然后优雅地进一步学习PHP的中高级知识,直至成为一位真正的PHP骨灰级人物。

下述情形,你最好不要使用CI:

. 你没有一点PHP和HTML的基本知识.

. 四五个页面的小程序.

. 只用极少的代码就要完成一个CMS或FORUM程序(CI做不到,神仙也做不到)

节约时间

CI学习周期短,见效快。 让我们试着评估一下相关的要素:

CI如何减少代码数量?

你真的可以减少很多工作量:敲击键盘的次数减少了, 代码错误减少了, 你只需要较少的时间调试代码。 代码量减少还意味着你只需要较少的空间来存放应用程序。

举二个例子(稍后它们会被进一步分析, 因此不用担心如何了解它们的工作原理!)

想像你正在写一个MySQL数据库查询。 可能的代码如下:

PHP复制代码
   $connection = mysql_connect("localhost","fred","12345");
   mysql_select_db("websites", $connection);
   $result = mysql_query("SELECT * FROM sites", $connection);
   while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
      foreach ($row as $attribute) {
         print "{$attribute[1]} ";
      }
   }
复制代码


现在看看CI如何处理同一个问题:

PHP复制代码
$this->load->database('websites');
$query = $this->db->get('sites');
foreach ($query->result() as $row) {
    print $row->url
}
复制代码


比较字符数: 前者336,后者112。

第二个例子,现在让我们想像你正在用HTML写一个数据输入窗口, 你想要一个下拉输入框。下拉框中有三个选项。代码如下:

HTML复制代码
<select name="type">
<option value="1">www.this.com</option>
<option value="2">www.that.com</option>
<option value="3" selected>www.theother.com</option>
</select>
复制代码


CI的写法和前例一样,因为它把相关内容放入一个数组,更容易由PHP进行处理::

PHP复制代码
$urlarray = array(
                  '1'  => 'www.this.com',
          '2'  => 'www.that.com',
          '3'  => 'www.theother.com'
                  );
 
$variable .= form_dropdown('url', $urlarray, '1');
复制代码


在 HTML ,你需要键入 167; 在 CI, 148.

使你的网站更安全

你不需要写很多代码, 是因为CI提供了许多标准的功能, 这些经过仔细推敲的框架内的代码, 对安全性和输入进行了有效的校验和考虑。初学者往往没有足够的能力全面兼顾功能和安全(这也是中高级程序中央委员新手之间能力差异的一个方面)

确保你的链接自动更新

设想你正在写一个菜单页, 有许多超链接可重定向到其他页。 他们全部以传统的HTML格式编写:

<a href="http://www.mysite.com/index.php/start/hello/fred">Hello World</a>

然后, 你决定改变这个链接地址。这意谓你必须仔细地去查找并修改代码中的每一处地址, 否则它们将无法正常工作。

CI 给你一个简单的函数,可以这样写超链接:

echo anchor(start/hello/fred, Say hello to Fred);

CI推荐你把你的URL放入一个config文件供你的脚本读取。CI的anchor函数会自动从config文件中提取相关URL。因此, 当你修改一个URL时,你只需要修改config文件中的的对应链接,就一次那么简单。

防止对数据库的攻击: 对录入数据进行校验和处理

数据输入可能引发许多问题。 因为 HTML 和数据库的限制,数据中总包含特定的符号- 举例来说, 省略符号和引号-可能导致你的数据库遭到攻击,最终得到你无法预料的结果。

解决方案是在把这些数据存入数据库前对这些数据进行相关处理。 这样做会浪费一些系统时间, 增加一些额外编码。

CI的页面助手会自动地完成这些工作。 因此, 当你编写一个录入框时:

echo form_input('username','johndoe');

CI也隐式地执行下列校验函数:

PHP复制代码
function form_prep($str='') {
{
   if ($str==='') {
       return '';
   }
   $temp ='__ TEMP_AMPERSANDS__';
     
   // 将录入内容放入临时变量进行处理以便
   // htmlspecialchars不破坏原数据
   $str= preg_replace("/&#(\d+);/", "$temp\\1;",$str);
   $str= preg_replace("/&(\w+);/", "$temp\\1;",$str);
 
   $str= htmlspecialchars($str);
   // htmlspecialchars函数会造成对一些符号的错误处理
   $str= str_replace(array("'",'"'),array("'", "& quot;"), $str);
     
   // 把临时变量还原到输入变量中
   $str= preg_replace("/$temp (\d+);/","&#\\1;",$str);
   $str= preg_replace("/$temp (\w+);/","&\\1;",$str);
     
   return $str;
}
复制代码


上述函数捕获象'&'这样的特殊字符, 以便在你的页面提交时不会造成混乱。你应该知道,有些字符会引起问题。

并不是所有的用户都会中规中矩地录入符合要求的信息,你也不可能知道使用浏览器录入信息的是什么人,他们在想什么,做什么。你可以使用CI来防上下系统录入不符合要求的信息。自然,你大可不必知道CI是如何在幕后为你做到这一切的,你只需要简单地输入如下代码:

  echo form_input('username', 'johndoe');

CI使你写代码更容易了。不象有些类库如PEAR等,集成比较困难,(有时候你会找不到支持PEAR的空间),CI很容易集成,只要把它放入一个目录,它就能很好地工作。CI所有的代码可读性好,也很强健,推出前经过社区用户的认真测试,所以在你可以使用时这些代码已经历了很多考验。

让我们看二个例子。

发送电子邮件非常简单

传统的发送电子邮件功能实现起来比较复杂。CI提供的功能使这件事变得很简单:

PHP复制代码
$this->load->library('email');
$this->email->from('your@your-site.com', 'Your Name');
$this->email->subject('Email Text');
$this->email->message('Testing the eamil class.');
$this->email->send();
复制代码


实现发送电子邮件功能中有一些不容易解决的技术问题: 比如文本封装和发送附件功能,标准的PHP实现起来比较复杂,CI简化了这些工作, 它的email类使得发送附件很简单:

  $this->email->attach('/path/to/photo1.jpg');

CI把内部的复杂部分悄悄地完成了, 举例来说,实现了列举近百种不同的附件的MIME类型的功能。所以它知道你的相片photo1.jpg是一个‘image/jpeg'的MIME类型。因此它在在你附件的适当位置填写必要的限制符号,它细致地封装你的文本,使你方便地设置需要标记的文本。

压缩用户需要下载的文件以加快下载速度

为了加快下载速度, 常见的做法是在下载之前压缩下载文件。你可能不知道如何处理。但CI可以方便地让你用四行代码完成此功能:

PHP复制代码
$name = 'mydata1.txt';
$data = 'the contents of my file......';
$this->zip->add_data($name, $data);
$this->zip->archive('c:/my_backup.zip');
复制代码


执行这些代码,你会在你的C盘根目录下找到一个压缩文件,解压后即为原始文件。

你网站的用户并不清楚你是如何容易地实现下载压缩文件的功能,他们能体会到你的网站下载速度很快,而你只用了数分种(而不是数小时)就实现了这个功能。

什么是框架,什么是CI?

三百六十行中新增编程这一行不久,人们注意到它牵涉了许多可重复的工作。你或者其它人也许不久以后就要用到几乎同样的功能,但是你必须花很长的时间来修改它。于是,人们就发明了使用函数库的方法来重用代码。使用PHP的兄弟们也会使用函数库,并按用途分类保存到不同的文件中,在编程时用require或include来使用它们。

同样的,框架是为重用而发明的,放在和你的代码分开的目录中,用来减少重复的劳动。

上面例子中连接数据库和写HTML页面的编程工作都可以调用相关的CI函数来进行简化。

有很多种方法实现同样的功能,大多数的框架会让你按照它实现的方法来做,一般来说,框架的作者很有经验,并且作了精心的设计,你可以在几乎所有的场合下使用。

好的框架设计能实现需要的功能, 而且尽可能地不互相牵连。 一个好框架为你做出各种功能的实现,并且给你提供一步一步的编程指导。

提到框架时,就不能不提到有名的框架:Ruby on Rails。

Rails做得相当成功, 因为它藉由最小量的编码, 明显地提供简便快捷的网站开发。 本质上,它是一个结构和一组工具,专为使用Ruby语言的用户开发,允许你快速建立Ruby系统原型。 它不是Ruby语言中唯一的框架,但是它一定是最有开发效率和最有名的。

为PHP开发的框架有好多个,CI只是其中的一个。 其它的还包括Zend Framework、Cake、 Trax 和其他。 下列网址可以找到一个针对十来种框架的简明的图表分析:

http://www.phpit.net/article/ten-different-php-frameworks/。

如果你访问上述网址中相关产品的官方网站, 你将会注意到,每个论坛都有一个共同的热点,就是到底哪个一个框架是最好的? 事实似乎是每个都有它的长处,而且又都有自己的弱点。 我的评估标准是: 我很忙; 因此框架应该节约我的时间,从中选择一个后,就坚持使用下去,因此就有了这篇介绍CI框架的文章。

关于开发者

Rick Ellis开发了CI,他曾经是一个摇滚音乐家,现在是一个软件设计师。 Rick还是pMachine公司的CEO,该公司还有一个著名的CMS产品叫做Expression Engine. 2006年1月,他在他的博客中写道:
(http://ellislab.com)

"我花了数星期时间搜索和安装PHP框架, 也被它们中的许多打击了一把,令我惊讶的是:我发现大多数框架存在以下问题:

. 文档不全或质量很差

. 他们假定你水平很高,希望你能很容易地掌握使用方法

. 他们是为那些有超级用户权限或者有权修改服务器设置的人写的

. 他们假定你偏爱命令行操作,事实上许多人无此爱好

. 偏爱使用PEAR类库或其它开源代码库

. 模板语法过于复杂

. 有的太笨重,有的又太简单

. 大多数框架只能在PHP5中运行,只有5%的使用率

我还没有找到一个简单的PHP框架, 健壮,易于使用, 文档完整,包含建立一个完整应用需要的所有工具彻底地从顶端被证明到根据,生来地包括不可或缺的建立强健的申请的所有的工具, 并且有一个以浏览器为基础的接口, 使用普通用户权限就能安装。没有别的原因,就是市场需要这一单一的原因促使我想开发这样一个框架产品..."

结果是CI诞生了, 作为一个业余时间开发的作品,Rick慷慨地决定使它成为开源作品。在跑生意间隙,他保持经常更新CI。 他也创建了一个优秀的论坛, CI使用者能提出问题而且分享开发心得。 所有这些资源可从下列网址获得:
   http://www.codeigniter.com/
   
他能实现自己的设计目标吗?相信你使用后会得出自己的结论.

CI不能做什么

CI有它本身的缺点。Rick把CI定义为小的和'轻量级'的结构。(1.5版压缩后只有737KB可以在几秒种内下载完毕。Zend Framework是10MB) CI不能解决你所有的问题。 但是它能够:

. 使PHP编程更容易

. 帮助你架构网站或使你更容易地设计架构

作为 '轻量级' 框架的一个结果是它没有它的对手具有的许多特征。 象Rails因为它包含 '脚手架'功能和"代码生成器",因此可以为你编写一些基本的脚本代码。 因此, 举例来说,一经你已经建立一个数据库, Rails能自动生成简单的CRUD脚本(Create, Read, Update, Delete)。

除此之外,Rails还能让你编写'代码生成器'-自动地写其他的简单脚本代码。Rails社区中有许多这样的例子,因此你可以做很多智能化的东西。

CI不这样做。(有基本的 '脚手架'功能-在CI中,脚手架只给开发者使用。就象在线手册描述的一样: "脚手架安全性不够...如要使用脚手架的话要确保在使用后立即关闭这个功能。在实际运行的网站上不要让脚手架处在工作状态。" 说得够明确了吧?)

相反地CI专注于使基本的东西更容易。它处理的一些事物是:

. session管理和cookie管理 (见第 6 章)

. 数据库访问和查询 (见第 4 章)

. 创建HTML相关内容,如页面和表单,并检验输入内容。(见第 5 章)

. 测试 (第 8 章)

. 英特网通信, 使用FTP或 XMLRPC(第 9 章)

很熟悉吧? 这些全部是基本的处理, 如果你正在创建一个动态的网站,你一定会做这些工作。 CI使这些工作更容易, 而且使你的代码尽可能更好地工作。

许可证

参见CI下载文件包

摘要

如果你已经掌握PHP的基本知识并且想“聪明”地编写动态网站脚本, CodeIgniter框架会使你的工作更容易,它帮助你:

. 节约时间

. 使你的网站更强健

. 帮助你编写更复杂的系统

它使你更好地享受编程乐趣, 而不是一个干苦活的体力工。

有相当多的框架, 还有很多是为其它语言开发的。 他们都能减少编码的重复工作,使编写复杂程序变得更容易, 而且建立一个合理的系统架构。

这篇文章不制造框架大战。文章中已经解释了选择CI理由,让它为你节约更多的时间用在学习工作和生活中吧,请享用它!

下一章:

二分钟: 建立一个CI网站
发表于 2008-2-28 18:46:00 | 显示全部楼层
好文啊 哈哈~业余时间 正想学学这个
发表于 2008-2-28 18:58:11 | 显示全部楼层
很好的文字教程~~~
发表于 2008-3-24 22:38:44 | 显示全部楼层
太好了,强力支持哈
发表于 2008-3-31 15:54:55 | 显示全部楼层
恩那,清晰透彻!~~
发表于 2008-7-27 13:10:05 | 显示全部楼层

抱歉提个小意见

非常感谢您的教程, 对初学的人很有帮助,不过 为什么不把代码中的类似-&gt;zip-&gt;字符转换成正常代码,这样粘贴测试代码太累了 每次要批量替换一下
发表于 2008-8-6 07:43:36 | 显示全部楼层

累眼

&it;等符号,没有转换
 楼主| 发表于 2008-8-6 09:38:59 | 显示全部楼层
呵呵,请大家等待新版本吧,改这个意义不大了,因为新版会比这个完美很多。
发表于 2008-8-6 12:47:55 | 显示全部楼层
支持Hex, VIVA CI
发表于 2008-8-29 13:38:29 | 显示全部楼层
想像你正在写一个MySQL数据库查询。 可能的代码如下: 复制内容到剪贴板 PHP 代码:  $connection = mysql_connect("localhost","fred","12345");
   mysql_select_db("websites", $connection);
   $result = mysql_query("SELECT * FROM sites", $connection);
   while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
      foreach ($row as $attribute) {
         print "{$attribute[1]} ";
      }
   }


现在看看CI如何处理同一个问题: 复制内容到剪贴板 PHP 代码:$this->load->database('websites');
$query = $this->db->get('sites');
foreach ($query->result() as $row) {
    print $row->url;
}


弱弱的问下楼主,有没有多点类似上面这样对照的东西,,刚开始用这个框架,,感觉函数很多,有的知道,有的就不大明白怎么用,如果能有这种做个对比,我想对于我们这些初用者来说,可能会更轻松些,,强烈支持下

[ 本帖最后由 ssfnadn 于 2008-9-1 14:10 编辑 ]

本版积分规则