CI手册观后总结
  87NHThsqHimc 2023年11月02日 64 0


CodeIgniter框架 CI手册观后总结

1.view函数

第三个可选参数可以改变函数的行为,让数据作为字符串返回而不是发送到浏览器。如果想用其它方式对数据进一步处理,这样做很有用。如果将view第三个参数设置为true(布尔)则函数返回数据。view函数缺省行为是 false, 将数据发送到浏览器。如果想返回数据,记得将它赋到一个变量中:

$buffer = $this->load->view('myview', $data, true);    //自我理解就是file_get_content('myview')


2.模型model

当一个模型被载入时,它并不会自动连接数据库。可以把第三个参数设置为TRUE来使模型装载函数自动连接数据库,连接配置可以在您的数据库配置文件中可以定义:

您可以手动设定第三个参数来载入您的自定义数据库配置:

$this->load->model('Model_name', 'model_rename', TRUE);


$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$this->load->model('Model_name', '', $config);

3.加载配置文件

Note:CodeIgniter 会自动加载主要的配置文件(application/config/config.php), 所以你只需要加载你自己创建的配置文件


有两种方法来加载配置文件:


手动加载


为了加载一个你自定义的配置文件,你需要在 controller中这样做:


$this->config->load('filename');


这里的 filename是你自定义的配置文件的文件名,这个文件名没有 .php 的扩展名.


如果你需要加载多个自定义配置文件,一般情况下它们会被合并成一个数组。然而,如果在不同的配置文件中存在同名的索引,那么会发生冲突。为了避免这个问题,你可以把第二个参数设置为 TRUE,这可以使每个配置文件的内容存储在一个单独的数组中,数组的索引就是配置文件的文件名。请看下面的例子:


$this->config->load('blog_settings', TRUE);  // 用这样的方式保存为一个数组:  $this->config['blog_settings'] = $config

请阅读下面名为 获取配置元素的部分以了解在这样的方式下如何取得配置信息


第三个参数允许屏蔽当配置文件不存在时产生的错误信息:


$this->config->load('blog_settings', FALSE, TRUE);


自动加载


如果你需要一个特定配置文件在全局范围内都能使用,你可以使系统自动加载它。要自动加载配置,请打开文件 autoload.php,它在 application/config/autoload.php,然后按照文件中的提示增加你想要自动加载的配置文件。



获取配置元素


从配置文件中检索元素,使用下面的函数:


$this->config->item('item name');


其中 item name是 $config 数组中你期望检索的索引. 例如,要获得您选择的语言,你可以这样做:


$lang = $this->config->item('language');


4.错误处理

show_error('消息'[,int $status_code=500][,string $heading='An error was encountered'])


这个函数将会使用以下错误模版来显示错误消息:


application/errors/error_general.php


可选参数 $status_code 决定在显示错误的同时将会发送哪种 HTTP 状态代码。


可选参数 $heading 决定错误模版h1标签内容。



show_404('页面' [, 'log_error'])


这个函数将会使用以下错误模版来显示 404 错误信息:


application/errors/error_404.php


传递给该函数的字符串代表的是找不到的文件路径。注意CodeIgniter会在找不到目标控制器情况下,自动显示404消息。


CodeIgniter自动记录任何 show_404() 函数调用。设置第二个可选的参数为FALSE将跳过记录



log_message('级别', '消息')


这个函数可以让你将消息写入记录文件中。你必须在第一个参数中选择三个“级别“中的任何一个, 指明它是那一类消息(调试 debug, 错误 error, 信息info)。 第二个参数是消息本身。  例如:


有三种不同类型的消息:

if ($some_var == "") 

 { 

     log_message('error', 'Some variable did not contain a value.'); 

 } 

 else 

 { 

     log_message('debug', 'Some variable was correctly set'); 

 } 


 log_message('info', 'The purpose of some variable is to provide some value.');


错误类型的消息。  这种是真正的错误消息. 例如PHP错误或者用户错误。


调试类型的消息。  这种是用来帮助调试的消息。 例如, 如果当一个类被初始化时,你可以将这个初始化纪录下来,然后用于调试。


信息类型的消息。  这种是最低优先级别的消息,它只是简单的提供了关于运行的一些信息。 CodeIgniter 不会自动产生任何信息类型的消息,但是你可能会在你的程序里使用它



注意:  确保"logs" 文件夹是可写的,才能准确地将消息写入记录文件中。$config ['log_path'] = APPPATH.'logs/';  此外, 你必须设置application/config/config.php文件中的"threshold"设定,通过设置“threshold“,你可以只记录错误类型的消息,而不用记录其他两种。如果你将“threshold“设为0,记录就会被禁止。


$config['log_threshold'] =0(默认为0)


启用错误日志,设置记录哪些类型的错误。


0 = 关闭错误日志记录


1 = 记录错误信息


2 = 记录调试信息


3 = 记录通知信息


4 = 记录所有信息


$config['log_path'] = ''


如果您不想使用默认的错误日志记录目录配置(system/logs/),可以设置完整的服务器目录。


5.网页缓存


缓存是怎么工作的?


CI支持每个页面单独缓存,而且可以设置缓存更新时间。当一个网页第一次被加载的时候,缓存文件将被保存到application/cache文件夹。 下次访问的时候,系统就会直接读取缓存文件,然后返回给用户的浏览器。如果缓存文件过期,它将被删除并重新生成。


注意:Benchmark 标签在使用了缓存的页面仍然可用。



启动缓存


启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内:



$this->output->cache(n);



其中 n是你希望缓存更新的 分钟数。可以使用 m/60 来精确到秒,例如 1/60 ,则是精确到  1秒


上面的代码可以放到任何一个 function 里面。他的出现顺序对缓存并没有影响,所以将它放在你认为最合乎逻辑的地方。一旦上面的代码放到了控制器的方法中,页面就会被缓存。



警告:由于CI存储缓存文件的方式,只有通过view文件的输出才能被缓存。


注意:在缓存文件产生之前,请确保 application/cache文件夹可写。



清除缓存


如果你不再想使用缓存,仅需将上面的代码从你的controller里面删除即可。注意: 这样做并不能让缓存文件立即消失,它将会自动过期并被删除。如果你想立即删除那些文件,就必须自己动手了。


6.数据库缓存

数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问。


激活缓存需要三步:


在服务器上创建一个可写的目录以便保存缓存文件。


在文件 application/config/database.php 中设置其目录。 $db ['default'] ['cachedir'] = APPPATH.'cache/';


激活缓存特性,可以在文件 application/config/database.php 中设置全局选项,( $db ['default'] ['cache_on'] = true;  //打开数据库缓存 )也可以用以本页下面的方法手动设置。


一旦被激活,每一次含有数据库查询的页面被加载时缓存就会自动发生。


当页面被浏览时CodeIgniter的查询缓存系统能够动态执行。如果缓存特性被激活,那么在此页面首次被加载时,数据库查询的结果对象将会被序 列化并保存在你服务器的文本文件中。而页面再次被加载时缓存文件将会替代数据库查询。如此,在被缓存的页面中,你的数据库使用率会降至0。


只有 读类型(read-type) (SELECT) 查询会被缓存,因为只有这种查询会产生结果集。 写类型(Write-type) (INSERT, UPDATE, 等等) 查询,因为不会产生结果集,故缓存系统不对之进行缓存。


缓存文件不会过期,除非你删掉,否则任何被缓存了的查询会一直存在。缓存系统允许你按页面清除,或把所有缓存都清除掉。一般来说,你可以在某些事件(比如向数据库添加了数据)发生时用下面的函数来清除缓存。



CI把每次查询的结果放置在自己的缓存文件里。根据你的控制器函数,缓存文件集将被进一步组织到子目录中。准确的话,子目录的名称由你的URI的前 两段(控件器类名和函数名)决定。例如,假设你有一个控制器blog和一个comments函数,这个函数包括三个查询。缓存系统将创建一个叫做 blog+comments的目录并在这个目录里创建三个缓存文件。当你根据URI上的信息动态查询时(例如使用分页),每次查询的实例将创建自己的缓存 文件。因此,经过很多次查询后,缓存文件的个数可能比你查询的次数还多。


由于缓存文件不会过期,您需要在您的应用程序中写入删除缓存操作的代码。例如,假设您有一个博客,让用户发表评论。每当有新的评论被提交您一定希望在某个控制器的方法中删除缓存文件与控制器的功能。你会发现如下两个删除功能的介绍,可以帮助您清除数据。


可手动设置缓存开关。如果您想保留某些查询不被缓存 这个功能就十分有用。例如:

// 打开缓存开关 

 $this->db->cache_on(); 

 $query= $this->db->query("SELECT * FROM mytable"); 

 // 使下面这条查询不被缓存 

 $this->db->cache_off(); 

 $query= $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'"); 

 // Turn caching back on 

 $this->db->cache_on(); 

 $query= $this->db->query("SELECT * FROM another_table");


删除缓存文件与特定网页


$this->db->cache_delete('blog', 'comments');


我在实际测试的时候不起作用,不知道为什么原因,不知道是不是小bug?但是下面 的$this->db->cache_delete_all()是可以的,没有问题.



如果您不使用任何参数,目前的URI设置将决定什么时候应该清除/更新 该缓存。


清除所有所有的缓存文件。


7.转义查询

$this->db->cache_delete_all(); 


 $this->uri->uri_string( );  //获取当前的controller/function路径,如index/about_profiller(本次请求的URI)

将数据转义以后提交到你的数据库是非常好的安全做法,CodeIgniter 提供了 3 个函数帮助你完成这个工作。

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

 $this->db->escape_str()此函数将忽略数据类型对传入数据进行转义。更多时候你将使用上面的函数而不是这个。这个函数的使用方法是: $sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')"; 

 $this->db->escape_like_str()This method  should be used when strings are to be used in LIKE conditions so that  LIKE wildcards ('%', '_') in the string are also properly escaped. $search = '20% raise'; 

 $sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";

封装查询


封装,通过让系统为你组装各个查询语句,能够简化你的查询语法。参加下面的范例:


$sql = "SELECT * FROM some_table WHERE id = ?AND status = ?AND author = ?"; 


 $this->db->query($sql, array(3, 'live', 'Rick'));


查询语句中的问号会自动被查询函数中位于第二个参数位置的数组中的值所替代。


使用封装查询的第二个好处是所有的值都会被自动转义,形成了较为安全的查询语句。你无需手动地去转义这些数据;控制器将会自动为你进行。


8.安全类

http://codeigniter.org.cn/user_guide/libraries/security.html

9.session类

  初始化 Session: $this->load->library('session');


  Sessions 是怎样工作的?


当页面载入后,session类就会检查用户的cookie中是否存在有效的session数据。如果session数据不存在(或者已经过期),那么就会创建一个新的session并把他保存在cookie中。如果session数据存在,那么他的信息就会被更新,同时cookie也会被同时更新。每次 更新都会重新生成session_id的值。


  Session 数据是什么?


一个 session是由一个包括下列信息的数组组成的:


唯一的用户Session ID (这是一个平均信息量统计出来的非常坚固的随机字符串,使用MD5加密,默认是每五分钟就重新生成一次。


用户的 IP 地址


用户浏览器信息(取前120个字符)


最新的一个活跃时间戳.


以上数据将会用以下数组格式序列化并存到cookie里:


如果你将加密设置开启,serialized 的数组会先被加密,然后存入cookie中。这会让数据不容易被看到和修改,从而提高安全性。

[array] 

 ( 

      'session_id'    => random hash, 

      'ip_address'    => 'string - user IP address', 

      'user_agent'    => 'string - user agent data', 

      'last_activity' => timestamp 

 )


注意: 默认情况下, Session Cookie 每隔 5 分钟才会更新一次,这样会减少对处理器的负荷。如果你重复的装载页面,  你会发现"上次活动"的时间在五分钟,或多余五分钟的时候才会变化,也就是 cookie 上次被写入的时间。 这个时间可以通过设置  application/config/config.php 文件里的 $config['sess_time_to_update'] 行来改变。


取得 Session 数据


$session_id = $this->session->userdata('session_id');



实例:


/**
 * session类
 * 输出
 * array(8) { ["session_id"]=> string(32) "64f30859779453c2b58443d1445f524a" ["ip_address"]=> string(9) "127.0.0.1" ["user_agent"]=> string(72) "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0" ["last_activity"]=> int(1356664600) ["user_data"]=> string(0) "" ["username"]=> string(5) "johny" ["email"]=> string(13) "johny@163.com" ["logged_in"]=> bool(true) }
 * 64f30859779453c2b58443d1445f524a
 */
function about_session(){
	$data = array(
		'username' => 'johny',
		'email' => 'johny@163.com',
		'logged_in' =>true
	);
	$this->session->set_userdata($data);
	var_dump($this->session->all_userdata());
	echo "<br>";
	$session_id = $this->session->userdata('session_id');
	echo $session_id;
}
删除 Session 数据


$this->session->unset_userdata('some_name');


也可以给这个函数传一个要删除项的关联数组。


$array_items = array('username' => '', 'email' => '');



$this->session->unset_userdata($array_items);


闪出数据


CodeIgniter 支持 "闪出数据", 或者说Session数据只对下次服务器请求可用, 然后会自动清除。这应该会非常有用,往往应用在信息或状态提示中(例如:“记录2已删除”)。


注意: 闪出数据变量名以“flash_”开头,所以在你自己的变量名中要避免使用这个前缀。


要添加闪出数据:


$this->session->set_flashdata('item', 'value');


你也可以使用和 set_userdata() 同样的方式向 set_flashdata() 传递一个数组。


要读取一个闪出数据变量:


$this->session->flashdata('item');


如果你发现你需要在一个附加的请求中保留一个闪出数据,你可以使用 keep_flashdata() 这个函数。


$this->session->keep_flashdata('item');



将 Session 数据存入数据库


由于Session数据数组是附带一个Session  ID保存在用户cookie里的,你无法验证它,除非你把session数据存储在数据库中。在一些不需要或很少需要安全保护的应用中,session  ID 或许并不需要。但如果你的应用需要安全保护,验证是必须的。Otherwise, an old session could be  restored by a user modifying their  cookies.


当session 数据在数据库中可用时,每当从用户cookie中发现一个有效的session,一个数据库查询就会被执行以匹配它。如果  session ID 不相配,session 就会被销毁。Session ID永远不会更新,它们只会在一个新的会话创建时生成。


为了存储session,你必须先创建一个数据表。这是 session 类所需的基本结构(用于MySQL的):


注意:默认情况下这个表叫做 ci_sessions, 但是你可以给它指定任意名字,只要你更新了 application/config/config.php文件以确保它包含了你所起的名字。一旦你创建了数据表,你就可以像下面这样在config.php文件中启用数据库选项:


$config['sess_use_database'] = TRUE;


一旦启用了,Session类就会在数据库中存储session数据。


同时确保你已经在配置文件中指定了数据表名:


$config['sess_table_name'] = 'ci_sessions';


注意:Session类已经内置了清除过期session的垃圾回收机制,因此你不需要编写你自己的事务来做这个。


销毁 Session 


要清除当前 session: 


$this->session->sess_destroy();


注意:此函数应该是最后被调用的。即使闪出变量已不再有效。如果你只想让某几项而不是所有项被销毁,请使用 unset_userdata().


Session 的参数


你可以在application/config/config.php文件中找到以下的 Session 相关的参数:


参数默认选项描述sess_cookie_nameci_session无你想要保存 Session Cookie 的名字。sess_expiration7200无session 持续的秒数。默认是2个小时(7200秒)。如果将这个数值设为: 0,就可以得到 永久 session。sess_expire_on_closeFALSETRUE/FALSE (boolean)这个选项决定当浏览器窗口关闭时是否自动使session过期。sess_encrypt_cookieFALSETRUE/FALSE (布尔值boolean)是否对 session 数据加密.sess_use_databaseFALSETRUE/FALSE (布尔值boolean)是否将 session 数据存放入数据库中。在开启这个选项前,你要先创建一个数据库表。sess_table_nameci_sessions任何有效的 SQL 表名session 数据库表的名字。sess_time_to_update300时间以秒计算这个选项控制 session 类多久会产生一个新的session 和 session id。sess_match_ipFALSETRUE/FALSE (布尔值boolean)是否通过用户的IP地址来读取 session 的数据。 注意 ,有些网络运行商 ISPs 会动态的改变IP, 所以将这个选项设为 FALSE, 才有可能得到永久的 session。sess_match_useragentTRUETRUE/FALSE (布尔值boolean)是否要按照对应的 User Agent 来读取 session 数据。



10.表单验证类(回调函数)

function about_form_submit(){

        $this->load->library('form_validation');
        $this->form->helper('url','form');

        $this->form_validation->set_rules('username','用户名','trim|required|min_length[4]|xss_clean|callback_username_check');  //回调函数
        $this->form_validation->set_rules('password','密码','trim|required|min_length[4]|md5');  //左右去空格
        $this->form_validation->set_rules('cpassword','密码确认','trim|required|matches[password]|md5');  
        $this->form_validation->set_rules('email','邮箱','trim|required|valid_email');

        if($this->form_validation->run() === FALSE){
            $this->load->view('home/formV');
        }else{
            $this->load->view('home/uploadSuccess');
        }
    }

    public function username_check($str){
        if($str == 'admin'){
            $this->form_validation->set_message('username_check',"The %s field can't be the word 'admin'");
            return false;
        }else{
            return true;
        }
    }
设置错误信息


所有自身的错误信息位于下面的语言文件中:language/english/form_validation_lang.php


要设置你的自定义信息你可以编辑那个文件,或使用下面的函数:


$this->form_validation->set_message('rule', 'Error Message');


其中 rule是该条定义规则的名称,Error Message该规则会显示的错误文本。


如果你在错误信息中包含了 %s,它将插入显示出你在表单域中设置的别名。


在上面回调的例子中,, 错误信息是通过传送函数名称返回的:



$this->form_validation->set_message('username_check') 

 你也可以重写语言文件中的错误信息.  例如, 你可以这么做来改变"required" 规则的信息: 

 $this->form_validation->set_message('required', 'Your custom message here');

如果你喜欢紧挨着每个表单域显示错误信息而不是显示为一个列表,你可以使用 form_error()函数,如下所示:



//view文件


<body>
<?php echo validation_errors();?>
<?php echo form_open('index/about_form_submit');?>
<h5>用户名</h5>
<?php echo form_error('username'); ?>
<input type="text" value="<?php echo set_value('username','xiahuiqin');?>" name="username" size="50"/>  <!--set_value()的第一个参数是记录输入框内文字,第二个参数是文本框默认文字。-->
<h5>密码</h5>
<input type="password" value="<?php echo set_value('password');?>" name="password" size="50"/>
<h5>密码确认</h5>
<input type="password" value="<?php echo set_value('cpassword');?>" name="cpassword" size="50"/>
<h5>邮箱</h5>
<input type="text" value="<?php echo set_value('email');?>" name="email" size="50"/>
<br><br>
<input type="submit" value="submit" />
</form>
</body>

11. cookie(输入类)


function about_cookie(){
	$cookie = array(
		'name' => 'myci_cookie_201301051',
		'value' => 'myci_cookie_201301051_value',
		'expire' => '10',
		'secure' => TRUE
	);

	$this->input->set_cookie($cookie);    //这是ci的cookie写法
	setcookie('myci_cookie_201301052','mytestonlyvalue2_haha', time()+'10','/');    //这是php原生的setcookie,注意:时间一定要是time()+时间        
}

$this->input->is_ajax_request()  //判断是否是ajax数据
$this->input->ip_address()  //返回当前用户的ip,如果ip无效,返回0.0.0.0
$this->input->valid_ip($ip)  //测试输入的ip地址是否有效

cookie辅助函数:

要先装载helper:$this->load->helper('cookie');

set_cookie(); 设置浏览器的cookie。
 get_cookie(); 获取浏览器的cookie。
 delete_cookie(); 删除一个cookie,除非你设置了一个自定义的路径或者其他变量,否则只要给出cookie的名字就行了:
 delete_cookie("name");
 delete_cookie(); 可以把一个数组作为第一个参数提交,也可以像下面这样,设置独立的参数.
 delete_cookie($name, $domain, $path, $prefix);$this->input->is_ajax_request()  //判断是否是ajax数据
 $this->input->ip_address()  //返回当前用户的ip,如果ip无效,返回0.0.0.0
 $this->input->valid_ip($ip)  //测试输入的ip地址是否有效

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年12月09日   30   0   0 cii++数据
87NHThsqHimc