婉兮清扬

案上诗书杯中酒之快意人生

CodeIgniter 2.0.2学习笔记

发表时间:2011-08-24 16:34:23
如下学习过程是在Ubuntu 11.04 Desktop + AMP环境下完成的。

1、下载安装

访问http:/codeigniter.com/,有个“Downloads”链接。下载最新的版本CodeIgniter_2.0.2.zip。解压缩后把整个文件夹丢到/var/www目录下。

unzip CodeIgniter_2.0.2.zip

sudo cp -r CodeIgniter_2.0.2 /var/www/CodeIgniter

访问http://localhost/CodeIgniter,应该能够看到CodeIgniter的欢迎页面。

在/var/www/CodeIgniter目录下,分别有application, system, user_guide三个子目录,还有index.php和license.txt两个文件。其中,system目录包含了CodeIgniter的类库,而应用层面的工作基本上集中在application目录下。

2、快速上手

首先设置应用的根目录。编辑application/config/config.php,修改$config['base_url']参数:

$config['base_url'] = 'http://localhost/CodeIgniter/';

其次设置数据库连接参数。编辑application/config/database.php,修改$db相关参数:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = 'root';
$db['default']['database'] = 'CI_Test';
$db['default']['dbdriver'] = 'mysql';

对于需要大量访问数据库的应用,建议自动装载数据库相关参数。编辑application/config/autoload.php,在文件的末尾增加一行:

$autoload['libraries'] = array('database');

再次访问http://localhost/CodeIgniter/。如果你的数据库CI_Test尚未创建,你会看到一条错误信息Database Error。登录进入MySQL数据库,创建一个名为CI_Test的数据库。刷新一下浏览器,如果看到CodeIgniter欢迎界面的话就可以了。(如果没看到CodeIgniter欢迎界面的话,一般是数据库连接参数问题。)

CodeIgniter应用的入口定义在application/config/routes.php中。在2.0.2版本中,routes.php文件里定义了

$route['default_controller'] = "welcome";

这个定义说明该应用的缺省入口为application/controllers/welcome.php。需要注意的是welcome.php的文件名和$route['default_controller']的定义是相同的。

看一下application/controllers/welcome.php文件,主要的部分如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller {
public function index()
{
$this->load->view('welcome_message');
}


代码中$this->load->view('welcome_message')这一句说明显示部分要去找application/views/welcome_message.php。看一下welcome_message.php这个文件,基本上就是HTML代码了。

接下来我们把这个例子稍微改装一下。编辑application/config/routes.php,修改如下:

$route['default_controller'] = "hello_world";

创建文件application/controllers/hello_world.php,内容如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Hello_World extends CI_Controller {
public function index()
{
$this->load->view('hello_world_display');
}


创建文件application/views/hello_world_display.php,文件里头随便填一些内容,不是HTML格式的也没有关系。再次访问http://localhost/CodeIgniter/,浏览器里显示的就应该是hello_world_display.php的内容了。

通过上面的例子,CodeIgniter中的控制器(Controller)和视图(View)的关系就比较清楚了。

3、数据库查询

我们继续在前面的hello_world应用上进行修改。假设在数据库CI_Test中有一个名为User的表,这个表中有id, firstname, lastname, title等字段,其中id是一个自动增加(auto increment)的字段。为了方便测试,我们事先在User表中添加了一些测试数据。接下来我们可以创建如下hello_world_model,对数据库进行插入、查询、更新等操作。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Hello_world_model extends CI_Model {

var $firstname = '';
var $lastname  = '';
var $title     = '';

function get_last_ten_entries()
{
$query = $this->db->query("SELECT * FROM User ORDER BY id DESC LIMIT 10");
return $query->result();
}

}

接下来我们修改一下application/controllers/hello_world.php,如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Hello_World extends CI_Controller {

public function index()
{
$this->load->model('hello_world_model');
$data['result'] = $this->hello_world_model->get_last_ten_entries();
$data['title']  = 'Hello World Page Title';
$this->load->view('hello_world', $data);
}
}

然后我们修改一下application/views/hello_world.php,如下:

<html>
<head>
<title><?=$title?></title>
</head>
<body>
<h1>CodeIgniter Hello World Application</h1>
<table>
<?php foreach($result as $row):?>
<p><tr><td><?=$row->firstname?>/<td><td><?=$row->lastname?></td><td><?=$row->title?></td></tr>
<?php endforeach;?>
</table>
</body>
</html>

刷新一下浏览器,应该可以看到数据库中个最后10条记录了。

4、数据库插入

接下来我们把这个例子改进一下,增加一个数据输入的表单。修改application/views/hello_world.php,如下:

<html>
<head>
<title><?=$title?></title>
</head>
<body>
<h1>CodeIgniter Hello World Application</h1>
<table>
<?php foreach($result as $row):?>
<p><tr><td><?=$row->firstname?>/<td><td><?=$row->lastname?></td><td><?=$row->title?></td></tr>
<?php endforeach;?>
</table>
<form action="index.php/hello_world/add_entry" method="post">
<p>First name: <input type="text" name="firstname" /></p>
<p>Last name: <input type="text" name="lastname" /></p>
<p>Title: <input type="text" name="title" /></p>
<input type="submit" value="Submit" />
</form>
</body>
</html>

在上面这个代码中,我们增加了一个表单,处理该表单的URL为index.php/hello_world/add_entry。与该URL相对应的代码为application/controllers/hello_world.php中的add_entry()方法。修改application/controllers/hello_world.php,如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Hello_world extends CI_Controller {

public function add_entry()
{
$this->load->model('hello_world_model');
$this->hello_world_model->add_entry();
$data['result'] = $this->hello_world_model->get_last_ten_entries();
$data['title']  = 'Hello World Page Title';
$this->load->view('hello_world', $data);
}

public function index()
{
$this->load->model('hello_world_model');
$data['result'] = $this->hello_world_model->get_last_ten_entries();
$data['title']  = 'Hello World Page Title';
$this->load->view('hello_world', $data);
}
}

在控制器hello_world的add_entry()方法中,又调用了模型hello_world_model的add_entry()方法。修改application/models/hello_world_model.php,如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Hello_world_model extends CI_Model {

var $firstname = '';
var $lastname  = '';
var $title     = '';

function get_last_ten_entries()
{
$query = $this->db->query("SELECT * from User ORDER BY id DESC LIMIT 10");
return $query->result();
}

function add_entry()
{
$this->firstname = $_POST['firstname'];
$this->lastname  = $_POST['lastname'];
$this->title     = $_POST['title'];
$this->db->insert('User', $this);
}

}

上面这几段程序已经实现了通过表单提交数据并插入到数据库的功能。不过,在浏览器中显示的返回页面URL为http://localhost/CodeIgniter/index.php/hello_world/add_entry,不够美观。我们再次修改修改application/controllers/hello_world.php,在执行数据库插入操作之后将返回页面重定向到index.php。同时,在控制器hello_world的多个方法中都要加载hello_world_model模型,我们干脆在控制器hello_world的构造函数中预先加载。修改后的代码如下:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Hello_world extends CI_Controller {

public function __construct()
{
parent::__construct();
$this->load->model('hello_world_model');
}

public function add_entry()
{
$this->hello_world_model->add_entry();
$this->load->helper('url');
redirect(site_url(), 'refresh');
}

public function index()
{
$data['result'] = $this->hello_world_model->get_last_ten_entries();
$data['title']  = 'Hello World Page Title';
$this->load->view('hello_world', $data);
}
}

到目前为止,我们已经可以基于CodeIgniter来编写简单的MVC应用了。

 
上一篇 下一篇

 
姓名:
评论:

请输入下面这首诗词的作者姓名。

朝辞白帝彩云间,千里江陵一日还。
两岸猿声啼不住,轻舟已过万重山。

答案:

云与清风常拥有,
冰雪知音世难求。
击节纵歌相对笑,
案上诗书杯中酒。

2020年12月31日
洛杉矶

最新评论


2026-07-23 11:37:04
qyjohn 评论了 《几句翻译》

2026-07-21 20:11:28
wells 评论了 《几句翻译》

2025-11-15 06:29:51
qyjohn 评论了 《青桔》

2025-11-14 01:55:04
wells 评论了 《青桔》

2025-10-24 18:04:06
Ted Wang 评论了 《关于作者(About Me)》

2025-03-27 08:28:09
Max 评论了 《父亲走了》

2025-03-08 04:13:52
W 评论了 《我不想颂扬普京大帝》

2024-07-22 16:02:03
云思 评论了 《无题》

2024-06-27 10:01:54
yiming 评论了 《致访客(Welcome)》

2024-05-06 08:50:06
qyjohn 评论了 《致访客(Welcome)》

2024-05-03 19:49:00
jimmie 评论了 《致访客(Welcome)》

2024-02-19 03:32:57
林小静 评论了 《埋剑渡》

2024-01-05 03:54:28
路过者 评论了 《2023年度盘点》

2024-01-04 10:22:05
qyjohn 评论了 《致访客(Welcome)》

2024-01-04 08:05:13
qyjohn 评论了 《2023年度盘点》