【CI3.1】CI框架简单使用方法-程序员宅基地

技术标签: 测试  php  数据库  


CI框架简单使用方法

1、回忆MVC

 

1.1、M:模型,提供数据,保存数据

1.2、V:视图,只负责显示,表单form

1.3、C:控制器,协调模型和视图

1.4、action:动作,是控制器中的方法,用于被浏览器请求

 

2、CI中的MVC

CI简介:CodeIgniter是一个轻量级但功能强大的php框架,基于MVC的设计模式。提供了一套丰富的类库

 

2.1、访问的url使用的pathinfo

2.2、格式:入口文件/控制器/动作(默认pathinfo格式)

2.3、application目录:

 

Controllers控制器

Models模型

Views视图

 

2.4、默认的控制器是welcome

2.5、默认的动作是index

2.6、文件名全部小写




3、控制器(controller):

3.1、不需要加后缀,直接是类名.php

3.2、文件名全部小写,例如 user.php(大写的文件名浏览器不支持)

3.3、所有的控制器,直接或间接继承自CI_Controller类,类名首字母大写

3.4、方法名不区分大小写

 

动作要求:1.必须以public开头

 

2.不能以下划线(_)开头

注意!方法名与类名相同,会被php当做构造方法(__construct)

 

4、视图(view)

 

4.1、在控制器中加载视图:$this->load->view(“user_add”);//不加扩展名

4.2、在控制器中加载视图:$this->load->view(“user/add”);//不加扩展名

注意:可以多次调用$this->load->view(视图);

4.3、视图中,直接使用原生php代码

4.4、在控制器中分配变量:$this->load->vars(“视图中变量名”,php中变量名);

 

例如:$str=“abcdefg”;

$this->load->vars(“str”,$str);

视图中使用:<?php echo $str;?>

 

4.5、在控制器中分配多个变量:

 

例如:$str=“abcd”;

$list = array(“id”=>”1”,”name”=>”zhangsan”,”pwd”=>”1234”);

$data[“str”]=
 $str;

$data[“list”]=
 $list;

$this->load->vars($data);

 

4.6、CI框架会自己解决php中的短标签<?=…?>

4.7、推荐使用:<?phpforeach($listas
 $key=>$val):?><?php endforeach;?>




5、超级对象:当前控制器对象,提供了很多属性

 

5.1、$this->load属性

5.1.1、装载器类的实例
 system/core/Loader.php

5.1.2、CI_Loader提供的方法:

$this->load->view()装载视图

$this->load->vars()分配变量到视图

$this->load->database()装载数据库操作对象

$this->load->model()装载模型对象

$this->load->helper()帮助对象

$this->load->view(“视图名”,$变量名)装载视图时分配变量

 

5.2、$this->uri属性

5.2.1、装载器类的实例
 system/core/URI.php

5.2.2、CI_URI提供的方法:

$this->uri->Segment(n)用于获取URL中的第n个参数

控制器代表1,动作代表2,值1代表3,值2代表为4…

用法1:入口文件/控制器/动作/值1/值2

echo $this->uri->segment(3);//输出值1

用法2:index.php/控制器/动作/6

//可以直接获取;参数一定要对应正确

publicfunction($id=0){

echo $id;//输出6

}

 

5.3、$this->input属性

5.3.1、装载器类的实例
 system/core/Input.php

5.3.2、CI_Input提供的方法:

 

$this->input->post(‘username’);//$_POST[“username”];

$this->input->server(“DOCUMENT_ROOT”);//$_SERVER[“DOCUMENT_ROOT”]

$this->input->server(“REMOTE_ADDR”);//客户端IP

$this->input->server(“SERVER_ADDR”);//服务器端IP

注意:在视图中,可以直接用$this来访问超级对象中的属性

 

6、访问数据库

 

6.1、修改配置文件:application/config/database.php

6.2、装载数据库操作类:$this->load->database();

加载成功后,会放入超级对象的属性中,默认属性名是db

$this->db

6.3、$query=
 $this->db->query($sql);//返回值是对象(array_fetch_object)

$sql = $this->db->last_query($sql);//显示最后一条执行的sql语句

6.3.1、$query=
 $this->db->escape();//此函数会确定数据类型,对字符串类型数据转义

6.4、$list=
 $query->result();//返回数组,数组中是一个一个的对象

6.5、$list=
 $query->result_array();//返回二维数组,里面是关联数组

6.6、$row=
 $query->row();//返回第一条数据,直接是一个对象

6.7、$row=
 $query->row_array();//返回第一条数据,是一个数组

6.8、$count=
 $query->num_rows();//返回结果集的行数

6.9、$field=
 $query->num_fields();//返回请求的字段数

6.10、$count=
 $query->affected_rows();//返回受影响的行数

6.11、$id=
 $query->insert_id();//返回自增ID

 

7、数据库中的配置

7.1、自动加载db:

在application/config/autoload.php中配置:

$autoload[“libraries”]=
 array(“database”);

这样就不需要 $this->load->database();




7.2、参数绑定

$name = $this->input->post(“name”);

$pwd = $this->input->post(“pwd”);

//使用问号绑定参数

$data[0]=
 $name;

$data[1]=
 $pwd;//用二维数组传递值

$sql =“insertinto
 ci_user(name,pwd)
 values (?,?)”;//多个问号,需要传一个索引数组

$bool = $this->db->query($sql,$data);//返回值是boolean

7.3、表前缀配置

在application/config/database.php中配置:

$db[‘default’][‘dbprefix’]=‘ci_’;

$db[‘default’][‘swap_pre’]=‘ci_’;

配置为一样,代码中,直接编写表前缀后面的名就行了,如果以后项目表前缀发生变化,只需要修改$db[‘default’][‘dbprefix’]=‘new_’,代码中ci_会自动替换为new_

 

8、数据库操作(AR模型)

8.1、配置application/cinfig/database.php中

$active_record = TRUE;

8.2、在配置文件中,配置表前缀后,会自动添加

8.3、查找(get):

$res = $this->db->get(‘表名’);//返回结果集对象

$list = $res->result();//返回数组,数组中是一个一个的对象

$list = $res->result_array();//返回二维数组,里面是关联数组

8.4、插入(insert):

//数据使用关联数组

$data[“数据库字段名”]=值;//$this->input->post(“name”);

$data[“数据库字段名”]=值;

$res = $this->db->insert(“数据表名”,$data);//返回结果boolean;

8.5、修改(update):

//数据使用关联数组

$data[“数据库字段名”]=值;//$this->input->post(“name”);

$data[“数据库字段名”]=值;

$where = array(“id”=>”4”);

$res = $this->db->update(“数据表名”,$data,$where);//返回结果boolean;

8.6、删除(delete):

$where = array(“id”=>”4”);

$res = $this->db->dalete(“数据表名”,
 $where);//返回结果boolean;

 

9、AR的连贯操作

 

9.1、$res=
 $this->db->select("id,name")//查找的字段

->from("user")//数据表名

->where("id
 >",3)//条件
 id与>之间必须要有空格

->order_by("id
 desc")//排序

->limit(3,1)//分页;表示跳过1条,取3条,与tp相反

->get();//获取数据

$list = $res->result_array();

9.2、where()条件

条件符:“>”、“>=”、“<”、“<=”、“=”、“!=“;不指定条件付默认是”=“

1、只有单个条件时:

9.2.1、$res=
 $this->db->where(“字段”,”值”)->get();

例如:$res= $this->db->where(“name”,”admin”)->get();//自动会加上“=”

9.2.2、$res=
 $this->db->where(“字段=”,”值”)->get();

例如:$res= $this->db->where(“name=”,”admin”)->get();//必须要有空格

2、有多个条件时:用array()

9.2.3、$res=
 $this->db->where(array(“字段”=>”值”,“字段”=>”值”))->get();

例如:$res= $this->db->where(array(“name”=>”admin”,“id>3”=>”2”))->get();

9.2.4、复杂的查询语句使用$this->db->query($sql,$data);//使用问号绑定参数

9.3、join连接查询

9.3.1、默认为左查询(left
 join … on)

$this->db->select(“字段”)

->from(“数据表名”)

->join('连接表','连接条件')

->get();    //默认为左查询(left
 join … on) 例如:

$this->db->select(“*”)

->from(“user”)

->join('category',
 user.id= category.id)//默认为左查询(left
 join )

->get();


9.3.2、通过join()第三个可选参数选择连接,可选参数包括:left、 right、outer、 inner、left outer、right outer

例如:

$this->db->select(“*”)

->from(“user”)

->join(“category”, “user.id = category.id”,”left”)//通过第三个参数指定

->get();

10、扩展CI控制器

 

10.1、扩展控制器

1、在application/core新建一个自己的控制器(MY_Controller),新建的控制器继承CI_Controller类,可以从自己创建的控制器中进行扩展。

例如:class MY_Controller extends CI_Controller{

Public function __consreuct(){

Parent::__construct(); //调用父类的构造方法

//登陆验证

//权限验证

}

}

2、让welcome.php继承自己创建的控制器(MY_Controller),间接继承CI_Controller。

3、控制器前缀可以修改

在application/config/config.php中修改:

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

11、模型(model)

11.1、模型文件命名:user_model.php 、category_model.php,文件名小写

建议:模型文件名使用_model为后缀,防止与控制器类名冲突!

11.2、所有的模型,直接或间接继承自CI_Model类,类名首字母大写

11.3、里面创建所需要的方法:getAll()…

11.4、控制器中加载模型:$this->load->model(“模型文件名”); //不加后缀

11.5、控制器中加载模型时起别名:$this->load->model(“模型文件名”,”别名”);

加载成功后,会放入超级对象的属性中,默认属性名是模型文件名或别名

11.6、控制器中调用模型,获取数据:$this->模型文件名->方法名();

例如:$this->load->model(“User_model”); //注意大小写

$this->User_model->getAll(); //调用模型,获取数据

11.6.1、控制器中调用模型,获取数据:$this->别名->方法名();

例如:$this->load->model(“User_model”,”user”); //注意大小写

$this->user->getAll(); //调用模型,获取数据

12、CI中url相关函数

12.1、加载辅助函数:$this->load->helper(“url”);

配置自动加载辅助函数:在application/config/autoload.php中配置

$autoload['helper'] = array('url');

就不用写$this->load->helper(“url”);

辅助函数:

site_url(“控制器/动作/参数”) ; //处理url及参数

在视图中使用<?php echo site_url(“控制器/动作/参数”)?>

base_url();//返回网站的根目录(“ci/”);

13、CI中的路由与伪静态、隐藏index.php入口文件

13.1、路由设置

 

在application/config/routes.php中设置/修改:

 

$route['default_controller'] = "welcome"; //默认的控制器为welcome

 

13.2、伪静态设置

在application/config/routes.php中设置/修改:

//正则匹配(控制器/)

$route['news/[\d]{6}/([\d\w]+)\.html']
 = 'user/show/$1';

http://localhost/CI/index.php/news/201401/caolizhi66.html

将动作news中的参数路由到user/show/$1

 

13.3、隐藏入口文件index.php

13.3.1、开启apache配置文件:LoadModule rewrite_module modules/mod_rewrite.so

13.3.2、在入口文件统计目录中,创建一个.htaccess文件,内容如下:

<IFModule mod_rewrite.c>

RewriteEngine on //启用伪静态

RewriteCond %{REQUEST_FILENAME} !-d //匹配不存在的目录

RewriteCond %{REQUEST_FILENAME} !-f //匹配不存在的文件

RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] //重写规则

</IFModule>

 

这样就不用写入口文件index.php了

 

14、CI中的分页

$this->load->library('pagination');

1 $config['base_url'] = $url;

2 /* 分页的基础 URL

3 如果你想用a、b的链接形式,则该url应该形式如/news/page/ 

4 如果链接是c、d的形式,则url应该如/news? 

5 */ 

6 $config['total_rows'] = $total;//记录总数,这个没什么好说的了,就是你从数据库取得记录总数

7 $config['per_page'] = $pagesize; //每页条数。额,这个也没什么好说的。。自己设定。默认为10好像。

8 $config['page_query_string'] = TRUE;

9 /*传参形式。开启true则会自动在你的url后面加上&per_page=3。(这个per_page是默认的查询字符,当然你也可以用$config['query_string_segment']来自己设定)

10 因此c、d中的形式一般是为localhost/news?&per_page=2不过都一样,没什么影响。get的per_page还是3

11 */ 

12 $config['first_link'] = '首页';
 // 第一页显示 

13 $config['last_link'] = '末页';
 // 最后一页显示 

14 $config['next_link'] = '下一页>';
 // 下一页显示

15 $config['prev_link'] = '<上一页';
 // 上一页显示

16 $config['cur_tag_open'] = '<aclass="current">';
 // 当前页开始样式 

17 $config['cur_tag_close'] = '</a>';

18 /*当前页结束样式。这些你可以自己尝试一下。

19比如说我想让当前页的分页数字样式好看一点,红色字体等。你就可以在current上加上css代码

20*/

21 $config['num_links']
 = 2;//当前连接前后显示页码个数。意思就是说你当前页是第5页,那么你可以看到3、4、5、6、7页。

22 $config['uri_segment']=4;

23/*这个是你在用a)、b)链接样式的时候,用来判断页页数。

24 比如localhost/news/page/3 这个uri_segment就要设定为3。localhost/news/title/page/3这个就要设定为4

25 */

26 $config['use_page_numbers']=
 TRUE;

27/*这个就是a)、b)的差别了。开启了,page就会表示页数。false就会表示记录数

 

转载于:https://www.cnblogs.com/xuzhengzong/p/7729785.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30652897/article/details/98370842

智能推荐

pic秒表c语言程序,PIC单片机C语言编程实例三-第7章秒表.doc-程序员宅基地

文章浏览阅读91次。PIC单片机C语言编程实例三-第7章秒表.docPAGEPAGE 133第7章 秒 表7.2.2 程序清单该源程序已在实验板上调试通过,读者可直接引用,并可利用软件编程的灵活性,加以拓展,实现更为复杂的功能。#include#include //此程序实现计时秒表功能,时钟显示范围00.00~99.99秒,分辨度:0.01秒unsigned chars0,s1,s2,s3;//定义0.0..._pic跑表启动条件

Java调用Groovy脚本_groovy evaluate-程序员宅基地

文章浏览阅读2.1k次。概述 在Java和Groovy的结合中,经常会碰到需要从Java代码中调起一个写好的Groovy脚本,我们可以通过GroovyShell来实现。其中最重要的就是GroovyShell和Binding两个类,其中GroovyShell可以调起一个Groovy脚本,而Binding可以向脚本里面传递参数。简单示例//通过Binding向要执行的groovy脚本传递变量 Bindi..._groovy evaluate

服务器发送信息给arduino,arduino通过esp8266模块发送数据到云服务器-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏25次。arduino通过esp8266模块发送数据到云服务器我是代码小白,一个正在做毕设的秃头少年。鄙人拙作,有不当之处,还请指教。最近买了一套arduino设备,打算做一个物联网设备小玩意,可是怎么把数据上传到云服务器可愁坏我了。通过对比实验,我决定用esp8266wifi模块进行通信。云服务器的话,我现在还没写相应的代码,所以先用Onenet平台进行配置。Onenet平台进行配置1.进入Onenet..._esp8266 arduino wifi发送数据

latex h t b p是什么意思_latex htpb-程序员宅基地

文章浏览阅读1.4w次,点赞9次,收藏17次。常用选项[htbp]是浮动格式:『h』当前位置。将图形放置在正文文本中给出该图形环境的地方。如果本页所剩的页面不够,这一参数将不起作用。『t』顶部。将图形放置在页面的顶部。『b』底部。将图形放置在页面的底部。『p』浮动页。将图形放置在一只允许有浮动对象的页面上。在table或者figure 后加 [!htb] 是系统忽略“美学”标准,把表格和图片插入到你的代码中,是动的,但是不加感叹号,它就是按顺序选择h(此处),t(上方),b(下方),所以为了让图片随着你的代码移动,最好加一个[!htb]_latex htpb

【转载】linux下的usb抓包方法-程序员宅基地

文章浏览阅读67次。1 linux下的usb抓包方法1、配置内核使能usb monitor:make menuconfigDevice Drivers --> USB Support --> USB Monitor --> Sel..._linux安装tcpdump 查看usb

计算机组成pc em ir,计算机组成 课程设计报告.doc-程序员宅基地

文章浏览阅读164次。计算机组成 课程设计报告计算机组成原理课程设计报告姓 名:班 级:学 号:指导老师:2016年 6月31日目 录第一章 背景知识与课设任务概述11.1课设目的11.2课设任务11.2111.2211.2321.2421.252第二章 课设内容32.1指令的执行流程32.1.132.1.242.1.352.2存储器62.2.162.3运算器72.3.172.4硬件系统组成122.4..._计算机组成课程设计报告

随便推点

QT5实现简单的TCP通信_qt tcpsocket 同步接收-程序员宅基地

文章浏览阅读8.3w次,点赞115次,收藏776次。这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程。使用QT的网络套接字需要.pro文件中加入一句:QT += network一、客户端1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:(1)创建QTcpSocket套接字对象socket = new Q..._qt tcpsocket 同步接收

基于相空间重构的混沌背景下微弱信号检测算法matlab仿真,对比SVM,PSO-SVM以及GA-PSO-SVM_微弱信号检测 仿真-程序员宅基地

文章浏览阅读500次。支持向量机(Support Vector Machine,SVM)是一种用于分类和回归的机器学习方法,其原理基于寻找一个最优超平面(或者曲线在非线性情况下)来划分不同类别的数据点。SVM 的目标是找到一个能够最大化不同类别之间的间隔(margin)的超平面,从而在未知数据上取得良好的泛化能力。SVM 的目标是找到一个超平面,使得距离超平面最近的数据点(支持向量)到超平面的距离(间隔)最大。_微弱信号检测 仿真

解决atom上gcc无法识别 <ros/ros.h>_ros类型无法识别-程序员宅基地

文章浏览阅读335次。找到插件 linter-gcc在Settings里找到GCC Inlude Path和GCC -isystemInclude Paths两栏填入ros的Include路径 /opt/ros/noetic/include注意ros版本不同路径可能有所不同,可以在先文件夹里找一找确定一下_ros类型无法识别

java 解析 modbus rtu_ModBus-RTU详解-程序员宅基地

文章浏览阅读5.7k次,点赞2次,收藏13次。Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。虽然RTU比较简单,但是看协议资料、手册说得太专业了,起初很多内容都很难理解。所谓的协议是什么?就是互相之间的约定嘛,如果不让别人知道那就是暗号。现在就来定义一个新的最简单协议。例如,协议: “A” --“LED灭”“B” --“报警..._java modbus4j-rtu 二进制数字意义

2021-07-18-程序员宅基地

文章浏览阅读43次。从零开始实现简易版本SpringIoC&DI&MVCSpring源码进修中,实现一个简易版本的Spring,包含以下主要内容:IoC,DI,MVC,已完成基本的功能。代码量还算一般,特此记录以共勉。首先是整个项目的基本思路。项目实现的功能就是从前端发一个请求,后端根据请求解析到后端的相应方法进行处理,完成后将结果进行返回。代码需要完成请求路径和类+方法的对应。配置阶段配置web.xml:DispatcherServlet设定init-param:contextConfigL

507页XX市应急管理局智慧矿山煤矿数字化矿山技术解决方案_18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案word-程序员宅基地

文章浏览阅读542次。只有在单系统自动化的基础上,通过高速网络接入各单系统,充分数据融合,建立合理的联动机制才能完成从单系统自动化到综合自动化的转变,该部分的转变从投入的资金和实现的容易度相对来讲可实现性和可控性都比较容易,但是从综合自动化向数字化矿山发展,涉及的面比较广,必须由多方共同来推进,一般涉及到“综合自动化”、“空间数字化”及“管理信息化”三大方面,三者缺一不可,通过三者的有机融合,再通过合适的平台例如三维可视化平台进行展示,同时通过科学合理的管理制度和流程加以应用才是真正意义上有血有肉的数字化矿山。_18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案word