- CodeIgniter 教程
- CodeIgniter - 首頁
- CodeIgniter - 概述
- CodeIgniter - 安裝 CodeIgniter
- CodeIgniter - 應用程式架構
- CodeIgniter - MVC 框架
- CodeIgniter - 基本概念
- CodeIgniter - 配置
- CodeIgniter - 使用資料庫
- CodeIgniter - 庫
- CodeIgniter - 錯誤處理
- CodeIgniter - 檔案上傳
- CodeIgniter - 傳送郵件
- CodeIgniter - 表單驗證
- CodeIgniter - 會話管理
- CodeIgniter - 快閃記憶體資料
- CodeIgniter - 臨時資料
- CodeIgniter - Cookie 管理
- CodeIgniter - 常用函式
- CodeIgniter - 頁面快取
- CodeIgniter - 頁面重定向
- CodeIgniter - 應用程式分析
- CodeIgniter - 基準測試
- CodeIgniter - 新增 JS 和 CSS
- CodeIgniter - 國際化
- CodeIgniter - 安全性
- CodeIgniter 有用資源
- CodeIgniter 快速指南
- CodeIgniter - 有用資源
- CodeIgniter - 討論
CodeIgniter 快速指南
CodeIgniter - 概述
CodeIgniter 是一個應用程式開發框架,可用於使用 PHP 開發網站。它是一個開源框架。它具有非常豐富的功能集,可以提高網站開發工作的速度。
如果您精通 PHP,那麼 CodeIgniter 將使您的任務更容易。它具有非常豐富的庫和助手。透過使用 CodeIgniter,如果您是從頭開始開發網站,那麼您將節省大量時間。不僅如此,使用 CodeIgniter 構建的網站也很安全,因為它能夠防止透過網站發生的各種攻擊。
CodeIgniter 功能
下面列出了一些 CodeIgniter 的重要功能:
基於模型-檢視-控制器 (MVC) 的系統
極其輕量級
支援多個平臺的完整功能資料庫類。
查詢生成器資料庫支援
表單和資料驗證
安全和 XSS 過濾
會話管理
電子郵件傳送類。支援附件、HTML/文字電子郵件、多種協議(sendmail、SMTP 和 Mail)等。
影像處理庫(裁剪、調整大小、旋轉等)。支援 GD、ImageMagick 和 NetPBM
檔案上傳類
FTP 類
本地化
分頁
資料加密
基準測試
全頁面快取
錯誤日誌記錄
應用程式分析
日曆類
使用者代理類
Zip 編碼類
模板引擎類
Trackback 類
XML-RPC 庫
單元測試類
搜尋引擎友好 URL
靈活的 URI 路由
支援鉤子和類擴充套件
大量的“助手”函式庫
CodeIgniter - 安裝
安裝 CodeIgniter 非常簡單。只需按照以下步驟操作:
步驟 1 - 從連結 CodeIgniter 下載 CodeIgniter
步驟 2 - 解壓縮資料夾。
步驟 3 - 將所有檔案和資料夾上傳到您的伺服器。
步驟 4 - 將所有檔案上傳到伺服器後,訪問伺服器的 URL,例如 www.domain-name.com。
訪問 URL 後,您將看到以下螢幕:
CodeIgniter - 應用程式架構
CodeIgniter 應用程式的架構如下所示。
如圖所示,每當請求到達 CodeIgniter 時,它將首先轉到index.php頁面。
在第二步中,路由將決定是將此請求傳遞到步驟 3 進行快取,還是將此請求傳遞到步驟 4 進行安全檢查。
如果請求的頁面已存在於快取中,則路由將請求傳遞到步驟 3,並且響應將返回給使用者。
如果請求的頁面不存在於快取中,則路由將請求的頁面傳遞到步驟 4 進行安全檢查。
在將請求傳遞到應用程式控制器之前,會檢查提交資料的安全性。經過安全檢查後,應用程式控制器載入必要的模型、庫、助手、外掛和指令碼,並將其傳遞給檢視。
檢視將使用可用資料呈現頁面,並將其傳遞到快取。由於請求的頁面之前未被快取,因此這次它將被快取到快取中,以便將來快速處理此頁面。
目錄結構
下圖顯示了 CodeIgniter 的目錄結構。
CodeIgniter 目錄結構分為 3 個資料夾:
- 應用程式
- 系統
- 使用者指南
應用程式
顧名思義,應用程式資料夾包含您正在構建的應用程式的所有程式碼。這是您開發專案的資料夾。應用程式資料夾包含幾個其他資料夾,如下所述:
快取 - 此資料夾包含應用程式的所有快取頁面。這些快取頁面將提高訪問頁面的整體速度。
配置 - 此資料夾包含配置應用程式的各種檔案。藉助config.php檔案,使用者可以配置應用程式。使用database.php檔案,使用者可以配置應用程式的資料庫。
控制器 - 此資料夾包含應用程式的控制器。它是應用程式的基本部分。
核心 - 此資料夾將包含應用程式的基本類。
助手 - 在此資料夾中,您可以放置應用程式的助手類。
鉤子 - 此資料夾中的檔案提供了一種方法來利用和修改框架的內部工作原理,而無需修改核心檔案。
語言 - 此資料夾包含與語言相關的檔案。
庫 - 此資料夾包含為您的應用程式開發的庫的檔案。
日誌 - 此資料夾包含與系統日誌相關的檔案。
模型 - 資料庫登入將放在此資料夾中。
第三方 - 在此資料夾中,您可以放置任何將用於您的應用程式的外掛。
檢視 - 應用程式的 HTML 檔案將放在此資料夾中。
系統
此資料夾包含 CodeIgniter 核心程式碼、庫、助手和其他檔案,這些檔案有助於簡化編碼。這些庫和助手在 Web 應用程式開發中載入並使用。
此資料夾包含所有重要的 CodeIgniter 程式碼,並組織到各種資料夾中:
核心 - 此資料夾包含 CodeIgniter 的核心類。不要在此處修改任何內容。您的所有工作都將在應用程式資料夾中進行。即使您的目的是擴充套件 CodeIgniter 核心,您也必須使用鉤子來完成,而鉤子位於應用程式資料夾中。
資料庫 - 資料庫資料夾包含核心資料庫驅動程式和其他資料庫實用程式。
字型 - 字型資料夾包含與字型相關的的資訊和實用程式。
助手 - 助手資料夾包含標準的 CodeIgniter 助手(如日期、cookie 和 URL 助手)。
語言 - 語言資料夾包含語言檔案。您可以暫時忽略它。
庫 - 庫資料夾包含標準的 CodeIgniter 庫(以幫助您處理電子郵件、日曆、檔案上傳等)。您可以建立自己的庫或擴充套件(甚至替換)標準庫,但這些庫將儲存在application/libraries目錄中,以使它們與儲存在此特定資料夾中的標準 CodeIgniter 庫分開。
使用者指南
這是您使用 CodeIgniter 的使用者指南。它基本上是 CodeIgniter 網站上使用者指南的離線版本。使用它,可以學習各種庫、助手和類的功能。建議在使用 CodeIgniter 構建您的第一個 Web 應用程式之前閱讀本使用者指南。
除了這三個資料夾之外,還有一個名為“index.php”的重要檔案。在此檔案中,我們可以設定應用程式環境和錯誤級別,並且可以定義系統和應用程式資料夾名稱。如果您對要執行的操作了解不足,建議不要編輯這些設定。
CodeIgniter - MVC 框架
CodeIgniter 基於模型-檢視-控制器 (MVC) 開發模式。MVC 是一種軟體方法,它將應用程式邏輯與表示分離。在實踐中,它允許您的網頁包含最少的指令碼,因為表示與 PHP 指令碼是分開的。
模型表示您的資料結構。通常,您的模型類將包含幫助您檢索、插入和更新資料庫中資訊的函式。
檢視是呈現給使用者的資訊。檢視通常是網頁,但在 CodeIgniter 中,檢視也可以是頁面片段,例如頁首或頁尾。它也可以是 RSS 頁面或任何其他型別的“頁面”。
控制器充當模型、檢視和處理 HTTP 請求並生成網頁所需的任何其他資源之間的中介。
CodeIgniter - 基本概念
控制器
控制器是一個簡單的類檔案。顧名思義,它透過 URI 控制整個應用程式。
建立控制器
首先,轉到application/controllers資料夾。您會在那裡找到兩個檔案,index.html和Welcome.php。這些檔案隨 CodeIgniter 一起提供。
保持這些檔案不變。在同一路徑下建立一個名為“Test.php”的新檔案。在該檔案中寫入以下程式碼:
<?php
class Test extends CI_Controller {
public function index() {
echo "Hello World!";
}
}
?>
Test類擴充套件了一個名為CI_Controller的內建類。每當您想要建立自己的控制器類時,都必須擴充套件此類。
呼叫控制器
可以透過以下 URI 呼叫上述控制器:
http://www.your-domain.com/index.php/test
請注意上面 URI 中 index.php 後的“test”一詞。這表示控制器的類名。由於我們為控制器指定了名稱“Test”,因此我們在 index.php 後寫了“test”。類名必須以大寫字母開頭,但當我們透過 URI 呼叫該控制器時,我們需要寫小寫字母。呼叫控制器的常規語法如下:
http://www.your-domain.com/index.php/controller/method-name
建立和呼叫構造方法
讓我們修改上述類並建立一個名為“hello”的另一個方法。
<?php
class Test extends CI_Controller {
public function index() {
echo "This is default function.";
}
public function hello() {
echo "This is hello function.";
}
}
?>
我們可以透過以下三種方式執行上述控制器:
- http://www.your-domain.com/index.php/test
- http://www.your-domain.com/index.php/test/index
- http://www.your-domain.com/index.php/test/hello
在瀏覽器中訪問第一個 URI 後,我們將獲得如下所示的輸出。如您所見,我們獲得了方法“index”的輸出,即使我們沒有在 URI 中傳遞方法的名稱。我們只在 URI 中使用了控制器名稱。在這種情況下,CodeIgniter 呼叫預設方法“index”。
在瀏覽器中訪問第二個 URI 後,我們將獲得與上圖相同的輸出。在這裡,我們在 URI 中的控制器名稱後傳遞了方法的名稱。由於方法的名稱為“index”,因此我們獲得了相同的輸出。
在瀏覽器中訪問第三個URI,我們會得到如下所示的輸出。正如你所看到的,我們得到了方法“hello”的輸出,因為我們在URI中控制器“test”的名稱後面傳遞了“hello”作為方法名稱。
要點
控制器類的名稱必須以大寫字母開頭。
控制器必須使用小寫字母呼叫。
不要使用方法名稱與父類相同,因為它會覆蓋父類的功能。
檢視
這可以是一個簡單或複雜的網頁,可以透過控制器呼叫。網頁可能包含標題、頁尾、側邊欄等。檢視不能直接呼叫。讓我們建立一個簡單的檢視。在application/views下建立一個名為“test.php”的新檔案,並將下面給出的程式碼複製到該檔案中。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter View Example</title>
</head>
<body>
CodeIgniter View Example
</body>
</html>
更改application/controllers/test.php檔案的程式碼,如下所示。
載入檢視
檢視可以透過以下語法載入:
$this->load->view('name');
其中name是要渲染的檢視檔案。如果你計劃將檢視檔案儲存在某個目錄中,則可以使用以下語法:
$this->load->view('directory-name/name');
沒有必要指定副檔名php,除非使用了.php以外的其他副檔名。
index()方法呼叫view方法並將“test”作為引數傳遞給view()方法,因為我們將html程式碼儲存在application/views/test.php下的“test.php”檔案中。
<?php
class Test extends CI_Controller {
public function index() {
$this->load->view('test');
}
}
?>
以下是以上程式碼的輸出:
下圖說明了所有內容的工作原理:
模型
模型類旨在處理資料庫中的資訊。例如,如果你使用CodeIgniter來管理應用程式中的使用者,那麼你必須有一個模型類,其中包含插入、刪除、更新和檢索使用者資料的函式。
建立模型類
模型類儲存在application/models目錄中。以下程式碼展示瞭如何在CodeIgniter中建立模型類。
<?php
Class Model_name extends CI_Model {
Public function __construct() {
parent::__construct();
}
}
?>
其中Model_name是要賦予的模型類的名稱。每個模型類都必須繼承CodeIgniter的CI_Model類。模型類的第一個字母必須是大寫字母。以下是使用者模型類的程式碼。
<?php
Class User_model extends CI_Model {
Public function __construct() {
parent::__construct();
}
}
?>
以上模型類必須儲存為User_model.php。類名和檔名必須相同。
載入模型
模型可以在控制器中呼叫。以下程式碼可用於載入任何模型。
$this->load->model('model_name');
其中model_name是要載入的模型的名稱。載入模型後,你可以像下面這樣簡單地呼叫它的方法。
$this->model_name->method();
自動載入模型
在某些情況下,你可能希望在整個應用程式中使用某些模型類。在這種情況下,最好自動載入它。
/*
| ---------------------------------------------------------------
| Auto-Load Models
| ---------------------------------------------------------------
| Prototype:
|
| $autoload['model'] = array('first_model', 'second_model');
|
| You can also supply an alternative model name to be assigned
| in the controller:
|
| $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array();
如上圖所示,將要自動載入的模型的名稱傳遞到陣列中,它將在系統初始化狀態時自動載入,並在整個應用程式中可用。
輔助函式
顧名思義,它將幫助你構建你的系統。它被分成小的函式來提供不同的功能。CodeIgniter中提供了許多輔助函式,如下表所示。我們也可以構建自己的輔助函式。
輔助函式通常儲存在你的system/helpers或application/helpers目錄中。自定義輔助函式儲存在application/helpers目錄中,系統輔助函式儲存在system/helpers目錄中。CodeIgniter將首先在你的application/helpers目錄中查詢。如果目錄不存在或未找到指定的輔助函式,CodeIgniter將改為在你的全域性system/helpers/目錄中查詢。每個輔助函式,無論是自定義輔助函式還是系統輔助函式,都必須在使用前載入。
| 序號 | 輔助函式名稱及描述 |
|---|---|
| 1 | 陣列輔助函式 陣列輔助函式檔案包含有助於處理陣列的函式。 |
| 2 | 驗證碼輔助函式 驗證碼輔助函式檔案包含有助於建立驗證碼影像的函式。 |
| 3 | Cookie輔助函式 Cookie輔助函式檔案包含有助於處理cookie的函式。 |
| 4 | 日期輔助函式 日期輔助函式檔案包含有助於處理日期的函式。 |
| 5 | 目錄輔助函式 目錄輔助函式檔案包含有助於處理目錄的函式。 |
| 6 | 下載輔助函式 下載輔助函式允許你將資料下載到你的桌面。 |
| 7 | 郵件輔助函式 郵件輔助函式提供了一些輔助函式來處理郵件。有關更強大的郵件解決方案,請參閱CodeIgniter的郵件類。 |
| 8 | 檔案輔助函式 檔案輔助函式檔案包含有助於處理檔案的函式。 |
| 9 | 表單輔助函式 表單輔助函式檔案包含有助於處理表單的函式。 |
| 10 | HTML輔助函式 HTML輔助函式檔案包含有助於處理HTML的函式。 |
| 11 | 詞形變化輔助函式 詞形變化輔助函式檔案包含允許你將單詞更改為複數、單數、駝峰式大小寫等的函式。 |
| 12 | 語言輔助函式 語言輔助函式檔案包含有助於處理語言檔案的函式。 |
| 13 | 數字輔助函式 數字輔助函式檔案包含有助於處理數字資料的函式。 |
| 14 | 路徑輔助函式 路徑輔助函式檔案包含允許你處理伺服器上的檔案路徑的函式。 |
| 15 | 安全輔助函式 安全輔助函式檔案包含與安全相關的函式。 |
| 16 | 表情符號輔助函式 表情符號輔助函式檔案包含允許你管理表情符號(表情)的函式。 |
| 17 | 字串輔助函式 字串輔助函式檔案包含有助於處理字串的函式。 |
| 18 | 文字輔助函式 文字輔助函式檔案包含有助於處理文字的函式。 |
| 19 | 排版輔助函式 排版輔助函式檔案包含有助於以語義相關的方式格式化文字的函式。 |
| 20 | URL輔助函式 URL輔助函式檔案包含有助於處理URL的函式。 |
| 21 | XML輔助函式 XML輔助函式檔案包含有助於處理XML資料的函式。 |
載入輔助函式
輔助函式可以如下所示載入:
$this->load->helper('name');
其中name是輔助函式的名稱。例如,如果你想載入URL輔助函式,則可以載入為:
$this->load->helper('url');
路由
CodeIgniter擁有使用者友好的URI路由系統,以便你可以輕鬆地重新路由URL。通常,URL字串與其對應的控制器類/方法之間存在一對一的關係。URI中的段通常遵循以下模式:
your-domain.com/class/method/id/
**第一段**表示應呼叫的控制器類。
**第二段**表示應呼叫的類函式或方法。
**第三段**以及任何其他段表示將傳遞給控制器的ID和任何變數。
在某些情況下,你可能希望更改此預設路由機制。CodeIgniter提供了透過它你可以設定自己的路由規則的功能。
自定義路由規則
有一個特定的檔案,你可以在其中處理所有這些。該檔案位於application/config/routes.php。你會找到一個名為$route的陣列,你可以在其中自定義你的路由規則。$route陣列中的鍵將決定路由什麼,值將決定路由到哪裡。CodeIgniter中有三個保留路由。
| 序號 | 保留路由及描述 |
|---|---|
| 1 | $route['default_controller'] 此路由指示如果URI不包含任何資料,則應載入哪個控制器類,當人們載入你的根URL時,就會出現這種情況。建議你設定預設路由,否則預設情況下會出現404頁面。我們可以在此處設定網站的主頁,以便預設載入它。 |
| 2 | $route['404_override'] 此路由指示如果未找到請求的控制器,則應載入哪個控制器類。它將覆蓋預設的404錯誤頁面。它不會影響show_404()函式,該函式將繼續載入application/views/errors/error_404.php中的預設error_404.php檔案。 |
| 3 | $route['translate_uri_dashes'] 從布林值可以看出,這並不是一個真正的路由。此選項使你能夠自動將控制器和方法URI段中的連字元('-')替換為下劃線,因此如果你需要這樣做,則可以節省額外的路由條目。這是必需的,因為連字元不是有效的類或方法名稱字元,如果你嘗試使用它,則會導致致命錯誤。 |
路由可以透過**萬用字元**或使用**正則表示式**進行自定義,但請記住,這些自定義的路由規則必須位於保留規則之後。
萬用字元
我們可以使用兩個萬用字元,如下所述:
(:num) - 它將匹配僅包含數字的段。
(:any) - 它將匹配包含任何字元的段。
示例
$route['product/:num']='catalog/product_lookup';
在以上示例中,如果在URL的第一段中找到文字“product”,並且在第二段中找到數字,則使用“catalog”類和“product_lookup”方法代替。
正則表示式
與萬用字元類似,我們也可以在$route陣列鍵部分使用正則表示式。如果任何URI與正則表示式匹配,則它將路由到$route陣列中設定的值部分。
示例
$route['products/([a-z]+)/(\d+)']='$1/id_$2';
在以上示例中,類似於products/shoes/123的URI將改為呼叫“shoes”控制器類和“id_123”方法。
CodeIgniter - 配置
設定好網站後,接下來要做的事情是配置網站。application/config資料夾包含一組設定網站基本配置的檔案。
配置基本URL
網站的基本URL可以在application/config/config.php檔案中配置。它是CodeIgniter根目錄的URL。通常,這將是你的基本URL,帶有一個尾部斜槓,例如
http://example.com/
如果未設定,則CodeIgniter將嘗試猜測協議、域名和安裝路徑。但是,你應該始終明確配置此項,並且永遠不要依賴自動猜測,尤其是在生產環境中。你可以在$config陣列中使用鍵“base_url”配置基本URL,如下所示:
$config['base_url'] = 'http://your-domain.com';
資料庫配置
網站的資料庫可以在 application/config/database.php 檔案中配置。通常我們需要為不同的環境(例如開發環境和生產環境)設定資料庫。使用 CodeIgniter 中提供的多維陣列,我們可以為不同的環境設定資料庫。配置設定儲存在如下所示的陣列中。
$db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'database_name', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => TRUE, 'db_debug' => TRUE, 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array() );
除了主機名、使用者名稱、密碼、資料庫和 dbdriver 之外,您可以將一些選項保留為預設值。
hostname − 在此處指定資料庫的位置,例如 localhost 或 IP 地址
username − 在此處設定資料庫的使用者名稱。
password − 在此處設定資料庫的密碼。
database − 在此處設定資料庫的名稱。
dbdriver − 設定您正在使用的資料庫型別,例如 MySQL、MySQLi、Postgre SQL、ODBC 和 MS SQL。
透過更改陣列 $db 的鍵,您可以設定資料庫的其他配置,如下所示。在這裡,我們將鍵設定為 ‘test’ 以設定測試環境的資料庫,同時保持其他資料庫環境不變。
$db['test'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'database_name', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => TRUE, 'db_debug' => TRUE, 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array() );
您可以透過更改變數的值來簡單地切換到不同的環境,如下所示:
$active_group = ‘default’; //這將設定預設環境
$active_group = ‘test’; //這將設定測試環境
自動載入配置
此檔案預設指定應載入哪些系統。為了使框架儘可能輕量級,預設情況下僅載入絕對最少的資源。應該自動載入經常使用的系統,而不是在本地級別重複載入它。以下是您可以自動載入的內容:
Libraries − 這是一個庫列表,應該自動載入。提供如下所示的庫列表,以便 CodeIgniter 自動載入。在此示例中,我們自動載入資料庫、郵件和會話庫。
$autoload['libraries'] = array('database', 'email', 'session');
Drivers − 這些類位於 system/libraries/ 或 application/libraries/ 目錄中,但也被放置在它們自己的子目錄中,並且它們擴充套件了 CI_Driver_Library 類。它們提供了多種可互換的驅動程式選項。以下是自動載入快取驅動的示例。
$autoload['drivers'] = array('cache');
Helper files − 這是一個輔助檔案列表,需要自動載入。提供如下所示的庫列表,以便 CodeIgniter 自動載入。在給定的示例中,我們自動載入 URL 和檔案輔助函式。
$autoload['helper'] = array('url', 'file');
Custom config files − 這些檔案僅在您建立了自定義配置檔案時才用於使用。否則,請將其留空。以下是如何自動載入多個配置檔案的示例。
$autoload['config'] = array('config1', 'config2');
Language files − 這是一個語言檔案列表,應該自動載入。檢視下面的示例。提供如下所示的語言列表,以便 CodeIgniter 自動載入。請記住,不要包含檔案中的“_lang”部分。例如,“codeigniter_lang.php”將被引用為 array('codeigniter');
Models − 這是一個模型檔案列表,應該自動載入。提供如下所示的模型列表,以便 CodeIgniter 自動載入。以下是如何自動載入多個模型檔案的示例。
$autoload['model'] = array('first_model', 'second_model');
CodeIgniter - 使用資料庫
像任何其他框架一樣,我們也需要經常與資料庫互動,而 CodeIgniter 使這項工作變得容易。它提供了一套豐富的功能來與資料庫互動。
在本節中,我們將瞭解 CRUD(建立、讀取、更新、刪除)函式如何在 CodeIgniter 中工作。我們將使用 stud 表來選擇、更新、刪除和插入 stud 表中的資料。
| 表名:stud | |
|---|---|
| roll_no | int(11) |
| name | varchar(30) |
連線資料庫
我們可以透過以下兩種方式連線資料庫:
自動連線 − 可以使用檔案 application/config/autoload.php 進行自動連線。自動連線將為每個頁面載入資料庫。我們只需要新增資料庫庫,如下所示:
$autoload['libraries'] = array(‘database’);
手動連線 − 如果您只想對某些頁面進行資料庫連線,那麼我們可以進行手動連線。我們可以在任何類中新增以下行來手動連線資料庫。
$this->load->database();
在這裡,我們沒有傳遞任何引數,因為所有內容都設定在資料庫配置檔案 application/config/database.php 中
插入記錄
要插入資料庫中的記錄,可以使用 insert() 函式,如下表所示:
語法 |
insert([$table = ''[, $set = NULL[, $escape = NULL]]]) |
引數 |
|
返回值 |
成功時返回 TRUE,失敗時返回 FALSE |
返回型別 |
bool |
以下示例顯示如何在 stud 表中插入記錄。$data 是一個數組,我們已在其中設定了資料,要將此資料插入到 stud 表中,我們只需要將此陣列作為第二個引數傳遞給 insert 函式。
$data = array(
'roll_no' => ‘1’,
'name' => ‘Virat’
);
$this->db->insert("stud", $data);
更新記錄
要更新資料庫中的記錄,可以使用 update() 函式以及 set() 和 where() 函式,如下表所示。set() 函式將設定要更新的資料。
語法 |
set($key[, $value = ''[, $escape = NULL]]) |
引數 |
|
返回值 |
CI_DB_query_builder 例項(方法連結) |
返回型別 |
CI_DB_query_builder |
where() 函式將決定更新哪個記錄。
語法 |
where($key[, $value = NULL[, $escape = NULL]]) |
引數 |
|
返回值 |
DB_query_builder 例項 |
返回型別 |
object |
最後,update() 函式將更新資料庫中的資料。
語法 |
update([$table = ''[, $set = NULL[, $where = NULL[, $limit = NULL]]]]) |
引數 |
|
返回值 |
成功時返回 TRUE,失敗時返回 FALSE |
返回型別 |
bool |
$data = array(
'roll_no' => ‘1’,
'name' => ‘Virat’
);
$this->db->set($data);
$this->db->where("roll_no", ‘1’);
$this->db->update("stud", $data);
刪除記錄
要刪除資料庫中的記錄,可以使用 delete() 函式,如下表所示:
語法 |
delete([$table = ''[, $where = ''[, $limit = NULL[, $reset_data = TRUE]]]]) |
引數 |
|
返回值 |
CI_DB_query_builder 例項(方法連結)或失敗時返回 FALSE |
返回型別 |
mixed |
使用以下程式碼刪除 stud 表中的記錄。第一個引數指示要刪除記錄的表名,第二個引數決定要刪除哪個記錄。
$this->db->delete("stud", "roll_no = 1");
選擇記錄
要選擇資料庫中的記錄,可以使用 get 函式,如下表所示:
語法 |
get([$table = ''[, $limit = NULL[, $offset = NULL]]]) |
引數 |
|
返回值 |
CI_DB_result 例項(方法連結) |
返回型別 |
CI_DB_result |
使用以下程式碼從資料庫中獲取所有記錄。第一個語句從“stud”表中獲取所有記錄並返回物件,該物件將儲存在 $query 物件中。第二個語句使用 $query 物件呼叫 result() 函式以獲取所有記錄作為陣列。
$query = $this->db->get("stud");
$data['records'] = $query->result();
關閉連線
可以透過執行以下程式碼手動關閉資料庫連線:
$this->db->close();
示例
建立一個名為 Stud_controller.php 的控制器類,並將其儲存在 application/controller/Stud_controller.php 中
這是一個完整的示例,其中執行了上述所有操作。在執行以下示例之前,請根據本章開頭提供的說明建立資料庫和表,並在儲存在 application/config/database.php 中的資料庫配置檔案中進行必要的更改
<?php
class Stud_controller extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->helper('url');
$this->load->database();
}
public function index() {
$query = $this->db->get("stud");
$data['records'] = $query->result();
$this->load->helper('url');
$this->load->view('Stud_view',$data);
}
public function add_student_view() {
$this->load->helper('form');
$this->load->view('Stud_add');
}
public function add_student() {
$this->load->model('Stud_Model');
$data = array(
'roll_no' => $this->input->post('roll_no'),
'name' => $this->input->post('name')
);
$this->Stud_Model->insert($data);
$query = $this->db->get("stud");
$data['records'] = $query->result();
$this->load->view('Stud_view',$data);
}
public function update_student_view() {
$this->load->helper('form');
$roll_no = $this->uri->segment('3');
$query = $this->db->get_where("stud",array("roll_no"=>$roll_no));
$data['records'] = $query->result();
$data['old_roll_no'] = $roll_no;
$this->load->view('Stud_edit',$data);
}
public function update_student(){
$this->load->model('Stud_Model');
$data = array(
'roll_no' => $this->input->post('roll_no'),
'name' => $this->input->post('name')
);
$old_roll_no = $this->input->post('old_roll_no');
$this->Stud_Model->update($data,$old_roll_no);
$query = $this->db->get("stud");
$data['records'] = $query->result();
$this->load->view('Stud_view',$data);
}
public function delete_student() {
$this->load->model('Stud_Model');
$roll_no = $this->uri->segment('3');
$this->Stud_Model->delete($roll_no);
$query = $this->db->get("stud");
$data['records'] = $query->result();
$this->load->view('Stud_view',$data);
}
}
?>
建立一個名為 Stud_Model.php 的模型類,並將其儲存在 application/models/Stud_Model.php 中
<?php
class Stud_Model extends CI_Model {
function __construct() {
parent::__construct();
}
public function insert($data) {
if ($this->db->insert("stud", $data)) {
return true;
}
}
public function delete($roll_no) {
if ($this->db->delete("stud", "roll_no = ".$roll_no)) {
return true;
}
}
public function update($data,$old_roll_no) {
$this->db->set($data);
$this->db->where("roll_no", $old_roll_no);
$this->db->update("stud", $data);
}
}
?>
建立一個名為 Stud_add.php 的檢視檔案,並將其儲存在 application/views/Stud_add.php 中
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>Students Example</title>
</head>
<body>
<form method = "" action = "">
<?php
echo form_open('Stud_controller/add_student');
echo form_label('Roll No.');
echo form_input(array('id'=>'roll_no','name'=>'roll_no'));
echo "<br/>";
echo form_label('Name');
echo form_input(array('id'=>'name','name'=>'name'));
echo "<br/>";
echo form_submit(array('id'=>'submit','value'=>'Add'));
echo form_close();
?>
</form>
</body>
</html>
建立一個名為 Stud_edit.php 的檢視檔案,並將其儲存在 application/views/Stud_edit.php 中
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>Students Example</title>
</head>
<body>
<form method = "" action = "">
<?php
echo form_open('Stud_controller/update_student');
echo form_hidden('old_roll_no',$old_roll_no);
echo form_label('Roll No.');
echo form_input(array('id'⇒'roll_no',
'name'⇒'roll_no','value'⇒$records[0]→roll_no));
echo "
";
echo form_label('Name');
echo form_input(array('id'⇒'name','name'⇒'name',
'value'⇒$records[0]→name));
echo "
";
echo form_submit(array('id'⇒'sub mit','value'⇒'Edit'));
echo form_close();
?>
</form>
</body>
</html>
建立一個名為 Stud_view.php 的檢視檔案,並將其儲存在 application/views/Stud_view.php 中
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>Students Example</title>
</head>
<body>
<a href = "<?php echo base_url(); ?>
index.php/stud/add_view">Add</a>
<table border = "1">
<?php
$i = 1;
echo "<tr>";
echo "<td>Sr#</td>";
echo "<td>Roll No.</td>";
echo "<td>Name</td>";
echo "<td>Edit</td>";
echo "<td>Delete</td>";
echo "<tr>";
foreach($records as $r) {
echo "<tr>";
echo "<td>".$i++."</td>";
echo "<td>".$r->roll_no."</td>";
echo "<td>".$r->name."</td>";
echo "<td><a href = '".base_url()."index.php/stud/edit/"
.$r->roll_no."'>Edit</a></td>";
echo "<td><a href = '".base_url()."index.php/stud/delete/"
.$r->roll_no."'>Delete</a></td>";
echo "<tr>";
}
?>
</table>
</body>
</html>
在 application/config/routes.php 中的路由檔案中進行以下更改,並在檔案末尾新增以下行。
$route['stud'] = "Stud_controller"; $route['stud/add'] = 'Stud_controller/add_student'; $route['stud/add_view'] = 'Stud_controller/add_student_view'; $route['stud/edit/(\d+)'] = 'Stud_controller/update_student_view/$1'; $route['stud/delete/(\d+)'] = 'Stud_controller/delete_student/$1';
現在,讓我們透過在瀏覽器中訪問以下 URL 來執行此示例。將 yoursite.com 替換為您自己的 URL。
http://yoursite.com/index.php/stud
CodeIgniter - 庫
CodeIgniter 框架的重要組成部分是它的庫。它提供了一套豐富的庫,間接地提高了應用程式的開發速度。系統庫位於 system/libraries 中。我們只需要載入我們想要使用的庫即可。庫可以按如下所示載入:
$this->load->library('class name');
其中 class name 是我們要載入的庫的名稱。如果我們要載入多個庫,那麼我們可以簡單地將陣列作為引數傳遞給 library() 函式,如下所示:
$this->load->library(array('email', 'table'));
庫類
庫類位於 system/libraries 中。每個類都有各種函式來簡化開發工作。下表顯示了庫類的名稱及其描述。
| 序號 | 庫類和描述 |
|---|---|
| 1 | 基準測試類 基準測試類始終處於活動狀態,可以計算任何兩個標記點之間的時間差。 |
| 2 | 快取類 此類將快取頁面,以快速訪問頁面速度。 |
| 3 | 日曆類 使用此類,您可以動態建立日曆。 |
| 4 | 購物車類 使用此類,您可以新增或刪除購物車中的商品。商品儲存在會話中,並在使用者瀏覽網站時保持活動狀態。 |
| 5 | 配置類 可以使用此類檢索配置首選項。此類會自動初始化。 |
| 6 | 郵件類 此類提供與郵件相關的功能,例如傳送或回覆郵件。 |
| 7 | 加密類 此類提供雙向資料加密功能。 |
| 8 | 檔案上傳類 此類提供與檔案上傳相關的功能。您可以設定各種首選項,例如要上傳的檔案型別、檔案大小等。 |
| 9 | 表單驗證類 此類提供各種驗證表單的功能。 |
| 10 | FTP 類 此類提供各種與FTP相關的功能,例如將檔案傳輸到遠端伺服器、移動、重新命名或刪除伺服器上的檔案。 |
| 11 | 影像處理類 藉助此類,可以執行影像處理操作,例如調整大小、建立縮圖、裁剪、旋轉、水印。 |
| 12 | 輸入類 此類出於安全原因預處理輸入資料。 |
| 13 | 語言類 此類用於國際化。 |
| 14 | 載入器類 此類載入元素,例如檢視檔案、驅動程式、輔助函式、模型等。 |
| 15 | 遷移類 此類提供與資料庫遷移相關的功能。 |
| 16 | 輸出類 此類將輸出傳送到瀏覽器,並快取該網頁。 |
| 17 | 分頁類 此類為網頁新增分頁功能。 |
| 18 | 模板解析器類 模板解析器類可以對檢視檔案中包含的偽變數執行簡單的文字替換。它可以解析簡單的變數或變數標籤對。 |
| 19 | 安全類 此類包含與安全相關的功能,例如XSS過濾、CSRF等。 |
| 20 | 會話庫 此類提供維護應用程式會話的功能。 |
| 21 | HTML表格 此類用於根據陣列或資料庫結果自動生成HTML表格。 |
| 22 | Trackback 類 Trackback類提供允許您傳送和接收Trackback資料的功能。 |
| 23 | 排版類 排版類提供有助於格式化文字的方法。 |
| 24 | 單元測試類 此類提供對應用程式進行單元測試並生成結果的功能。 |
| 25 | URI類 URI類提供幫助您從URI字串中檢索資訊的方法。如果您使用URI路由,您還可以檢索有關重定向段的資訊。 |
| 26 | 使用者代理類 使用者代理類提供幫助識別有關訪問您網站的瀏覽器、移動裝置或機器人的資訊的功能。此外,您還可以獲取推薦來源資訊以及語言和支援的字元集資訊。 |
| 27 | XML-RPC和XML-RPC伺服器類 CodeIgniter的XML-RPC類允許您向其他伺服器傳送請求,或設定您自己的XML-RPC伺服器以接收請求。 |
| 28 | Zip 編碼類 此類用於建立資料的zip壓縮檔案。 |
建立庫
CodeIgniter擁有豐富的庫集,您可以在system/libraries資料夾中找到它們,但CodeIgniter不僅限於系統庫,您也可以建立自己的庫,這些庫可以儲存在application/libraries資料夾中。您可以透過三種方式建立庫。
- 建立新庫
- 擴充套件原生庫
- 替換原生庫
建立新庫
建立新庫時,應牢記以下事項:
- 檔名必須以大寫字母開頭,例如Mylibrary.php
- 類名必須以大寫字母開頭,例如class Mylibrary
- 類名和檔名必須匹配。
Mylibrary.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Mylibrary {
public function some_function() {
}
}
/* End of file Mylibrary.php */
載入自定義庫
可以透過在控制器中簡單地執行以下程式碼行來載入上述庫。
$this->load->library(‘mylibrary’);
mylibrary是您的庫的名稱,您可以使用小寫或大寫字母編寫它。使用庫的名稱,不帶“.php”副檔名。載入庫後,您還可以像下面所示呼叫該類的函式。
$this->mylibrary->some_function();
擴充套件原生庫
有時,您可能需要向CodeIgniter提供的庫中新增您自己的功能。CodeIgniter提供了一種機制,您可以透過該機制擴充套件原生庫並新增您自己的函式。要實現這一點,您必須擴充套件原生庫類的類。例如,如果您想擴充套件Email庫,則可以按如下所示完成:
Class MY_Email extends CI_Email {
}
在這裡,在上面的示例中,MY_Email類擴充套件了原生庫的郵件類CI_Email。此庫可以透過載入郵件庫的標準方式載入。將上述程式碼儲存在My_Email.php檔案中。
替換原生庫
在某些情況下,您不希望按照原生庫的工作方式使用它,而是希望用您自己的方式替換它。這可以透過替換原生庫來完成。要實現這一點,您只需要使用與原生庫中相同的類名即可。例如,如果您想替換Email類,則使用如下所示的程式碼。將您的檔名儲存為Email.php,並將類名設定為CI_Email。
Email.php
Class CI_Email {
}
CodeIgniter - 錯誤處理
很多時候,在使用應用程式時,我們會遇到錯誤。如果錯誤沒有得到妥善處理,這對使用者來說是非常惱人的。CodeIgniter提供了一種簡單的錯誤處理機制。
當應用程式處於開發模式而不是生產模式時,您希望顯示這些訊息,因為錯誤訊息可以在開發階段輕鬆解決。
可以透過更改index.php檔案中給出的以下程式碼行來更改應用程式的環境。這可以設定為任何內容,但通常為此目的使用三個值(開發、測試、生產)。
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
不同的環境需要不同的錯誤報告級別。預設情況下,開發模式將顯示錯誤,而測試和生產模式將隱藏錯誤。CodeIgniter提供以下三個函式來處理錯誤。
show_error()函式以HTML格式在螢幕頂部顯示錯誤。
語法 |
show_error($message, $status_code, $heading = 'An Error Was Encountered') |
引數 |
|
返回型別 |
mixed |
show_404()函式在您嘗試訪問不存在的頁面時顯示錯誤。
語法 |
show_404($page = '', $log_error = TRUE) |
引數 |
|
返回型別 |
無效 |
log_message()函式用於寫入日誌訊息。當您想要編寫自定義訊息時,這很有用。
語法 |
log_message($level, $message, $php_error = FALSE) |
引數 |
|
返回型別 |
無效 |
可以在application/config/config.php檔案中啟用日誌記錄。下面是config.php檔案的螢幕截圖,您可以在其中設定閾值。
/* |-------------------------------------------------------------------------------- | Error Logging Threshold |-------------------------------------------------------------------------------- | You can enable error logging by setting a threshold over zero. The | threshold determines what gets logged. Threshold options are: | | 0 = Disable logging, Error logging TURNED OFF | 1 = Error Message (including PHP errors) | 2 = Debug Message | 3 = Informational Messages | 4 = All Messages | | You can also pass an array with threshold levels to show individual error types | | array(2) = Debug Message, without Error Messages | For a live site you'll usually only enable Errors (1) to be logged otherwise | your log files will fill up very fast. | */ $config['log_threshold'] = 0;
您可以在application/log/中找到日誌訊息。在啟用日誌檔案之前,請確保此目錄可寫。
各種錯誤訊息模板可以在application/views/errors/cli或application/views/errors/html中找到。
CodeIgniter - 檔案上傳
使用檔案上傳類,我們可以上傳檔案,我們還可以限制要上傳的檔案的型別和大小。請按照給定示例中所示的步驟瞭解CodeIgniter中的檔案上傳過程。
示例
複製以下程式碼並將其儲存在application/view/Upload_form.php中。
<html>
<head>
<title>Upload Form</title>
</head>
<body>
<?php echo $error;?>
<?php echo form_open_multipart('upload/do_upload');?>
<form action = "" method = "">
<input type = "file" name = "userfile" size = "20" />
<br /><br />
<input type = "submit" value = "upload" />
</form>
</body>
</html>
複製下面給出的程式碼並將其儲存在application/view/Upload_success.php中
<html>
<head>
<title>Upload Form</title>
</head>
<body>
<h3>Your file was successfully uploaded!</h3>
<ul>
<?phpforeach ($upload_data as $item => $value):?>
<li><?php echo $item;?>: <?php echo $value;?></li>
<?phpendforeach; ?>
</ul>
<p><?php echo anchor('upload', 'Upload Another File!'); ?></p>
</body>
</html>
複製下面給出的程式碼並將其儲存在application/controllers/Upload.php中。在CodeIgniter的根目錄(即application資料夾的父目錄)中建立“uploads”資料夾。
<?php
class Upload extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->helper(array('form', 'url'));
}
public function index() {
$this->load->view('upload_form', array('error' => ' ' ));
}
public function do_upload() {
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 100;
$config['max_width'] = 1024;
$config['max_height'] = 768;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('userfile')) {
$error = array('error' => $this->upload->display_errors());
$this->load->view('upload_form', $error);
}
else {
$data = array('upload_data' => $this->upload->data());
$this->load->view('upload_success', $data);
}
}
}
?>
在application/config/routes.php中的路由檔案中進行以下更改,並在檔案末尾新增以下行。
$route['upload'] = 'Upload';
現在讓我們透過在瀏覽器中訪問以下URL來執行此示例。將yoursite.com替換為您自己的URL。
http://yoursite.com/index.php/upload
它將生成以下螢幕:
成功上傳檔案後,您將看到以下螢幕:
CodeIgniter - 傳送郵件
在CodeIgniter中傳送電子郵件非常容易。您還可以配置有關CodeIgniter中電子郵件的首選項。CodeIgniter提供以下功能來發送電子郵件:
- 多種協議 - 郵件、Sendmail和SMTP
- SMTP的TLS和SSL加密
- 多個收件人
- 抄送和密送
- HTML或純文字電子郵件
- 附件
- 自動換行
- 優先順序
- BCC批處理模式,允許將大型郵件列表分解成小的BCC批次。
- 電子郵件除錯工具
電子郵件類具有以下功能,以簡化傳送電子郵件的工作。
| 序號 | 語法 | 引數 | 返回 | 返回型別 |
|---|---|---|---|---|
| 1 | from($from[, $name = ''[, $return_path = NULL]]) |
$from (字串) - “發件人”電子郵件地址 $name (字串) - “發件人”顯示名稱 $return_path (字串) - 可選的電子郵件地址,用於將未送達的郵件重定向到該地址 |
CI_Email例項(方法鏈) | CI_Email |
| 2 | reply_to($replyto[, $name = '']) |
$replyto (字串) - 回覆的電子郵件地址 $name (字串) - 回覆電子郵件地址的顯示名稱 |
CI_Email例項(方法鏈) | CI_Email |
| 2 | to($to) |
$to (混合) - 以逗號分隔的字串或電子郵件地址陣列 |
CI_Email例項(方法鏈) | CI_Email |
| 3 | cc($cc) |
$cc (混合) - 以逗號分隔的字串或電子郵件地址陣列 |
CI_Email例項(方法鏈) | CI_Email |
| 4 | bcc($bcc[, $limit = '']) |
$bcc (混合) - 以逗號分隔的字串或電子郵件地址陣列 $limit (整數) - 每個批次傳送的最大電子郵件數量 |
CI_Email例項(方法鏈) | CI_Email |
| 5 | subject($subject) |
$subject (字串) - 電子郵件主題行 |
CI_Email例項(方法鏈) | CI_Email |
| 6 | message($body) |
$body (字串) - 電子郵件正文 |
CI_Email例項(方法鏈) | CI_Email |
| 7 | set_alt_message($str) |
$str (字串) - 備用電子郵件正文 |
CI_Email例項(方法鏈) | CI_Email |
| 8 | set_header($header, $value) |
$header (字串) - 標頭名稱 $value (字串) - 標頭值 |
CI_Email例項(方法鏈) | CI_Email |
| 9 | clear([$clear_attachments = FALSE]) |
$clear_attachments (布林) – 是否清除附件 |
CI_Email例項(方法鏈) | CI_Email |
| 10 | send([$auto_clear = TRUE]) |
$auto_clear (布林) - 是否自動清除郵件資料 |
CI_Email例項(方法鏈) | CI_Email |
| 11 | attach($filename[, $disposition = ''[, $newname = NULL[, $mime = '']]]) |
$filename (字串) - 檔名 $disposition (字串) - 附件的“處置”。大多數電子郵件客戶端都會根據此處使用的MIME規範做出自己的決定。iana $newname (字串) - 要在電子郵件中使用的自定義檔名 $mime (字串) - 要使用的MIME型別(對緩衝資料很有用) |
CI_Email例項(方法鏈) | CI_Email |
| 12 | attachment_cid($filename) |
$filename (字串) - 現有的附件檔名 |
附件內容ID或如果未找到則為FALSE | 字串 |
傳送電子郵件
要使用CodeIgniter傳送電子郵件,首先您必須使用以下方法載入電子郵件庫:
$this->load->library('email');
載入庫後,只需執行以下函式來設定傳送電子郵件的必要元素。from()函式用於設定 - 從哪裡傳送電子郵件,to()函式用於 - 向誰傳送電子郵件。subject()和message()函式用於設定電子郵件的主題和內容。
$this->email->from('your@example.com', 'Your Name');
$this->email->to('someone@example.com');
$this->email->subject('Email Test');
$this->email->message('Testing the email class.');
之後,執行如下所示的send()函式來發送電子郵件。
$this->email->send();
示例
建立一個控制器檔案Email_controller.php並將其儲存在application/controller/Email_controller.php中。
<?php
class Email_controller extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->library('session');
$this->load->helper('form');
}
public function index() {
$this->load->helper('form');
$this->load->view('email_form');
}
public function send_mail() {
$from_email = "your@example.com";
$to_email = $this->input->post('email');
//Load email library
$this->load->library('email');
$this->email->from($from_email, 'Your Name');
$this->email->to($to_email);
$this->email->subject('Email Test');
$this->email->message('Testing the email class.');
//Send mail
if($this->email->send())
$this->session->set_flashdata("email_sent","Email sent successfully.");
else
$this->session->set_flashdata("email_sent","Error in sending Email.");
$this->load->view('email_form');
}
}
?>
建立一個名為email_form.php的檢視檔案,並將其儲存到application/views/email_form.php。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter Email Example</title>
</head>
<body>
<?php
echo $this->session->flashdata('email_sent');
echo form_open('/Email_controller/send_mail');
?>
<input type = "email" name = "email" required />
<input type = "submit" value = "SEND MAIL">
<?php
echo form_close();
?>
</body>
</html>
修改application/config/routes.php檔案中的routes.php檔案,並在檔案末尾新增以下行。
$route['email'] = 'Email_Controller';
訪問以下連結執行以上示例。將yoursite.com替換為您網站的URL。
http://yoursite.com/index.php/email
CodeIgniter - 表單驗證
驗證是構建Web應用程式的重要過程。它確保我們獲取的資料是正確且有效的,可以儲存或處理。CodeIgniter使這項任務變得非常容易。讓我們透過一個簡單的例子來理解這個過程。
示例
建立一個檢視檔案myform.php,並將以下程式碼儲存到application/views/myform.php中。此頁面將顯示一個表單,使用者可以在其中提交姓名,我們將驗證此頁面以確保在提交時該欄位不能為空。
<html>
<head>
<title>My Form</title>
</head>
<body>
<form action = "" method = "">
<?php echo validation_errors(); ?>
<?php echo form_open('form'); ?>
<h5>Name</h5>
<input type = "text" name = "name" value = "" size = "50" />
<div><input type = "submit" value = "Submit" /></div>
</form>
</body>
</html>
建立一個檢視檔案formsuccess.php,並將其儲存到application/views/formsuccess.php中。如果表單驗證成功,將顯示此頁面。
<html>
<head>
<title>My Form</title>
</head>
<body>
<h3>Your form was successfully submitted!</h3>
<p><?php echo anchor('form', 'Try it again!'); ?></p>
</body>
</html>
建立一個控制器檔案Form.php,並將其儲存到application/controller/Form.php中。此表單將顯示錯誤(如果驗證不正確),或重定向到formsuccess.php頁面。
<?php
class Form extends CI_Controller {
public function index() {
/* Load form helper */
$this->load->helper(array('form'));
/* Load form validation library */
$this->load->library('form_validation');
/* Set validation rule for name field in the form */
$this->form_validation->set_rules('name', 'Name', 'required');
if ($this->form_validation->run() == FALSE) {
$this->load->view('myform');
}
else {
$this->load->view('formsuccess');
}
}
}
?>
在application/config/routes.php中新增以下行。
$route['validation'] = 'Form';
讓我們透過在瀏覽器中訪問以下URL來執行此示例。此URL可能因您的網站而異。
http://yoursite.com/index.php/validation
它將生成以下螢幕:
我們在控制器中添加了一個驗證 - 提交表單前“姓名”是必填欄位。因此,如果您在不輸入姓名欄位的情況下單擊提交按鈕,則系統會要求您在提交前輸入姓名,如下面的螢幕截圖所示。
成功輸入姓名後,您將被重定向到如下所示的螢幕。
在上面的示例中,我們使用了required規則設定。CodeIgniter中還有許多其他規則可用,如下所述。
驗證規則參考
以下是所有可用的原生規則列表 -
| 規則 | 引數 | 描述 | 示例 |
|---|---|---|---|
required |
否 | 如果表單元素為空,則返回FALSE。 | |
matches |
是 | 如果表單元素與引數中的元素不匹配,則返回FALSE。 | matches[form_item] |
regex_match |
是 | 如果表單元素與正則表示式不匹配,則返回FALSE。 | regex_match[/regex/] |
differs |
是 | 如果表單元素與引數中的元素不不同,則返回FALSE。 | differs[form_item] |
is_unique |
是 | 如果表單元素對於引數中的表和欄位名稱不是唯一的,則返回FALSE。注意 - 此規則需要啟用查詢構建器才能工作。 | is_unique[table.field] |
min_length |
是 | 如果表單元素短於引數值,則返回FALSE。 | min_length[3] |
max_length |
是 | 如果表單元素長於引數值,則返回FALSE。 | max_length[12] |
exact_length |
是 | 如果表單元素不完全等於引數值,則返回FALSE。 | exact_length[8] |
greater_than |
是 | 如果表單元素小於或等於引數值或不是數字,則返回FALSE。 | greater_than[8] |
greater_than_equal_to |
是 | 如果表單元素小於引數值或不是數字,則返回FALSE。 | greater_than_equal_to[8] |
less_than |
是 | 如果表單元素大於或等於引數值或不是數字,則返回FALSE。 | less_than[8] |
less_than_equal_to |
是 | 如果表單元素大於引數值或不是數字,則返回FALSE。 | less_than_equal_to[8] |
in_list |
是 | 如果表單元素不在預定的列表中,則返回FALSE。 | in_list[red,blue,green] |
alpha |
否 | 如果表單元素包含除字母字元以外的任何內容,則返回FALSE。 | |
alpha_numeric |
否 | 如果表單元素包含除字母數字字元以外的任何內容,則返回FALSE。 | |
alpha_numeric_spaces |
否 | 如果表單元素包含除字母數字字元或空格以外的任何內容,則返回FALSE。應在trim之後使用,以避免開頭或結尾處的空格 | |
alpha_dash |
否 | 如果表單元素包含除字母數字字元、下劃線或破折號以外的任何內容,則返回FALSE。 | |
numeric |
否 | 如果表單元素包含除數字字元以外的任何內容,則返回FALSE。 | |
integer |
否 | 如果表單元素包含除整數以外的任何內容,則返回FALSE。 | |
decimal |
否 | 如果表單元素包含除十進位制數字以外的任何內容,則返回FALSE。 | |
is_natural |
否 | 如果表單元素包含除自然數以外的任何內容,則返回FALSE - 0、1、2、3 等。 | |
is_natural_no_zero |
否 | 如果表單元素包含除自然數以外的任何內容,但不是零 - 1、2、3 等,則返回FALSE。 | |
valid_url |
否 | 如果表單元素不包含有效的URL,則返回FALSE。 | |
valid_email |
否 | 如果表單元素不包含有效的電子郵件地址,則返回FALSE。 | |
valid_emails |
否 | 如果逗號分隔列表中提供的任何值不是有效的電子郵件,則返回FALSE。 | |
valid_ip |
否 | 如果提供的IP無效,則返回FALSE。接受“ipv4”或“ipv6”的可選引數以指定IP格式。 | |
valid_base64 |
否 | 如果提供的字串包含除有效的Base64字元以外的任何內容,則返回FALSE。 |
CodeIgniter - 會話管理
在構建網站時,我們經常需要跟蹤使用者的活動和狀態,為此,我們必須使用會話。CodeIgniter為此目的提供了會話類。
初始化會話
會話資料可以透過整個站點全域性訪問,但要使用這些資料,我們首先需要初始化會話。我們可以在建構函式中執行以下行來實現。
$this->load->library('session');
載入會話庫後,您可以簡單地使用如下所示的會話物件。
$this->session
新增會話資料
在PHP中,我們只需使用$_SESSION陣列即可在會話中設定任何資料,如下所示。
$_SESSION[‘key’] = value;
其中“key”是陣列的鍵,“value”分配在等號的右側。
在CodeIgniter中可以執行相同操作,如下所示。
$this->session->set_userdata('some_name', 'some_value');
set_userdata()函式接受兩個引數。第一個引數some_name是會話變數的名稱,some_value將儲存在此名稱下。
set_userdata()函式還支援另一種語法,您可以在其中傳遞陣列以儲存值,如下所示。
$newdata = array( 'username' => 'johndoe', 'email' => 'johndoe@some-site.com', 'logged_in' => TRUE ); $this->session->set_userdata($newdata);
刪除會話資料
在PHP中,我們可以使用unset()函式刪除儲存在會話中的資料,如下所示。
unset($_SESSION[‘some_name’]);
在CodeIgniter中刪除會話資料非常簡單,如下所示。unset_userdata()函式的以下版本將僅從會話中刪除一個變數。
$this->session->unset_userdata('some_name');
如果要從會話中刪除更多值或刪除整個陣列,可以使用unset_userdata()函式的以下版本。
$this->session->unset_userdata($array_items);
獲取會話資料
在會話中設定資料後,我們還可以檢索該資料,如下所示。Userdata()函式將用於此目的。如果要訪問的資料不可用,此函式將返回NULL。
$name = $this->session->userdata('name');
示例
建立一個名為Session_controller.php的控制器類,並將其儲存到application/controller/Session_controller.php中。
<?php
class Session_controller extends CI_Controller {
public function index() {
//loading session library
$this->load->library('session');
//adding data to session
$this->session->set_userdata('name','virat');
$this->load->view('session_view');
}
public function unset_session_data() {
//loading session library
$this->load->library('session');
//removing session data
$this->session->unset_userdata('name');
$this->load->view('session_view');
}
}
?>
建立一個名為session_view.php的檢視檔案,並將其儲存到application/views/session_view.php中。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter Session Example</title>
</head>
<body>
Welcome <?php echo $this->session->userdata('name'); ?>
<br>
<a href = 'https://:85/CodeIgniter-3.0.1/CodeIgniter3.0.1/index.php/sessionex/unset'>
Click Here</a> to unset session data.
</body>
</html>
修改application/config/routes.php檔案中的routes.php檔案,並在檔案末尾新增以下行。
$route['sessionex'] = 'Session_Controller';
使用以下地址執行以上示例。將yoursite.com替換為您網站的URL。
http://yoursite.com/index.php/sessionexCodeIgniter - 快閃記憶體資料
在構建Web應用程式時,我們需要僅儲存某些資料一次,然後我們希望刪除該資料。例如,顯示某些錯誤訊息或資訊訊息。在PHP中,我們必須手動執行此操作,但CodeIgniter為我們簡化了這項工作。在CodeIgniter中,flashdata僅在下一個請求之前可用,並且會自動刪除。
新增Flashdata
我們可以簡單地儲存flashdata,如下所示。
$this->session->mark_as_flash('item');
mark_as_flash()函式用於此目的,它僅接受一個要儲存的值引數。我們還可以傳遞陣列以儲存多個值。
set_flashdata()函式也可以使用,它接受兩個引數,名稱和值,如下所示。我們還可以傳遞陣列。
$this->session->set_flashdata('item','value');
檢索Flashdata
可以使用flashdata()函式檢索Flashdata,該函式接受一個要獲取的專案的引數,如下所示。flashdata()函式確保您僅獲取flash資料,而不是任何其他資料。
$this->session->flashdata('item');
如果未傳遞任何引數,則可以使用相同的函式獲取一個數組。
示例
建立一個名為FlashData_Controller.php的類,並將其儲存到application/controller/FlashData_Controller.php中。
<?php
class FlashData_Controller extends CI_Controller {
public function index() {
//Load session library
$this->load->library('session');
//redirect to home page
$this->load->view('flashdata_home');
}
public function add() {
//Load session library
$this->load->library('session');
$this->load->helper('url');
//add flash data
$this->session->set_flashdata('item','item-value');
//redirect to home page
redirect('flashdata');
}
}
?>
建立一個名為flashdata_home.php的檢視檔案,並將其儲存到application/views/ flashdata_home.php中。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter Flashdata Example</title>
</head>
<body>
Flash Data Example
<h2><?php echo $this->session->flashdata('item'); ?></h2>
<a href = 'flashdata/add'>Click Here</a> to add flash data.
</body>
</html>
修改application/config/routes.php檔案中的routes.php檔案,並在檔案末尾新增以下行。
$route['flashdata'] = 'FlashData_Controller'; $route['flashdata/add'] = 'FlashData_Controller/add';
訪問以下連結執行以上示例。將yoursite.com替換為您網站的URL。
http://yoursite.com/index.php/flashdata
訪問上述URL後,您將看到如下所示的螢幕。
單擊“單擊此處”連結,您將看到如下所示的螢幕。在此螢幕上,您將看到flash資料變數的值。再次重新整理頁面,您將看到類似於上面的螢幕,並且flash資料變數將自動刪除。
CodeIgniter - 臨時資料
在某些情況下,如果要刪除在會話中儲存的資料,則可以使用CodeIgniter中的tempdata功能,此操作將在特定時間段後執行。
新增Tempdata
要將資料新增為tempdata,我們必須使用mark_as_tempdata()函式。此函式接受兩個引數專案或要儲存為tempdata的專案,以及這些專案的到期時間,如下所示。
// 'item' will be erased after 300 seconds(5 minutes)
$this->session->mark_as_temp('item',300);
您還可以傳遞陣列以儲存多個數據。以下儲存的所有專案將在300秒後過期。
$this->session->mark_as_temp(array('item','item2'),300);
您還可以為每個專案設定不同的到期時間,如下所示。
// 'item' will be erased after 300 seconds, while 'item2' // will do so after only 240 seconds $this->session->mark_as_temp(array( 'item'=>300, 'item2'=>240 ));
檢索Tempdata
我們可以使用tempdata()函式檢索tempdata。此函式確保您僅獲取tempdata,而不是任何其他資料。請檢視下面給出的示例,瞭解如何檢索tempdata。tempdata()函式將接受一個要獲取的專案的引數。
$this->session->tempdata('item');
如果您省略引數,則可以檢索所有現有的tempdata。
刪除Tempdata
Tempdata在過期時間後會自動刪除,但如果您想在此之前刪除tempdata,則可以使用unset_tempdata()函式(該函式接受一個要刪除的專案的引數)如下所示進行刪除。
$this->session->unset_tempdata('item');
示例
建立一個名為Tempdata_controller.php的類,並將其儲存在application/controller/Tempdata_controller.php中。
<?php
class Tempdata_controller extends CI_Controller {
public function index() {
$this->load->library('session');
$this->load->view('tempdata_view');
}
public function add() {
$this->load->library('session');
$this->load->helper('url');
//tempdata will be removed after 5 seconds
$this->session->set_tempdata('item','item-value',5);
redirect('tempdata');
}
}
?>
建立一個名為tempdata_view.php的檔案,並將其儲存在application/views/tempdata_view.php中。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter Tempdata Example</title>
</head>
<body>
Temp Data Example
<h2><?php echo $this->session->tempdata('item'); ?></h2>
<a href = 'tempdata/add'>Click Here</a> to add temp data.
</body>
</html>
修改application/config/routes.php中的routes.php檔案,並在檔案末尾新增以下行。
$route['tempdata'] = "Tempdata_controller"; $route['tempdata/add'] = "Tempdata_controller/add";
訪問以下連結執行以上示例。將yoursite.com替換為您網站的URL。
http://yoursite.com/index.php/tempdata
訪問上述URL後,您將看到如下所示的螢幕。
點選“點選此處”連結,您將看到如下所示的螢幕。
在此螢幕中,您將看到tempdata變數的值。5秒後再次重新整理同一頁面(因為我們將tempdata設定了5秒),您將看到與上面類似的螢幕,並且tempdata變數將在5秒後自動刪除。如果您在5秒前重新整理同一頁面,則tempdata不會被刪除,因為時間段尚未結束。
銷燬會話
在PHP中,我們使用session_destroy()函式銷燬會話,在CodeIgniter中,我們可以如下所示銷燬函式。
$this->session->sess_destroy();
呼叫此函式後,所有會話資料(包括flashdata和tempdata)將被永久刪除,無法檢索。
CodeIgniter - Cookie 管理
Cookie是從Web伺服器傳送到客戶端計算機上儲存的一小段資料。CodeIgniter有一個名為“Cookie Helper”的助手用於Cookie管理。
語法 |
set_cookie($name[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = FALSE[, $httponly = FALSE]]]]]]]]]]) |
引數 |
|
返回型別 |
無效 |
在set_cookie()函式中,我們可以透過兩種方式傳遞所有值。第一種方式只能傳遞陣列,第二種方式也可以傳遞單個引數。
語法 |
get_cookie($index[, $xss_clean = NULL]]) |
引數 |
|
返回 |
Cookie值或未找到時為NULL |
返回型別 |
mixed |
get_cookie()函式用於獲取使用set_cookie()函式設定的Cookie。
語法 |
delete_cookie($name[, $domain = ''[, $path = '/'[, $prefix = '']]]]) |
引數 |
|
返回型別 |
無效 |
delete_cookie()函式用於刪除Cookie。
示例
建立一個名為Cookie_controller.php的控制器,並將其儲存在application/controller/Cookie_controller.php中。
<?php
class Cookie_controller extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->helper(array('cookie', 'url'));
}
public function index() {
set_cookie('cookie_name','cookie_value','3600');
$this->load->view('Cookie_view');
}
public function display_cookie() {
echo get_cookie('cookie_name');
$this->load->view('Cookie_view');
}
public function deletecookie() {
delete_cookie('cookie_name');
redirect('cookie/display');
}
}
?>
建立一個名為Cookie_view.php的檢視檔案,並將其儲存在application/views/Cookie_view.php中。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter View Example</title>
</head>
<body>
<a href = 'display'>Click Here</a> to view the cookie.<br>
<a href = 'delete'>Click Here</a> to delete the cookie.
</body>
</html>
修改application/config/routes.php中的routes.php檔案,為上述控制器新增路由,並在檔案末尾新增以下行。
$route['cookie'] = "Cookie_controller"; $route['cookie/display'] = "Cookie_controller/display_cookie"; $route['cookie/delete'] = "Cookie_controller/deletecookie";
之後,您可以在瀏覽器中執行以下URL來執行示例。
http://yoursite.com/index.php/cookie
它將生成如下所示的輸出。
CodeIgniter - 常用函式
CodeIgniter庫函式和助手函式需要在使用前進行初始化,但有一些常用函式不需要初始化。
這些常用函式及其描述如下所示。
| 語法 | is_php($version) |
|---|---|
| 引數 |
$version (字串) - 版本號 |
| 返回 | 如果正在執行的PHP版本至少為指定版本,則為TRUE,否則為FALSE |
| 返回型別 | 無效 |
| 描述 | 確定正在使用的PHP版本是否大於提供的版本號。 |
| 語法 | is_really_writable($file) |
|---|---|
| 引數 |
$file (字串) - 檔案路徑 |
| 返回 | 如果路徑可寫,則為TRUE,否則為FALSE |
| 返回型別 | bool |
| 描述 | 檢查檔案是否可寫。 |
| 語法 | config_item($key) |
|---|---|
| 引數 |
$key (字串) - 配置項鍵 |
| 返回 | 配置鍵值或未找到時為NULL |
| 返回型別 | mixed |
| 描述 | 此函式用於獲取配置項。 |
| 語法 | set_status_header($code[, $text = '']) |
|---|---|
| 引數 |
$code (整數) - HTTP響應狀態程式碼 $text (字串) - 要與狀態程式碼一起設定的自定義訊息 |
| 返回 | |
| 返回型別 | 無效 |
| 描述 | 此函式允許您手動設定伺服器狀態標頭。 |
| 語法 | remove_invisible_characters($str[, $url_encoded = TRUE]) |
|---|---|
| 引數 |
$str (字串) - 輸入字串 $url_encoded (布林值) - 是否也刪除URL編碼字元 |
| 返回 | 已清理的字串 |
| 返回型別 | 字串 |
| 描述 | 此函式防止在ASCII字元之間插入NULL字元。 |
| 語法 | html_escape($var) |
|---|---|
| 引數 |
$var (混合型別) - 要轉義的變數(字串或陣列) |
| 返回 | HTML轉義的字串 |
| 返回型別 | mixed |
| 描述 | 此函式充當本機PHP htmlspecialchars()函式。 |
| 語法 | get_mimes() |
|---|---|
| 返回 | 檔案型別的關聯陣列 |
| 返回型別 | 陣列 |
| 描述 | 此函式返回對application/config/mimes.php中MIMEs陣列的引用。 |
| 語法 | is_https() |
|---|---|
| 返回 | 如果當前使用HTTP over SSL,則為TRUE,否則為FALSE |
| 返回型別 | bool |
| 描述 | 如果使用安全(HTTPS)連線,則返回TRUE,否則返回FALSE(包括非HTTP請求)。 |
| 語法 | is_cli() |
|---|---|
| 返回 | 如果當前在CLI下執行,則為TRUE,否則為FALSE |
| 返回型別 | bool |
| 描述 | 如果應用程式透過命令列執行,則返回TRUE,否則返回FALSE。 |
| 語法 | function_usable($function_name) |
|---|---|
| 引數 |
$function_name (字串) - 函式名稱 |
| 返回型別 | bool |
| 描述 | 如果函式存在且可用,則返回TRUE,否則返回FALSE。 |
下面是一個示例,演示了所有上述函式。
示例
這裡我們只建立了一個控制器,我們將在其中使用上述函式。複製下面給出的程式碼,並將其儲存在application/controller/CommonFun_Controller.php中。
<?php
class CommonFun_Controller extends CI_Controller {
public function index() {
set_status_header(200);
echo is_php('5.3')."<br>";
var_dump(is_really_writable('./Form.php'));
echo config_item('language')."<br>";
echo remove_invisible_characters('This is a test','UTF8')."<br>";
$str = '< This > is \' a " test & string';
echo html_escape($str)."<br>";
echo "is_https():".var_dump(is_https())."<br>";
echo "is_cli():".var_dump(is_cli())."<br>";
var_dump(function_usable('test'))."<br>";
echo "get_mimes():".print_r(get_mimes())."<br>";
}
public function test() {
echo "Test function";
}
}
?>
修改application/config/routes.php中的routes.php檔案,為上述控制器新增路由,並在檔案末尾新增以下行。
$route['commonfunctions'] = 'CommonFun_Controller';
在瀏覽器位址列中鍵入以下URL以執行示例。
http://yoursite.com/index.php/commonfunctions
CodeIgniter - 頁面快取
快取頁面將提高頁面載入速度。如果頁面被快取,則它將以其完全呈現的狀態儲存。下次伺服器收到對快取頁面的請求時,它將直接傳送到請求的瀏覽器。
快取檔案儲存在application/cache資料夾中。可以基於每個頁面啟用快取。在啟用快取時,我們需要設定快取檔案需要保留的時間,在此時間段後,它將自動刪除。
啟用快取
可以透過在任何控制器的任何方法中執行以下行來啟用快取。
$this->output->cache($n);
其中$n是希望頁面在重新整理之間保留的分鐘數。
停用快取
快取檔案在過期時會被刪除,但當您想手動刪除它時,您必須停用它。您可以透過執行以下行來停用快取。
// Deletes cache for the currently requested URI
$this->output->delete_cache();
// Deletes cache for /foo/bar
$this->output->delete_cache('/foo/bar');
示例
建立一個名為Cache_controller.php的控制器,並將其儲存在application/controller/Cache_controller.php中。
<?php
class Cache_controller extends CI_Controller {
public function index() {
$this->output->cache(1);
$this->load->view('test');
}
public function delete_file_cache() {
$this->output->delete_cache('cachecontroller');
}
}
?>
建立一個名為test.php的檢視檔案,並將其儲存在application/views/test.php中。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter View Example</title>
</head>
<body>
CodeIgniter View Example
</body>
</html>
修改application/config/routes.php中的routes.php檔案,為上述控制器新增路由,並在檔案末尾新增以下行。
$route['cachecontroller'] = 'Cache_controller'; $route['cachecontroller/delete'] = 'Cache_controller/delete_file_cache';
在瀏覽器中鍵入以下URL以執行示例。
http://yoursite.com/index.php/cachecontroller
訪問上述URL後,您將看到為此建立的快取檔案將儲存在application/cache資料夾中。要刪除該檔案,請訪問以下URL。
http://yoursite.com/index.php/cachecontroller/delete
CodeIgniter - 頁面重定向
在構建Web應用程式時,我們經常需要將使用者從一個頁面重定向到另一個頁面。CodeIgniter使這項工作變得簡單。redirect()函式用於此目的。
語法 |
redirect($uri = '', $method = 'auto', $code = NULL) |
引數 |
|
返回型別 |
無效 |
第一個引數可以具有兩種型別的URI。我們可以將完整的站點URL或URI片段傳遞到您要重定向到的控制器。
第二個可選引數可以具有auto、location或refresh中的任何一個值。預設為auto。
第三個可選引數僅在location重定向中可用,它允許您傳送特定的HTTP響應程式碼。
示例
建立一個名為Redirect_controller.php的控制器,並將其儲存在application/controller/Redirect_controller.php中。
<?php
class Redirect_controller extends CI_Controller {
public function index() {
/*Load the URL helper*/
$this->load->helper('url');
/*Redirect the user to some site*/
redirect('https://tutorialspoint.tw');
}
public function computer_graphics() {
/*Load the URL helper*/
$this->load->helper('url');
redirect('https://tutorialspoint.tw/computer_graphics/index.htm');
}
public function version2() {
/*Load the URL helper*/
$this->load->helper('url');
/*Redirect the user to some internal controller’s method*/
redirect('redirect/computer_graphics');
}
}
?>
修改application/config/routes.php中的routes.php檔案,為上述控制器新增路由,並在檔案末尾新增以下行。
$route['redirect'] = 'Redirect_controller'; $route['redirect/version2'] = 'Redirect_controller/version2'; $route['redirect/computer_graphics'] = 'Redirect_controller/computer_graphics';
在瀏覽器中鍵入以下URL以執行示例。
http://yoursite.com/index.php/redirect
上述URL將重定向到tutorialspoint.com網站,如果您訪問以下URL,則它將重定向到tutorialspoint.com上的計算機圖形教程。
http://yoursite.com/index.php/redirect/computer_graphics
CodeIgniter - 應用程式分析
在構建Web應用程式時,我們非常關心網站的效能,包括控制器執行花費的時間以及使用了多少記憶體。不僅是效能,而且我們還需要檢視資料的見解,例如POST資料、資料庫查詢資料、會話資料等,以便在開發某些應用程式時進行除錯。CodeIgniter透過分析應用程式使這項工作變得更容易。
啟用效能分析
要啟用應用程式的效能分析,只需在控制器的任何方法中執行以下命令。
$this->output->enable_profiler(TRUE);
啟用後,可以在頁面底部看到效能分析報告。
停用效能分析
要停用應用程式的效能分析,只需在控制器的任何方法中執行以下命令。
$this->output->enable_profiler(FALSE);
啟用/停用效能分析器部分
效能分析可以基於部分進行。您可以透過設定布林值TRUE或FALSE來啟用或停用某個部分的效能分析。如果要為應用程式設定效能分析,則可以在application/config/profiler.php中找到的檔案中進行設定。
例如,以下命令將為整個應用程式啟用效能分析查詢。
$config['queries'] = TRUE;
在下表中,鍵是引數,可以在config陣列中設定以啟用或停用特定配置檔案。
| 鍵 | 描述 | 預設值 |
|---|---|---|
benchmarks |
基準點經過的時間和總執行時間 | TRUE |
config |
CodeIgniter配置變數 | TRUE |
controller_info |
請求的控制器類和方法 | TRUE |
get |
請求中傳遞的任何GET資料 | TRUE |
http_headers |
當前請求的HTTP標頭 | TRUE |
memory_usage |
當前請求消耗的記憶體量(以位元組為單位) | TRUE |
post |
請求中傳遞的任何POST資料 | TRUE |
queries |
所有執行的資料庫查詢列表,包括執行時間 | TRUE |
uri_string |
當前請求的URI | TRUE |
session_data |
當前會話中儲存的資料 | TRUE |
query_toggle_count |
查詢塊預設為隱藏的查詢數量。 | 25 |
application/config/profiler.php中檔案中設定的效能分析器可以透過在控制器中使用set_profiler_sections()函式來覆蓋,如下所示。
$sections = array( 'config' => TRUE, 'queries' => TRUE ); $this->output->set_profiler_sections($sections);
CodeIgniter - 基準測試
設定基準點
如果您想測量執行一組程式碼行或記憶體使用所需的時間,您可以使用 CodeIgniter 中的基準點進行計算。CodeIgniter 中為此目的提供了一個單獨的“Benchmarking”類。
此類會自動載入;您無需手動載入。它可以在您的控制器、檢視和模型類中的任何位置使用。您只需標記一個起點和一個終點,然後在這兩個標記點之間執行elapsed_time()函式,即可獲得執行該程式碼所需的時間,如下所示。
<?php
$this->benchmark->mark('code_start');
// Some code happens here
$this->benchmark->mark('code_end');
echo $this->benchmark->elapsed_time('code_start', 'code_end');
?>
要顯示記憶體使用情況,請使用函式memory_usage(),如下面的程式碼所示。
<?php echo $this->benchmark->memory_usage(); ?>
示例
建立一個名為Profiler_controller.php的控制器,並將其儲存到application/controller/Profiler_controller.php
<?php
class Profiler_controller extends CI_Controller {
public function index() {
//enable profiler
$this->output->enable_profiler(TRUE);
$this->load->view('test');
}
public function disable() {
//disable profiler
$this->output->enable_profiler(FALSE);
$this->load->view('test');
}
}
?>
建立一個名為test.php的檢視檔案,並將其儲存到application/views/test.php
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter View Example</title>
</head>
<body>
CodeIgniter View Example
</body>
</html>
修改application/config/routes.php中的routes.php檔案,為上述控制器新增路由,並在檔案末尾新增以下行。
$route['profiler'] = "Profiler_controller"; $route['profiler/disable'] = "Profiler_controller/disable"
之後,您可以在瀏覽器位址列中輸入以下 URL 來執行示例。
http://yoursite.com/index.php/profiler
上述 URL 將啟用分析器,並生成如下所示的輸出。
要停用分析,請執行以下 URL。
http://yoursite.com/index.php/profiler/disable
CodeIgniter - 新增 JS 和 CSS
在 CodeIgniter 中新增 JavaScript 和 CSS(層疊樣式表)檔案非常簡單。您需要在根目錄中建立 JS 和 CSS 資料夾,並將所有 .js 檔案複製到 JS 資料夾中,並將 .css 檔案複製到 CSS 資料夾中,如下圖所示。
例如,假設您建立了一個 JavaScript 檔案sample.js和一個 CSS 檔案style.css。現在,要將這些檔案新增到您的檢視中,請在您的控制器中載入 URL 助手,如下所示。
$this->load->helper('url');
在控制器中載入 URL 助手後,只需在檢視檔案中新增以下行,即可在檢視中載入 sample.js 和 style.css 檔案,如下所示。
<link rel = "stylesheet" type = "text/css" href = "<?php echo base_url(); ?>css/style.css"> <script type = 'text/javascript' src = "<?php echo base_url(); ?>js/sample.js"></script>
示例
建立一個名為Test.php的控制器,並將其儲存到application/controller/Test.php
<?php
class Test extends CI_Controller {
public function index() {
$this->load->helper('url');
$this->load->view('test');
}
}
?>
建立一個名為test.php的檢視檔案,並將其儲存到application/views/test.php
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter View Example</title>
<link rel = "stylesheet" type = "text/css"
href = "<?php echo base_url(); ?>css/style.css">
<script type = 'text/javascript' src = "<?php echo base_url();
?>js/sample.js"></script>
</head>
<body>
<a href = 'javascript:test()'>Click Here</a> to execute the javascript function.
</body>
</html>
建立一個名為style.css的 CSS 檔案,並將其儲存到css/style.css
body {
background:#000;
color:#FFF;
}
建立一個名為sample.js的 JS 檔案,並將其儲存到js/sample.js
function test() {
alert('test');
}
修改application/config/routes.php中的routes.php檔案,為上述控制器新增路由,並在檔案末尾新增以下行。
$route['profiler'] = "Profiler_controller"; $route['profiler/disable'] = "Profiler_controller/disable"
在瀏覽器中使用以下 URL 執行上述示例。
http://yoursite.com/index.php/test
CodeIgniter - 國際化
CodeIgniter 中的語言類提供了一種簡單的方法來支援多種語言以實現國際化。在某種程度上,我們可以使用不同的語言檔案來顯示多種語言的文字。
我們可以將不同的語言檔案放在 application/language 目錄中。系統語言檔案可以在 system/language 目錄中找到,但是要將您自己的語言新增到您的應用程式中,您應該在 application/language 目錄中為每種語言建立一個單獨的資料夾。
建立語言檔案
要建立語言檔案,必須以_lang.php結尾。例如,您想為法語建立語言檔案,則必須將其儲存為french_lang.php。在此檔案中,您可以將所有語言文字儲存在$lang陣列中的鍵值對中,如下所示。
$lang[‘key’] = ‘val’;
載入語言檔案
要在應用程式中使用任何語言,必須首先載入該特定語言的檔案以檢索儲存在該檔案中的各種文字。您可以使用以下程式碼載入語言檔案。
$this->lang->load('filename', 'language');
filename - 它是您要載入的檔名。此處不要使用檔案的副檔名,而只使用檔名。
Language - 包含它的語言集。
獲取語言文字
要從語言檔案中獲取一行,只需執行以下程式碼。
$this->lang->line('language_key');
其中language_key是用於在載入的語言檔案中獲取鍵值的鍵引數。
自動載入語言
如果全域性需要某些語言,則可以在application/config/autoload.php檔案中自動載入它,如下所示。
| -----------------------------------------------------------------------
| Auto-load Language files
| -----------------------------------------------------------------------
| Prototype:
| $autoload['config'] = array('config1', 'config2');
|
| NOTE: Do not include the "_lang" part of your file. For example
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
*/
$autoload['language'] = array();
只需將 CodeIgniter 要自動載入的不同語言傳遞進去即可。
示例
建立一個名為Lang_controller.php的控制器,並將其儲存到application/controller/Lang_controller.php
<?php
class Lang_controller extends CI_Controller {
public function index(){
//Load form helper
$this->load->helper('form');
//Get the selected language
$language = $this->input->post('language');
//Choose language file according to selected lanaguage
if($language == "french")
$this->lang->load('french_lang','french');
else if($language == "german")
$this->lang->load('german_lang','german');
else
$this->lang->load('english_lang','english');
//Fetch the message from language file.
$data['msg'] = $this->lang->line('msg');
$data['language'] = $language;
//Load the view file
$this->load->view('lang_view',$data);
}
}
?>
建立一個名為lang_view.php的檢視檔案,並將其儲存到application/views/ lang_view.php
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<title>CodeIgniter Internationalization Example</title>
</head>
<body>
<?php
echo form_open('/lang');
?>
<select name = "language" onchange = "javascript:this.form.submit();">
<?php
$lang = array('english'=>"English",'french'=>"French",'german'=>"German");
foreach($lang as $key=>$val) {
if($key == $language)
echo "<option value = '".$key."' selected>".$val."</option>";
else
echo "<option value = '".$key."'>".$val."</option>";
}
?>
</select>
<br>
<?php
form_close();
echo $msg;
?>
</body>
</html>
在application/language中建立三個名為 English、French 和 German 的資料夾,如下圖所示。
複製以下程式碼,並將其儲存在application/language/english資料夾中的english_lang.php檔案中。
<?php $lang['msg'] = "CodeIgniter Internationalization example."; ?>
複製以下程式碼,並將其儲存在application/language/French資料夾中的french_lang.php檔案中。
<?php $lang['msg'] = "Exemple CodeIgniter internationalisation."; ?>
複製以下程式碼,並將其儲存在application/language/german資料夾中的german_lang.php檔案中。
<?php $lang['msg'] = "CodeIgniter Internationalisierung Beispiel."; ?>
修改application/config/routes.php中的routes.php檔案,為上述控制器新增路由,並在檔案末尾新增以下行。
$route['lang'] = "Lang_controller";
在瀏覽器中執行以下 URL 來執行上述示例。
http://yoursite.com/index.php/lang
它將生成如下所示的輸出。如果更改下拉列表中的語言,下拉列表下方所寫句子的語言也將相應更改。
CodeIgniter - 安全性
XSS 防禦
XSS 指跨站指令碼攻擊。CodeIgniter 帶有 XSS 過濾安全功能。此過濾器將阻止任何惡意 JavaScript 程式碼或任何其他試圖劫持 Cookie 並進行惡意活動的程式碼。要透過 XSS 過濾器過濾資料,請使用xss_clean()方法,如下所示。
$data = $this->security->xss_clean($data);
只有在提交資料時才應使用此函式。可選的第二個布林引數也可用於檢查影像檔案是否存在 XSS 攻擊。這對於檔案上傳功能很有用。如果其值為 true,則表示影像安全,否則表示不安全。
SQL 注入防禦
SQL 注入是對資料庫查詢發起的攻擊。在 PHP 中,我們使用mysql_real_escape_string()函式以及其他技術來防止這種情況,但 CodeIgniter 提供了內建函式和庫來防止這種情況。
我們可以透過以下三種方式在 CodeIgniter 中防止 SQL 注入 -
- 轉義查詢
- 查詢繫結
- 活動記錄類
轉義查詢
<?php
$username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.
$this->db->escape($email);
$this->db->query($query);
?>
$this->db->escape()函式會自動在資料周圍新增單引號,並確定資料型別,以便它只能跳脫字元串資料。
查詢繫結
<?php $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, 'live', 'Rick')); ?>
在上面的示例中,問號(?)將被 query() 函式第二個引數中的陣列替換。以這種方式構建查詢的主要優點是值會自動轉義,從而生成安全的查詢。CodeIgniter 引擎會自動為您執行此操作,因此您無需記住它。
活動記錄類
<?php
$this->db->get_where('subscribers_tbl',array
('status'=> active','email' => 'info@arjun.net.in'));
?>
使用活動記錄,查詢語法由每個資料庫介面卡生成。它還允許更安全的查詢,因為值會自動轉義。
隱藏 PHP 錯誤
在生產環境中,我們通常不希望向使用者顯示任何錯誤訊息。如果在開發環境中啟用它以進行除錯目的,則效果很好。這些錯誤訊息可能包含一些資訊,出於安全原因,我們不應向網站使用者顯示這些資訊。
有三個與錯誤相關的 CodeIgniter 檔案。
PHP 錯誤報告級別
不同的環境需要不同級別的錯誤報告。預設情況下,開發將顯示錯誤,但測試和生產將隱藏錯誤。根目錄下的 CodeIgniter 中有一個名為index.php的檔案,用於此目的。如果我們將零作為引數傳遞給error_reporting()函式,則將隱藏所有錯誤。
資料庫錯誤
即使您已關閉 PHP 錯誤,MySQL 錯誤仍然處於開啟狀態。您可以在application/config/database.php中關閉它。將$db陣列中的db_debug選項設定為FALSE,如下所示。
$db['default']['db_debug'] = FALSE;
錯誤日誌
另一種方法是將錯誤傳輸到日誌檔案。因此,它不會顯示在網站上的使用者面前。只需將$config陣列中的log_threshold值設定為application/cofig/config.php檔案中的 1,如下所示。
$config['log_threshold'] = 1;
CSRF 防禦
CSRF 代表跨站點請求偽造。您可以透過在application/config/config.php檔案中啟用它來防止此攻擊,如下所示。
$config['csrf_protection'] = TRUE;
當您使用form_open()函式建立表單時,它將自動插入一個 CSRF 作為隱藏欄位。您還可以使用get_csrf_token_name()和get_csrf_hash()函式手動新增 CSRF。get_csrf_token_name()函式將返回 CSRF 的名稱,而get_csrf_hash()將返回 CSRF 的雜湊值。
CSRF 令牌每次提交時都可以重新生成,或者您也可以在 CSRF Cookie 的整個生命週期內保持不變。透過在配置陣列中使用鍵‘csrf_regenerate’將值設定為TRUE,將重新生成令牌,如下所示。
$config['csrf_regenerate'] = TRUE;
您還可以透過在配置陣列中使用鍵‘csrf_exclude_uris’設定白名單 URL 來防止 CSRF 保護,如下所示。您還可以使用正則表示式。
$config['csrf_exclude_uris'] = array('api/person/add');
密碼處理
許多開發人員不知道如何在 Web 應用程式中處理密碼,這可能是許多駭客如此容易侵入系統的原因。在處理密碼時,應牢記以下幾點 -
不要以純文字格式儲存密碼。
始終對密碼進行雜湊處理。
不要使用 Base64 或類似的編碼來儲存密碼。
不要使用 MD5 或 SHA1 等弱或已損壞的雜湊演算法。僅使用強密碼雜湊演算法,如 BCrypt,它用於 PHP 自身的密碼雜湊函式。
切勿以純文字格式顯示或傳送密碼。
不要對使用者的密碼設定不必要的限制。