您的位置:首页 > 其它

CI框架学习

2015-11-21 09:43 363 查看
CI框架学习
php在哪里都可以嵌入

CI控制器
CI超级对象
数据库访问

AR模型
如何扩展CI的控制器
模型

url相关函数
设置路由
分页
文件上传
session
验证码
表单验证

在php什么地方用memcache
一.数据库读出来的数据(select) 使用memcache缓存
二.在会话控制session 讲session写入memcache
1.会memcahe
2.session_set_save_handler()
3.php的session

uniqid()
生成一个唯一ID
*****************************************************************************

框架目录为入口文件所在目录
注意:
url 浏览器相同会进行缓存。。

CI框架
system:核心
index.php:入口文件 
application:应用

基于MVC 访问使用pathinfo格式
数据来自于模型.

控制器
CI_Controller
默认的控制器$route['default_controller'] = "welcome";
$route['404_override'] = '';
1.不需要加后缀,文件名小写。
2.所有的控制器,直接或间接接触CI_Controller类。
3.与类名相同的方法会被php当作构造方法。
4.外部访问必须是public
5.在url参数可以传到方法参数里  function index($a,$b){};
6.控制器不参入查询数据库。

CI的超级对象:控制器对象(自动实例化CI_Loader());
属性:
$this->load:装载器对象。 system/core/Loader.php
view() 装载视图
vars() 分配变量
database()
装载数据库操作对象。
model()    
装载模型,获取数据。
helper()  
装载帮助
library()
装载类库

$this->uri
是CI_URI类的实例 system/core/URI.php
CI_URI类提供方法;
segment(n);用于获取url中的第n个参数;

传统的url:入口文件.php/控制器/动作/参数1/值1/参数2/值2
CI: 入口文件.php/控制器/动作/值1/值2

$this->input
是CI_Input类的实例 system/core/Input.php
//会进行安全处理
CI_Input类提供方法;

$this->input->post('控件名',ture)    
//获取$_POST 过滤xss攻击,没有过滤和转义处理
$this->input->get('控件名')    
//获取$_get 没有过滤和转义处理。没过滤xss攻击
$this->input->server("REMOTE_ADDR")        //$_SERVER["REMOTE_ADDR"]
$this->input->cookie("");
...

视图
1.在控制器里加载视图,$this->load-view("user_index",$data); 加载根目录下的视图,("user\index");根目录user文件夹下的index 不写扩展名
2.在视图里分配变量。$this->load->vars("title","这是标题");再显示视图
<?php foreach ($todo_list as $item):?>

<li><?php echo $item;?></li>

<?php endforeach;?>

函数返回引用

在视图里中可以直接用$this来访问超级对象(include 视图的);
<?php
echo $this->input->server("SERVER_ADDR");
?>

model模型:
1.继承CI_Model
2.文件名小写,类名首字母大写。建议_model为后缀,防止与控制器冲突。
3.可以直接使用超级对象中的属性;
4.只允许在model模型里获取数据,通过控制器输出。
$this->load->model('Model_name');
$this->Model_name->function();

数据库访问
DB_driver.php
修改配置文件 application/config/database.php
//装载数据库操作
$this->load->database();
//装载成功后,数据库对象会在$this->db属性中
$res = $this->db->query($sql);
$res->result();//返回数组,数组中是一个一个的对象。对象用'->'调用
$res->result_array();返回二维数组,里面是关联数组
$this->db->insert_id(); 自增id
$this->db->affected_rows();受影响行数

$this->db->last_query();//最后一次执行的sql语句.
。。。

封装查询:(防sql注入)
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$this->db->query($sql, array(3, 'live', 'Rick')); (绑定参数)

安全表前缀:
$db['default']['dbprefix'] = 'blog_';
$db['default']['swap_pre'] = 'blog_'; 表前缀
配置为一样,代码中,直接硬编码表前缀就行,如果以后项目数据库表前缀发生改变。
只需要修改$db['default']['dbprefix'] = 'new_';代码中的blog_会自动替换为new_.

db的自动加载
$autoload['libraries'] = array('database');
不需要 $this->load->database();

AR模型
DB_active_rec.php
1.数据配置文件 $active_record = TRUE;  开启AR;
2.在配置文件中,配置表前缀后,会自动添加
$res = $this->db->get("表名");//返回结果集。
$res->result();
增删改:

$this->where('id',$id) //或者$this->where(array());
$this->db->insert('表名',关联数组);
$this->db->update('表名',关联数组的条件);
$this->db->delete("表名", 条件的关联数组);

查找:

$res = 
$this->db->select('id,name')
 ->from('表名')
 ->where('id  >=',3)  // 或者 where(array('name ='=>"mary","id"=2))
 ->limit(3,2) //跳过2条,取3条。 注意
 ->order_by('id desc')->get();

$this->db->last_query();//最近一次执行的sql语句.

扩展控制器:(制定自己的控制器基类)(对应的文件夹) 
application/core/MY_Controller.php
class MY_Controller extends CI_Controller {
public function __construct(){
parent::__construct();
//登录验证
//权限验证
...
}
}
别的控制器继承我们的自己的控制器(MY_Controller);
扩展library 类似

application/config/config.php
$config['subclass_prefix'] = 'MY_' 可以修改自定义前缀

url函数:
$this->load->helper('url');
//可以根据需要自动加载 autoload.php
site_url(控制器/方法):
//返回站点的URL, 如果在config.php 文件中指定了base_url会返回指定的值,否则自动获取

base_url()
//网址根目录,你可以用它指定文件的路径,像是image路径或者css路径

redirect() //转向指定的url
路由:

application/config/routes.php
//默认控制器
$route['default_controller'] = 'welcome';

$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
$route['404_override'] = '';

//index.php/news/312456/32.html 会被路由到article/show.
$route['news/\d{6}/\d+\.html']  = "article/show";

不规则的url可以路由到我们的控制器中

隐藏入口文件(伪静态)
开启apache的rewrite模块(httpd.config)
loadModule rewirte_module moules/mod_rewrite.so
重启服务器
在入口文件同级目录中,放入一个 .htaccess文件
内容如下:
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|robots\.txt)  
RewriteRule ^(.*)$ index.php/$1 [L]

分页:
$config['base_url'].="&pass_id=".$_GET['pass_id'];
config['enable_query_strings']  = TRUE;
$this->pagination->initialize($config);
$data['links'] = $this->pagination->create_links();
$this->load->view("article\show",$data);

在一些情况下你需要在 URL 中使用查询字符串:
index.php?c=products&m=view&id=345
在url里传递其他参数
可以在 application/config/config.php 文件中进行设置
$config['page_query_string'] = TRUE; //连接符会从/ 变为? 如果你使用查询字符串,那么就必须使用自己建立的 URL ,而且不能使用URL 辅助函数(或是其他生成 URL 的辅助函数,例如表单辅助函数),因为这些都是根据分段
URL 设计的。
$config['first_url'] = site_url('article/show/1').'/qhi/1/dhiwu/2';
$config['suffix'] = "/qhi/1/dhiwu/2";//参数传递

文件上传:
手动创建上传目录

SESSION:
d1c6074070e4f1f321b01aef1e01b7df// md5(uniquid())
默认放在cookie里
生成一个随机不重复的字符串作为加密用的Key,保存到application/config/config.php
$config['encryption_key'] = 'd1c6074070e4f1f321b01aef1e01b7df';
$this->load->library('session');//初始化 Session
$this->session->set_userdata();
在当前方法session里获取不到session
只能在其他的方法里获取$this->session->userdata();

session 配置在application/config/config.php中

一次性数据,只能读取一次
$this->session->set_flashdata(...);

验证码:
CAPTCHA 辅助函数
$this->load->helper('captcha');
session_start();
$_SESSION['cap'] = $cap['word'];

表单验证:
$this->load->library('form_validation');
$this->form_validation->set_rules('name','用户ming');
$bool =$this->form_validation->run();

if($bool){
调用模型保存数据到数据库
}else{
//显示错误信息
$this->load->view('user/add'); //重新加载视图
}
在视图echo form_error('name');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: