首页 > 代码库 > ci框架(二)

ci框架(二)

自定义SQL语句                                                                            

当提供的API满足不了我们对SQL语句的要求的时候,我们通常是自己来写SQL语句,CI也提供了比较强大了,能够满足我们需求的一般的sql的API。

$res=$this->db->select(‘id,name‘)    ->from(‘表名‘)    ->whrer(‘id >=‘,5)//注意id后面要有个空格    ->limit(3,2)//这里与sql的limit是顺序是反的    ->order_by(‘id desc ‘)    ->get();//翻译成sql语句var_dump($res->result());echo $this->db->last_query();//先是最近一条SQL

自定义扩展控制器                                                                          

在application/core中新建MY_Controller.php

class MY_Controller extends CI_Controller{    public function __construct()    {        parent::__construct();        //一定呀先调用父类的构造方法        //登录验证、权限验证、其他操作。。。    }}

同时需要在application/config/config.php中配置一下:

$config[‘subclass_prefix‘] = ‘MY_‘;

自定义扩展模型                                                                            

在application/models中创建user_model.php

class User_model extends CI_Model{    public function getAll()    {        $res = $this->db->get(‘表名‘);        return $res->result();    }}

在控制器中调用自定义模型

application/controllers:

class User extends MY_Controller{    public function index()    {        $this->load->model(‘User_model‘);//调用以类名为主,而不是文件名
$list = $this->User_model->getAll();//调用模型获取数据
$this->load->view(‘user/index‘,array(‘list‘=>$list));//加载视图      }   }

加载模型的时候可以给模型取一个名字:

$this->load->model(‘User_model‘,‘user‘);//调用以类名为主,而不是文件名        $list = $this->user->getAll();//调用模型获取数据

Url相关函数                                                                             

在表单验证的时候,需要把数据传给控制器,怎么准确的而且可扩展的写action呢,调用API:

public function addView(){    $this->load->helper(‘url‘);//为了不把表单传递的地址写死,用url函数    $this->load->view(‘user/add‘);}

在user/add.php视图当中:

<form action="<?php echo site_url(‘user/insert‘); ?>" method="post"><!-- ........--></form>

如果是index.php目录的话,用:

base_url();

这个API。

同时,每次加载url很麻烦,也可是设置成自动加载,在config/config.php中修改:

$config[‘helper‘] = array(‘url‘);

可能在后面的版本中就没有这个自动加载了。

路由                                                                                           

image

想要把12.html中的.html删了怎么办,这就需要匹配路由规则了(在config/routes.php):

$route[‘rouxx/showxx/([\d]+)\.html‘] = ‘rou/show/$1‘;//插入这句话

image

分页                                                                                           

  • 必须知道的一些参数

总共有多少条记录

一页要有多少条记录

总共多少页

当前页前后要显示多少个分页链接

  • 设置一些CI分页类基本参数
//总条数$config[‘total_rows‘]//一页显示几条$config[‘per_page‘]//定义当前页的前后各有几个数字链接$config[‘num_links‘]//定义没有分页参数,主URL$config[‘base_url‘]
  • 调用CI的分页类
$this->load->library(‘pagination‘);
  • 执行分页方法
$this->pagination->initialize($config);
  • 输出分页链接
echo $this->pagination->create_links();
  • 查询部分数据(limit)
echo $this->db->limit($num,$start);  //从$start查$num条
<?php if ( ! defined(‘BASEPATH‘)) exit(‘No direct script access allowed‘);class Page extends CI_Controller {    public function user_add(){        $this->load->model(‘test_m‘);        for ($i = 1;$i <= 100;$i++){            $name = ‘u‘.$i;            $arr = array("usid"=>$i,"uname"=>$name,"upass"=>123456);            $this->test_m->user_insert($arr);        }    }    public function pagelist(){        $this->load->model(‘test_m‘);        $user = $this->test_m->user_select_all();        $allnum = count($user);        $pagenum = 20;        $config[‘total_rows‘] = $allnum;        $config[‘per_page‘] = $pagenum;        $config[‘num_links‘] = 3;        $config[‘base_url‘] = "/CI/index.php/page/pagelist";        $config[‘use_page_numbers‘] = true;        $this->load->library(‘pagination‘);        $this->pagination->initialize($config);        var_dump($this->pagination->create_links());        echo $this->pagination->create_links();        echo "<br />";        $id = $this->uri->segment(3);  //获得url第三段字符        $id =$id ? $id:1;        $start = ($id - 1) * $pagenum;        $list = $this->test_m->user_select_limit($start,$pagenum);        var_dump($list);    }}

上传文件                                                                                    

视图 /views/up.php:

<html>    <form action="ci/CodeIgniter_2.2.0/index.php/upload/up" method="post" enctype="multipart/form-data">        <input type="file" name="upfile" />        <input type="submit" name="sub" value="提交" />    </form></html>

控制器:

  • 定义一个数组,设置一些与上传相关的参数
$config[‘upload_path‘] = ‘./uploads/‘;//设置允许上传的类型$config[‘allowed_types‘] = ‘gif|jpg|png‘;$config[‘max_size‘] = ‘100‘;//如果是图片还可以设置最大高度和宽度$config[‘max_height‘] = 768;$config[‘max_width‘] = 1024;

还可以设置其他的一些额外参数,详细看用户手册。

  • 调用CI的上传通用类,并执行上传
//upload为调用的类名,全小写$this->load->library(‘upload‘,$config);//如果上传框的name写的是userfile,那就不用传参数了,如果不是,把name的值传进去$this->upload->do_upload(‘上传框的name‘);
  • 接收出错信息或成功信息
//出错信息$error = array(‘error‘ => $this->upload->display_error());//成功信息$data = array(‘upload_data‘ => $this->upload->data());
<?php if ( ! defined(‘BASEPATH‘)) exit(‘No direct script access allowed‘);class Upload extends CI_Controller {    //显示带表单的视图    public function index(){        $this->load->view(‘up‘);    }    //显示上传信息    public function up(){        $config[‘upload_path‘] = ‘./uploads/‘;        $config[‘allowed_types‘] = ‘gif|jpg|png‘;        $config[‘max_size‘] = "2000";        $this->load->library(‘upload‘,$config);        //打印成功或错误的信息        if($this->upload->do_upload(‘upfile‘))        {            $data = array("upload_data" => $this->upload->data());            var_dump($data);        }        else        {            $error = array("error" => $this->upload->display_errors());            var_dump($error);        }    }}

Session                                                                                   

利用CI类实现session登录

  • 修改配置文件(config.php)
//生成一个随机不重复的字符串走位加密的key保存到config.php的encryption_key中$config[‘encryption_key‘]=‘adb8bf6d0ac4e17b42a80941582497a4‘;
  • 加载SESSION类
$this->load->library(‘session‘);
  • 创建SESSION
$array = array(‘id‘=>3,‘name‘=>‘jack‘);$this->session->set_userdata($array);
  • 查看SESSION
$this->session->userdata(session名);
  • 删除SESSION
$this->session->unset_userdata(‘SESSION名‘);

image

在config.php文件中修改一下配置,便可以对cookie加密:

$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‘]       = FALSE;$config[‘sess_table_name‘]        = ‘ci_sessions‘;$config[‘sess_match_ip‘]        = FALSE;$config[‘sess_match_useragent‘]    = TRUE;$config[‘sess_time_to_update‘]    = 300;
  • 一次性数据,只能读取一次
//设置$this->session->set_flashdata(‘test‘,‘aaaaa‘);//读取$test = $this->session->flashdata(‘test‘);