当前位置: 首页 > 工具软件 > awesome-ci > 使用案例 >

CI学习笔记

夹谷晋
2023-12-01

参考资料:LAMP兄弟连CI视频教程


8、数据库操作,query方式(一般情况下CI的AR模型可以搞定,复杂情况用这种方式):


//修改配置文件
\application\config\database.php


//装载数据库操作类:
$this->load->database();
//装载成功后中,会放入超级对象的属性中,默认属性名是db
//var_dump($this->db);


$sql = 'select * from blog_user';
$res = $this->db->query($sql);
//var_dump($res);//返回值是一个对象
$users = $res->result();//返回数组,数组中是一个一个的对象
$users = $res->result_array();//返回二维数组,数组中是关联对象
$users = $res-row();//返回第一条数据,直接是一个对象
//echo '<pre>';
//var_dump($users);


//mysql_fetch_assoc();//关联数组
//mysql_fetch_object();//返回对象


参数绑定
$sql = 'select * from blog_user where name=?';
$this->db->query($sql, $name);
//如果有多个问号,需要传入一个索引数组
$sql = 'insert into blog_user (name, password) values (?, md5(?))';
$data[0] = 'lili';
$data[1] = '123';
$bool = $this->db->query($sql, $data);
if($bool)
{
echo '受影响的行数:'.$this->db->affected_rows();
echo '自增ID:'.$this->db-insert_id();
}


表前缀:
//修改配置文件
\application\config\database.php
$db['default']['dbprefix'] = 'blog_';
$db['default']['swap_pre'] = 'blog_';
将dbprefix和swap_pre配置为一样,代码中,直接硬编码表前缀就行了,如果以后项目数据库表前缀发生变化,只需要修改$db['default']['dbprefix'] = 'new_',代码中的blog_会自动替换为new_;


db的自动加载:
不需要在每个超级对象中写$this->load->database();
在\application\config\autoload.php中
$autoload['libraries'] = array('database');




$data['user_list'] = $users;
$this->load->view('user/showusers', $data);




/
AR模型(Active Record)
1、在database.php中确保$active_record为true
\application\config\database.php
$active_record = TRUE;
2、\application\config\database.php
在database.php中正确配置表前缀;
3、在\application\config\autoload.php中设置自动加载数据库
$autoload['libraries'] = array('database');
4、基本操作:
//查询
$res = $this->db->get('user');//表名不带前缀
$res->result();
//添加
$data = array(
'name'=>'mary',
'password'=>md5('123');
);
$bool = $this->db->insert('user', $data);
//更新
$data = array(
'email'=>'marry@gmail.com',
'password'=md5('12345'),
);
$bool = $this->db->update('user',$data,array('id'=>3));
//删除
$bool = $this->db->delete('user', array('id'=>2));
5、连贯操作
//select id,name from user where id>=3 order by id desc limit 2,3
$res = $this-db->select('id,name')
->from('user')
->where('id >=', 3) //默认是=,其它的话id后面一定要加空格
->limit(3,2) //跳过2条取3条,跟正常的SQL语句是反的
->order_by('id desc') //CI命名不用驼峰,用下划线
->get();
$res->result();
//CI中最后一条被执行的SQL语句
var_dump($this->db->last_query());
//where重点讲一下:
$res=$this->db->where('name', 'marry')->get('user'); //不加符号默认是=
$res=$this->db->where('name !=', 'marry')->get('user'); //加符号后面一定要跟一个空格(以便CI用正规匹配)
$res=$this->db->where(array('name'=>'marry'))->get('user'); //还可以是关联数组
$res=$this->db->where(array('name'=>'marry', 'id >'=>2))->get('user'); //关联数组中可以传多个条件 


复杂的查询,请用$this->db->query($sql, $data);//使用问题绑定参数





 扩展CI控制器------------------
1、在\application\core\目录下新建自已的控制器BNC_Controller.php
class My_Controller extends CI_Controlle r {
public function __construct() {
parent::__construct();

$CI =& get_instance();

$uid = getSession('admin_uid');
if(empty($uid)){
die('<script language="javascript" type="text/javascript">window.parent.location.href="'.$CI->config->site_url('login').'"</script>');
}
}
}
2、其它Controlloer继承My_Controller
注意:CI中要扩展某个核心类,先在system中找到该类,然后在application的对应目录下新建自己的类,继承该类就行,
比如要扩展Session类,那么先找到该类在system/libraries/中,再在appliation/libraries/中新建一个该类的子类
3、\application\config\config.php中修改
$config['subclass_prefix'] = 'My_';

// 模型------------------
1、在appliction/models/中新建user_model.php,注意文件名全小写;
2、class User_model extends CI_Model{//注意类名的首字母大写
3、在模型中新建方法获取数据,(在模型中,可以直接使用超级对象中的属性)
4、在超级对象中:
//加载模型,加载后将自动成为超级对象的属性
$this->load->model('User_model');
//调用模型获取数据
$list = $this->User_model->getAll();
//加载视图
$this->load->view('user/index', array{
'list'=>$list
});
5、模型加载时可以取别名
$this->load->model('User_model', 'user');
$list = $this->user->getAll();


// URL相关函数------------------
1、先load:$this->load->helper('url');
//也可自动加载
在\application\config\autoload.php中
$autoload['libraries'] = array('url');
2、
site_url('控制器/方法'); //定位到控制器中的action
base_url(); //根目录,跟入口文件index.php平缓的目录




// 路由------------------
application/config/routes.php
//默认控制器
$route['default_controller'] = "welcome"; 
//
http://loalhost/ci/index.php/news/20140622/4.html
$route['news/[\d]{6}/([\d]+)\.html'] = 'article/show/$1';
//隐藏入口文件
1、开户apache的rewirte模块,重启apache
\Apache2.2.21\conf\httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
2、在入口文件同级目录中放入一个.htaccess文件
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond $1 !^(index\.php|admin\.php|uploads|test|user_files|assets|static|robots\.txt)
    RewriteRule ^(.*)$ admin.php?/$1 [L]
</IfModule>




// 分页------------------
1、装载类文件
$this->load->library('pagination'); //装载成功后会有一个$this->pagination属性


2、设置配置项
//
$config['base_url'] = site_url('user/test');//注意先load:$this->load->helper('url');
//一共有多少条数据
$config['total_rows'] = 100;
//每页显示10条数据
$page_size = 10;
$config['per_page'] = $page_size;
//定制链接文字
$config['first_link'] = '首页';
$config['next_link'] = '下一页';
//分页的数据查询偏移量在哪一段上
$config['uri_segment'] = 3;


3、调用初始化方式 
$this->pagination->initialize($config);


4、取得偏移量
$offset = intval($this->uri->segment(3));//跟$config['uri_segment']对应
$sql = 'select * from blog_user limit $offset,$page_size';


5、显示上一页,下一页链接
$this->pagination->create_links();






// 文件上传------------------
1、手动创建好上传目录,否则会报错;
2、视图file.php
<body>
<form action="<?=site_url('user/upload')?>" method="post" enctype="'multipart/form-data">
<input type="file" name="pic" />
<input type="submit" value="上传" />
</form>
</body>
3、控制器user.php
public function file()
{
$this->load->helper('url');
$this->load->view('user/file');
}
public function upload()
{
$config['upload_path'] = './uploads';
$config['allowed_types'] = 'gif|jpg|png';
$config['file_name'] = uniqid();//新文件名
$this->load->libaray('upload', $config);
$this->upload->do_upload('pic');//对应表单中的pic


$data = $this->upload->data(); //上传的文件的信息







// session------------------
//存CI session
public function login()
{
1、生成一个随机不重复的字符串作为加密用的key
//echo md5(uniqid()); exit;
保存到application/config/config.php中
$config['encryption_key'] = 'sfsdafsadfasdfsadfdsf';
这样用户只能看到session中的数据(其实是cookie中的数据),但是不能修改
还可以更安全,让用户看不到session中的数据,只需要设置:$config['sess_encrypt_cookie'] = TRUE;


2、设置数据
$this->load->library('session');
$user = array('id'=>3, 'name'=>'jack');
$this->session->set_userdata('user', $user); //只能存键值对
//传统做法如下:
//session_start();
//$_SESSION['USER'] = $user;


//CI的session是放在cookie中的
//不要在这里获取刚放入的数据
//只有页面重新加载或跳转到别的url中,才能获取到

3、设置flash数据(一次性数据,取一次之后就会被CI销毁掉)
$this->session->set_flashdata('test', 'abcdedddddd');
}
//取CI session
public function show_session()
{
1、取数据
$this->load->library('session');
$user = $this->session->userdata('user');
var_dump($user);

2、取一次性数据,只能读取一次,
$test = $this->session->flashdata('test');
}


//验证码------------------
1、创建一个验证码文件夹captcha,与入口文件同级
2、
$this->load->helper('url');
$this->load->helper('captcha');
$vals = array(
'img_path' => './captcha/',//此目录需要手动创建
'img_url' => base_url().'/captcha/',
'img_width' => '150',
'img_height' => 30,
'expiration' => 7200 //指定了验证码图片的超时删除时间. 默认是2小时. 
    );


$cap = create_captcha($vals);//生成验证码
$this->load->view('user/test2', $cap['image']);//生成一个image标签在$cap['image']中


//验证码字符串在$cap['word']中
//先把验证码存到session中
$_SESSION['cap'] = $cap['word']
//验证时,对比$_SESSION['cap']就行


表单验证-----------------------
class Form extends CI_Controller {
 function index()
 {
  $this->load->helper(array('form', 'url'));
  //加载form_validation
  $this->load->library('form_validation');
  //设置验证规则
  $this->form_validation->set_rules('username', '用户名', 'required');
  $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email''); //可以设置多种规则
   
  if ($this->form_validation->run() == FALSE) //验证没通过
  {
$this->load->view('myform');
  }
  else
  {
$this->load->view('formsuccess');
  }
 }
}


<html>
<head>
<title>My Form</title>
</head>
<body>
<?php echo validation_errors(); ?>//所有错误信息
<?php echo form_open('form'); ?>
<h5>用户名</h5>
<input type="text" name="username" value="<?=set_value('username')?>"  size="50" />//set_value()可以自动填充数据
<?php echo form_error('username'); ?> //输出错误信息
<h5>Email Address</h5>
<input type="text" name="email" value="" size="50" />
<?php echo form_error('email','<spane class="error">','</span>'); ?> //输出错误信息,还可以替换掉错误信息前后默认的<p>标签并指定样式
<div><input type="submit" value="提交" /></div>
</form>
</body>
</html>





 类似资料: