php CI框架基础知识
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php CI框架基础知识相关的知识,希望对你有一定的参考价值。
一、 CI框架的MVC导图
二、 CI框架目录文件介绍
(1)index.php 单入口
整个框架对外暴露的唯一访问文件
(2)application 应用文件(放置用户信息,用户控制器、用户模板等)
application/cache ---> 缓存
application/config ---> 配置文件
application/controllers ---> 控制器
application/core ---> 核心文件
application/errors ---> 错误(数据库连接错误等)
application/helpers ---> 辅助函数文件夹
application/hooks ---> 钩子文件
application/language ---> 语言
application/libraries ---> 通用类库
application/logs ---> 日志
application/models ---> 模型
application/third_party ---> 第三方类库
application/views ---> 视图
(3)system 系统文件
system/core ---> 核心包(系统初始化、框架控制器等)
system/database ---> 数据库操作
system/fonts ---> 验证码、字体文件
system/helpers ---> 辅助函数
system/language ---> 语言包
system/libraries ---> 通用类库(包含购物车、表单验证、加密等)
三、 CI框架中的文件操作
(1)application/config/routes.php (路由配置文件)
① 代码说明
1. $route[\'default_controller\'] = \'home\';
//设置默认 控制器为home,此时不需输入控制器名可直接访该控制器下的indexp.php文件 输入:http://www.tabb.com/ci/
注释:在CI.3版本后,不支持设置例如admin/home,这样在文件夹下的控制器文件路径,可参考相关修改方法,修改system/core/Route.php中的相关设置即可
(2)application/controllers/home.php (自己创建的控制文件)
① controllers中文件的基础代码说明
1.页面首行代码:
defined(\'BASEPATH\') OR exit(\'No direct script access allowed\');
// 判断是否是单入口进入,如果不是,则停止访问
2. 设置类
class Home extends CI_Controller {
//定义类Home继承自CI_Controller 类名Home的首字母必须大写
public function index() //定义方法名为index
{
echo "home";
}
public function hello() //定义方法名为hello
{
echo "hello world";
}
}
3. 载入视图
public function index()
{
$this->load->view(\'news/header\');
$this->load->view(\'news/home\');
//载入view文件中news文件夹中的home.php文件,如果文件不是php格式,需要补全文件名
$this->load->view(\'news/footer\');
}
//支持同时载入多个文件进行显示,如上同时载入3个文件显示
4. 载入数据
public function index()
{
$data[“title”]=”这是标题”;
$this->load->view(\'news/header\',$data); // 将数据作为第二个参数传递进去即可
$this->load->view(\'news/home\');
$this->load->view(\'news/footer\');
}
在views页面中接受数据变量<h2><?php echo $title ?></h2>,值得注意的是,只要第一个header视图中注入了变量,后续两个视图无需再次注入变量,也可使用相应的变量
5. 加载辅助函数
$this->load->helper(\'url\'); //引入辅助函数url,具备以下三个方法
echo site_url(); //获取当前的url
echo base_url(); //获取根目录的url
redirect(\'home/hello\'); //跳转指定的controller函数
6. 设置自动加载辅助函数
在application/config/autoload.php 文件下,找到$autoload[‘helper’]=array(‘url’); ,将需要加载的辅助函数名,传入数组中,即可实现全局都自动加载该辅助函数
7. 载入框架中的类(此处以表单验证为例)
public function index()
{
$this->load->helper(\'form\'); //加载表单验证辅助函数
$this->load->view("index/home.html");
}
public function send()
{
//载入表单验证类
$this->load->library("form_validation");
//设置规则
$this->form_validation->set_rules(\'title\', \'标题\', \'required|min_length[5]\');
//此处传递的三个参数,”title”是需要验证的表单的name,”标题”是提示语,\'required|min_length[5]\'是验证规则,使用|分割,可以写入多个规则
$this->form_validation->set_rules(‘cid’, \'栏目\', \'required|min_length[5]\');
//设置多个表单验证
//执行验证
$status = $this->form_validation->run(); //验证结果为bool值
if ($status) {
echo "数据库操作";
} else {
$this->load->helper(\'form\');
$this->load->view("index/home.html"); //不通过加载视图,返回提示信息
}
}
视图页面代码如下:
<form action=\'<?php echo site_url("index/home/send")?>\' method="post">
//此处表单发送的地址是上述的home中的send方法
<table>
<tr>
<th>表单验证</th>
</tr>
<tr>
<td>
输入标题:<input type="text" name="title" value="<?php echo set_value(\'title\') ?>"> //set_value(),该方法可以将上一次提交的数值,重新设置在页面上
<?php echo form_error(\'title\',’<span>’,’</span>’)?>
//输出“form”辅助函数的提示内容,第一个参数是表单name,第二个是以什么开始,第三是以什么结束
</td>
</tr>
</table>
<input type="submit" value="提交">
</form>
设置数组形式传递验证规则:
新建文件:cation/config/form_vadication.php (必须使用这个文件名)
设置参数
$config=array(
‘test’ =>array(
array(
‘field’=> ‘title’,
‘label’=>’标题’,
‘rules’=>’ required|min_length[5]’
),
array(
‘field’=> ‘cid’,
‘label’=>’栏目’,
‘rules’=>’ required|min_length[5]’
)
)
)
在表单验证的方法中传入该变量
$this->form_validation->run(“test”);
② ci的url路径说明
http://www.tabb.com/ci/index.php/home/hello
根目录下的单入口文件index.php再访问application/controllers中的视图控制文件home,再执行其中的hello方法,显示在页面上,如果方法名为index则url中可以省略该名字
③ CI中的图片上传并预览
public function send() //设置上传图片的函数
{
$config[\'upload_path\'] = \'./uploads/\'; //配置上传图片的路径,按照路径创建文件夹
$config[\'allowed_types\'] = \'gif|jpg|png|jpeg\'; //配置允许上传的图片格式
$config[\'max_size\'] = \'10000\'; //配置允许上传图片的最大容量
$config[\'file_name\'] = time() . mt_rand(1000, 9999); //配置图片名,为了防止图片名重复,此处使用时间戳加随机数的方法命名图片名
……. //配置条件可以写很多,查阅手册按需填写即可,例如还可以添加最大宽度、高度等
$this->load->library(\'upload\', $config); //引入上传类,并传递配置参数
$status = $this->upload->do_upload(\'fileName\'); //应用包含上述配置的上传类方法,\'fileName\'为type=‘file’的input框的name,在此上传处执行上述上传方法,上传状态返回bool值
if (!$status) { //如果没有上传图片,$status为false
error(\'必须上传图片\'); //执行一个error函数
}
$wrong = $this->upload->display_errors(); //此处为传递图片的要求与设置的配置要求不相符时的bool返回值
if ($wrong) { //如果传递图片的要求不符合设置要求
error($wrong); //执行一个error函数
}
$info = $this->upload->data(); //上述都不执行,则可获取传递的成功的图片信息
p($info);
die;
设置上传缩略图:(参考手册配置属性)
$arr[\'source_image\'] = $info[\'full_path\']; //引入之前上传的图片路径
$arr[\'create_thumb\'] = FALSE; //创建预览图像
$arr[\'maintain_ratio\'] = TRUE; //保持缩放纵横比
$arr[\'width\'] = 200; //设置宽
$arr[\'height\'] = 200; //设置高
$this->load->library(\'image_lib\', $arr); //引入缩略图类,并传入参数
$status = $this->image_lib->resize(); //执行缩略动作,返回执行状态
if (!$status) {
error("缩略图制作失败");
}
}
(3)application/models/home_model.php (数据库模型操作文件)
① 引入一个数据模型方法
在home_model.php文件中输入如下代码
class Home_model extends CI_Model //表示类继承自CI类CI_Model
{
public function add() //声明一个model的方法,该方法的名称为add
{
echo "这里是数据库模型";
}
}
在application/controllers/home.php中输入如下:
public function modelTest() //在modelTest方法中进行操作
{
$data["title"] = "这是标题";
$this->load->model(\'home_model\', \'home\'); //载入model文件,并将下述引用中的”home_model”名称改为”home”这样的简单别名
$this->home->add(); //引入上述载入model文件中的add方法
$this->load->view(\'home.php\', $data); //展示视图
}
②引入数据库,MVC模型示例
1.在application/config/database.php中进行配置
$active_group = \'default\'; //设置需要展示的数据库名称与$db[]中的名称相对应
$query_builder = TRUE; //设置是否使用system/database/db_query_builder.php中的方法
$db[\'default\'] = array( //设置数据库信息
\'dsn\' => \'\',
\'hostname\' => \'localhost\', //数据库服务器地址
\'username\' => \'root\', //登录账号的名称
\'password\' => \'root\', //登录账号的密码
\'database\' => \'test\', //具体的数据库名称
\'dbdriver\' => \'mysqli\',
\'dbprefix\' => \'\', //字段前缀,如果此处设置,后续操作字段时可不写前缀
\'pconnect\' => FALSE,
\'db_debug\' => (ENVIRONMENT !== \'production\'),
\'cache_on\' => FALSE,
\'cachedir\' => \'\',
\'char_set\' => \'utf8\',
\'dbcollat\' => \'utf8_general_ci\',
\'swap_pre\' => \'\',
\'encrypt\' => FALSE,
\'compress\' => FALSE,
\'stricton\' => FALSE,
\'failover\' => array(),
\'save_queries\' => TRUE
);
2.在application/config/autoload.php 中配置自动载入数据库
$autoload[\'libraries\'] = array(\'database\'); //开启自动载入数据库
3.在application/models/home_model.php 中进行相关操作
public function test($data)
{
$this->dbtest=$this->load->database(\'testbatabase\',TRUE); //手动加载数据库,并指定为属性dbtest
$this->db->insert("007_news", $data); 在表’007_news’中插入数据
}
4.在application/controllers/home.php 中控制数据操作
$data = array(\'cname\' => $this->input->post(\'cname\')); //获取变量的值,此处使用input输入类来获取数据,是为了安全,进行的预处理
$this->load->model(\'home_model\', \'home\'); //执行对应的model文件
$this->home->test($data); //将获取的值,注入model的方法中
此处代码优化:
由于$this->load->model(\'home_model\', \'home\');载入数据模型这段代码在,controllers/home.php文件中许多函数方法都会用到,比如update,delete等,所以可以将其写入构造函数中,后续不需要写这段载入代码,即可直接调用该模型
public function __construct( ) //载入构造函数
{
parent::__construct(); //载入父级的构造函数
//需要在构造函数中执行的代码,必须写在父级构造函数载入后的代码下
$this->load->model(\'home_model\', \'home\'); //载入的代码
}
public function index()
{
$this->home->test(); //由于此类的构造函数载入了model,所以此处无需载入model代码,也能调用该model中的方法
$this->load->view(\'home.php\');
}
5.在application/config/config.php 中更改防跨站处理
$config[\'global_xss_filtering\'] = TRUE; //将此处的false改为true;可选择修改,改为true表示默认阻止post、get等的跨站请求
③ application/models/home_model.php中的数据库操作语句
1.查询数据
$data = $this->db->where(array(\'id\' => \'1\'))->get(\'007_class_news\')->result_array();
where中传递查询条件,最好传递一个数组
get获取需要查询数据的表名
result_array()返回数据格式为数组,不写array,则返回对象格式的数据
p($data); //p函数是设置在system/core/common.php中的自定义数组打印函数
function p ($arr) {
echo "<pre>";
echo print_r($arr);
echo "</pre>";
}
die; //终止代码执行
使用get_where()将where和get合并成一步操作:
$data = $this->db->get_where((\'007_class_news\' , array(\'id\' => \'1\'))->result_array();
2. 修改数据
public function update_home( $data, $cid ){
$this->db->update(‘007_class_news’ , $data , array(‘cid’=>$cid));
}
update方法中需要传递三个参数:
”007_class_news”是需要修改数据的表的名称
$data是需要修改的数据,需传递一个关联数组,字段名和数值
array(‘cid’=>$cid)是修改条件,此处$cid是传递的值,必须与表中的值一致,才修改该条数据
3. 添加数据
$this->db->insert(‘007_class_news’ , array(‘cname’=>$cname));
”007_class_news”是需要添加数据的表的名称
array(‘cname’=>$cname)是添加的数据,以关联数组形式传递
4. 删除数据
public function del_home($cid ){
$this->db-> delete (‘007_class_news’, array(‘cid’=>$cid));
}
”007_class_news”是需要删除数据的表的名称
array(‘cid’=>$cid)是删除条件,此处$cid是传递的值,必须与表中的值一致,才删除该条数据
(4)system/core/common.php (此处设置全局可调用的自定义函数)
以上是关于php CI框架基础知识的主要内容,如果未能解决你的问题,请参考以下文章