主要内容
CI简介
CI的超级对象
CI的控制器与视图
数据库访问
AR模型
如何扩展CI的控制器
CI中的模型
url相关函数
设置路由
分页
文件上传
session
验证码
表单验证
入口文件.php/控制器/动作
controlles 控制器
models 模型
views 试图
默认控制器是welcome
默认动作是index
不做任何指定 默认访问的
CI中的控制器:
1.不需要加后缀 例如:userAction,直接是类名.php
2.文件名全部小写
3.所有的控制器需要直接或间接继承自CI_Controller类
4.protected 受保护的 方法不能被浏览器直接请求
5.以下划线开头的方法,不能被浏览器直接请求_test
6. public function test2(){ //在类内部可以
$this->_test1();
}
7.控制器中对动作(方法)要求:public
以_开头
8.方法名不区分大小写
9.与类名相同的,会被PHP当做构造方法,__construct()
CI中的视图:
1.在控制器中加载特定文件夹的视图 user/index
2.视图中直接使用原声php代码,不适用模板引擎
3.如何将变量分配到视图中,在视图里使用
1.$this->assign('key','value'); smarty
2.$this->load->vars('title','this is title');
3.在视图输出 :echo $title;
4.分配二维数组
$list = array(array(),array(),array());
$data['list'] = $list;
$data['title'] = '这是标题';
$this->load->vars($data); //可以多次使用
//模板
4.推荐使用<?php foreach($list as $item):?>
<?=$item['name']?>
<?php endforeach;?>
CI中的超级对象:
var_dump($this); //控制器对象,超级对象
var_dump($this->load);
当前的控制器对象
提供了很多属性
$this->load
装载器类的实例 system/core/Loader.php
装载器类提供的方法:
view() 装载视图
vars() 分配变量到视图
database() 装载数据库操作对象
model() 装载模型对象
helper() 加载一些辅助函数
//CI会自动实例化一个CI_Loader的对象,放在超级对象的属性中
//下面代码帮助大家理解$this->load属性
$obj = new CI_Loader();
$this->load=$obj;
$this->load->view();
$this->uri
是CI_URI的实例(url的一些东西)system/core/URI.php
CI_URI类提供方法:
*segment(n) 用于获取url中的第n个参数(值)
入口文件.php/控制器/动作/参数1/参数2
$this->uri->segment(4); //获取第四段的
传统的:使用 参数1/值1/参数2/值2 //$_GET['id'];
可以在方法里面直接写,直接输出
//index.php/控制器/index/6
echo $this->segment(2); //输出6
public function index($p) {
echo $p; //输出6
}
$this->input
是CI_Input的实例(url的一些东西)system/core/Input.php
提供的方法
$this->input_post('username');
$this->input_server('DOCUMENT_ROOT');
等于 var_dump($_SERVER['']);
在视图中 直接用$this来访问超级对象
ci中的数据库操作
AR模型,就是以前的model
1.打开配置文件database.php
2.将数据库访问对象,装载到超级对象的属性 $this->db 中
$this->load->database();
//配置自动加载db
//把他写入autoload里面,$autoload['libraries'] = array('database'); ,就不需要每次加载了
3.执行一些数据库操作函数
查询:
var_dump($this->db) //加载后,会放入超级对象属性中,默认属性名是db
//执行操作,调用对象的某一个方法
$res = $this->db->query($sql); //返回对象
$list = $res->result(); //返回数组,里面是一个一个的对象
var_dump($list);
//mysql_fetch_object(); //返回对象
$data['user_list'] = $users;
//放到模板中,作为第二个参数
$this->load->view('user/showusers',$data);
$res->result_array(); //返回二维数组,关联数组
$res->row(); //返回第一条数据,直接是一个对象
添加:
$this->load->databases(); //加载数据库操作类
$sql = "insert into user (name,password) values ('jack','123')";
$res = $this->db->query($sql); //结果为:true or false
if($res) {
$this->db->affected_rows(); //获取影响行数mysql_affected_rows()
$this->db->insert_id(); //获取insert操作产生的id,自增id
}
修改:
删除:
解决安全: 可以表前缀;
配置一下
$db['default']['dbprefix'] = 'blog_';
$db['default']['swap_pre'] = 'blog_';
配置为一样,代码中就直接写死就行,如果以后表前缀变化,只需要
修改$db['default']['dbprefix'] = 'new_'; 代码中的blog_会自动替换为new_
参数绑定,?添加 查询;
$data[0] = "ss";
$data[1] = "123";
$sql = "insert into user (name,password) values (?,?)";//安全
$res = $this->db->query($sql,$data);
$sql = "select * from test where name=?";
$res = $this->db->query($sql,$name);
如果有多个?时,传入索引数组
db自动加载:
CI中的AR(数据库增删改查) // 简化操作
控制文件中
$active_record = TRUE; //开启AR模型,控制器中可以直接使用$this->db ,false 则不可以,只可以使用query
1.确保database.php里$active_record = TRUE ,开启AR模型
2.在配置文件中,正确配置表前缀后,会自动添加表前缀
//查
$res = $this->db->get('表名'); //返回结果集对象
$res->result();
//增
$bool = $this->db->insert('表名',关联数组);
//改
$bool = $this->db->update('表名',关联数组,条件);//条件应为数组
//删
$bool = $this->db->delete('表名',条件);
//连贯操作
//select * from user where id>=3 order by id desc limit 2,3;
$res = $this->db->select('id,name') //id大于1,id排序,
->from('user')
->where('id >=',3)
->limit(3,2) //表示跳过2条,取出3条数据
->order_by('id desc')
->get();
echo $this->db->last_query(); //打印最后一条sql语句
var_dump($res->result); //打印结果集
//where方法
//where方法
$res = $this->db->where('name','jack')->get('user'); //直接传字段,和值
$res = $this->db->where(array('name'=>'jack'))->get('user'); //传数组 , name为jack
$res = $this->db->where(array('name'=>'jack','id >'=>2))->get('user'); //id 大于2
//$res = $this->db->where('name !=','jack')->get('user'); //直接传字段,和值 name为jack
//$res = $this->db->where('name =','jack')->get('user'); //直接传字段,和值 name为jack
复杂的查询,请用$this->db->query($sql,$data); //使用问号参数绑定
扩展CI的控制器:
在application/core/MY_Controller.php
继承CI的基类,可以重写构造方法,
\system 这里面有很多系统的,如果想重写其他的也可以
可以修改自定义控制器的前缀 在config.php里
CI中的模型model
继承自CI_Model,
application/models
user_model.php(文件名全小写)
class User_model(类名首字母大写)
建议使用_model作为后缀,防止和控制器类名冲突
在模型中,可以直接使用超级对象中的属性 (超级对象就是控制器属性)
模型中的方法,是根据控制器的需求,控制器要什么的数据,就在模型中就OK了
CI中的url相关函数
htdoc/phpci/
$this->load->helper('url'); //加载url函数,可以配置自动加载$autiload['helper'] = array('url');
site_url('控制器/方法'); //生成url ,适用于表单
base_url(); //网站根目录 <?php echo base_url(); ?>upload/girl.jpg
CI中的路由与伪静态、隐藏index.php入口文件
路由:
配置文件:application\config\routes.php
默认控制器:$route['default_controller'] = "welcome"; //默认进来访问的页面
加入伪静态:
//http://localhost/phpci/news/4.html
//$route['news/[\d]+\.html'] = 'article/show/$1';
//$route['news/[\d]{6}/([\d]+)\.html'] = 'article/show/$1';
隐藏入口文件index.php:
开启apache的rewrite模块:apache的配置文件 httpd.conf,找rewrite,去掉注释,重置apache
在入口文件同级目录下建立.htaccess文件
加入以下内容:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index/.php|images|js|css|robots/.txt)
RewriteRule ^(.*)$ index.php?/$1 [L]
CI中的分页
//装载类文件
$this->load->library('pagination');
$this->load->helper('url'); //加载url辅助函数
//配置
$page_size = 10; //每页显示10条数据
$config['base_url'] = site_url('user/page'); //当前控制器下的当前方法
$config['total_rows'] = '200'; //总条数
$config['per_page'] = '10'; //每页显示条数
$config['first_link'] = '首页';
$config['next_link'] = '上一页';
$config['prev_link'] = '下一页';
$config['uri_segment'] = 3; //分页的数据查询偏移量在哪一段
$this->pagination->initialize($config);
$offset = intval($this->uri->segment(3)); //获取第三段的参数值,与$config['uri_segment']对应
echo $sql = "select * from blog_user limit $offset,$page_size"; //sql语句
$data['links'] = $this->pagination->create_links(); //创建上一页,下一页的按钮
$this->load->view('user/page',$data);
CI中的文件上传
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>
3.执行上传
$config['upload_path'] = './upload/'; //上传目录,需要手工创建,以入口文件为准
$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();
echo $data['file_name'];//输出新文件名
CI中的Session
//CI中不使用PHP的原声session,默认CI中的session使用的是cookie,
//SESSION类
public function login() {
//echo md5(uniqid()); //使用它生成一个加密id,填入配置文件中config.php 里的$config['encryption_key'] = 'c40e2bfe70d2c6956044f944bdfaaf8b';选项
$this->load->library('session'); //一旦被载入, session就可以这样使用: $this->session
$user = array('id'=>3,'name'=>'jack');
$this->session->set_userdata('user',$user); //将数据放入session中,只允许放KEY 和VALUE 键值对应的数据
//刚放完之后,不要马上在这里获取刚放入的数据,只有页面重新加载或跳转到别的url中才能获取到
//可以在配置文件中设置加密存放
//$config['sess_encrypt_cookie'] = FALSE; //使用加密存放 TRUE为是
//另一种放置数据,可以用于登陆,放入登陆前的url
$this->session->set_flashdata('test','aaaaaa'); //和session原理一样,下次刷新将没有,一次性数据
}
//SESSION类
public function show_session() {
//去另一个页面去取 CI 中session的数据
$this->load->library('session');
$user = $this->session->userdata('user'); //获取session中的数据
var_dump($user);
$test = $this->session->flashdata('test');
echo $test;
}
CI中的验证码,CAPTCHA 辅助函数
1.先手动在index入口文件同级目录下,创建文件夹
2.//验证码
public function code() {
$this->load->helper('url');
$this->load->helper('captcha'); //是辅助函数
$vals = array(
//'word' => rand(1000,9999), //指定随机字符串
'img_path' => './codeimg/', //验证码存放目录,手动创建 ,必须参数
'img_url' => base_url().'/codeimg/', //url
//'font_path' => './path/to/fonts/texb.ttf', //如果验证码为中文,指定字体目录
//'img_width' => '150',
//'img_height' => 30,
//'expiration' => 60 //验证码删除时间,秒
);
$cap = create_captcha($vals); //创建验证码
//echo $cap['image'];
$this->load->view('user/code',array('cap'=>$cap['image'])); //将图片分配到页面
//echo $cap['word']; //验证码数字内容,可以放到session中,进行验证,看手册
//session_start();
//$_SESSION['cap'] = $cap['word'];
//验证的时候,对比$cap['word']就行
}
CI中的表单验证
//表单验证类,此方法可以不要,直接用下面的,没有数据直接显示,所有类似的都可以
public function forms() {
$this->load->view('user/add');
}
//表单验证类
public function form() {
$this->load->library('form_validation'); //加载类库
//验证规则
$this->form_validation->set_rules('name', '用户名', 'required');
$bool = $this->form_validation->run(); //执行验证,成功返回true
//var_dump($bool);
if($bool) {
//为真,调用模型保存到数据库
} else {
//显示错误信息
$this->load->view('user/form');
}
}
<html>
<head>
<title></title>
</head>
<body>
<?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="text" name="password" /><br>
email:<input type="text" name="email" /><br>
<input type="submit" value="提交" /><br>
</form>
</body>
</html>
修改语言包
//语言包放到application/language/
//修改配置文件$config['language'] = 'english';