王新阳

wangxinyang

CodeIgniter获取header信息

以下两个用于获取 Request Headers

$this->input->request_headers()
返回 HTTP 请求头数组

$this->input->get_request_header()
返回某个指定的 HTTP 请求头,如果不存在,则返回 NULL

以下用于获取使用 header() 设置的 Response Headers

$this->output->get_header($header)
返回请求的 HTTP 头,如果 HTTP 头还没设置,返回 NULL

CodeIgniter同数据库/跨数据库复制表

同数据库复制表结构和数据:

$this->db->query('CREATE TABLE tab_new SELECT * FROM tab_old');


跨数据库复制表结构和数据:

//从db2获取原表的创建表sql语句
$query = $this->db2->query("SHOW CREATE TABLE $table_name")->row_array();
$query = $query[''Create Table'];

//在当前数据库创建新表
$this->db->query($query);

//遍历原表数据并写入新表
$res = $this->db2->get($table_name)->result_array();
foreach($res as $row){
    $this->db->insert($table_name, $row);
}

CodeIgniter把找不到的页面301跳转到指定页

问题:网站改版后页面链接地址发生变化,百度收录的原内容打开后出现404。

解决办法:

1、如果原网站也是 /product/view/id/12.html 这样的访问方式,只需要在自定义路由中设置下即可。如 $route['product/view/id/(:any)']='new_product/new_list';  把原产品详情页路由到新产品列表页;可以全部路由到一个新控制器,然后再跳转。

2、如果原网站是 product.asp?id=12 这种而新网站又是linux不支持asp时,可以使用 .htaccess 直接进行301跳转。

RewriteRule ^(news)\.asp$ http://domain/$1/gongsixinwen.html [R=301,L]
RewriteRule ^(products)\.asp$ http://domain/$1/jixie.html [R=301,L]

3、跳转到一个单独的控制器再进行精确跳转。

RewriteRule ^(news|art|files)\/ https://domain/baidu/index/$1 [R=301,L]


CodeIgniter框架中网站英文版以 /en/index.php 方式访问的设置

网址: http://www.baidu.com/en/about.html
实际请求地址: /en/index.php/about

实现步骤:

一、新建 /en 文件夹,把原 index.php 复制进来, 修改以下内容:
 1、 $system_path = '../system';
 2、 $application_folder = '../application/en_web';
 3、define('FCPATH', realpath(dirname(__FILE__).'/../').DIRECTORY_SEPARATOR);

二、在 /application 目录下新建英文版app的文件夹 en_web,把原中文版的app内容复制进来,修改 config.php
 1、$config['index_page'] = 'en/';

三、修改 .htaccess 文件,在原内容前面添加:
    RewriteRule ^en\/(.*)$ en/index.php/$1 [L]

OK!
另外,可以在 /index.php 中使用 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 判断客户语言并自动转入相应版本。

附我的 .htaccess

RewriteEngine On

RewriteRule ^en\/m\.php(.*)$ en/m.php/$1 [L]
RewriteRule ^en\/manage\.php(.*)$ en/manage.php/$1 [L]
RewriteRule ^en\/(.*)$ en/index.php/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^.+\.(ico|js|css|jpg|jpe|jpeg|png|bmp|gif|mp4|flv|swf|txt|pdf|zip|rar|htm|doc|docx|xls|xlsx)$
RewriteRule ^(.*)$ index.php/$1 [L]

CodeIgniter使用rewrite时出现404的原因

.htaccess中有如下一条,本意是要把/m重写为/m.php,结果总是 404错误

RewriteRule ^m/(.*)$ m.php/$1 [L]

原因:
config/config.php

$config['uri_protocol'] = 'REQUEST_URI';

要改为

$config['uri_protocol'[ = 'PATH_INFO';

否则CI无法根据重写后的uri获取请求的class和method,从而导致出错。
当访问地址为 http://abc.com/m   没有以 / 结尾时仍不能正确重写到 m.php,需要在.htaccess中增加如下一行(加在 RewriteRule ^m/(.*)$ m.php/$1 [L] 的前面):

RewriteRule ^m$ /m/ [R=301,NC,L]

参考:http://blog.csdn.net/newjueqi/article/details/12014673

如果服务器不支持$_SERVER['PATH_INFO'],可以在服务器上输入$_SERVER数组,查看是否支持$_SERVER['ORIG_PATH_INFO'],支持的话以ORIG_PATH_INFO代替PATH_INFO,当前要观察两个值是否相同,如果不相同,需要同时修改 system/core/URI.php 中关于$uri获取的部分。我本地电脑中ORIG_PATH_INFO和PATH_INFO的值不一样。阿里云虚拟主机不支持PATH_INFO,但ORIG_PATH_INFO的值却与我本地的PATH_INFO一样。

CI在模板中自由引用模板

<?php $this->load->view('模板'); ?>

为新模板赋额外值(同时在控制器中加载模板时传递的参数仍可在新模板中调用):
<?php $this->load->view('模板', array('newdata'=>参数值)); ?>

好处:灵活,不受制于controller

CI的CSRF防范原理及注意事项

首先我们谈谈什么是CSRF,它就是Cross-Site Request Forgery跨站请求伪造的简称。很多开发者甚至不够重视这个问题,认为这不是安全漏洞,而不过是恶意访问而已,它的攻击原理我在这里简单地描述一下:

有一天你打开你简单优雅逼格十足的谷歌浏览器,首先打开了一个tab页,登录并访问了你的微博首页。我们这里假设weibo.cn有这样一个网址: http://www.weibo.cn?follow_uid=123 ,意思是关注id为123的一个用户。这是一个正常的地址,访问也没有问题。

紧接着你的QQ群里发来了一个让你感到好奇的链接,http://www.comeonbaby.com, 你禁不住诱惑打开了这个链接,并在浏览器里的另一个tab页里显示出来。紧接着,你打开你的微博tab页,发现无故关注了一个新的用户。咦,这是为何?

原因很简单,很可能在你打开的http://www.comeonbaby.com链 接里存在着这样一个html元素: <img src="http://www.weibo.cn?follow_uid=123" alt="">, 浏览器试图加载这个img,很显然加载失败了,因为它不是一个有效的图片格式。但是,这个请求依然被发送出去了,此时你的微博是登录状态中,然后,你就真 的follow了123, 你看,你被强奸了。

这就是简单的csrf攻击。

在实际的网站项目中,如: http://www.abc.com/logout之类的链接都应该注意,注销类的、删除内容类的、转账类的都可能中埋伏,轻则让你感到诧异,重则数据丢失,财产损失,所以要重视任何一个对数据有操作行为的url。

那么我们在CI里如何解决呢?简单地:
第一步: 在application/config/config.php里配置以下字段:
$config['csrf_protection'] = true;
$config['csrf_token_name'] = 'csrf_token_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
第二步: 在form里使用form_open(),帮助生成一个token。

接下来我说一下csrf的工作原理:
简单地来说,当我们访问一个页面如: http://www.abc.com/register时, CI会生成一个名为csrf_cookie_name的cookie,其值为hash,并发送到客户端。同时由于你在该页面里使用了 form_open(),会在form标签下生成一个之类的隐藏字段,其值也为hash。
紧接着用户点击了注册按钮,浏览器将这些数据包括csrf_token_name发送到(post到)服务器,同时也会将名为 csrf_cookie_nam的cookie发送回去。服务器会比较csrf_token_name的值(也就是hash) 与 csrf_cookie_name 的cookie值(同样也是hash)是否相同, 如果相同则通过,如果不同则说明是csrf攻击。


点击查看全文:http://www.ifixedbug.com/posts/codeigniter-csrf-story

CodeIgniter数据库操作常用函数

选择数据
$this->db->select();
允许你在SQL查询中写 SELECT 部分。
$this->db->where();
$this->db->or_where();
$this->db->where_in();
允许你在SQL查询中写 WHERE部分,其余各种where语句请看手册。
$this->db->get();
运行选择查询语句并且返回结果集。可以获取一个表的全部数据。
$this->db->like();
$this->db->or_like();
$this->db->not_like();
本函数允许你生成 LIKE 子句,在做查询时非常有用,其余语法请看手册。
$this->db->order_by();
帮助你设置一个 ORDER BY 子句。
$this->db->group_by();
允许你编写查询语句中的 GROUP BY 部分:
$this->db->distinct();
为查询语句添加 "DISTINCT" 关键字:
$this->db->having();
允许你为你的查询语句编写 HAVING 部分。
$this->db->limit();
限制查询所返回的结果数量:
$this->db->select_max();
为你的查询编写一个 "SELECT MAX(field)"。
$this->db->select_min();
为你的查询编写一个 "SELECT MIN(field)" 。
$this->db->select_avg();
为你的查询编写一个 "SELECT AVG(field)" 。
$this->db->select_sum();
为你的查询编写一个 "SELECT SUM(field)" 。
$this->db->join();
允许你编写查询中的JOIN部分。
$this->db->count_all_results();
允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。

插入数据

$this->db->insert();
生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 数组 或一个 对象。
$this->db->insert_batch();
一次插入多条数据,生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 数组 或一个 对象。
$this->db->set();
本函数使您能够设置inserts(插入)或updates(更新)值。它可以用来代替那种直接传递数组给插入和更新函数的方式。

更新数据

$this->db->update();
根据你提供的数据生成并执行一条update(更新)语句。你可以将一个数组或者对象传递给本函数。
$this->db->update_batch();
Generates an update string based on the data you supply, and runs the query. You can either pass an array or an object to the function. Here is an example using an array:

删除数据

$this->db->delete();
生成并执行一条DELETE(删除)语句。
$this->db->empty_table();
生成并执行一条DELETE(删除)语句。
$this->db->truncate();
生成并执行一条TRUNCATE(截断)语句。

链式方法

链式方法允许你以连接多个函数的方式简化你的语法。考虑一下这个范例:
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20); 
$query = $this->db->get(); 
说明: 链式方法只能在PHP 5下面运行。

查询

$this->db->query(); 
要提交一个查询,用以下函数: 
$this->db->query('YOUR QUERY HERE'); 
query() 函数以object(对象)的形式返回一个数据库结果集。 当使用 "read" 模式来运行查询时, 你可以使用"显示你的结果集"来显示查询结果; 当使用 "write" 模式来运行查询时, 将会仅根据执行的成功或失败来返回 TRUE 或 FALSE. 

转义查询

$this->db->escape()这个函数将会确定数据类型,以便仅对字符串类型数据进行转义。并且,它也会自动把数据用单引号括起来,所以你不必手动添加单引号,用法如下:  $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";

查询辅助函数

$this->db->insert_id()
这个ID号是执行数据插入时的ID。
$this->db->affected_rows() 
当执行写入操作(insert,update等)的查询后,显示被影响的行数。 
$this->db->count_all(); 
计算出指定表的总行数并返回。在第一个参数中写入被提交的表名。

生成查询记录集

result() 
该方法执行成功返回一个object 数组,失败则返回一个空数组。 

result_array() 
该方法执行成功时将记录集作为关联数组返回。失败时返回空数组。 
row() 
该函数将当前请求的第一行数据作为 object 返回。你可以传递参数(参数是行的索引)以便获得某一行的数据。比如我们要获得第 5 行的数据: $row = $query->row(4);
row_array() 
功能与 row() 一样, 区别在于该函数返回的是一个数组。 

除此以外, 我们还可以使用下面的方法通过游标的方式获取记录: 
$row = $query->first_row() 
$row = $query->last_row() 
$row = $query->next_row() 
$row = $query->previous_row() 
默认情况下他们将返回一个 object,同时你也可以传递参数 "array" 以便使用 array 的方式获取数据 $row = $query->first_row('array') 
$row = $query->last_row('array') 
$row = $query->next_row('array') 
$row = $query->previous_row('array')

结果集辅助函数

$query->num_rows() 
该函数将会返回当前请求的行数。 

$query->num_fields() 
该函数返回当前请求的字段数(列数): 
$query->free_result() 

该函数将会释放当前查询所占用的内存并删除其关联的资源标识。

自动连接

"自动连接" 功能将在每个一页面加载时被自动实例化数据库类。要启用"自动连接",可在application/config/autoload.php中的 library 数组里添加 database: 
$autoload['libraries'] = array('database');

手动连接

如果仅仅是一部分页面要求数据库连接,你可以在你有需要的函数里手工添加如下代码或者在你的类里手工添加以供该类使用。 
$this->load->database();

连接多数据库

如果你需要同时连接多于一个的数据库,你可以用以下方式来实现: 
$DB1 = $this->load->database('group_one', TRUE); 
$DB2 = $this->load->database('group_two', TRUE);

表数据

$this->db->list_tables(); 
返回一个包含当前连接数据库中所有表名称的数组。 
$this->db->table_exists(); 
有时,在对某个表执行操作之前,使用该函数判断指定表是否存在很有用。返回一个布尔值。

数据库工具类

重要提示:  初始化数据库工具类之前,你的数据库驱动必须已经运行,因为工具类依赖于此。 

加载工具类: $this->load->dbutil() 
一旦初始化完毕,你可以通过 $this->dbutil 对象来访问成员函数: 
$this->dbutil->list_databases() 
$this->dbutil->database_exists(); 
$this->dbutil->xml_from_result($db_result) 
$this->dbutil->backup()

数据库缓存类激活缓存需要三步: 

1、在服务器上创建一个可写的目录以便保存缓存文件。 
2、在文件 application/config/database.php 中$db['xxxx']['cachedir']设置其目录。 
3、激活缓存特性,可以在文件 application/config/database.php 中设置全局选项$db['xxxx']['cache_on']='TRUE',也可以用以本页下面的方法手动设置。
一旦被激活,每一次含有数据库查询的页面被加载时缓存就会自动发生。

当有数据库更新,我们需要删除缓存文件 

$this->db->cache_delete() 

选择数据

$this->db->select();
允许你在SQL查询中写 SELECT 部分。
$this->db->where();
$this->db->or_where();
$this->db->where_in();
允许你在SQL查询中写 WHERE部分,其余各种where语句请看手册。
$this->db->get();
运行选择查询语句并且返回结果集。可以获取一个表的全部数据。
$this->db->like();
$this->db->or_like();
$this->db->not_like();
本函数允许你生成 LIKE 子句,在做查询时非常有用,其余语法请看手册。
$this->db->order_by();
帮助你设置一个 ORDER BY 子句。
$this->db->group_by();
允许你编写查询语句中的 GROUP BY 部分:
$this->db->distinct();
为查询语句添加 "DISTINCT" 关键字:
$this->db->having();
允许你为你的查询语句编写 HAVING 部分。
$this->db->limit();
限制查询所返回的结果数量:
$this->db->select_max();
为你的查询编写一个 "SELECT MAX(field)"。
$this->db->select_min();
为你的查询编写一个 "SELECT MIN(field)" 。
$this->db->select_avg();
为你的查询编写一个 "SELECT AVG(field)" 。
$this->db->select_sum();
为你的查询编写一个 "SELECT SUM(field)" 。
$this->db->join();
允许你编写查询中的JOIN部分。
$this->db->count_all_results();
允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。

插入数据

$this->db->insert();
生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 数组 或一个 对象。
$this->db->insert_batch();
一次插入多条数据,生成一条基于你所提供的数据的SQL插入字符串并执行查询。你可以向函数传递 数组 或一个 对象。
$this->db->set();
本函数使您能够设置inserts(插入)或updates(更新)值。它可以用来代替那种直接传递数组给插入和更新函数的方式。

更新数据

$this->db->update();

根据你提供的数据生成并执行一条update(更新)语句。你可以将一个数组或者对象传递给本函数。
$this->db->update_batch();

Generates an update string based on the data you supply, and runs the query. You can either pass an array or an object to the function. Here is an example using an array:

删除数据

$this->db->delete();
生成并执行一条DELETE(删除)语句。
$this->db->empty_table();
生成并执行一条DELETE(删除)语句。
$this->db->truncate();
生成并执行一条TRUNCATE(截断)语句。

链式方法

链式方法允许你以连接多个函数的方式简化你的语法。考虑一下这个范例:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20); 
$query = $this->db->get(); 

说明: 链式方法只能在PHP 5下面运行。

查询

$this->db->query(); 

要提交一个查询,用以下函数: 
$this->db->query('YOUR QUERY HERE'); 

query() 
函数以object(对象)的形式返回一个数据库结果集。 当使用 "read" 模式来运行查询时, 你可以使用"显示你的结果集"来显示查询结果; 当使用 "write" 模式来运行查询时, 将会仅根据执行的成功或失败来返回 TRUE 或 FALSE. 

转义查询

$this->db->escape()

这个函数将会确定数据类型,以便仅对字符串类型数据进行转义。并且,它也会自动把数据用单引号括起来,所以你不必手动添加单引号,用法如下:  $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";

查询辅助函数

$this->db->insert_id()
这个ID号是执行数据插入时的ID。  

$this->db->affected_rows() 
当执行写入操作(insert,update等)的查询后,显示被影响的行数。 
$this->db->count_all(); 
计算出指定表的总行数并返回。在第一个参数中写入被提交的表名。

生成查询记录集

result() 
该方法执行成功返回一个object 数组,失败则返回一个空数组。 

result_array() 
该方法执行成功时将记录集作为关联数组返回。失败时返回空数组。 
row() 
该函数将当前请求的第一行数据作为 object 返回。你可以传递参数(参数是行的索引)以便获得某一行的数据。比如我们要获得第 5 行的数据: $row = $query->row(4);
row_array() 
功能与 row() 一样, 区别在于该函数返回的是一个数组。 

除此以外, 我们还可以使用下面的方法通过游标的方式获取记录: 
$row = $query->first_row() 
$row = $query->last_row() 
$row = $query->next_row() 
$row = $query->previous_row() 
默认情况下他们将返回一个 object,同时你也可以传递参数 "array" 以便使用 array 的方式获取数据 $row = $query->first_row('array') 
$row = $query->last_row('array') 
$row = $query->next_row('array') 
$row = $query->previous_row('array')

结果集辅助函数

$query->num_rows() 

该函数将会返回当前请求的行数。 
$query->num_fields() 
该函数返回当前请求的字段数(列数): 
$query->free_result() 
该函数将会释放当前查询所占用的内存并删除其关联的资源标识。

自动连接

"自动连接" 功能将在每个一页面加载时被自动实例化数据库类。要启用"自动连接",可在application/config/autoload.php中的 library 数组里添加 database: 

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

手动连接

如果仅仅是一部分页面要求数据库连接,你可以在你有需要的函数里手工添加如下代码或者在你的类里手工添加以供该类使用。 
$this->load->database();

连接多数据库

如果你需要同时连接多于一个的数据库,你可以用以下方式来实现: 
$DB1 = $this->load->database('group_one', TRUE); 
$DB2 = $this->load->database('group_two', TRUE);

表数据

$this->db->list_tables(); 
返回一个包含当前连接数据库中所有表名称的数组。 
$this->db->table_exists(); 
有时,在对某个表执行操作之前,使用该函数判断指定表是否存在很有用。返回一个布尔值。

数据库工具类

重要提示:  初始化数据库工具类之前,你的数据库驱动必须已经运行,因为工具类依赖于此。 

加载工具类: $this->load->dbutil() 
一旦初始化完毕,你可以通过 $this->dbutil 对象来访问成员函数: 
$this->dbutil->list_databases() 
$this->dbutil->database_exists(); 
$this->dbutil->xml_from_result($db_result) 
$this->dbutil->backup()

数据库缓存类

激活缓存需要三步: 

1、在服务器上创建一个可写的目录以便保存缓存文件。 
2、在文件 application/config/database.php 中$db['xxxx']['cachedir']设置其目录。 
3、激活缓存特性,可以在文件 application/config/database.php 中设置全局选项$db['xxxx']['cache_on']='TRUE',也可以用以本页下面的方法手动设置。
一旦被激活,每一次含有数据库查询的页面被加载时缓存就会自动发生。

当有数据库更新,我们需要删除缓存文件 

$this->db->cache_delete() 
删除缓存文件与特定网页。如果你需要清除缓存后,更新您的数据库 
$this->db->cache_delete('/blog', 'comments'); 
注意,手册上写的是 $this->db->cache_delete('blog', 'comments');但根据实际测试应该在控制器名字前加斜杠'/'才能正确执行。 
$this->db->cache_delete_all() 
清除所有所有的缓存文件。

数据库维护类

注意:  欲初始化数据库维护类,请确保你的数据库驱动已经运行,因为该类依赖于数据库驱动。 
使用如下方法载入数据库维护类: 
$this->load->dbforge() 
一旦初始化,就可以使用$this->dbforge 对象访问类中函数: 
$this->dbforge->create_database('db_name') 
允许你创建由第一个参数指定的数据库。 
$this->dbforge->drop_database('db_name') 
允许你删除由第一个参数指定的数据库。 
$this->dbforge->create_table('table_name'); 
声明了字段和键之后,你就可以创建一个表。  删除缓存文件与特定网页。如果你需要清除缓存后,更新您的数据库 
$this->db->cache_delete('/blog', 'comments'); 
注意,手册上写的是 $this->db->cache_delete('blog', 'comments');但根据实际测试应该在控制器名字前加斜杠'/'才能正确执行。 
$this->db->cache_delete_all() 
清除所有所有的缓存文件。

数据库维护类

注意:  欲初始化数据库维护类,请确保你的数据库驱动已经运行,因为该类依赖于数据库驱动。 
使用如下方法载入数据库维护类: 
$this->load->dbforge() 
一旦初始化,就可以使用$this->dbforge 对象访问类中函数: 
$this->dbforge->create_database('db_name') 
允许你创建由第一个参数指定的数据库。 
$this->dbforge->drop_database('db_name') 
允许你删除由第一个参数指定的数据库。 
$this->dbforge->create_table('table_name'); 
声明了字段和键之后,你就可以创建一个表。  

CI开启url后缀实现伪静态时分页类页码url出错的解决方法

在 application/config/config.php 中添加url后缀 $config['url_suffix'] = '.html' 实现伪静态后,调用CI的分页类 pagination时,.html加在了页码前面的解决方法:

把分页类配置项 $config['base_url']=site_url('article/list/....') 改为 $config['base_url']=site_url().'/article/list',同时开启分页类的后缀配置 $config['suffix'] = '.html' 即可

我的代码片段:

//分页链接未定义时自动获取
if(! array_key_exists('base_url', $config)){
	if($CI->uri->total_segments() == 1){ //只有一个段时使用默认方法 index
		$config['base_url'] = site_url().'/'.$CI->uri->slash_segment(1).'index';
	}else{ //多个段时删除页码相关段
		$arr = $CI->uri->uri_to_assoc();
		unset($arr['page']);
		$config['base_url'] = site_url().'/'.$CI->uri->slash_segment(1).$CI->uri->slash_segment(2).$CI->uri->assoc_to_uri($arr);
	}
}

CodeIgniter命名规则

1、类文件的命名必须以大写字母开头,其他文件(配置文件,视图,一般的脚本文件等)的命名是全小写。类文件的名称必须和类的名称保持一致,例如,如果你有一个类名为 Myclass , 那么文件名应该是 Myclass.php 。

2、类名(core、libraries、helpers)必须以大写字母开头,多个单词之间使用下划线分割,不要使用驼峰命名法。

3、扩展类需要加前缀MY_(可以在application/config/config.php中自定义$config['subclass_prefix']),类名首字母大写,如扩展核心类CI_Controller:
class MY_Controller extends CI_Controller{}

4、类的方法应该使用全小写,并且应该明确指出该方法的功能,最好包含一个动词。 避免使用冗长的名称,多个单词之间使用下划线分割。

5、辅助函数的文件名全小写,但扩展CI自带的辅助函数需要加config中自定义的前缀MY_。如扩展array_helper.php的文件名应该为 MY_array_helper.php

6、变量的命名规则和类方法的命名规则非常接近,使用全小写,使用下划线分割, 并且应该明确指出该变量的用途。非常短的无意义的变量只应该在 for 循环中作为迭代器使用。

7、控制器放在子目录中,如 application/controllers/Product/Tv.php 中方法 detail() ,访问地址为: index.php/Product/tv/detail 子目录名大小写必须与实际一致(windows系统可不区分)

http://codeigniter.org.cn/user_guide/general/styleguide.html

2024-04-29 星期一 农历三月二十一