ci 基礎知識

//創建虛擬主機php

二、下載完畢後,解壓,並將其複製粘貼到程序的主目錄(d:/wamp/xmall/),而後再將其重命名爲"myshop",那麼"myshop" 就做爲ci項目名稱存在了

三、爲咱們的ci項目搭建一個虛擬主機:

首先,找到httpd.conf配置文件,開啓虛擬主機的配置

而後,找到httpd-vhosts.conf配置文件,進行虛擬主機的配置

最後,找到hosts配置文件,爲咱們的ci項目添加dns映射

四、在瀏覽器中輸入 http://www.myshop.com/index.php 回車,如能看到以下歡迎界面,則表示咱們的ci項目安裝成功了css

 

 

1 創建控制器的時候是外小內大
也就是:注意書寫習慣,2 注意加載視圖的時候的數組參數html

blog.php (控制器名稱)
class Blog extends CI_Controller{

//調用視圖,注意:視圖必須用php結尾,而且若是有數據傳入,視圖只能識別出數組的名字$title,不能識別$data['title'];
$this->load->view('blogview','$data');
}
不能以_開頭,這是私有方法正則表達式


視圖:
1 若是在控制器中加載了視圖,那麼直接寫控制器的加載方法:
$this->load->view(視圖); //注意:視圖直接寫名字不帶後綴,若是是在文件夾下,那麼應該是
$this->load->vlew(文件夾/視圖);
視圖能夠屢次加載,例如頭部和尾部分開
2 視圖中直接使用php原生代碼
3 給視圖分配變量
$list =array(
array('id'=>1,'name'=>'jack','email'=>'jack@163.com'),
array('id'=>2,'name'=>'lili','email'=>'lili@163.com'),
array('id'=>3,'name'=>'lucy','email'=>'lucy@163.com'),
);
$data['title']='數組標題';
$data['list']=$list;
$this->load->vars($data);
4 推薦使用 ,包括if ,if else 等等,由於這是模板專用寫法
<?php foreach($list as $item) : ?>
<?=$item['name']?>
<?php endforeach?>


$this->load->vars('key','value');
<?php
class User extends CI_Controller
{
public function index()
{
//給視圖分配變量
$this->load->vars('title','這是標題');
//加載視圖
$this->load->view('user/index');
}
}
?>

創建文件夾user/index的源代碼
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<?php
echo '這是user文件夾下面的文件';
echo "<br/>";
echo $title;
?>
</body>
</html>


注意:要先傳遞數組,再進行頁面的渲染
1 控制器的寫法 思路:設置變量,分配變量,加載視圖
<?php
class User extends CI_Controller {

public function index()
{
//給視圖分配變量
//$this->load->vars('title','這是標題');
//加載視圖
$list =array(
array('id'=>1,'name'=>'jack','email'=>'jack@163.com'),
array('id'=>2,'name'=>'lili','email'=>'lili@163.com'),
array('id'=>3,'name'=>'lucy','email'=>'lucy@163.com'),
);
$data['title']='數組標題';
$data['list']=$list;
$this->load->vars($data);
$this->load->view('user/index');
}


}
?>sql

2 視圖文件寫法 思路:獲取變量,用foreach循環出來
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<?php
echo '這是user文件夾下面的數據';
echo "<br/>";
echo $title;
?>
<table border="1">
<tr>
<td>編號</td>
<td>姓名</td>
<td>郵件</td>
</tr>
<?php foreach ($list as $item): ?>
<tr>
<td><?=$item['id']?></td> // 注意:等價於<?php echo item['id']?>
<td><?=$item['name']?></td>
<td><?=$item['email']?></td>
</tr>
<?php endforeach;?>
</table>
</body>
</html>數據庫



CI的超級對象(controller 對象)
也就是當前的控制器對象$this
打印下 var_dump($this)

$this->load (裝載器)
打印下屬性var_dump($this->load) \system\core
文件在庫文件core下面能夠查看,CI會自動實例化一個Loader對象,來放在超級對象中
$this->load,就是裝載器類,實際上例如$this->load->view()
至關於 $obj=new CI_Loader();
$this->load=$this
$this->load->view()等價於new CI_Loader()->view();

$this->load提供的方法包括:
view()方法 裝載視圖
vars()方法 分配變量到視圖
database() 裝載數據庫操做對象
model() 裝載模型對象
helper() 加載幫助對象
數組

$this->uri (URL解析相關的對象) \system\core
提供的方法包括:
1 首先傳統的get傳參數方式是怎樣的
http://localhost/ci/index.php/welcome?id=5
而後echo $_GET['id'],那麼就輸出了5

2 如今是pathinfo模式,那麼如何獲取到id?
http://localhost/ci/index.php/welcome/index/id/1
那麼就是用uri
$this->uri->segment(3);
那麼獲取到的就是id


$this->input
提供方法:
$this->input->post('username'); 獲取到post過來的數據 $_POST['username'],爲何用這個,由於比較安全
$this->input->server('REMOT_ADDR'); 獲取IP地址 $_SERVER['REMOTE_ADDR']
$this->input->server('DOCUMENT_ROOT'); 獲取根目錄信息 $_SERVER['DOCUMENT_ROOT']

注意:在視圖中,也能夠直接使用$this來獲取超級對象



數據庫訪問
1 修改配置文件 application\config\database.php,裏面默認是default


1 裝載數據庫操做類
2 開始使用數據庫操做類
3 執行數據庫語句得到結果集類
4 執行結果集類方法返回結果


顯示:
public function showusers() //包含兩步:1 獲取數據 2 傳遞給視圖
{


//裝載數據庫操做類,由於不是必要的,因此是有選擇地裝載!
$this->load->database(); //若是你想操做多個數據庫,那麼就選擇$this->load->database('另外一個數據庫');
//顯示這個操做類,裝載成功後,會放入超級對象的屬性中,默認屬性名是db
//var_dump($this->db);
$sql='select * from xqcx ';
$res = $this->db->query($sql); //返回對象
//var_dump($res);
$result=$res->result(); //返回數據
//var_dump($result); //打印數據


//把數據傳遞到視圖中去
$data['list']=$result;
%this->load->view('user/index',$data);


}

增長/刪除/修改/查詢: 使用最多見的query方法
public function add(){
$this->load->database();
$sql="insert into xqcx(ssxq, xqname) values('個人小區','測試小區')";
$bool=$this->db->query($sql);
if($bool)
{
echo '受影響行數'.$this->db->affected_rows();
echo '自增id'.$this->db->insert_id();
}
}

public function update(){
$data[0]=$this->input->post['name'];
$data[1]=$this->input->post['password'];
$sql="update xqcx(ssxq,xqname) values(?,?)";
$bool=$this->db->query($sql,$data);
if($bool)
{
echo '受影響行數'.$this->db->affected_rows();
echo '自增id'.$this->db->insert_id();
}
}




注意:若是每次都加載數據庫 $this->load->database(); 很麻煩的話,那麼就去配置文件裏面修改
application\config 下面的antoload.php裏面
$autoload['libraries'] = array('database');


AR模型
AR模型的引入是爲了簡化對基礎數據庫的操做,開啓AR模型是指
//$autoload['libraries'] = array('database'); 先開啓自動加載數據庫
//active_group=true; 默認狀態下是開啓AR模型的


//1 查詢
public function get(){
$query = $this->db->get('xqcx'); //返回結果集對象
foreach ($query->result() as $item){
echo $item->ssxq;
echo '<br>';
//echo $item->xqname;
}
}

//插入
public function insert()
{
$data=array('ssxq'=>'測試小區1','xqname'=>'小區名稱');
$bool=$this->db->insert('xqcx',$data);
if($bool)
{
echo '插入成功!';
}else
{
echo '插入失敗!';
}
}


//更新第334行的數據
public function update()
{
$data=array('ssxq'=>'測試小區2','xqname'=>'小區名稱');
$bool=$this->db->update('xqcx',$data,array('id'=>334));;
if($bool)
{
echo '更新成功!';
}else
{
echo '更新失敗!';
}
}

//刪除
public function delete(){
$bool=$this->db->delete('xqcx',array('id'=>334));
if($bool)
{
echo '刪除成功!';
}else
{
echo '刪除失敗!';
}
}


AR中的連貫操做,所謂的連貫操做,就是指應對複雜的SQL語句
public function ar(){
$query =$this->db->select('ssxq,xqname')
->from('xqcx')
->where('id >=',3)
->limit(2,3)
->order_by('id desc')
->get();
var_dump($query->result());
}


//注意:這個>號前面必定要有空格
//->limit(2,3) ,跳過3條取2條
//爲了便於比較,咱們查看下最後的一條查詢語句
//結果是 SELECT `ssxq`, `xqname` FROM (`xqcx`) WHERE `id` >= 3 ORDER BY `id` desc LIMIT 3, 2
//echo $this->db->last_query();


CI控制器的擴展
有什麼做用:例如,作登陸驗證
\www\ci\application\core 在這個下面寫上本身的控制器基類
自定義一個控制器,放在\www\ci\application\core 目錄下,名字叫作MY_Controller
<?php
class MY_Controller extends CI_Controller()
{
function __construct()
{
parent::__construct();
echo '測試控制器1';

//登陸驗證
//權限驗證
}
}
?>


而後在Controllers 文件夾下面新建一個newwelcome類來繼承我本身寫的控制器,注意:開頭都以MY_開頭

<?php
class Newwelcome extends MY_Controller{
public function index()
{
echo '123';
}
}
?>


模型
1 新建一個user模型,名字爲uer_model.php 內部類的命名方法爲User_Model ,注意:必定要小寫
2 CI Model類的方法其實至關簡單,主要是用來規範咱們的項目開發
1 構造方法
2 能夠引用超級對象$this->裏面的全部的類的方法
3 之後全部的$this->db方法都寫在裏面

完整的MVC方式怎麼寫?

1 建立模型
<?php
class User_Model extends CI_Model {

public function getAll()
{
$query=$this->db->get('xqcx');
return $query->result();
}
}
?>





2 控制器中加載模型

<?php
class User extends CI_Controller {

public function index()
{
//1 加載模型
$this->load->model('User_Model');
//2 調用模型中的方法獲取數據
$list=$this->User_Model->getAll();
//3 傳遞關聯數組給視圖
$this->load->view('user/usertest',array('list'=>$list));
}
?>


注意:也能夠給模型起別名,那麼User_Model 就被叫作user了
$this->load->modle('User_Model','user');
$this->user->getAll();

3 視圖顯示

<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<?php
var_dump($list);
?>
</body>
</html>



CI中有關URl的函數
有時候URL不能寫死,那麼怎麼辦,經過系統提供的URL相關函數來進行
快捷操做:複製當前行:CTRL+D
快速補全代碼,使用quicktext
注意:使用時語言設置成html
例如:dtd + ctrl enter 便可補全HTML代碼
例如:in + ctrl enter 便可補全input代碼




重要問題:
如何作好比登陸頁面的操做
1 在控制器中設計一個方法用來顯示視圖

public function loginshow()
{
$this->load->view('user/login');
}

2 在視圖中post數據到控制器中的另一個方法 ,注意:這邊寫的action 都是絕對路徑,因此要進行修改
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<meta name="Keywords" content="" />
<meta name="Description" content="" />
<link rel="stylesheet" href="style/.css" type="text/css" />
</head>
<body>
<form action="/ci/index.php/user/logininsert" method="post" >
name <input type="text" value="" name="name"/><br>
password <input type="password" value="" name="password" /><br>
E-mail <input type="text" value="" name="email" /><br>
<input type="submit" value="submit" />
</form>

</body>
</html>

3 在另一個方法中進行數據的操做,例如var_dump等等

public function logininsert()
{
var_dump($this->input->post('name'));

}


使用site_url函數進行簡化
目標site_url('控制器/方法'),設置url的訪問
1 首先加載helper裏面的URL,注意:關鍵是你在初始化的頁面進行加載這個helper
public function loginshow()
{
$this->load->helper('url');
$this->load->view('user/login');
}
2 使用site_url函數進行替換
原來<form action="/ci/index.php/user/logininsert" method="post" >
<form action="<?php echo site_url('user/logininsert')?>"

site_url表明的路徑是http://localhost/ci/index.php/



3 使用base_url作文件的上傳,設置訪問的路徑

base_url表明的路徑是http://localhost/ci/
創建一個uploads文件下,下面存放這張flash圖片
<img src="<?php echo base_url();?>uploads/flash.jpg" alt="" width="120" />


配置自動加載
D:\wampserver\wamp\www\ci\application\config
$autoload['helper'] = array('url');


設置路由 (能夠設置僞靜態)

路由的路徑:
配置文件:ci/application/config/routes.php
默認控制器:
$route['default_controller'] = "welcome";


規則:設置正則表達式,能夠定製URL
例如我想要的URL是http://localhost/ci/index.php/news/201309/4.html
個人實際控制器是article/show/$1
那麼我寫路由的規則就是
$route['news/[\d]{6}/([\d]+\.html)']='article/show/$1';神馬意思?不明白!!

如何去掉index.php?
必需要進入到Apache裏面,進行修改
複製裏面的,htaccess 文件,複製到CI的跟目錄下
去掉裏面的index,php

仍是出錯?
修改httpd.conf 文件,使其的rewrite屬性打開




設置分頁
//分頁顯示 ,注意:分頁類是最多見的類
//思路:1 調用分頁類而且正確顯示,獲取分頁類裏面的參數:1 偏移量 2 每頁數量
// 2 根據這兩個分頁量去生成SQL語句,應用到查詢 ,SQL語句的原型是select * from 表名 limit 偏移量 ,每頁數量
// 3 顯示出來數據
// 4 完善:1 查詢數據庫的全量而且賦值 2 作分頁的美化和優化 3 如何和model類結合來進行設置 4 顯示頁面的美化
// 那麼,其實設計的思路是分頁------->數據庫---------->顯示內容



public function fenye( )
{
//建立分頁對象而且初始化
$this->load->library('pagination');
$this->load->helper('url');

//配置分頁類文件,也就是超連接下面的url地址
$page_size=10;
$config['base_url'] =site_url('user/fenye');
$config['per_page']=$page_size;
$config['total_rows']=200;
$config['first_link'] = '首頁';
$config['last_link'] = '末頁';
$config['prev_link'] = '上一頁';
$config['next_link'] = '下一頁';
$this->pagination->initialize($config);

//作偏移量的設置,作數據庫語句的設置生成
$offset=intval($this->uri->segment(3));
$sql="select * from xqcx limit $offset ,$page_size ";
$query = $this->db->query($sql);
$result=$query->result();

//查詢出來的結果集和這個分頁的連接都傳遞到頁面上去
$data['user_result']=$result;
$data['links']= $this->pagination->create_links();
$this->load->view('user/fenye',$data);
}


前臺顯示:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<meta name="Keywords" content="" />
<meta name="Description" content="" />
<link rel="stylesheet" href="style/.css" type="text/css" />
</head>
<body>
<h1>分頁測試</h1>
<?php var_dump($user_result) ?>
<?php echo $links?>
</body>
</html>


文件上傳
1 須要前臺手動建立一個upload目錄,這個目錄是在根目錄的同級目錄下
2 顯示上傳頁面
public function file(){
$this->load->helper('url');
$this->load->view('user/file');
}


3 上傳頁面,作好action動做,注意配置 enctype="multipart/form-data"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<meta name="Keywords" content="" />
<meta name="Description" content="" />
<link rel="stylesheet" href="style/.css" type="text/css" />
</head>
<body>
<form action="<?php echo site_url('user/upload') ?> " method="post" enctype="multipart/form-data" >
<input type="file" name="pic" />
<input type="submit" value="上傳" />
</form>瀏覽器

</body>
</html>

4 在控制器中作上傳
public function upload(){
//配置當前的上傳參數
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png|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'];
}



session
ci的session 是放在cookie裏面的,最多不能放超過4K的數據
session 類通常是初始化之後就可使用了,時長5分鐘
public function getsession()
{
//生成隨機的字符串做爲加密用的key
//在這個以前,首先開啓配置文件中的加密key,路徑是www\ci\application\config
//echo md5(uniqid());exit;
//找到那一行,$config['encryption_key'] = '08eecdf63ec31d37a6ae1f24f11382ef';而後就能夠註釋掉
//注意,底下還有不少對於session的加密配置能夠修改
$this->load->library('session');
$user=array('id'=>3,'name'=>'jack');
$this->session->set_userdata('user',$user);
}


public function showsession()
{
$this->load->library('session');
$user=$this->session->userdata('user');
var_dump($user);

}



驗證碼

public function yanzheng()
{
$this->load->helper('captcha');
$this->load->helper('url');
$vals = array(
//'word' => 'Random word',
'word' =>rand(1000,9999),
'img_path' => './captcha/',
'img_url' => base_url().'captcha/',
'font_path' => './path/to/fonts/texb.ttf',
//'img_width' => '50',
//'img_height' => 30,
//'expiration' => 7200 圖片存在的時間
);
$cap = create_captcha($vals);
echo $cap['image'];
//var_dump($cap);
//傳遞圖片給登陸頁面來使用
//$this->load->view('index',array('cap'=>'$cap['image']'));

//如何驗證
//session_start();
//$_SESSION['cap']=$cap['word'];
}





表單輔助函數
注意:其實只須要一個insert方法就能夠了,不須要之前那麼複雜的add方法

public function logininsert()
{
//var_dump($this->input->post('name'));
$this->load->library('form_validation');
$this->form_validation->set_rules('name', '用戶名', 'required');
$this->form_validation->set_rules('password', '密碼', 'required');
$this->form_validation->set_rules('email', '郵箱', 'required|valid_email');
$bool=$this->form_validation->run() ;
if($bool){
//進行數據的判斷和驗證

}else{
$this->load->view('user/login');
}


}

至於前臺的頁面也要設計

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<meta name="Keywords" content="" />
<meta name="Description" content="" />
<link rel="stylesheet" href="style/.css" type="text/css" />
</head>
<body>
<?php echo validation_errors(); ?>
<form action="<?php echo site_url('user/logininsert')?>" method="post" >
name <input type="text" value="<?php echo set_value('name'); ?>" name="name"/> <?php echo form_error('name','<span>','</span>'); ?> <br>
password <input type="password" value="<?php echo set_value('password'); ?>" name="password" /><?php echo form_error('password','<span>','</span>'); ?> <br>
E-mail <input type="text" value="<?php echo set_value('email'); ?>" name="email" /><?php echo form_error('email','<span>','</span>'); ?> <br>
<input type="submit" value="submit" />
</form>
<img src="<?php echo base_url();?>/uploads/flash.jpg" alt="" width="120" />
</body>
</html>









安全

相關文章
相關標籤/搜索