CodeIgniter框架深入理解

PHP 专栏收录该内容
3 篇文章 0 订阅

.

CodeIgniter框架深入理解

1.CodeIgniter是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序。如果你是一个使用共享主机,并 且为客户所要求的期限而烦恼的开发人员,如果你已经厌倦了那些傻大笨粗的框架那么 CodeIgniter 就是你所需要的。CodeIgniter 是一个基于MVC框架的PHP开源轻量级框架 ,适合快速开发,相对与Zend Freamwork,其更容易学习和应用,而且CodeIgniter 入门简单,配置方便

2.对于标准的MVC框架来说,Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据; View(视图) 是应用程序中处理数据显 示的部分也就是用户能够看到的界面,通常视图是依据模型数据创建的;Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用 户输入,并向模型发送数据,最后,将模型返回的数据发送给视图,显示在界面上。
Controller层往往是程序的入口(网页的地址就是 Controller层的地址 ) ,然后由 Controller层加载 View层进行显示(显示在浏览器上的页面 其实并不是你输入的地 址),在View层用户通过表单实现交互,表单将数据传回 Controller层,由 Controller层调用Model层进行数据处理、存储、读取等操作,然后Model 层将处理结果返回 给 Controller层, Controller层再次加载View层显示处理的结果

3.配置CI开发环境
(1)在开发工具中创建工程目录ci(名字随便),把CodeIniter压缩包解压后的所有文件(不复制根目录)再复制到eclipse中的工程ci中
使用文本编辑器打开 application/config/config.php 文件设置你网站的根 URL,如果你想使用加密或会话,在这里设置上你的加密密钥;
如果你想通过隐藏 CodeIgniter 的文件位置来增加安全性,你可以将 system 和 application 目录修改为其他的名字,然后打开主目录下的 index.php 文件将 $system_path 和 $application_folder 两个变量设置为你修改的名字。

(2)为更好的安全性,system 和 application 目录都应该放置在 Web 根目录之外,这样它们就不能通过浏览器直接访问。CodeIgniter 默认在每个目录下都包含了一个 .htaccess 文件,用于阻止直接访问,但是最好还是将它们移出能公开访问的地方,防止出现 Web 服务器配置更改或者 .htaccess 文件不被支持这些情况。

(3)配置数据库文件。在application\config\database.php中,一般修改以下内容

          'dsn' => 'mysql:host=localhost;dbname=ci',
                //'hostname' => 'localhost',用pdo时注释掉,下同
	    //'database' => 'ci',
                'username' => 'root',
                'password' => '',
	    'dbdriver' => 'pdo',//默认数据库驱动是mysqli,一般改为pdo对象操作数据库

(4)在config.php中设置默认地址$config[‘base_url’] = ‘http://localhost/CodeIgniter/’;

(5)路由配置在applicaiton\config\routes.php中,
$route[‘default_controller’] = ‘welcome’;//可以修改

4.编写控制器方法和静态页面
例子http://example.com/news/latest/10 有一个叫做 “news” 的控制器,被调用的方法为 “latest” , 这个方法的作用应该是查询 10 条新闻条目并显示在页面上
新建一个文件 application/controllers/Pages.php ,然后添加一个view方法
<?php
class Pages extends CI_Controller {
public function view(KaTeX parse error: Expected '}', got 'EOF' at end of input: …/views/pages/'.page.’.php’)){
show_404();
}

	$data['title'] = ucfirst($page);
	
	$this->load->view('tempates/header', $data);
	$this->load->view('pages/'.$page, $data);
	$this->load->view('tempates/footer', $data);//view() 方法的第二个参数用于向视图传递参数,$data 数组中的每一项将被赋值给一个变量
}
  }

新建两个视图(页面模板)分别作为我们的页脚和页头
新建页头文件 application/views/templates/header.php 并添加以下代码:

CodeIgniter Tutorial
    <h1><?php echo $title; ?></h1>

新建页脚文件application/views/templates/footer.php ,然后添加以下代码:
© 2015

解释: 标签告诉浏览器把其中的文本表示为强调的内容。对于所有浏览器来说,这意味着要把这段文字用斜体来显示。

静态页面模板位于 application/views/pages/ 目录,在该目录中,再新建两个文件 home.php 和 about.php 内容随便写其中之一比如



Hello CodeIniter!

	<p>Let's start to study CodeIniter now!</p>

</body>
</html>

5.测试页面
控制器现在开始工作了!在你的浏览器中输入 http://localhost/CodeIgniter/index.php/pages/view来查看你的页面。当你访问 在view后面加上/about 时你将看到about 页面,包括页头和页脚。
如果不行有进可以在地址的index.php后加上?,如果提示404错误可能是控制器或页面文件里的文件名或位置错误

6.可以隐藏入口文件index.php,在url总中显示入口文件不太美观,如果要隐藏可以进行如下设置(路由配置文件中也能更方便的设置隐藏)。

(1)服务器配置文件http.conf中开启重写
LoadModule rewrite_module modules/mod_rewrite.so
这条前面不可有#,如果没有这条加上即可

(2)在网站根目录下新建文件.htaccess,属于隐藏文件,可新建文件后另存为时修改名字,

7.创建数据库模型
打开 application/models/ 目录,新建一个文件 News_model.php ,然后写入下面的代码。 确保你的 数据库配置正确

<?php class News_model extends CI_Model { public function __construct() { $this->load->database(); } } 在命令行中建表 CREATE TABLE news ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(128) NOT NULL, slug varchar(128) NOT NULL, text text NOT NULL, PRIMARY KEY (id), KEY slug (slug) ); 插入一些测试数据INSERT INTO `news` (`id`, `title`, `slug`, `text`) VALUES ('1', 'new1', 'hello', 'a shot accident in usa night in yesterday!'); 8.CodeIgniter 的数据库抽象层 查询构造器 , 通过它你可以编写你的查询代码,并在 所有支持的数据库平台 上运行。 向上面的模型类中添加如下代码。 public function get_news($slug = FALSE)//根据slug有无来执行查询所有条目或指定条目 { if ($slug === FALSE) { $query = $this->db->get('news'); return $query->result_array(); } $query = $this->db->get_where('news', array('slug' => $slug)); return $query->row_array(); } 9.现在,查询已经写好了,接下来我们需要将模型绑定到视图上,向用户显示新闻条目了,在application/controllers/News.php 文件中。 class News extends CI_Controller { public function __construct() { parent::__construct();//原因是你的构造函数将会覆盖父类的构造函数,所以我们要手工的调用它。 $this->load->model('news_model'); $this->load->helper('url_helper'); } public function index() { $data['news'] = $this->news_model->get_news(); $data['title'] = 'News archive'; $this->load->view('templates/header', $data); $this->load->view('news/index', $data); $this->load->view('templates/footer'); } public function view($slug = NULL) { $data['news_item'] = $this->news_model->get_news($slug); if (empty($data['news_item'])) { show_404(); } $data['title'] = $data['news_item']['title']; $this->load->view('templates/header', $data); $this->load->view('news/view', $data); $this->load->view('templates/footer'); } } 10.现在你需要创建一个视图文件来 显示新闻条目了,新建 application/views/news/index.php 文件并添加如下代码。

<?php echo $title; ?>

<?php foreach ($news as $news_item): ?>
<h3><?php echo $news_item['title']; ?></h3>
<div class="main">
    <?php echo $news_item['text']; ?>
</div>
<p><a href="<?php echo site_url('news/'.$news_item['slug']); ?>">View article</a></p>

<?php endforeach; ?>

剩下的事是创建视图文件 application/views/news/view.php 并添加如下代码 。
 <?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
 ?>

创建路由就可以访问了 注意__construct()函数的下划线是长的否则报错还有php标识后面的?>在ci中可以不写
可以不注释前面的路由照样有效,访问成功!
    $route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

11.用表单写入数据,在文件 application/views/news/create.php 中创建一个新视图。

<?php echo $title; ?>

<?php echo validation_errors(); ?> <?php echo form_open('news/create'); ?>
<label for="title">Title</label>
<input type="input" name="title" /><br />

<label for="text">Text</label>
<textarea name="text"></textarea><br />

<input type="submit" name="submit" value="Create news item" />

回到你的 News 控制器
public function create()
{
$this->load->helper(‘form’);
$this->load->library(‘form_validation’);

$data['title'] = 'Create a news item';

$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('text', 'Text', 'required');

if ($this->form_validation->run() === FALSE)
{
    $this->load->view('templates/header', $data);
    $this->load->view('news/create');
    $this->load->view('templates/footer');

}
else
{
    $this->news_model->set_news();
    $this->load->view('news/success');
}

}

建一个视图文件 application/views/news/success.php 并写上成功的信息

<?php echo "create success!"; ?>

向数据库中插入数据。打开之前创建的模型文件,添加以下代码:
public function set_news()
{
$this->load->helper(‘url’);

$slug = url_title($this->input->post('title'), 'dash', TRUE);

$data = array(
    'title' => $this->input->post('title'),
    'slug' => $slug,
    'text' => $this->input->post('text')
);

return $this->db->insert('news', $data);

}

到 config/routes.php 文件中去添加一条新的路由规则
$route[‘news/create’] = ‘news/create’;
$route[‘news/(:any)’] = ‘news/view/$1’;
$route[‘news’] = ‘news’;
$route[’(:any)’] = ‘pages/view/$1’;
$route[‘default_controller’] = ‘pages/view’;

12.用控制器接收多个参数
创建控制器
<?php
class Products extends CI_Controller {
public function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
测试 shoes方法将会收到两个参数(“sandals” 和 “123”):
http://localhost/CodeIgniter/index.php/Products/shoes/sandals/123

13.控制器的注意事项
如果你的控制包含一个_remap() 方法,那么无论 URI 中包含什么参数时都会调用该方法。 它允许你定义你自己的路由规则,重写默认的使用 URI 中的分段来决定调用哪个方法这种行为。
如果你的控制器含有一个 _output() 方法,输出类将会调用该方法来显示数据, 而不是直接显示数据。该方法的第一个参数包含了最终输出的数据。
类名和方法名都不要跟父类的相同,你的控制器将继承主程序的控制器,在新建方法时你必须要小心不要使用和父类一样的方法名, 要不然你的方法将覆盖它们

14.用数组和循环来显示页面
创建控制器Blog

<?php class Blog extends CI_Controller { public function index() { $data['title'] = "My Real Title"; $data['heading'] = "My Real Heading"; $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands'); $this->load->view('templates/blogview', $data); } } 创建视图,foreach使用了PHP的替代语法 <?php echo $title;?>
</head>
<body>
<h1><?php echo $heading;?></h1>
<h3>My Todo List</h3>

<ul>
<?php foreach ($todo_list as $item):?>

	<li><?php echo $item;?></li>
		
<?php endforeach;?>
</ul>
</body>
</html>

15.在视图文件中使用PHP替代语法?
Echo 替代语法?

通常情况,你会使用下面的方法来打印一个变量:

<?php echo $variable; ?>

使用替代语法,你可以写成这样:

<?=$variable?>

控制结构的替代语法?

像 if、for、foreach、while 这样的控制结构也可以写成精简的格式。 下面以 foreach 举例:

    <?php foreach ($todo as $item): ?>
    <li><?=$item?></li>
    
    <?php endforeach; ?>

    注意这里没有任何括号。所有的结束括号被替换成了 endforeach 。 上面说的那些控制结构也都有这相似的结束标志:endif 、 endfor 、 endforeach 和 endwhile 。

    ul是定义无序列表的样式,显示时前面只有圆点, ol是有序列表显示时前面有序号
    li是列表内行的样式
    在HTML代码中列表是这样的

    • 列表一
    • 列表二

    16.加载视图方法有一个可选的第三个参数可以让你修改它的默认行为,它让视图作为字符串返回 而不是显示到浏览器中
    $string = $this->load->view(‘myfile’, ‘’, TRUE);
    模型需要在整个应用程序中使用,你可以让 CodeIgniter 在系统初始化时自动加载它。打开 application/config/autoload.php 文件, 并将该模型添加到 autoload 数组中。

    17.连接数据库?
    当模型加载之后,它 并不会 自动去连接你的数据库,下面是一些关于 数据库连接的选项:
    你可以在控制器或模型中使用 标准的数据库方法 连接数据库。
    你可以设置第三个参数为 TRUE 让模型在加载时自动连接数据库,会使用你的数据库配置文件中的配置:
    $this->load->model(‘model_name’, ‘’, TRUE);

    18.加载辅助函数?
    可以使用下面的方法简单的加载辅助函数:
    要加载 URL 辅助函数 ,它的文件名为 url_helper.php ,你可以这样加载它:
    $this->load->helper(‘url’);
    如果你需要加载多个辅助函数,你可以使用一个数组,像下面这样:
    $this->load->helper(
    array(‘helper1’, ‘helper2’, ‘helper3’)
    );
    自动加载辅助函数同上自动加载模型

    19.所有的系统类库都位于 system/libraries/ 目录下,大多数情况下,在使用之前, 你要先在 控制器 中初始化它,使用下面的方法:
    $this->load->library(‘class_name’);
    在加载类库的时候,你可以通过第二个参数动态的传递一个数组数据,该数组将被传到你的类的构造函数中,如果你使用了该功能,你必须在定义类的构造函数时加上参数
    你也可以将参数保存在配置文件中来传递,只需简单的创建一个和类文件同名的配置文件

    20.在你的类库中使用 CodeIgniter 资源?
    在你的类库中使用 get_instance() 函数来访问 CodeIgniter 的原生资源,这个函数返回 CodeIgniter 超级对象。
    通常情况下,在你的控制器方法中你会使用 $this 来调用所有可用的 CodeIgniter 方法:
    $this->load->helper(‘url’);
    $this->load->library(‘session’);
    $this->config->item(‘base_url’);
    但是 $this 只能在你的控制器、模型或视图中直接使用,如果你想在你自己的类中使用 CodeIgniter 类,你可以像下面这样做:
    首先,将 CodeIgniter 对象赋值给一个变量:
    $CI =& get_instance();
    一旦你把 CodeIgniter 对象赋值给一个变量之后,你就可以使用这个变量来 代替 $this
    $CI =& get_instance(); //这是非常重要的,引用赋值允许你使用原始的 CodeIgniter 对象,而不是创建一个副本
    $CI->load->helper(‘url’);
    $CI->load->library(‘session’);
    $CI->config->item(‘base_url’);

    既然类库是一个类,那么我们最好充分的使用 OOP 原则,所以,为了让类中的所有方法都能使用 CodeIgniter 超级对象,建议将其赋值给一个属性:
    class Example_library {
    protected $CI;
    public function __construct()
    {
    // Assign the CodeIgniter super-object
    $this->CI =& get_instance();
    }

    21.使用你自己的类库替换原生类库?
    将你的类文件名改为和原生的类库文件一致,CodeIgniter 就会使用它替换掉原生的类库
    要加载你的类库,和标准的方法一样,注意数据库类不能被你自己的类替换掉。
    扩展原生类库?
    类在定义时必须继承自父类。
    你的新类名和文件名必须以 MY_ 为前缀(这个可配置,见下文)
    要扩展原生的 Email 类你需要新建一个文件命名为 application/libraries/MY_Email.php , 然后定义你的类:
    class MY_Email extends CI_Email {

    }
    

    如果你需要在你的类中使用构造函数,确保你调用了父类的构造函数 parent::__construct($config);

    22.使用 CodeIgniter 驱动器?
    驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类,但不能访问兄弟类。在你的控制器中,驱动器为你的类库提供了一种优雅的语法,从而不用将它们拆成很多离散的类。
    驱动器位于 system/libraries/ 目录,每个驱动器都有一个独立的目录,目录名和 驱动器父类的类名一致,在该目录下还有一个子目录,命名为 drivers,用于存放 所有子类的文件。
    要使用一个驱动器,你可以在控制器中使用下面的方法来进行初始化:
    $this->load->driver(‘class_name’);
    class_name 是你想要调用的驱动器类名,例如,你要加载名为 Some_parent 的驱动器, 可以这样:
    $this->load->driver(‘some_parent’);
    然后就可以像下面这样调用该类的方法:
    $this->some_parent->some_method();
    而对于那些子类,我们不用初始化,可以直接通过父类调用了:
    $this->some_parent->child_one->some_method();
    $this->some_parent->child_two->another_method();

    23.钩子 - 扩展框架核心?
    CodeIgniter的钩子特性提供了一种方法来修改框架的内部运作流程,而无需修改 核心文件。
    启用钩子?
    钩子特性可以在 application/config/config.php 文件中全局的启用或禁用, 设置下面这个参数:
    $config[‘enable_hooks’] = TRUE;
    定义钩子?
    钩子是在 application/config/hooks.php 文件中被定义的,每个钩子可以定义 为下面这样的数组格式:
    $hook[‘pre_controller’] = array(
    ‘class’ => ‘MyClass’,
    ‘function’ => ‘Myfunction’,
    ‘filename’ => ‘Myclass.php’,
    ‘filepath’ => ‘hooks’,
    ‘params’ => array(‘beer’, ‘wine’, ‘snacks’)
    );
    数组的索引为你想使用的挂钩点名称,例如上例中挂钩点为 pre_controller ,function 你希望调用的方法或函数的名称。
    如果你使用 PHP 5.3 以上的版本,你也可以使用 lambda表达式(匿名函数或闭包)作为钩子, 这样语法更简单:
    $hook[‘post_controller’] = function()
    {
    /* do something here */
    };

    24.公共函数?
    CodeIgniter 定义了一些全局的函数,你可以在任何地方使用它们,并且不需要加载任何 类库或辅助函数。
    is_php( v e r s i o n ) ? 判 断 当 前 运 行 的 P H P 版 本 是 否 高 于 或 等 于 你 提 供 的 版 本 号 i s r e a l l y w r i t a b l e ( version)?判断当前运行的 PHP 版本是否高于或等于你提供的版本号 is_really_writable( version)?PHPisreallywritable(file)?
    config_item( k e y ) ? 访 问 单 个 配 置 项 r e m o v e i n v i s i b l e c h a r a c t e r s ( key)?访问单个配置项 remove_invisible_characters( key)?访removeinvisiblecharacters(str[, u r l e n c o d e d = T R U E ] ) ? 这 个 函 数 去 掉 A S C I I 字 符 串 中 插 入 的 空 字 符 h t m l e s c a p e ( url_encoded = TRUE])?这个函数去掉ASCII字符串中插入的空字符 html_escape( urlencoded=TRUE])?ASCIIhtmlescape(var)?访问单个配置项这个函数类似于 PHP 原生的 htmlspecialchars() 函数,只是它除了可以接受字符串参数外,还可以接受数组参数

    25.设置你自己的路由规则?
    路由规则将按照它们定义的顺序执行,前面的规则优先级高于后面的规则。
    路由规则定义在 application/config/routes.php 文件中,在这个文件中你会 发现一个名为 $route 的数组,
    利用它你可以设置你自己的路由规则。 在路由规则中你可以使用通配符或正则表达式。
    通配符一个典型的使用通配符的路由规则如下:
    $route[‘product/:num’] = ‘catalog/product_lookup’;
    在一个路由规则中,数组的键表示要匹配的 URI ,而数组的值表示要重定向的位置。 上面的例子中,如果 URL 的第一段是字符串 “product” ,第二段是个数字,
    那么, 将调用 “catalog” 类的 “product_lookup” 方法。
    你可以使用纯字符串匹配,或者使用下面两种通配符:(:num) 匹配只含有数字的一段。 (:any) 匹配含有任意字符的一段。(除了 ‘/’ 字符,因为它是段与段之间的分隔符)
    route[‘journals’] = ‘blogs’; URL 的第一段是单词 “journals” 时,将重定向到 “blogs” 类。
    $route[‘blog/joe’] = ‘blogs/users/34’; URL 包含 blog/joe 的话,将重定向到 “blogs” 类和 “users” 方法。ID 参数设为 “34” 。
    $route[‘product/(:any)’] = ‘catalog/product_lookup’;URL 的第一段是 “product” 第二段是任意字符时,将重定向到 “catalog” 类的 “product_lookup” 方法。
    $route[‘product/(:num)’] = ‘catalog/product_lookup_by_id/$1’;URL 的第一段是"product",第二段是数字时,将重定向到"catalog"类的"product_lookup_by_id"方法,并将参数传递给它。

    你可以在路由规则中使用正则表达式。任何有效的正则表达式都是 允许的,包括逆向引用。
    $route[‘products/([a-z]+)/(\d+)’] = ‘$1/id_$2’;
    上例中,一个类似于 products/shirts/123 这样的 URL 将会重定向到 “shirts” 控制器的 “id_123” 方法
    在路由中使用 HTTP 动词,可以使用标准的 HTTP 动词(GET、PUT、POST、DELETE、PATCH),
    $route[‘products’][‘put’] = ‘product/insert’;
    上例中,当发送 PUT 请求到 “products” 这个 URI 时,将会调用 Product::insert() 方法。

    $route[‘404_override’] = ‘’; 这个路由表示当用户请求了一个不存在的页面时该加载哪个控制器,它将会覆盖默认的 404 错误页面。

    保留的路由规则必须位于任何一般的通配符或正则路由的前面。

    • 0
      点赞
    • 0
      评论
    • 0
      收藏
    • 打赏
      打赏
    • 扫一扫,分享海报

    参与评论 您还未登录,请先 登录 后发表或查看评论
    大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事。这篇文章是有关 CodeIgniter 的(以下简称 CI),CI 是一个达成以上目标的框架。 如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI 是你最好的朋友。 CI 有很多优点:免费,轻量级,容易安装,它能使你的编程生涯变得很轻松。 这一章我们会告诉你: CI 能为你做什么? 什么是“框架”?CI 为什么能被称为框架? “开源”商业模式。 CI 的某些不足(是的,它并不完美)。 1.1 CodeIgniter 能为你做什么? 如果你已经是一位 PHPer,开发过 PHP 应用,CodeIgniter 将会帮助你做得更好,更容易达成目标。CI 会减少你的代码量。你的脚本可读性也会更好,更容易升级。它会使你的网站结构更紧凑,代码更强健,如果没有很好地研究 CI 的源代码,你可能还无法察觉到它的强健。 对大多数兄弟来讲,你可能已经花了不少时间,系统地学习了 PHP、HTML 和 CSS,当然还有 MySQL 什么的,不过如果使用 CI,你只需要一些基本的 LAMP(WAMP)知识,你没有必要先成为一个专家才能使用 CI。你完全可以先借助于 CI 或别的什么框架软件,成为一个有生产力的 PHP 程序员,拿着高薪然后优雅地进一步学习 PHP 的中高级知识,直至成为一位真正的 PHP 骨灰级的人物。 下述情形,你最好不要使用CI: 你没有一点PHP和HTML的基本知识。 你想用最少的代码,快速简便的写一个基本的内容管理系统(CMS)(可以看看Expression Engine)。 你想写一个只有几个标准特性的简单的网站。 1.1.1 节省时间 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, '3');在 HTML 中,你需要输入 154 个字符;在 CI 中,只需要 128 个字符。 1.1.2 使你的网站更健壮 你不需要写很多代码,是因为 CI 提供了许多标准的功能,这些经过仔细推敲的框架内的代码,对安全性和输入进行了有效的校验和考虑。初学者往往没有足够的能力全面兼顾功能和安全。(这也是中高级程序员与新手之间能力差异的一个方面) 1.1.2.1 确保你的链接自动更新 设想你正在编写一个菜单页面,有许多超链接可重定向到其他页面。他们全部以传统的 HTML 格式编写: 复制代码到剪贴板HTML 代码<a href="http://www.mysite.com/index.php/start/hello/fred">say hello to Fred</a>后来,你决定转移网站到其他 URL。这意谓你必须仔细地去查找并修改代码中的每一处 URL,否则它们将无法正常工作。 CI 给你一个简单的函数,可以这样编写超链接: 复制代码到剪贴板PHP 代码echo anchor('start/hello/fred', 'Say hello to Fred');CI 推荐你把你的 URL 放入一个配置文件中供你的脚本读取。CI 的 anchor 函数会自动从配置文件中提取相关 URL。因此,当你修改一个 URL 时,你只需要修改配置文件中的对应链接,然后所有超链接将自动更新。 1.1.2.2 防止对数据库的攻击:对表单输入的数据进行校验和处理 数据输入可能引发许多问题。因为 HTML 和数据库的限制,数据中总包含特定的符号—举例来说,省略符号和引号—可能导致你的数据库遭到攻击,最终得到你无法预料的结果。 解决方案是在把这些数据存入数据库前对这些数据进行相关处理。这样做会浪费一些系统时间,增加一些额外编码。 CI 的表单辅助函数会自动地完成这些工作。因此,当你编写一个输入框时: 复制代码到剪贴板PHP 代码echo form_input('username', 'johndoe');CI 也隐式地执行下列校验函数: 复制代码到剪贴板PHP 代码function form_prep($str = '') { if ($str === '') { return ''; } $temp = '__TEMP_AMPERSANDS__'; // Replace entities to temporary markers so that // htmlspecialchars won't mess them up $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str); $str = preg_replace("/&(\w+);/", "$temp\\1;", $str); $str = htmlspecialchars($str); // In case htmlspecialchars misses these. $str = str_replace(array("'", '"'), array("'", """), $str); // Decode the temp markers back to entities $str = preg_replace("/$temp(\d+);/","&#\\1;",$str); $str = preg_replace("/$temp(\w+);/","&\\1;",$str); return $str; }上述函数捕获像“&”这样的特殊字符,以便在你的页面提交时不会造成混乱。你应该知道,有些字符会引起问题。 并不是所有的用户都会中规中矩的输入符合要求的信息,你也不可能知道使用浏览器输入信息的是什么人,他们在想什么,做什么。你可以使用 CI 来防止输入不符合要求的信息。当然,你大可不必知道 CI 是如何在幕后为你做到这一切的,你只需要简单地输入如下代码: 复制代码到剪贴板PHP 代码echo form_input('username', 'johndoe');1.1.3 增强你的代码 CI 使你写代码更容易了。不像有些类库如 PEAR 等,集成比较困难,(有时候你会找不到支持 PEAR 的空间),CI 很容易集成,只要把它放入一个目录,它就能很好地工作。CI 所有代码的可读性好,也很健壮,推出前经过社区用户的认真测试,所以在你可以使用时,这些代码已经经历了很多考验。 让我们看两个例子。 1.1.3.1 发送 Email 和附件很简单 发送 Email 的功能实现起来比较复杂,但是,使用 CI 将使这件事变得很简单: 复制代码到剪贴板PHP 代码$this->load->library('email'); $this->email->from('your@your-site.com', 'Your Name'); $this->email->subject('Email Test'); $this->email->message('Testing the email class.'); $this->email->send();实现发送 Email 的功能中有一些不容易解决的技术问题:比如设置文本自动换行(取消设置的话则可以保持长 URL 地址不被换行或截断)或发送附件。标准的 PHP 实现起来比较复杂,CI 简化了这些工作,它的 Email 类使得发送附件很简单: 复制代码到剪贴板PHP 代码$this->email->attach('/path/to/photo1.jpg');CI 把内部的复杂部分悄悄地完成了,举例来说,实现了列举近百种不同附件的 MIME 类型的功能。所以它知道你的相片 photo1.jpg 是一个“image/jpeg”MIME 类型。因此它在你附件的适当位置填写必要的限制符号,它处理文本的换行,让你轻松标记出不希望出现换行的文本块。 1.1.3.2 压缩用户要下载的文件以加快下载速度 为了加快下载速度,常见的做法是在下载之前压缩下载文件。你可能不知道如何处理。但 CI 可以方便地让你用 4 行代码完成此功能: 复制代码到剪贴板PHP 代码$name = 'mydata1.txt'; $data = 'the contents of my file..........'; $this->zip->add_data($name, $data); $this->zip->archive('c:/my_backup.zip');运行这些代码,你会在你的 C 盘根目录下找到一个压缩文件,解压后即为原始文件。 你网站的用户并不清楚你是如何简便实现这个功能的,但他们能体会到你的网站的下载速度很快,而你只用了数分种(而不是数小时)就实现了这个功能。 1.2 CodeIgniter 是什么?框架又是什么? 当发明计算机编程不久之后,便有人发现,这其中涉及到了太多的重复操作。之后,也许是 Ada Lovelace(人类历史上的首位程序员),又或许是 Alan Turning,决定将计算机程序模块化,从而使得片段程序代码可以重复使用。PHP 程序员们早已习惯了将需要重复使用的代码写在函数中,并将这些函数放在 include 文件里。 同样的,框架是为重用而发明的,存放在独立的文件中,用来简化重复操作的代码。 上面例子中连接数据库和编写 HTML 表单元素的工作都可以调用相关的 CI 函数来进行简化。 它超越了这一点。有很多种方法实现同样的功能;大多数的框架会让你按照它实现的方法来做。他们选择了一种方式来解决问题,所以你也必须要遵循这种方式。如果方式得当,编程便会轻松许多,反之则会事倍功半。 好的框架设计能实现需要的功能,而且尽可能地不互相牵连。一个好框架为你做出各种功能的实现,并且给你提供一步一步的编程指导。 提到框架时,就不能不提到著名的框架:Ruby on Rails。 Rails 做得相当成功,因为它籍由最少量的编码,提供简便快速的网站开发。本质上,它是一个结构和一组工具,专为使用 Ruby 语言的用户开发,允许你快速建立 Ruby 系统原型。它不是 Ruby 语言中唯一的框架,但它一定是最有开发效率和最有名的。另一方面,如果你已经花了很大功夫学习 PHP 的话,那么从 Ruby 重新开始又要重头学起。 为 PHP 开发的框架有很多个(大约 40 个),CI 只是其中之一。其它的还包括 Zend Framework、Cake、Trax 等。下列网址可以找到一个针对十种框架的简明图表分析:http://www.phpit.net/article/ten-different-php-frameworks/。 如果你访问上述网址中相关产品的官方网站,你将会注意到,每个论坛都有一个共同的热点,就是到底哪一个框架是最好的?事实似乎是每个都有它的长处,而且又都有自己的弱点。我的评估标准是:我很忙;因此框架应该节省我的时间,从中选择一个后,就坚持使用下去,因此就有了这本介绍 CI 的书。
    ©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

    打赏作者

    b66051612

    你的鼓励将是我创作的最大动力

    ¥2 ¥4 ¥6 ¥10 ¥20
    输入1-500的整数
    余额支付 (余额:-- )
    扫码支付
    扫码支付:¥2
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

    余额充值