CI页面乱码

今天项目页面乱码

我确认了数据库读取时utf8,页面也添加

<meta http-equiv=”content-type” content=”text/html; charset=UTF-8″ />

再确定程序页面编码同样是utf-8!!!!!!可以页面依旧乱码。~~~

其实我看服务器的response

Content-Type:text/html; charset=gb2312

我看到了不想看的内容!!!!!

忽然想起ci的output类找代码看看set_content_type和set_header

我在我控制集成的父类添加了

$this->output->set_header(“Content-Type: text/html; charset=utf-8”);

这样就解决了问题!

CI基础知识二

1.日历类
$this->load->library(‘calendar’);
echo $this->calendar->generate();//根据服务器时间创建一个当前年月的日历
echo $this->calendar->generate(2006, 6);//创建2006年6月日历
$data = array(
3 => ‘http://blog.phpfs.com/’,
7 => ‘http://blog.phpfs.com/’,
13 => ‘http://blog.phpfs.com/’,
26 => ‘http://blog.phpfs.com/’
);

echo $this->calendar->generate(2006, 6, $data);

2.购物车类
$this->load->library(‘cart’);
//这个依赖session需要配置以下内容(将session保存到数据库并加密)
$config[‘encryption_key’] = ‘Joyous’;//加密用
$config[‘sess_cookie_name’] = ‘ci_session’;
$config[‘sess_expiration’] = 7200;
$config[‘sess_expire_on_close’] = FALSE;
$config[‘sess_encrypt_cookie’] = true;
$config[‘sess_use_database’] = TRUE;
$config[‘sess_table_name’] = ‘ci_sessions’;
$config[‘sess_match_ip’] = FALSE;
$config[‘sess_match_useragent’] = TRUE;
$config[‘sess_time_to_update’] = 300;//5分钟更新一次

购车使用参考:http://codeigniter.org.cn/user_guide/libraries/cart.html

3.配置类
主要配置文件application/config/config.php,这个已经自动加载
手动加载配置文件
$this->config->load(‘filename’);//注意没有.php的扩展名
获取配置元素
$this->config->item(‘item_name’);//这个是配置中的索引
动态设置配置元素
$this->config->set_item(‘item_name’, ‘item_value’);
//这里仅仅更改了当前获取的元素而不会更改配置当中的

不同环境加载不同配置文件
比如当前是production环境,那么可以在config文件夹下添加production文件夹放入文件,那么会优先加载

$this->config->site_url();这个会带上$config[‘index_page’]的值
$this->config->base_url();站点根目录

4.安全
$this->input->post();//类似$_POST
$this->input->cookie();//类似$_COOKIE
$this->input->server();//类似$_SERVER
$this->input->post(‘some_data’, TRUE);//可以取得的数据经过跨站脚本过滤

5.输出类
$this->output->set_output();重要:使用这个方法有一点很重要,就要将它放在最后一句
$this->output->set_header();设置发送到浏览器http协议的标头

6.分页类
$this->load->library(‘pagination’);
$config[‘base_url’] = ‘http://blog.phpfs.com/archives/category/php’;
$config[‘total_rows’] = 200;//数据总数
$config[‘per_page’] = 20; //每页数据量
$this->pagination->initialize($config);
echo $this->pagination->create_links();
可以将配置文件写入到pagination.php配置文件中
配置参考http://codeigniter.org.cn/user_guide/libraries/pagination.html

7.XSS过滤
$data = $this->security->xss_clean($data);
如果希望能自动过滤所有访问的数据
可以配置$config[‘global_xss_filtering’] = TRUE;
$config[‘csrf_protection’] = TRUE;启用跨站请求伪造

8.Session
$this->load->library(‘session);
获取一项$this->session->userdata(‘item’);
添加session信息
$this->session->set_userdata($array);//参数为数组,由于cookie只能存放4k的数据
//所有 存放信息要注意大小
获取所有session
$this->session->all_userdata();
删除数据
$this->session->unset_userdata(‘item_name’);
将session保存在数据库中可以参考http://codeigniter.org.cn/user_guide/libraries/sessions.html
销毁session $this->session->sess_destroy();

9.数组辅助函数
$this->load->helper(‘array’);
element();//可以获取索引元素而不需要判断是否含有
random_element();//随机返回数组内一个元素

10.表单辅助函数
$this->load->helper(‘form’);
echo form_open(’email/send’);
输出<form method=”post” accept-charset=”utf-8″ action=”http://localhost/email/send” />
第二个参数可以添加一些属性
$attributes = array(‘class’ => ’email’, ‘id’ => ‘myform’);
echo form_open(’email/send’, $attributes);
$hidden = array(‘username’ => ‘Joe’, ‘member_id’ => ‘234’);
echo form_open(’email/send’, ”, $hidden);
第三个参数可以添加一些隐藏域
更多参考:http://codeigniter.org.cn/user_guide/helpers/form_helper.html

11.html辅助函数
link_tag()
echo link_tag(‘css/mystyles.css’);
//生成 <link href=”http://site.com/css/mystyles.css” rel=”stylesheet” type=”text/css” />

12.字符串辅助函数
$this->load->helper(‘string’);
random_string()根据你所指定的类型和长度产生一个随机字符串。可用于生成密码串或随机字串。
第一个参数指定字符串类型,第二个参数指定其长度。以下为可选字符串类型:
alpha, alunum, numeric, nozero, unique, md5, encrypt 和 sha1
trim_slashes()去掉任何出现在字符串开头或结尾的斜线
reduce_multiples()去掉多余的一个紧接着一个重复出现的特殊字符
strip_quotes()去掉字符串中的单引号和双引号
quotes_to_entities()将字符串中的单引号和双引号转换为相应的 HTML 字符表示

13.文本辅助函数
highlight_code()对一段代码着色
highlight_phrase()对字符串的一个短语进行突出显示

14URL辅助函数
$this->load->helper(‘url’);
site_url()站点的URL
base_url()返回config设定的base_url
current_url()返回当前正在查看的页面的完整URL
uri_string()返回任何包含了函数的页面URI(域名之后的部分)
anchor()创建基于站点的URL的标准链接地址
第一个参数包含你想附加到URL的任何段.像上面的site_url() 函数一样,段可以是字符串或数组.
注意: 如果你创建在应用程序内部的链接没有包含基本URL(http://…),这个参数会从你配置文件信息中自动加载。
只需要写上你的 URL 分段即可。
第二个参数是你想给链接的内容(<a>标签中间的内容).如果让它为空,将会由URL替代.
第三个参数包含一组你想附加给链接的属性.这些属性可以是简单的字符串或相关的数组
prep_url()可以在url中么有http://的情况下添加上
redirect();//通过发送http头命令客户端转向指定的URL,第二个参数是location或者refresh,第三个参数是http状态码

 

CI基础知识笔记

1.知识点
$config[‘url_suffix’] = ”;//url后缀
$config[‘enable_query_strings’] = FALSE;
$config[‘controller_trigger’] = ‘c’;//类似Thinkphp当中的m,可以传递c=news控制器名
$config[‘function_trigger’] = ‘m’;//类似Thinkphp当中的a,可以传递a=index方法名
$config[‘directory_trigger’] = ‘d’; //一些控制器在controllers目录下的子目录当中需要使用

2.获取交互数据$this->input->post(‘title’);等同于$_POST[‘title’]

3.使用CI类库
//引入表单验证器
$this->load->library(‘form_validation’);//载入多个可以传递数组形式传递
//set_rules() 方法包含三个参数,第一个是输入域的名称,第二个是错误信息的名称,第三个是错误信息的规则
$this->form_validation->set_rules(‘text’, ‘text’, ‘required’);
//执行验证,返回boolean值
$this->form_validation->run();
其中载入类库第二个参数可以传递数组到类的构造函数中(这样类的构造函数必须带有参数)
在自定义的类库中初始化CI资源可以使用$CI=&get_instance();这样就可以$CI->load->helper(‘url’);等等操作
扩展现有类可以参考扩展辅助函数

4.载入视图
$this->load->view(‘name’);//可以载入views目录下后缀是.php的视图文件,一个控制器可以载入多个视图
$this->load->view(‘folder/name’);//载入views目录下的folder目录下的视图
$this->load->view(‘name’, $data);//其中$data可以是数组或者对象(类变量转换成数组元素)
$content = $this->load->view(‘name’, $data, true);//这样视图内容就作为字符串返回

5.载入模型
$this->load->model(‘Model_name’);如果在子目录下载入参考视图载入形式
$this->load->model(‘model_name’, ‘my_model’);//第二个参数是对象名
载入的模型不会自动连接数据库,如果需要自动连接可以将第三个参数设置成true,或者传入$config数据库配置
可以配置autoload.php自动加载模型(不建议使用)

6.辅助函数
一般保存在system/helpers或者application/helpers下,一旦使用$this->load->helper(‘name’);载入那么在视图和控制器当中都可以使用
可以是载入多个辅助函数$this->load->helper(array(‘help1′,’help2′,’help3’));一定要在使用前加载
可以配置autoload.php自动加载辅助函数
扩展辅助函数,可以在定义文件$config[‘subclass_prefix’] = ‘MY_’;那么扩展a_helper.php那么就可以使用MY_a_helper.php进行重写

7.适配器
适配器是特殊的类库,存放在system/libraries目录下,命名一个和类名相同的文件夹,文件夹下存放该类,
该文件夹下的子文件夹drivers包含了所有子类,那么可以使用$this->load->driver(‘class_name’);

8.系统核心类
CI启动调用Benchmark,Config,Controller,Exceptions,Hooks,Input,Language,Loader,Log,Output,Router,URI,Utf8
可以将自己写的核心类放在/application/core/Input.php,类名字必须是CI_Input

9.钩子
9.1启用钩子可以修改config,$config[‘enable_hooks’] = TRUE;
定义钩子在config/hooks.php文件中定义例如
$hook[‘pre_controller’] = array(
‘class’ => ‘MyClass’,//如果只是过程函数,这个可以用空
‘function’=>’function’,//函数名
‘filepath’=>’hooks’,//文件存放路径
‘params’=>array(‘filter’,’input’));//参数
如果同一挂钩点有多次引用,可以将挂钩点定义成二位数组即可
9.2挂钩点列表以及说明:
pre_system系统执行的早起调用,仅仅在benchmark和hooks类加载完毕的时候,没有执行路由或者其他过程
pre_controller调用你的任何控制器之前调用,此时所用的基础类路由选择和安全性检查都已经完成
post_controller_constructor在控制器实例化之后任何方法调用之前调用
post_controller控制器完全运行之后
display_override在系统执行末尾向web浏览器发送最终页面
cache_override取代output类中的_display_cache函数
post_system最终渲染页面发送到浏览器之后,浏览器接受完最终数据的系统执行末尾调用

10.公共函数
ci使用了一些全局定义的函数,在任何情况下都可以使用
is_php(‘5.2.0’);判断使用的php是否高于5.2.0
is_really_writeable(‘path/to/file’);判断文件是否有写入权限,一般在windows平台才用
set_status_header(code,’text’);手动设置服务器状态头
remove_invisible_characters();//防止在ascii字符之间插入空字符
html_escape();可以防止跨站脚本攻击

11.URI路由
可以定义自己的路由规则,其中可以使用通配符或者正则表达式
11.1通配符
$route[‘product/(:num)’]=’product/show’;
这样可以匹配product是第一个部分,数字是第二部的url都可以定义到product控制器的show方法中
:num表示一个只包含数字
:any表示任何字符,可以匹配多个值,eg:$route[‘product/(:any)’]=’product/list/$1/$2/$3′;
11.2正则路由
$route[‘products/([a-z]+)/(\d+)’] = “$1/id_$2″;
上例中, 类似于 products/shirts/123 的URI 将换成调用 shirts 控制器类的 id_123 方法.

第一个为系统默认的路由$route[‘default_controller’] = ‘welcome’;
第二个为404页面的路由$route[‘404_override’] = ”;
这个路由标识了如果请求的控制器无法访问的时候将加载哪个控制器。
它相当于覆盖了默认的404错误页面(即提供了自己定义404页面的功能)。
但它不会影响show_404()这个方法,这个方法依然会加载默认的位于application/errors/error_404.php的error_404.php页面。

12.错误处理
show_error(‘消息’ [, int $status_code = 500 ] [, string $heading = ‘An Error Was Encountered’])
这个函数将会使用以下错误模版来显示错误消息:
application/errors/error_general.php
可选参数 $status_code 决定在显示错误的同时将会发送哪种 HTTP 状态代码。
可选参数 $heading 决定错误模版h1标签内容。
更多参考:http://codeigniter.org.cn/user_guide/general/errors.html

13.启动缓存
$this->output->cache(n);//其中n是分钟,可以使用1/60表示精确到1s
由于CI存储缓存文件的方式,只有通过 view 文件的输出才能被缓存
在缓存文件产生之前,请确保 application/cache 文件夹可写

14调试程序
激活分析器$this->output->enable_profiler(TRUE);
关闭分析器$this->output->enable_profiler(FALSE);
其中可以在配置文件profiler.php配置启用和禁用的变量,或者使用
$sections = array(
‘config’ => TRUE,
‘queries’ => TRUE
);
$this->output->set_profiler_sections($sections);

注意点:
1.类名的首字母应该大写。如果名称由多个词组成,词之间要用下划线分隔,不要使用骆驼命名法。
类中所有其他方法的名称应该完全小写并且名称能明确指明这个函数的用途,最好用动词开头
2.如果你要使用某个子文件夹下的功能,就要保证 URI 的第一个片段是用于描述这个文件夹的
3.如果要在你的任意控制器中使用构造函数的话,那么必须在里面加入下面这行代码parent::__construct();
4.控制器保留字Controller,CI_Base,_ci_initialize,Default,index
5.函数保留字is_really_writeable(),load_class(),get_config(),config_item(),show_error(),show_404(),log_message(),_exception_handler(),get_instance()
6.变量保留字$config,$mimes,$lang
7.常量ENVIRONMENT,EXT,FCPATH,SELF,BASEPATH,APPPATH,CI_VERSION,FILE_READ_MODE,FILE_WRITE_MODE,DIR_READ_MODE,FOPEN_READ_WRITE等等
8.载入多个视图,只需要在第一个视图传入数据就可以
9.辅助函数中的函数名最好做好命名规范,如果同时加载多个辅助函数文件,且其中有名称相同的函数,会导致 CI 出现空白页问题(也就是 PHP 语法错误)。
10. 对象的实例名永远都是小写的
11.编写路由规则的时候不要在前面或后面加”/