兄弟连PHP视频CI框架(CodeIgniter)-笔记
...
兄弟连PHP视频CI框架(CodeIgniter)-01-CI简介与MVC设计模式
--CI框架
讲师:邹义良
微博:weibo.com/it266
...
--主要内容
CI简介
深入MVC设计模式
CI中控制器与视图
CI的超级对象
数据库访问
AR模型
...
--CI是什么?
1,codeIgniter是一个轻量级但功能强大的PHP框架
2,基于MVC设计模式,提供了一套丰言的类库
3,简单易学,高效实用
--官方网站32
codeigniter.com
--中文网站
codeigniter.org.cn
--下载当前最新版本
codeigniter_2.1.4.zip,2.19m
+++
...
--有什么特点?
你想要--个小巧的框架
你需要出色的性能
你需要广泛兼容标准主机上的各种PHP 版本和配置,CI 2.1.4 需要PHP5.1.6
你想要一个几乎只需0配置的框架
你想要一个不需使用命令行的框架
你想要一个不需坚守限制性编码规则的框架
你不希望被迫学习一门模板语言( 虽然可以选择你喜欢的模板解析器)
你不喜欢复杂,热爱简单
你需要清晰、完整的文档
...
--目录结构说明
license.txt许可协议
user_guide 用户手册
system 框架核心文件
application 应用目录
index.php 入口文件
...
+++
MVC简单示范
...省略...
以下几点:
1,入口文件:唯一能让浏览器直接请求的脚本文件
2,控制器controller:协调模型和视图
3,模型model:提供数据,保存数据,有效性验证
4,视图view:只负责显示,搜索输入,比如表单。。。
(CI中甚至可以不用模型,只用CV,也可以做出项目来,这样很难维护,而且重用性差)
5,动作action:是控制器中的方法(公开的),用于被浏览器请求
=============
【版權聲明】兄弟连PHP视频CI框架(CodeIgniter)-02-
...
CI中的MVC
访问URL使用的方式是【pathinfo】(好像文件夹一样)
访问方法:【入口文件.php】/【控制器】/【动作(方法)】
如:http://aub.pub/CI/index.php/welcome/test
application目录中
--controller 控制器
--models 模型
--view 视图
...
默认控制器welcome
默认动作是index
+++
控制器
1,不需要加后缀(如cotroller),直接:类名.php
2,文件名建议小写(指的是控制器文件名如:user.php,类名可以大写如User)
3,所有的控制器,直接或间接继承自类CI_Controller
4,只有public的方法,才能做为动作(被浏览器请求)。
控制器中对动作方法要求:
--定义必须是public,protected不能被请求
--方法名不能以下划线开头(不能被请求,但可以被调用)
--方法名不区分大小写
--与类名相同的方法,会被php当作是构造方法,会被默认执行。相当于__construct()。不要这样做!
class User extends CI_Controller
public function index() {
echo 'user----index';
}
public function test1() {
echo 'test1';
}
// 以下划线开头的方法,不能被请求,但可以被调用
public function _test() {
echo 'test2';
}
public function test2() {
$this->_test();
}
}
class Index extends CI_Controller
//与类名相同的,会被php当作构造方法,会被自动执行
// 相当于_construct(){}
public function index() {
echo 'index 控制器的index方法
';
}
public function index2() {
echo 'index 控制器的index2方法
';
}
20210808 2135
PS:
与类名相同的方法,会被php当作是构造方法,在CI3以后的版本中会报错:
A PHP Error was encountered
Severity: 8192
Message: Methods with the same name as their class will not be constructors in a future version of PHP; Index has a deprecated constructor
Filename: controllers/Index.php
Line Number: 3
Backtrace:
File: /www/wwwroot/aub.pub/00ci/index.php
Line: 315
Function: require_once
PHP错误,8192
消息:在PHP的未来版本中,与类同名的方法将不会是构造函数;索引有一个不推荐使用的构造函数
--20220117
兄弟连PHP视频CI框架(CodeIgniter)-03
...
--->视图
1,在控制器中如何加载视图
调用方法:$this->load->view(视图)
可以多次调用$this->load->view(视图);
//直接写视图名字,不用写扩展名,如果有子目录,则写上目录名,如:
load->view('welcome_message');
//echo 'user---->index';
//$this->load->view('user_index'); //加载/views/use_index.php视图
//$this->load->view('user/index'); //加载/views/use/index.php视图
//还可以分别加载header和主体
$this->load->view('header');
$this->load->view('user/index');
//分配变量
//$this->assign('key','value'); // smarty中分配变量
// 分配单独的变量
//$this->load->vars('title','这是标题');
$list=array(
array('id'=>1,'name'=>'V-jack','email'=>'[email protected]'),
array('id'=>2,'name'=>'V-tom','email'=>'[email protected]'),
array('id'=>3,'name'=>'V-john','email'=>'[email protected]'),
);
$data['title']='这是标题';
$data['list']=$list;
$this->load->var($data);
//$this->load->view('user_index');
$this->load->view('user/index');
}
2,视图中可以直接写使用原生php
3,推荐使用以下方法
<h2><?=$title."[user_index.php]"?></h2>
<?
//不推荐的写法
echo "<h2>不推荐的写法</h2>";
echo "<table border='1'>";
echo "<tr><th>1编号</th><th>姓名</th><th>邮箱</th></tr>";
foreach ($list as $key=>$value) {
echo "<tr>";
echo "<td>{$value['id']}</td>";
echo "<td>{$value['name']}</td>";
echo "<td>{$value['email']}</td>";
echo "</tr>";
}
echo "</table>";
?>
<h2><?="推荐的写法"?></h2>
<table border='1'>
<tr>
<th>2编号</th>
<th>姓名</th>
<th>邮箱</th>
</tr>
<? foreach($list as $item): ?>
<tr>
<td><?=$item['id'] ?></td>
<td><?=$item['name'] ?></td>
<td><?=$item['email'] ?></td>
</tr>
<? endforeach; ?>
</table>
兄弟连PHP视频CI框架(CodeIgniter)-04-超级对象
...
----->超级对象,就是控制器对象
当前的控制器对象,提供了很多属性:
var_dump($this);
var_dump($this->load);
...
$this->load属性,装载器,提供了很多属性,可以用来加载各种类,如视图,变量,文件等。
装载器类的实例:system/core/loader.php
装载器类提供很多方法,如:
view() 装载视图
vars() 分配变量到视图
database() 装载数据库操作对象
model() 装载模型对象
helper()
public function index()
{
// 打印控制器对象,超级对象(CI主要依赖这个对象)
var_dump($this);
//load对象,CI提供的装载器
var_dump($this->load)
/*
//CI会自动实例化一个CI_Loader的对象,放在超级对象的属性中
//下面的代码只是帮助大家理解$this->load属性
$obj=new CI_loader(); ///system/core/Loader.php
$this->load=$obj;
$this->load->view(); //用的是核心中这个方法public function view($view, $vars = array(), $return = FALSE)
*/
兄弟连PHP视频CI框架(CodeIgniter)-04- CI超级对象中的uri
//$this->p($this->uri); //是CI_URI类的实例,在核心中的system/core/uri.php
// https://aub.pub/00ci/index.php/welcome/index/id/7
echo $this->uri->segment(0)."<br>"; // 空
echo $this->uri->segment(1)."<br>"; // welcome
echo $this->uri->segment(2)."<br>"; // index
echo $this->uri->segment(3)."<br>"; // id
echo $this->uri->segment(4)."<br>"; // 7
//需要添加p方法
public function p($data=null) {
if (empty($data)) {
return false;
}
echo '<pre>';
print_r($data);
echo '</pre>';
}
CI里传参数方式:
CI里传参数方式:
index.php/welcome/index/id/5/name/jack
(=?id=5&name=jack)
CI中如何取这些参数?分段获取。
$this->uri->segment(4); // 可以获取到5
index.php/welcome/index/7
$this->uri->segment(3); // 可以获取到7
也可以直接引用
public function index($aa=0,$name='')
{
echo $aa."<br>";
echo $name."<br>";
}
welcome/index/7/jack
-》7,jakck,
总结:
CI中分段获取参数
segment(n)用于获取url中的第n个参数(值)
传统的URL写法:入口文件.php/控制器/动作/参数1/值1/参数2/值2
CI中的URL写法:入口文件.php/控制器/动作/值1/值2
echo $this->segment(3); //值1
echo $this->segment(4); //值2
index.php/控制器/index/7/jack
public function index($p=0,$name="") {
echo $p; // 输出7
echo $name; // 输出jack
}
兄弟连CI框架视频教程-06,CI超级对象中的input输入类
$this->input,输入类
是CI_Input类的实例,system/core/Input.php
CI_Input类提供方法:
$this->input->post('username'); // $_post['username']
$this->input->server('DOCUMENT_ROOT'); // $_SERVER['DOCUMENT_ROOT']
$this->input->server('REMOTE_ADDR'); // $_SERVER['REMOTE_ADDR']
通过前一种方式访问,Ci已经帮我们做了一些安全处理
$this->p($this->input);
//$this->p($_SERVER);
...
暂时先介绍这三个超级对象:load,uri,input
+++
在视图中使用超级对象
在视图中,直接用$this来访问超级对象中的数据属性,原理就是CI就是把视图include进来了。
<? echo $this->input->server('REMOTE_ADDR'); ?>
07,在CI中的数据库操作(1)
https://www.php.cn/code/6299.html
1,修改配置:applicationconfigdatabase.php
2,操作数据库 将数据库访问对象,装载到超级对象的属性中
$this->db //装载数据库操作类
$this->load->database();
$this->load->database($db); //也可以加参数,默认为default
$res=$this->db->query($sql); //返回对象 // mysql_query();
$users=$res->result(); //返回数组,数组里面是一个一个的对象
$users=$res->result_array(); //返回二维数组,数组中是一个一个的关联数组
$users=$res->row(); //返回第一条数据,直接是一个对象
用对象传递数据
public function showusers(){
//装载数据库操作类
$this->load->database();
//装载成功后,会放入超级对象的属性中,默认属性名是db
//var_dump($this->db); //$this->p($this->db); //
$sql='select * from ty_user';
$res=$this->db->query($sql); //返回对象 // mysql_query();
//var_dump($result); //$this->p($res); //返回值是一个类的对象
// 用对象传递数据
$users=$res->result(); //返回数组,数组下面是一个一个的对象
//mysql_fetch_assoc(); //关联数组
//mysql_fetch_object(); //返回对象
$data['user_list']=$users;
$this->load->view('user/showusers',$data);
// foreach ($users as $row) {
// echo $row->user_id." | ";
// echo $row->user_name." | ";
// echo $row->user_email." | ";
// echo "<br>";
// }
}
//视图showusers中调用
<table border='1'>
<tr>
<th>编号</th>
<th>姓名</th>
<th>邮箱</th>
</tr>
<? foreach($user_list as $row): ?>
<tr>
<td><?=$row->user_id; ?></td>
<td><?=$row->user_name; ?></td>
<td><?=$row->user_email; ?></td>
</tr>
<? endforeach; ?>
</table>
用二维数组传递数据
public function showusers(){
//装载数据库操作类
$this->load->database();
//装载成功后,会放入超级对象的属性中,默认属性名是db
//var_dump($this->db); //$this->p($this->db); //
$sql='select * from ty_user';
$res=$this->db->query($sql); //返回对象 // mysql_query();
//var_dump($result); //$this->p($res); //返回值是一个类的对象
// 用二维数组传递数据
$users=$res->result_array(); //返回二维数组,数组中是一个一个的关联数组
//mysql_fetch_assoc(); //关联数组
//mysql_fetch_object(); //返回对象
$data['user_list']=$users;
$this->load->view('user/showusers',$data);
}
//视图showusers中调用
<table border='1'>
<tr>
<th>编号</th>
<th>姓名</th>
<th>邮箱</th>
</tr>
<? foreach($user_list as $item): ?>
<tr>
<td><?=$item['user_id'] ?></td>
<td><?=$item['user_name'] ?></td>
<td><?=$item['user_email'] ?></td>
</tr>
<? endforeach; ?>
</table>
08,在CI中的数据库操作(2)
https://www.php.cn/code/6302.html
参数绑定
$sql="select * from ty_user where name=?";
$this->db->query($sql,$name);
//如果有多个问号时,需要传入一个索引数组
$data[0]='lili'; //$name='lili';
$data[1]='123';
$sql="insert into ty_user (name,password) value (?,md5(?))";
$bool=$this->db->query($sql,$data);
表前缀
'dbprefix' => 'ty_',
'swap_pre' => 'swap_',
只需要把这两个配置成一样即可。
说明:代码中全部写成【swap_pre】即可,CI会自动把前缀换成【dbprefix】
db的自动加载
//配置自动加载db
application/config/autoload.php
$autoload['libraries']=array('database');
//$this->load->database(); //配置自动加载后,就不需要这一行了
受影响行数
$this->db->affected_rows();
自增id
$this->db-insert_id();
测试代码
public function add() {
$this->load->database();
$sql="insert into ty_user (user_id,user_name,user_pwd,user_email) values (200,'mary',md5('mary'),'[email protected]')";
$bool=$this->db->query($sql);
if ($bool){
//mysql_affected_rows
//
echo '受影响行数'.$this->db->affected_rows();
echo '自增id:'.$this->db-insert_id();
}
}
public function update() {
//配置自动加载db
// application/config/autoload.php
// $autoload['libraries']=array('database');
// $this->load->database(); //配置自动加载后,就不需要这一行了
//参数绑定
//$name=$this-input->post('name');
$data[0]='lili'; //$name='lili';
$data[1]='123';
$sql="insert into ty_user (name,password) value (?,md5(?))";
$bool=$this->db->query($sql,$data);
if ($bool){
//mysql_affected_rows
echo '受影响行数'.$this->db->affected_rows();
echo '自增id:'.$this->db-insert_id();
}
}
1-9CI中的AR(数据库增、删、改、查)
https://www.php.cn/code/6306.html
1,确保配置文件【application/config/database.php】中,
$active_record=TRUE
2,application/config/autoload.php
$autoload['libraries']=array('database');
3,在配置文件中,正确配置表前缀后,会自动添加。
三个方法:get,insert,update,delete
$res=$this->db->get('表名'); //表名不用加前缀,返回结果集对象
$res->result()
$bool=$this->db->insert('表名',关联数组);
$bool=$this->db->upate('表名',关联数组,条件);
$bool=$this->db->delete('表名',条件);
测试代码
测试代码
$this->db->get('表名'); //表名不用加前缀,返回结果集对象
// Get
$res=$this->db->get('user');
//var_dump($res);
foreach ($res->result() as $item) {
echo $item->name;
echo '<br>';
}
// insert
$data=array{
'name'=>'mary',
'password'=>md5('mary'),
}
$bool=$this->db->insert('user',$data);
var_dump($bool);
//update
$data=array(
'emain'=>'[email protected]',
'password'=>md5('12345'),
);
$bool=$this->db->upate('user',$data,array('id'=>3));
var_dump($bool);
//delete
$bool=$this->db->delete('user',array('id'=>2));
var_dump($bool);