codeigniter ,看完这些,就可以用它做项目了
一、MVC
1,入口文件
唯一一个让浏览器直接请求的脚本文件
2,控制器 controller
负责协调模型和视图
3,模型 model
只负责提供数据,保存数据
4,视图
只负责显示,以及搜集用户的输入(表单)
5,action 动作
是控制器中的方法,用于被浏览器请求
--------------------------------------------
二、CI中的MVC
1,pathinfo 模式 http://localhost/php/ci/index.php/控制器文件/动作
application目录中
controller 控制器
views 视图
models 模型
-------------------------------------------------------------------------
三、控制器
1,不需要加后缀,直接是 类名.php
2, 文件名全部小写
3,所有的控制器需要直接或间接继承自 CI_Controller 类
4,以下划线开头的方法,不能被浏览器请求,但是可以被内部调用
5,控制器中只有public 的方法,才能作为动作
6,方法名不区分大小写
7,与类名相同的方法,会被php当做构造方法,因此不要创建与类名相同的方法
---------------------------------------------------------------------------------------
四、视图
1,在控制器中如何加载视图
$this->load->view(视图);//直接写视图名字,不用加扩展名
2,视图中直接使用原生php代码,不使用模板引擎
3,在视图中分配变量
$this->load->vars('title',"这是标题"); $data['title'] = "这是标题";
$data['list'] = $list; $this->load->vars($data); //可以多次调用
在视图中
<?php foreach($list as $item): ?>
<tr>
<td><?php echo $item['id']; ?></td>
<td><?php echo $item['name']; ?></td>
<td><?php echo $item['email']; ?></td>
</tr>
<?php endforeach; ?>
4,推荐使用
<?php foreach($list as $item):?>
<?php endforeach; ?>
-------------------------------------------------------------------------------
五、ci的超级对象
当前的控制器对象
属性
$this->load
装载器类的实例
装载器类提供的方法:
view() 装载视图
vars() 分配变量
database() 装载数据库操作对象
model() 装在模型
helper() 辅助函数
$this->uri
是CI_URI 类的实例
CI_URI提供的方法:
segment() 用于获取url中某一段的值
传统pathinfo
入口文件.php/控制器/动作/参数1/值1/参数2/值2
CI的pathinfo
入口文件.php/控制器/动作/值1/值2
$this->uri->segment(3);//对应 值1
$this->uri->segment(4);//对应 值2
public function index($p=0){
echo $p;
}
$this->input() 输入类
是CI_Input()的实例
提供的方法
$this->input->post('username');//$_POST['username'](无get,可以使用segment())
$this->input->server('DOCUMENT_ROOT');
在视图中,可以直接使用$this 来只用超级对象
------------------------------------------------------------------------------------------
六、数据库访问
修改配置文件
application/config/database.php
将数据库访问对象,装载到超级对象的属性中 $this->db
$this->load->database();
$res = $this->db->query($sql);//返回一个对象
$res->result(); //返回数组,数组中是一个一个的对象
$res->result_array(); //返回二维数组,是关联数组
$res->row(); //返回第一条记录,直接是一个对象
$res->row_array();//第一条记录的数组
程序实例
1,查询
public function showusers(){
//装载数据库操作类
$this->load->database(); //装载成功之后会放入超级对象的属性中,默认属性名是db/
//var_dump($this->db); $sql = "select * from blog_user"; //返回一个对象
$res = $this->db->query($sql); // mysql_query() //var_dump($res); //返回值是一个对象 $users = $res->result(); //mysql_fetch_object(); 返回对象
//mysql_fetch_assoc(); 返回关联数组 $data['user_list'] = $users;
$this->load->view('index/users',$data);
}
2,添加
public function add{
$this->load->database(); $sql = "insert into blog_user (name,password) values ('mary',md5('mary'))"; $bool = $this->db->query($sql); if($bool){
//mysql_affected_rows
echo $this->db->affected_rows(); //受影响行数
echo $this->db->insert_id(); //自增id
} }
在上述两个例子中,存在安全问题,以及表前缀不能自动修改的问题,一以下例子针对这两个问题做了改进
1,修改(表前缀与参数绑定)
public function test8(){
//此处可以在autoload.php 中配置“自动加载”,$autoload['libraries'] = array('database');
//$this->load->database(); //$name = $this->input->post('name');
$data[0] = 'lili';
$data[1] = 'lili';
//$db['default']['swap_pre'] = 'swap_'; 数据库配置文件中的交换表前缀
$sql = "insert into swap_user (name,password) values (?,?)"; $bool = $this->db->query($sql,$data);//SQL语句中有多个?时,需要传入索引数组 if($bool){
echo "添加成功!";
}
}
七、数据库中的AR模型(Active Record)
1,在 database.php 文件中
$active_record = TRUE;
2,自动加载
$autoload['libraries'] = array('database');
3,在配置文件中,配置表前缀后,会自动添加
$res = $this->db->get("表名"); //返回结果集对象
$res -> result(); $this->db->insert('表名',关联数组); $bool = $this->db->update('表名',关联数组,条件); $bool = $this->db->delete('表名',条件);
连贯操作
// select id,name from tableName where id >= 3 order by id desc limit 2,3
$res = $this->db->select('id,name')
->from('user')
->where('id >=',2)
->limit(3,2) //跳过2条取出3条数据
->order_by('id desc')
->get();
var_dump($res->result());
echo $this->db->last_query();
->where() 的一些用法
// $res = $this->db->where('name =','zhongshan')->get('user');
// $res = $this->db->where('name !=','zhongshan')->get('user');
$res = $this->db->where(array('name' => 'mary','id >' => 2))->get('user');
复杂的查询,请用 $this->db->query($sql,$data); //使用?绑定参数
八、如何扩展CI的控制器
编写自己的控制器,application/core/MY_Controller.php文件
其他控制器就可以继承自 MY_Controller
在config.php中,可以修改前缀 $config['subclass_prefix'] = 'MY_';
class MY_Controller extends CI_Controller{
//构造方法会自动调用
public function __construct(){
parent::__construct(); //调用父类的构造方法 //登陆验证... //权限验证...
} public function funcname(){
}
九、模型
继承自 CI_Model
在模型中,可以使用超级对象的属性
文件名全部小写,类名首字母大写
建议使用 _model 做为后缀,防止和控制器类名冲突
程序代码
model
<?php
/**
* 用户模型
* @author zhongshan <1194567130@qq.com>
*/
class User_model extends CI_Model{
//返回所有用户
public function getAll(){
$res = $this->db->get('user');
return $res -> result();
}
}
controller
<?php
class User extends MY_Controller{
public function index(){
//加载模型,可以起一个别名,加载完成后,自动成为超级对象的属性
$this->load->model('User_model','user'); $list = $this->user->getAll(); //调用模型,获取数据 $this->load->view("user/index",array('list' => $list)); }
}
views
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php var_dump($list) ?>
</body>
</html>
十、url相关函数
$this->load->helper('url');//可以根据需要配置自动加载,在 autoload.php 中
site_url('控制器/方法')
base_url()
十一、设置路由
application/config/routes.php
//默认控制器
$route['default_controller'] = "welcome";
//http://localhost/php/ci/index.php/news/123456/4.html
$route['news/[\d]{6}/([\d]+)\.html'] = 'article/show/$1';
十二、隐藏入口文件
开启apache的rewrite模块,在httpd.conf 文件中
LoadModule rewrite_module modules/mod_rewrite.so
重启服务器
在根目录下放入 .htaccess 文件
十三、分页类
//装载类文件
$this->load->library('pagination');
//每页显示10 条数据
$page_size = 10; $config['base_url'] = site_url('user/test'); // 一共有多少条数据
$config['total_rows'] = 100; //每页显示多少条
$config['per_page'] = $page_size; $config['first_link'] = '首页';
$config['next_link'] = '下一页';
$config['uri_segment'] = 3; //分页的数据查询偏移量在哪一段上 $this->pagination->initialize($config); $offset = intval($this->uri->segment(3)); //和 $config['uri_segment'] 对应 $sql = "select * from user limit {$offset},{$page_size}"; echo $sql; //创建链接
$data['links'] = $this->pagination->create_links(); $this->load->view('user/test',$data);
十四、文件上传
1,手动创建好上传目录
2,程序实例
表单
<form action="<?php echo site_url('user/upload'); ?>" method="post" enctype="multipart/form-data">
<input type="file" name="pic" /><input type="submit" value="提交" />
</form>
控制器
public function upload(){
//上传目录需要手工创建
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|png|jpg|jpeg';
//生成新的文件名
$config['file_name'] = uniqid();
//装载文件上传类
$this->load->library('upload',$config);
$this->upload->do_upload('pic'); var_dump($this->upload->data());
//获取上传之后的数据
$data = $this->upload->data(); $filename = $data['file_name'];
echo $filename;
}
十五、session
public function login(){
//生成一个随机字符串作为一个加密用的 key
//保存到 config.php 中的 $config['encryption_key'] = '';
// echo md5(uniqid());exit;
$this->load->library('session'); $user = array('id'=>3,'name'=>'jack'); // session_start();
// $_SESSION['user'] = $user;
$this->session->set_userdata('user',$user);
//不要在这里获取放入的数据,只有页面重新加载或跳转到别的url中,才能获取 //一次性的数据,只能读取一次
$this->session->set_flashdata('index','abcdefghij');
} public function show_session(){
$this->load->library('session');
//取 CI session 中的数据
$user = $this->session->userdata('user');
var_dump($user); //下次刷新,就没有了
$test = $this->session->flashdata('index');
echo $test; }
十六、验证码
public function valid(){
$this->load->helper('captcha');
$vals = array(
'word' => rand(1000,9999),
'img_path' => './captcha/',
'img_url' => base_url().'/captcha/',
'img_width' => 100,
'img_height' => 30,
'expiration' => 60*10 //过期时间,时间一到,会自动删除图片
); $cap = create_captcha($vals);
echo $cap['image']; echo $cap['word']; session_start();
//验证时,对比 $_SESSION['cap']
$_SESSION['cap'] = $cap['word'];
}
十七、表单验证
控制器文件
public function insert(){
// var_dump($this->input->post('name')); $this->load->library('form_validation'); $this->form_validation->set_rules('name','用户名','required');
$this->form_validation->set_rules('email','邮箱','valid_email'); $bool = $this->form_validation->run(); if ($bool) {
//调用模型保存到数据库 }else{
//显示错误信息
$this->load->view('user/add');
} }
视图文件
<?php echo validation_errors(); ?>
<form action="<?php echo site_url('user/insert');?>" method="post">
name:<input type="text" name="name" value="<?php echo set_value('name');?>"><?php echo form_error('name','<span>','</span>'); ?><br>
pass: <input type="password" name="pass"><br>
age: <input type="number" name="age"><br>
sex: <input type="text" name="sex"><br>
email: <input type="text" name="email" value="<?php echo set_value('email');?>"><?php echo form_error('email','<span>','</span>'); ?><br> <input type="submit" value="提交">
</form>
codeigniter ,看完这些,就可以用它做项目了的更多相关文章
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- 在知乎上看到 Web Socket这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错
在知乎上看到这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错,所以推荐给大家,非常值得一读. 作者:Ovear链接:https://www.zhihu.com/que ...
- 盘点国内程序员不常用的热门iOS第三方库:看完,还敢自称”精通iOS开发”吗?【转载】
综合github上各个项目的关注度与具体使用情况,涵盖功能,UI,数据库,自动化测试,编程工具等类型,看完,还敢自称”精通iOS开发”吗? https://github.com/syedhali/EZ ...
- APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了
APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了 彻底理解android中的内部存储与外部存储 存储在内部还是外部 所有的Android设备均有两个文件存储区域:"intern ...
- 安装完Ubuntu 14.04要做的九件事
www.linuxidc.com/Linux/2014-04/100411.htm 1.看看有哪些新特性 安装完之后的第一件事肯定是看看Ubuntu 14.04有哪些新的特性. Ubuntu 14.0 ...
- Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的
Android图表库MPAndroidChart(二)--线形图的方方面面,看完你会回来感谢我的 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库MP ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- 看完此文还不懂NB-IoT,你就过来掐死我吧...【转】
转自:https://www.cnblogs.com/pangguoming/p/9755916.html 看完此文还不懂NB-IoT,你就过来掐死我吧....... 1 1G-2G-3G-4G-5G ...
随机推荐
- codeforces 609E. Minimum spanning tree for each edge 树链剖分
题目链接 给一个n个节点m条边的树, 每条边有权值, 输出m个数, 每个数代表包含这条边的最小生成树的值. 先将最小生成树求出来, 把树边都标记. 然后对标记的边的两个端点, 我们add(u, v), ...
- 如何使用autotools生成Makefile
安装autotools工具sudo apt-get install autoconf 一,四个代码文件init.s lcd.c addr.h uart.c 二,命令:autoscan 三,命令:vi ...
- wordpress模板制作第一课
一套完整的WordPress模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : Archive/Category模板 ...
- RFID电子标签的二次注塑封装
生活当中,RFID电子标签具有明显的优势,随着RFID电子标签成本的降低.读写距离的提高.标签存储容量增大及处理时间缩短的发展趋势,R F I D电子标签的应用将会越来越广泛. RFID电子标签的应用 ...
- FastJson中@JSONField注解使用
最近做项目中,使用了json格式在服务器之间进行数据传输.但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式. 思路: ...
- [Django实战] 第8篇 - 分页列表
当用户登录成功后,首先看到的是他自己之前提交的任务列表,本篇将实现该页面. 视图(views.py)里定义如下: from django.core.paginator import Paginator ...
- 操蛋的UITableView重用机制
1,背景 你可能会遇见一下情况: 使用UITableView加载数据,比如你的每一个cell上面有一个UITextField,当你在第一个cell的UITextField中写下了内容,开始下滑UITa ...
- Winet API 支持HTTPP/SOCKS代理
源程序 1.Winet API 支持使用IE代理.或者不使用代理.或者使用自定义代理三种方式. 2.使用自定义代理的话,支持HTTP代理,SOCKS代理,但是SOCKS代理不知支持用户名密码,HTTP ...
- DevExpress ASP.NET 使用经验谈(2)-XPO对象的使用(使用默认数据连接)
接下来,我们通过一个控制台应用程序,介绍XPO对象的保存操作. 图一 添加新项目 图二 选择项目类型为控制台应用程序 查看生成的Program.cs代码文件,代码如下: using System; u ...
- 关于js的一些总结
1.js中如果判断变量是否为空,要注意两种情况: 一种是变量为空:另一种是变量为0: 2.js如果要进行算术运算或者比较,最好把它强制类型为整型或者浮点型.防止字符串比较,如果本来是数字的字符串,如果 ...