函數參考手冊:https://php.golaravel.com/extensions.membership.htmlphp
總體參考手冊:https://secure.php.net/manual/zh/langref.phphtml
CodeIgniter參考手冊:http://codeigniter.org.cn/user_guide/前端
安裝配置略node
PHP弱類型語言,能夠放在任何地方,腳本以<?php 開始,以 ?>結束mysql
默認擴展名 .phplaravel
$變量名,能夠建立變量。數字變量能夠經過 $a + $b進行合併。字符串變量經過$a . $b進行合併。web
PHP有四種不一樣的變量做用域正則表達式
local、global、static、parametersql
局部和全局做用域數據庫
函數聲明外叫全局變量,函數聲明內叫局部變量
global關鍵字能夠訪問全局變量。
<?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); echo $y; // 輸出 15 ?>
static函數會保留變量,不會再函數執行完後刪除
function myTest() { static $x=0; echo $x; $x++; } myTest(); myTest(); myTest();
echo 能夠輸出一個或多個字符串,加不加括號無所謂
String(字符串)、Integer(整型)、Float(浮點)、Boolean(布爾)、Array(數組)、Object(對象)、NULL(空值)
//Array $cars=array("Volvo","BMW","Toyota"); //Object class Car { var $color; function Car($color="green") { $this->color = $color; } function what_color() { return $this->color; } }
常量是一個簡單值的標識符,值在腳本中不能改變,常量不須要使用$修飾符
設置常量使用 define 函數,bool define(string $name,mixed $value,[, bool $case_insensitive = false])
name:必須參數,常量名稱
value:必須參數,常量的值
case_insensitive:可選參數,若是設置爲TRUE,該常量則大小寫不敏感,默認是敏感的。
<?php // 不區分大小寫的常量名 define("GREETING", "歡迎訪問 php.cn", true); echo greeting; // 輸出 "歡迎訪問 php.cn" ?>
常量是全局的
定義後,默認是全局變量,能夠在整個運行腳本的任何地方使用。
即便常量定義在函數外也能夠正常使用常量。
define("GREETING", "歡迎訪問 php.cn"); function myTest() { echo GREETING; } myTest(); // 輸出 "歡迎訪問 php.cn"
並置運算符 (.)
在PHP中只有一個字符串運算符,並置運算符(.)用於把兩個字符串值鏈接起來。
$A = "H"; $B = "I"; echo $A . $B;
strlen() 長度函數
echo strlen($A . $B);
strpos() 查找函數
用於在字符串內查找一個字符或一段指定的文本,若是找到返回字符位置,未找到匹配,返回FALSE
count() 獲取數組長度
關聯數組是使用您分配給數組的指定的鍵的數組。
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); or: $age['Peter']="35"; $age['Ben']="37"; $age['Joe']="43";
分配後,能夠根據指定鍵來進行獲取。
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); echo "Peter is " . $age['Peter'] . " years old.";
遍歷並打印關聯數組中的全部值,可使用foreach循環
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); foreach($age as $x=>$x_value) { echo "Key=" . $x . ", Value=" . $x_value; echo "<br>"; }
sort() - 對數組進行升序排列
rsort() - 對數組進行降序排列
asort() - 根據關聯數組的值,對數組進行升序排列
ksort() - 根據關聯數組的鍵,對數組進行升序排列
arsort() - 根據關聯數組的值,對數組進行降序排列
krsort() - 根據關聯數組的鍵,對數組進行降序排列
<?php $cars=array("Volvo","BMW","Toyota"); sort($cars); print_r($cars); ?>
PHP 超級全局變量列表:
$GLOBALS:包含所有變量的全局組合數組,變量的名字就是數組的鍵
$_SERVER:包含服務信息的數組,由Web服務器建立
$_SERVER['PHP_SELF']:當前文件完整路徑和文件名
$_SERVER['GATEWAY_INTERFACE']:服務器使用的CGI規範的版本
$_SERVER['SERVER_ADDR']:腳本所在服務器的IP地址
$_SERVER['SERVER_NAME']:腳本所在服務器的主機名
$_SERVER['SERVER_SOFTWARE']:服務器標識字符串,響應請求時的頭部信息
$_SERVER['SERVER_PROTOCOL']:請求頁面時的通訊協議名稱和版本
$_SERVER['REQUEST_METHOD']:訪問頁面使用的請求方法:例如:GET\HEAD\POST\PUT
$_SERVER['REQUEST_TIME']:請求開始時間戳
$_SERVER['QUERY_STRING']:查詢字符串,若是有能夠經過它進行頁面訪問
$_SERVER['HTTP_ACCEPT']:請求頭的Accept項內容
$_SERVER['HTTP_ACCEPT_CHARSET']:請求頭的Accept-Charset項內容
$_SERVER['HTTP_HOST']:請求地址:localhost:81
$_SERVER['HTTP_REFERER']:引導用戶代理到當前頁的前一頁地址
$_SERVER['HTTPS']:若是腳本是經過HTTPS協議被訪問,則被設爲一個非空的值
$_SERVER['REMOTE_ADDR']:瀏覽當前頁面的用戶的IP地址
$_SERVER['REMOTE_HOST']:瀏覽當前頁面的用戶的主機名
$_SERVER['REMOTE_PORT']:用戶機器上連接到Web服務器所使用的端口號
$_SERVER['SCRIPT_FILENAME']:當前執行腳本的絕對路徑
$_SERVER['SERVER_ADMIN']:Apache服務器配置文件中的SERVER_ADMIN參數
$_SERVER['SERVER_PORT']:Web服務器使用的端口,默認爲80
$_SERVER['SERVER_SIGNATURE']:包含服務器版本和虛擬主機名的字符串
$_SERVER['PATH_TRANSLATED']:當前腳本所在的文件系統的基本路徑
$_SERVER['SCRIPT_NAME']:包含當前腳本的路徑,在頁面須要指向本身的時候用
$_SERVER['SCRIPT_URI']:指定要訪問的頁面,例如"/"
$_REQUEST:用於收集HTML表單提交的數據
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> Name: <input type="text" name="fname"> <input type="submit"> </form> <?php $name = $_REQUEST['fname']; echo $name; ?>
$_POST:接收POST請求數據,
$_POST['fname'];
$_GET:接收URL中發送的數據,
$_GET['subject']
$_FILES
$_ENV
$_COOKIE
$_SESSION
PHP內建函數
Array 函數:運行訪問並操做數組,支持簡單的數組和多維數組
Calendar 函數:日曆擴展包含了簡化不一樣日曆格式之間的轉換函數
cURL 函數:容許你與各類的服務器使用各類類型的協議進行鏈接和通信
Date 函數:容許在運行服務器上獲取時間
Directory 函數:容許獲取關於目錄及其內容的信息
Error 函數:Error和Loggin函數容許對錯誤進行處理和記錄
Filesystem 函數:容許您訪問和操做文件系統
Filter 函數:過濾器用於對來自非安全來源的數據(好比用戶輸入)進行驗證和過濾
FTP 函數:經過文件傳輸協議(FTP)提供文件服務器的客戶端訪問
HTTP 函數:容許您在其餘輸出被髮送以前,對由Web服務器發送的瀏覽器的信息進行操做
LibXML 函數:與SimpleXML、XSLT以及DOM函數一塊兒使用
Mail 函數:容許您從腳本中直接發送電子郵件
Math 函數:能處理integer和float範圍內的值
Misc 函數:把不屬於其餘類別的函數概括到雜項函數類別
MySQLi 函數:容許訪問MySql數據庫服務器
SimpleXML 函數:提供一種獲取XML元素的名稱和文本的簡單方式,轉換XML文檔到SimpleXMLElement對象
String 函數:操做字符串的相關函數
XML Parser 函數:容許解析XML文檔
Zip 函數:容許讀取壓縮文件
建立函數
function functionName()
{
要執行的代碼;
}
__LINE__:返回在文件中的行號
__FILE__:返回文件的完整路徑和文件名
__DIR__:文件所在的目錄,若是用在包括文件中,則返回被包括的文件所在目錄
__FUNCTION__:返回該函數被定義時的名字,若是不在函數內則返回NULL
__CLASS__:常量返回該類被定義時的名字(區分大小寫),調用類裏面的函數須要->的方式
$class = new FunctionClass(); $class->FunctionName(); class FunctionClass { function FunctionName() { echo '類名爲:' . __CLASS__ . "<br>"; echo '函數名爲:' . __FUNCTION__; } }
__TRAIT__:包括其被聲明的做用區域,從基類繼承的成員被插入SayWorld,會先執行父類再執行trait覆蓋的方法
<?php class Base { public function sayHello() { echo 'Hello '; } } trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } } class MyHelloWorld extends Base { use SayWorld; } $o = new MyHelloWorld(); $o->sayHello(); ?>
__METHOD__:返回該方法被定義時的名字
<?php function test() { echo '函數名爲:' . __METHOD__ ; } test(); ?>
__NAMESPACE__:當前命名空間的名稱
<?php namespace MyProject; echo '命名空間爲:"', __NAMESPACE__, '"'; // 輸出 "MyProject" ?>
定義命名空間:namespace MyProject;
定義子命名空間:namespace MyProject\Sub\Level;
導入命名空間:use blah\blah
導入命名空間並賦別名:use My\Full\Classname as Another;
全局空間:在名稱前加上前綴「\」,\fopen(...)表示函數名,是全局空間中的名稱若是沒有定義命名空間則這樣使用
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..] } ?>
解析以下:
類使用 class 關鍵字後加上類名定義。
類名後的一對大括號({})內能夠定義變量和方法。
類的變量使用 var 來聲明, 變量也能夠初始化值。
函數定義相似 PHP 函數的定義,但函數只能經過該類及其實例化的對象訪問。
實例
<?php class Site { /* 成員變量 */ var $url; var $title; /* 成員函數 */ function setUrl($par){ $this->url = $par; } function getUrl(){ echo $this->url . PHP_EOL; } function setTitle($par){ $this->title = $par; } function getTitle(){ echo $this->title . PHP_EOL; } } ?>
變量$this表明自身的對象,PHP_EOL表明換行符
構造函數:_construct()
function __construct( $par1, $par2 ) { $this->url = $par1; $this->title = $par2; }
析構函數:_destruct()
class MyDestructableClass { function __construct() { print "構造函數\n"; $this->name = "MyDestructableClass"; } function __destruct() { print "銷燬 " . $this->name . "\n"; } } $obj = new MyDestructableClass();
繼承:extends
方法重寫:能夠直接在子類定義相同名稱的函數來重寫父類方法
訪問控制:PHP對屬性、方法的訪問控制,是經過關鍵字public\protected\private來實現的 。若是用var定義,視爲公有
接口:interface定義,使用implements繼承,可使用逗號繼承多個接口
類中保持不變的稱爲常量:const constant = "常量值",讀取常量值使用"::":MyClass::constant
抽象類:abstract定義,使用extends繼承
靜態類:static定義能夠不實例化類直接訪問
class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } } print Foo::$my_static . PHP_EOL; $foo = new Foo(); print $foo->staticValue() . PHP_EOL;
密封類:final,沒法覆蓋該方法
class BaseClass { public function test() { echo "BaseClass::test() called" . PHP_EOL; } final public function moreTesting() { echo "BaseClass::moreTesting() called" . PHP_EOL; } }
調用父類構造: parent::__construct();
驗證變量是否進行過設置。
變量不存在返回FALSE
變量存在且值爲NULL,返回FALSE
變量存在且值不爲NULL,返回TRUE
檢查一個變量是否爲空。
若變量不存在則返回TRUE
若變量存在且其值爲""、0、"0"、NULL、FALSE、array()則返回TRUE
若變量存在且其值不爲上面數據,則返回FALSE
PHP中的$_GET和$_POST變量用於檢索表單中的信息,好比用戶輸入
有一點很重要的事情,當處理HTML表單時,PHP能把來自HTML頁面中的表單元素自動變成可供PHP腳本使用
實例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="welcome.php" method="post"> <span>名字:</span><input type="text" name="txtName" /> <span>年齡:</span><input type="number" name="txtOld" /> <input type="submit" value="提交" /> </form> </body> </html> echo "歡迎" . $_POST["txtName"] . "年齡" . $_POST["txtOld"];
能夠經過$_SERVER["REQUEST_METHOD"]來判斷獲取請求類型,而後對請求進行驗證
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>php.cn</title> <style> .error {color: #FF0000;} </style> </head> <body> <?php // 定義變量並默認設置爲空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { $nameErr = "名字是必需的"; } else { $name = test_input($_POST["name"]); // 檢測名字是否只包含字母跟空格 if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只容許字母和空格"; } } if (empty($_POST["email"])) { $emailErr = "郵箱是必需的"; } else { $email = test_input($_POST["email"]); // 檢測郵箱是否合法 if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法郵箱格式"; } } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); // 檢測 URL 地址是否合法 if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) { $websiteErr = "非法的 URL 的地址"; } } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性別是必需的"; } else { $gender = test_input($_POST["gender"]); } } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?> <h2>PHP 表單驗證明例</h2> <p><span class="error">* 必需字段。</span></p> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value="<?php echo $name;?>"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email" value="<?php echo $email;?>"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 網址: <input type="text" name="website" value="<?php echo $website;?>"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 備註: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> <br><br> 性別: <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>您輸入的內容是:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html>
$_SERVER["PHP_SELF"]會存在SQL注入的風險,能夠經過htmlspecialchars()函數來避免被利用
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
多維數組:包含一個或多個數組的數組
<?php // 二維數組: $cars = array ( array("Volvo",100,96), array("BMW",60,59), array("Toyota",110,100) ); print_r($cars);
date()格式化日期
date函數的第一個必需參數format規定了如何格式化日期/時間
可用字符:d-表明月中的天01-3一、m-表明月01-十二、y表明年(四位數)
echo date("Y/m/d"); //2016/05/11 echo date("Y.m.d"); //2016.05.11 echo date("Y-m-d"); //2016-05-11
能夠在服務執行php以前在該文件插入一個文件的內容。
include和require除了處理錯誤的方式不同,其餘方面都是相同的
所以,若是但願無論丟沒丟失都繼續執行,選擇include,不然請始終使用require,有助於提升應用程序的完整性和安全性
語法
或者
此函數的第一個參數是打開文件的名稱,第二個參數規定了使用哪一種模式來打開文件
<?php $file=fopen("welcome.txt","r"); ?>
完整模式以下
模式 | 描述 |
---|---|
r | 只讀。在文件的開頭開始。 |
r+ | 讀/寫。在文件的開頭開始。 |
w | 只寫。打開並清空文件的內容;若是文件不存在,則建立新文件。 |
w+ | 讀/寫。打開並清空文件的內容;若是文件不存在,則建立新文件。 |
a | 追加。打開並向文件末尾進行寫操做,若是文件不存在,則建立新文件。 |
a+ | 讀/追加。經過向文件末尾寫內容,來保持文件內容。 |
x | 只寫。建立新文件。若是文件已存在,則返回 FALSE 和一個錯誤。 |
x+ | 讀/寫。建立新文件。若是文件已存在,則返回 FALSE 和一個錯誤。 |
異常拋出
使用exit能夠在不能打開文件時,拋出一段消息
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
關閉文件
<?php $file = fopen("test.txt","r"); fclose($file); ?>
檢測文件末尾(EOF)
feof()函數能夠檢測是否已到達文件末尾(EOF)
在循環遍歷未知長度的數據時,feof()函數頗有用。
在w、a、x模式下,您沒法讀取打開的文件!
if (feof($file)) echo "文件結尾";
逐行讀取文件
fgets() 函數用於從文件中逐行讀取文件,在調用該函數後,文件指針會移動到下一行
$file = fopen("welcome.txt", "r") or exit("沒法打開文件!"); // 讀取文件每一行,直到文件結尾 while(!feof($file)) { echo fgets($file). "<br>"; } fclose($file);
逐字符讀取文件
fgetc() 函數用於從文件中逐字符的讀取文件,調用該函數後,文件指針會移動到下一個字符
$file=fopen("welcome.txt","r") or exit("沒法打開文件!"); while (!feof($file)) { echo fgetc($file); } fclose($file);
首先建立一個前臺頁面HTML頁面用來接收表單。
<form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="file" id="file" /> <input type="submit" name="submit" value="提交" /> </form>
將以上代碼保存到form.html文件中,須要注意的點以下:
<form>標籤的enctype屬性規定了在提交表單時要使用哪一種內容類型,在表單須要二進制數據時(文件內容)
請使用"multipart/form-data"
<input>標籤的type="file"屬性規定了應該把輸入做爲文件來處理,當瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
<?php //判斷是否有上傳錯誤代碼 if ($_FILES["file"]["error"] > 0) echo "錯誤:" . $_FILES["file"]["error"] . "<br>"; else { echo "上傳文件名:" . $_FILES["file"]["name"] . "<br>"; echo "文件類型:" . $_FILES["file"]["type"] . "<br>"; echo "文件大小:" . $_FILES["file"]["size"] . "<br>"; echo "文件臨時存儲位置:" . $_FILES["file"]["tmp_name"] . "<br>"; }
經過使用PHP的全局數組$_FILES,能夠從客戶計算機向遠程服務器上傳文件。
第一個參數是表單的input name,第二個下標能夠是以下內容
$_FILES["file"]["name"] - 上傳文件的名稱
$_FILES["file"]["type"] - 上傳文件的類型
$_FILES["file"]["size"] - 上傳文件的大小,以字節計
$_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳致使的錯誤代碼
顯示用戶只能上傳txt文件,大小必須小於200kb
<?php $allowedExts = array("txt"); $temp = explode(".",$_FILES["file"]["name"]); $extension = end($temp); if($_FILES["file"]["size"] > 204800 || !in_array($extension,$allowedExts)) return; //判斷是否有上傳錯誤代碼 if ($_FILES["file"]["error"] > 0) echo "錯誤:" . $_FILES["file"]["error"] . "<br>"; else { echo "上傳文件名:" . $_FILES["file"]["name"] . "<br>"; echo "文件類型:" . $_FILES["file"]["type"] . "<br>"; echo "文件大小:" . $_FILES["file"]["size"] . "<br>"; echo "文件臨時存儲位置:" . $_FILES["file"]["tmp_name"] . "<br>"; }
咱們須要把文件拷貝到另外一個位置
<?php $allowedExts = array("txt"); $temp = explode(".", $_FILES["file"]["name"]); $extension = end($temp); if ($_FILES["file"]["size"] > 204800 || !in_array($extension, $allowedExts)) { echo "錯誤:文件類型不正確"; return; } //判斷是否有上傳錯誤代碼 if ($_FILES["file"]["error"] > 0) { echo "錯誤:" . $_FILES["file"]["error"] . "<br>"; } else { echo "上傳文件名:" . $_FILES["file"]["name"] . "<br>"; echo "文件類型:" . $_FILES["file"]["type"] . "<br>"; echo "文件大小:" . $_FILES["file"]["size"] . "<br>"; echo "文件臨時存儲位置:" . $_FILES["file"]["tmp_name"] . "<br>"; } if (file_exists("tem/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " 文件已經存在"; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "tem/" . $_FILES["file"]["name"]); echo "文件保存成功"; }
setcookie() 函數用於設置 cookie
setcookie(name, value, expire, path, domain);
好比建立一個名爲"user"的cookie,併爲它賦值"php",在一個小時後過時。
setcookie("user","php",time()+60*60)
$_COOKIE變量用於取回cookie的值,print_r可查看全部Cookie
<?php // 輸出 cookie 值 echo $_COOKIE["user"]; // 查看全部 cookie print_r($_COOKIE); ?>
使用isset()函數能夠確認是否已設置cookie
if (isset($_COOKIE["user"])) echo "歡迎 " . $_COOKIE["user"] . "!<br>"; else echo "普通訪客!<br>";
// 設置 cookie 過時時間爲過去 1 小時 setcookie("user", "", time()-3600);
session_start()函數必須位於<html>標籤以前,會向服務器註冊用戶的會話,以便保存用戶信息
<?php session_start(); ?> <html> <body> </body> </html>
存儲Session變量
session_start(); // 存儲 session 數據 $_SESSION['views']=1; echo "瀏覽量:". $_SESSION['views'];
檢測Session變量
if(isset($_SESSION['views'])) { $_SESSION['views']=$_SESSION['views']+1; }
銷燬Session變量
session_start(); if(isset($_SESSION['views'])) { unset($_SESSION['views']); }
<?php $to = "someone@example.com"; // 郵件接收者 $subject = "參數郵件"; // 郵件標題 $message = "Hello! 這是郵件的內容。"; // 郵件正文 $from = "someonelse@example.com"; // 郵件發送者 $headers = "From:" . $from; // 頭部信息設置 mail($to,$subject,$message,$headers); echo "郵件已發送"; ?>
防止E-mail注入
<html> <head> <meta charset="utf-8"> <title>php中文網(php.cn)</title> </head> <body> <?php function spamcheck($field) { // filter_var() 過濾 e-mail // 使用 FILTER_SANITIZE_EMAIL $field = filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() 過濾 e-mail // 使用 FILTER_VALIDATE_EMAIL if (filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) { // 若是接收到郵箱參數則發送郵件 // 判斷郵箱是否合法 $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck == FALSE) { echo "非法輸入"; } else { // 發送郵件 $email = $_REQUEST['email']; $subject = $_REQUEST['subject']; $message = $_REQUEST['message']; mail("someone@example.com", "Subject: $subject", $message, "From: $email"); echo "Thank you for using our mail form"; } } else { // 若是沒有郵箱參數則顯示錶單 echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text'><br> Subject: <input name='subject' type='text'><br> Message:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form>"; } ?> </body> </html>
在上面代碼中,使用了PHP過濾器來對輸入進行驗證:
FILTER_SANITIZE_EMAIL過濾器從字符串中刪除電子郵件的非法字符
FILTER_VALIDATE_EMAIL過濾器驗證電子郵件地址的值
在php中,默認的錯誤處理,就是把錯誤信息發送到瀏覽器,這條消息帶有文件名、行號以及描述錯誤的消息
die()函數
能夠重定義錯誤信息,相似於new Error
<?php if(!file_exists("welcome.txt")) { die("文件不存在"); } else { $file=fopen("welcome.txt","r"); } ?>
Try、catch、throw、new Excetption。與C#同樣
若是須要過濾變量,請使用下面的過濾器函數之一
函數 | 描述 | PHP |
---|---|---|
filter_has_var() | 檢查是否存在指定輸入類型的變量。 | 5 |
filter_id() | 返回指定過濾器的 ID 號。 | 5 |
filter_input() | 從腳本外部獲取輸入,並進行過濾。 | 5 |
filter_input_array() | 從腳本外部獲取多項輸入,並進行過濾。 | 5 |
filter_list() | 返回包含全部獲得支持的過濾器的一個數組。 | 5 |
filter_var_array() | 獲取多項變量,並進行過濾。 | 5 |
filter_var() | 獲取一個變量,並進行過濾。 |
參考手冊:http://www.w3school.com.cn/php/php_ref_filter.asp
<!DOCTYPE html> <html> <body> <?php $message = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $int = $_POST["txtNumber"]; if (!filter_var($int, FILTER_VALIDATE_INT)) { $message = "不是合法的整數"; } else { $message = "是合法的整數"; } } ?> <h1>My first PHP page</h1> <form action="index.php" method="post"> <input type="text" name="txtNumber" /> <input type="submit" value="驗證" /> <label style="color:red"><?php echo $message; ?></label> </form> </body> </html>
如今email變量經過Get類型,傳入到php頁面
<?php if(!filter_has_var(INPUT_GET, "email")) { echo("沒有 email 參數"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "不是一個合法的 E-Mail"; } else { echo "是一個合法的 E-Mail"; } } ?>
$filters = array ( "name" => array ( "filter" => FILTER_SANITIZE_STRING ), "age" => array ( "filter" => FILTER_VALIDATE_INT, "options" => array ( "min_range" => 1, "max_range" => 120 ) ), "email" => FILTER_VALIDATE_EMAIL ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("年齡必須在 1 到 120 之間。<br>"); } elseif (!$result["email"]) { echo("E-Mail 不合法<br>"); } else { echo("輸入正確"); } ?>
json_enode:對變量進行JSON編碼
//數組轉換 $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5); echo json_encode($arr); //{"a":1,"b":2,"c":3,"d":4,"e":5} //對象轉換
class Emp {
public $name = "sachin";
public $hobbies = "sports";
}
$e = new Emp();
echo json_encode($e); //{"name":"sachin","hobbies":"sports"}
json_decode:對JSON格式的字符串進行解碼,轉換爲PHP變量
語法:mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
參數:
json: 待解碼的 JSON 字符串,必須是 UTF-8 編碼數據
assoc: 當該參數爲 TRUE 時,將返回數組,FALSE 時返回對象。
depth: 整數類型的參數,它指定遞歸深度
options: 二進制掩碼,目前只支持 JSON_BIGINT_AS_STRING 。
<?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); var_dump(json_decode($json, true)); ?>
json_last_error:返回最後發生的錯誤
建議使用如下兩種方式連接MySql:MySqlLi extension / PDO
PDO應用在12種不一樣數據庫中,MySQLi只針對MySql數據庫
若是須要多數據庫切換,使用PDO,不然使用MySQLi
連接MySql
<?php $serverName = "localhost"; $userName = "root"; $passWord = "1111aaaa"; $conn = new mysqli($serverName, $userName, $passWord, "ibo"); if ($conn->connect_error) { dir("連接失敗:" . $conn->connect_error); } echo "連接成功"; ?>
關閉連接
$conn->close()
執行SQL
$serverName = "localhost";
$userName = "root";
$passWord = "1111aaaa";
$conn = mysqli_connect($serverName, $userName, $passWord, "ibo");
if (!$conn) {
dir("連接失敗:" . mysqli_connect_error());
}
echo "連接成功" . PHP_EOL;
$sql = "insert into ibo.act_id_info(ID_) values(1)";
if(mysqli_query($conn,$sql)){
echo "執行成功" . PHP_EOL;
}else{
echo "執行失敗" . mysqli_error($conn);
}
mysqli_close($conn);
讀取數據
<?php $serverName = "localhost"; $userName = "root"; $passWord = "1111aaaa"; $conn = mysqli_connect($serverName, $userName, $passWord, "ibo"); if (!$conn) { dir("連接失敗:" . mysqli_connect_error()); } echo "連接成功" . PHP_EOL; $sql = "select * from ibo.act_id_info;"; $result = mysqli_query($conn, $sql); foreach ($result as $item) { echo "<br>" . $item["ID_"]; }
mysqli_close($conn);
?>
提供了一種獲取XML元素的名稱和文本的簡單方式
//加載XML $xmlDoc = simplexml_load_file("node.xml"); //輸出全部XML print_r($xmlDoc); //輸出每一個項 echo "<br>" . $xmlDoc->to . PHP_EOL . "<br>"; //輸出所有項 foreach ($xmlDoc->children() as $child) { echo $child->getName() . "-" . $child . PHP_EOL; }
http://www.php.cn/php/php-file-upload.html
CodeIgniter是一套PHP網站開發使用的應用框架和工具包,目標是讓你可以快速的開發
提供了平常任務中所需的大量類庫,以及簡單的接口和邏輯結構。
解壓安裝包
將CodeIgniter文件上傳到服務器
打開application/config/config.php文件設置根URLhttp://localhost:81
打開application/config/database.php文件設置數據庫參數
若是想隱藏文件位置,能夠修改system、application目錄路徑,位置在index.php中的$system_path、$application_folder兩個變量
CodeIgnter默認在每一個目錄下都包含.htaccess文件,阻止直接訪問。
經過ENVIRONMENT常量能夠禁用PHP錯誤報告以及開發環境使用的功能
一個應用程序框架
爲php開發人員提供的一套應用程序工具包,提供了豐富的類庫、提供簡單的接口和邏輯來調用這些類庫。
免費的
CodeIgniter經過MIT開源許可協議受權
輕量級的
核心系統只須要一些很是小的庫,庫都是根據請求動態加載,核心系統很是輕快
快速的
真正的快速,很難找到一個比CodeIgniter性能更好的框架
使用MVC架構
很好的講邏輯層和表示層分離,特別對於模板問你件的項目來講更好,減小代碼量
生成乾淨的URL
生成URL很是乾淨,對搜索引擎友好
功能強大
擁有全面的類庫,能知足大多數Web開發任務的須要
可擴展的
很是簡單的經過你本身的類庫和輔助函數來擴展,能夠經過類擴展或系統鉤子來實現
不須要模板引擎
自帶了一個很是簡單的可選模板解析器,可是不推薦使用,由於會影響性能。
擁有全面的文檔
擁有友好的用戶社區
index.php做爲前端控制器,初始化運行CodeIgniter所需的基本資源
Routing檢查HTTP請求,已確認如何處理請求
若是存在緩存文件,將直接輸出到瀏覽器中,不用走下面的正常流程
加載應用呢程序控制器以前,對HTTP請求以及任何用戶提交的數據進行安全檢查。
控制器加載模型、核心類庫、輔助函數以及其餘全部處理請求所需的資源
渲染函數併發送到瀏覽器,若是開啓緩存,視圖被先緩存起來用於後續的請求
CodeIgniter的MVC與傳統不同
M模型表明你的數據結構,包含幫助你對數據庫進行增刪改查的方法(也就是DLL和DAL)
V視圖展現給用戶的信息,一個視圖一般就是一個網頁
C控制器模型視圖以及其餘任何處理HTTP請求所必須的資源之間的中介
默認狀況你的URL會包含index.php文件,若是你的Apache服務器啓用了mod_rewrite,能夠經過一個
.htaccess文件再加上一些簡單的規則就能夠移出index.php了,下面是這個文件的一個例子,其中使用了否認條件,來排除不須要重定向的系項目
//.htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
上面例子中除了已存在的目錄,其餘HTTP請求都會通過你的index.php文件
而每每僅排除index.php還不夠,咱們還須要排除.txt或者images
RewriteCond $1 !^(index\.php|images|robots\.txt)
添加URL後綴
你能夠指定一個後綴,CodeIgniter生成URL時會自動添加上它。
須要修改conig/config.php文件中的
$config['url_suffix'] = '';
一個控制器就是一個類文件,是一種可以和URI關聯在一塊兒的方式來命名的
控制器文件名必須大寫字母開頭,例如:Blog.php
類名必須以大寫字母開頭,例如:class Blog extends CI_Controller
控制器的類必需要繼承父控制器 CI_Controller
若是URI的第二段爲空時會默認調用index(),若是不爲空則調用該方法
經過URI分段向你的方法傳遞參數,若是URI多於兩個段,多餘的段將做爲參數傳遞到你的方法中
假設你的URI是:localhost/products/shoes/sandals/123
那麼就會收到第三段和第四段的兩個參數
class Products extends CI_Controller { public function shoes($sandals, $id) { echo $sandals; echo $id; } }
默認控制器
CodeIgniter能夠設置一個默認的控制器,當URI沒有分段參數時被加載
$route['default_controller'] = 'blog';
其中Blog是你想加載的控制器類名,若是你如今經過不帶任何參數的地址,你就看到這個信息
重映射方法
URI的第二段一般決定控制器的那個方法被調用,CodeIgniter容許你使用_remap()方法來重寫規則
若是你的控制器包含一個_remap()方法,那麼不管URI中包含什麼參數都會調用該方法
它容許你定義你本身的路由規則,重寫默認的使用URI中的分段來決定調用那個方法
public function _remap($method, $params = array()) { $method = 'process_'.$method; if (method_exists($this, $method)) { return call_user_func_array(array($this, $method), $params); } show_404(); }
處理輸出
CodeIgniter有一個輸出類能夠自動將最終數據發送到你的瀏覽器
容許你向你的控制器添加一個_output方法,能夠接受最終的輸出數據
若是你的控制器含有一個_output方法,輸出類將會調用該方法來顯示數據,而不是直接顯示
public function _output($output) { echo $output; }
私有方法
使用provate或者protected就不會被URI訪問到
構造函數
若是你打算在你的控制器中使用構造函數,必須將下面代碼放在裏面
你的構造函數將會覆蓋父類的構造函數,因此咱們要手工調用它
class Blog extends CI_Controller { public function __construct() { parent::__construct(); // Your own constructor code } }
一個視圖其實就是一個Web頁面或者頁面的一部分,向頁頭、頁腳、側邊等
實際上視圖能夠很靈活的鉗在另外一個視圖裏,而後這個視圖在鑲嵌等等
若是想用這種層次結構的話,能夠這樣作。視圖不能直接被調用,必須經過控制器來加載。
加載視圖
$this->load->view('name');
name參數爲你的視圖文件名,若是視圖放在子目錄中須要添加"目錄名稱/文件名"。
文件的擴展名.php能夠省略,除非使用了其餘的擴展名
加載多個視圖
能夠智能的處理在控制器中屢次調用$this->load->view()方法。
若是出現了屢次調用,視圖會被合併到一塊兒。
若是你但願有一個頁頭、一個菜單、一個內容、一個頁腳。能夠寫成以下形式
public function index() { $data['page_title'] = 'Your title'; $this->load->view('header'); $this->load->view('menu'); $this->load->view('content', $data); $this->load->view('footer'); }
添加動態數據
經過視圖加載方法的第二個參數能夠動態傳入數據,參數能夠是數組或者對象
$data = array( 'title' => 'My Title', 'heading' => 'My Heading', 'message' => 'My Message' ); $this->load->view('blogview', $data); ------------------------------------------------ $data = new Someclass(); $this->load->view('blogview', $data);
當你使用對象時,對象中的變量會轉換爲數組元素
那麼在視圖中就能夠直接使用
<html> <head> <title><?php echo $title;?></title> </head> <body> <h1><?php echo $heading;?></h1> </body> </html>
將視圖做爲數據返回
加載視圖方法有一個可選的第三個參數可讓你修改它的默認行爲
讓視圖做爲字符串返回而不是顯示到瀏覽器中,這在你想對視圖數據作有些處理時頗有用哦個。
若是你將參數設置爲TRUE,該方法返回字符串。默認爲FALSE,視圖將顯示到瀏覽器中
若是你須要返回的數據,將它賦值給一個變量
$string = $this->load->view('myfile', '', TRUE);
模型是專門用來和數據庫打交道的PHP類,用於存放SQL操做類。
class Blog_model extends CI_Model { public $title; public $content; public $date; public function get_last_ten_entries() { $query = $this->db->get('entries', 10); return $query->result(); } public function insert_entry() { $this->title = $_POST['title']; // please read the below note $this->content = $_POST['content']; $this->date = time(); $this->db->insert('entries', $this); } public function update_entry() { $this->title = $_POST['title']; $this->content = $_POST['content']; $this->date = time(); $this->db->update('entries', $this, array('id' => $_POST['id'])); } }
剖析模型
模型類位於你的application/models目錄下,若是你願意也能夠建立子目錄
class Model_name extends CI_Model { public function __construct() { parent::__construct(); // Your own constructor code } }
其中Model_name是類的名字,類名的第一個字母必須大寫,其他小寫。確保你的類繼承CI_Model基類
加載模型
你的模型通常會在你的控制器方法中加載並調用,可使用下面的方法來加載模型
$this->load->model('model_name');
若是你的模型位於一個子目錄下,那麼加載時要帶上你的模型所在目錄的相對路徑。
例如:$this->load->model('blog/queries')
加載以後,就能夠經過一個和你的類同名的對象訪問模型中的方法了
$this->load->model('model_name'); $this->model_name->method();
若是你想將你的模型對象賦值給一個不一樣名字的對象,你可使用$this->load->model()方法的第二個參數
$this->load->model('model_name', 'foobar'); $this->foobar->method();
模型自動加載
若是你有一個模型須要在整個應用程序中使用,你可讓CodeIgniter在系統初始化時自動加載它
打開application/config/autoload.php並將該模型添加到autoload數組中
連接數據庫
當模型加載後,並不會自動去鏈接你的數據庫,有三種辦法能夠連接數據庫
1. 你能夠在控制器或模型中使用標準的數據庫方法連接數據庫
$this->load->database();
2.你能夠設置第三個參數爲TRUE讓模型在加載時自動連接數據庫,會使用你的數據庫配置文件中的配置
$this->load->model('model_name', '', TRUE);
3.你還能夠經過第三個參數傳一個數據庫連接配置
$config['hostname'] = 'localhost'; $config['username'] = 'myusername'; $config['password'] = 'mypassword'; $config['database'] = 'mydatabase'; $config['dbdriver'] = 'mysqli'; $config['dbprefix'] = ''; $config['pconnect'] = FALSE; $config['db_debug'] = TRUE; $this->load->model('model_name', '', $config);
幫助咱們完成特定任務的函數,每一個輔助函數文件都是某一類函數的集合。
輔助函數沒有使用面向對象的方式來實現的,只是簡單的過程式函數,每一個函數處理一個特定的任務
不依賴與其餘函數。
CodeIgniter默認不會本身加載函數,因此使用函數的第一步就是加載它。
一旦加載,就能夠在你的控制器和視圖中全局訪問了。
輔助函數位於system/helpers或application/helpers目錄下
加載輔助函數
$this->load->helper('name')
name參數爲輔助函數的文件名,去掉.php文件後綴以及_helper部分
例如:要加載URL輔助函數,它的文件名叫作url_helper.php,你能夠這樣加載它
$this->load->helper('url');
輔助函數能夠在你的控制器方法的任何地方加載,只要確保在使用以前加載它就能夠了。
你能夠在你的控制器的構造函數中加載它,這樣就能夠在該控制器的任何方法中使用
也能夠在某個須要它的函數中單獨加載它
加載多個輔助函數
若是須要加載多個輔助函數,可使用一個數組
$this->load->helper( array('helper1', 'helper2', 'helper3') );
自動加載輔助函數
設置application/config/autolaod.php
使用輔助函數
一旦輔助函數被加載,你就能夠像使用標準的PHP函數同樣使用它們
<?php echo anchor('blog/comments', 'Click Here');?>
擴展輔助函數
爲了擴展輔助函數,須要在application/helper/目錄下新建一個文件,文件名和已存在的輔助函數同樣
可是要加載MY_前綴。若是隻是想往現有類中添加一些功能,這種時候最好的辦法就是擴展類
例如:要擴展數組輔助函數,須要建立application/helpers/MY_array_helper.php而後重寫函數
// any_in_array() is not in the Array Helper, so it defines a new function function any_in_array($needle, $haystack) { $needle = is_array($needle) ? $needle : array($needle); foreach ($needle as $item) { if (in_array($item, $haystack)) { return TRUE; } } return FALSE; } // random_element() is included in Array Helper, so it overrides the native function function random_element($array) { shuffle($array); return array_pop($array); }
設置自定義前綴
要自定義前綴,能夠在application/config/config.php中找到
$config['subclass_prefix'] = 'MY_';
注意:不要使用CI_開頭
全部的系統類庫都位於system/libraries/目錄下,大多數狀況,須要在使用以前先初始化它
$this->load->library('class_name');
‘class_name’是你想要調用的類庫名稱,例如,要加載表單驗證類庫,能夠這樣作
$this->load->library('form_validation');
一旦類庫被載入,就能夠根據類庫的用戶指南中介紹的方法去使用它了
另外,多個類庫能夠經過一個數組來同時加載
$this->load->library(array('email', 'table'));
類庫一般位於libraries這個目錄下
你能夠建立一個全新的類庫
你能夠擴展原生的類庫
你能夠替換掉原生的類庫
存儲位置
你的類庫文件應該放置在application/libraries目錄下,當你初始化類時CodeIgniter會在這個目錄下尋找
命名約定
文件名首字母必須大寫
類名和文件名必須一致
defined('BASEPATH') OR exit('No direct script access allowed'); class Someclass { public function some_method() { } }
使用類
$this->load->library('someclass');
其中someclass爲文件名,不包括.php文件擴展名
文件名首字母大寫,也能夠寫成全小寫
一旦加載,你就可使用小寫字母名稱來訪問你的類
$this->someclass->some_method();
初始化類時傳入參數
加載類庫的時候,能夠經過第二個參數動態的傳遞一個數組數據
該數組將被傳到你的類的構造函數中
$params = array('type' => 'large', 'color' => 'red'); $this->load->library('someclass', $params);
類庫中使用CodeIgniter資源
一般你的控制器中使用$this來調用全部可用的CodeIgniter方法
$this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url');
可是$this只能在控制器、模型或視圖中直接使用,若是你想在類庫中使用
須要將CodeIgntier對象賦值給一個變量,而後用這個變量代替$this
$CI =& get_instance(); $CI->load->helper('url'); $CI->load->library('session'); $CI->config->item('base_url');
替換原生類庫
將你的類文件名改成和原生的類庫文件一致,CodeIgniter就會使用它替換掉原生的類庫
例如:要替換掉原生的Email類的話,須要建立一個application/libraries/Email.php
class CI_Email { }
加載方式一致:
$this->load->library('email');
注意:數據庫類不能被替換
擴展原生類庫
若是你想往現有類庫中添加一些功能,這個時候就要擴展類庫
類在定義時必須繼承自父類
你的新類名和文件名必須以MY_爲前綴
例如,要擴展原生的Email類你須要新建一個文件命名爲application/libraries/MY_Email.php
class MY_Email extends CI_Email { public function __construct($config = array()) { parent::__construct($config); } }
加載和使用與普通類一致便可。
自定義前綴
$config['subclass_prefix'] = 'MY_';
一種特殊的類庫,有一個父類和多個子類。子類能夠訪問父類,但不能訪問兄弟類
咱們能夠在控制器中初始化父類,而後直接經過父類調用其餘子類便可。
驅動器位於system/libraries目錄,每一個驅動器都有一個獨立的目錄,目錄名和驅動器父類一致
該目錄下還有一個子目錄,命名爲drivers,用於存放全部子類文件
要使用一個驅動器,能夠在控制器中使用下面的方法來進行初始化
$this->load->driver('class_name');
而後就能夠像下面這樣調用該類的方法
$this->some_parent->some_method();
而對於那些子類,咱們也不用初始化,能夠直接經過父類調用了
$this->some_parent->child_one->some_method(); $this->some_parent->child_two->another_method();
鉤子特性提供了一種方法來修改框架的內部運做流程,而無需修改核心文件。
啓用鉤子
application/config/config.php設置下面參數
$config['enable_hooks'] = TRUE;
定義鉤子
鉤子是在application/config/hooks.php文件中被定義的,每一個鉤子能夠定義爲下面的數組格式
$hook['pre_controller'] = array( 'class' => 'MyClass', 'function' => 'Myfunction', 'filename' => 'Myclass.php', 'filepath' => 'hooks', 'params' => array('beer', 'wine', 'snacks') );
數組的索引爲想要使用的掛鉤點名稱pre_controller
鉤子數組是一個關聯數組,數組的鍵值能夠是下面這些
class:但願調用的類名
function:但願調用的方法或函數名
filename:包含你的類或函數的文件名
filepath:包含你的腳本文件的目錄名。filepath相對於application/目錄的路徑
params:你但願傳遞給你腳本的任何參數(可選)
或者也可使用lamdba表達式做爲鉤子
$hook['post_controller'] = function() { /* do something here */ };
屢次調用同一個掛鉤點
若是想要同一個掛鉤點添加多個腳本,只須要將鉤子數組變成二維數組便可
$hook['pre_controller'][] = array( 'class' => 'MyClass', 'function' => 'MyMethod', 'filename' => 'Myclass.php', 'filepath' => 'hooks', 'params' => array('beer', 'wine', 'snacks') ); $hook['pre_controller'][] = array( 'class' => 'MyOtherClass', 'function' => 'MyOtherMethod', 'filename' => 'Myotherclass.php', 'filepath' => 'hooks', 'params' => array('red', 'yellow', 'blue') );
掛鉤點
如下是全部可用掛鉤點的一份列表:
pre_system:系統執行的早期調用,在執行路由或其餘流程以前
pre_controller:控制器調用以前
post_controller_constructor:控制器實例化以後當即執行,方法以前
display_overried:覆蓋_display方法,用於執行結束時向瀏覽器發送最終頁面結果
cache_override:使用方法來替代輸出類的方法,讓你有本身的緩存顯示機制
post_system:最終的頁面發送到瀏覽器以後、在系統的最後期被調用
自動加載特性能夠容許系統每次運行時自動初始化類庫、輔助函數和模型
若是須要在整個應用程序中全局使用某些資源,爲方便起見能夠考慮自動加載它們
支持自動加載的有下面這些:
libraries/目錄下的核心類
helpers/ 目錄下的輔助函數
config/ 目錄下的自定義配置
system/language/ 目錄下的語言文件
models/ 目錄下的模型類
在application/config/autoload.php文件中添加到對應的autoload數組便可。添加時不用文件後綴
定義了一些全局的函數,能夠在任何地方使用它們,不須要加載任何類庫或輔助函數
http://codeigniter.org.cn/user_guide/general/common_funct
兼容性函數只有在高版本的PHP中才有,或者須要依賴其餘的擴展才有。
http://codeigniter.org.cn/user_guide/general/compatibility_functions.html
設置路由規則
規則定義在application/config/routes.php文件中,名爲$route的數組,利用它能夠設置你本身的路由規則
通配符
一個典型的使用通配符的路由規則以下:
$route['product/:num'] = 'catalog/product_lookup';
在一個路由規則中,數組的鍵表示要匹配的URI,值表示要重定向的位置。
URL第一段是product,第二段是數組,那麼調用catalog類的product_lookup方法
也可使用純字符串匹配,或者使用下面兩種通配符
(:num):匹配只含有數字的一段
(:any):匹配含有任何字符串的一段
例子:
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
URL第一段是product,第二段是數字的時候,重定向到catalog類的product_lookup_by_id方法
並將第二段的數組做爲參數傳遞給它。$1表示第一個通配符匹配的內容
能夠在路由規則中使用正則表達式。
$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
相似於products/shirts/123這樣的URL將會重定向到shirts控制器的id_123方法
例如,登陸頁面重定向,就可使用正則表達式來規定路由
$route['login/(.+)'] = 'auth/login/$1';
能夠在你的路由規則中使用HTTP動詞,當你在建立RESTful應用時特別有用
可使用標註你的HTTP動詞(GET\PUT\POST\DELTE\PATCH)
$route['products']['put'] = 'product/insert';
當發送PUT請求到products這個URI時,將會調用Product::insert()方法
$route['products/(:num)']['DELETE'] = 'product/delete/$1';
當發送DELETE請求到第一段爲products,第二段爲數字這個URL時,將會調用Product::delete方法
有三個保留路由,不能名稱一致
$route['default_controller'] = 'welcome';
默認路由,當不加任什麼時候調用的地址
$route['404_override'] = '';
表示當用戶請求了一個不存在的頁面時該加載那個控制器,將會覆蓋默認的404錯誤頁面
$route['translate_uri_dashes'] = FALSE;
能夠自動的將URL中的控制器和方法中連字符轉換爲下劃線
能夠經過下面介紹的方法來在你的應用程序中生成錯誤報告,另外還有一個錯誤日誌類用來記錄
錯誤函數是一個能夠在整個應用程序中使用的簡單接口,讓你在使用該函數時不用擔憂類或方法的做用域的問題。
當任何一處核心代碼調用exit()時,會返回一個狀態碼。
狀態碼用來通知其餘程序PHP腳本是否成功運行,若是運行不成功,又是什麼緣由致使了腳本退出。
狀態碼的值被定義在application/config/constants.php文件中,狀態碼在CLI形式下很是有用,能夠幫你的服務器跟蹤並監控你的腳本
下面的函數用於生成錯誤信息:
show_error(message,status_code,heading)
該函數使用下面的錯誤模板來顯示錯誤信息application/view/errors/html/error_general.php
show_404(page,log_error)
該函數使用下面的錯誤模板來顯示404錯誤信息application/view/error/cli/error_404.php
log_message(level,message)
該函數用於向你的日誌文件中寫入信息,level有三種'error'\'debug'\'info'
爲了保證日誌文件被正確寫入,logs/目錄必須設置爲可寫的,此外必需要設置application/config/config.php
文件中的threshold參數
讓你經過緩存頁面來達到更好的性能
能夠針對每一個獨立的頁面進行緩存,而且你能夠設置每一個頁面緩存的更新時間。
頁面第一次加載時,緩存江北寫入到application/cache目錄下的文件中。
以後請求這個頁面時,就能夠直接從緩存文件中讀取內容並輸出到用戶的瀏覽器。
若是緩存過時,會在輸出以前被刪除並從新刷新。
開啓緩存
將下面的代碼放在任何一個控制器的方法內,你就能夠開啓緩存了。
$this->output->cache($n);
其中$n是緩存更新的事件(單位分鐘)
上面代碼能夠放在方法的任何位置,出現的熟悉怒對緩存沒有影響
刪除緩存
刪除代碼後會在緩存過時時纔會生效
若是須要手工刪除,可使用delete_cache()方法
$this->output->delete_cache();
分析器類會在頁面下方顯示基準測試結果,運行過的SQL語句,本身$_POST數組,有助於調試和優化
啓用分析器
$this->output->enable_profiler(TRUE);
當啓用以後,將會生成一份報告插入到頁面的最底部
使用下面的方法禁用分析器
$this->output->enable_profiler(FALSE);
啓用禁用分析器中的字段
分析器中的每一個字段均可以經過設置響應的控制變量爲TRUE或FALSE來啓用或禁用
在application/config/profiler.php設置全局的默認值
$config['config'] = FALSE; $config['queries'] = FALSE;
或者在控制器裏經過調用輸出類的set_profiler_sections函數來覆蓋全局設置和默認設置
$sections = array( 'config' => TRUE, 'queries' => TRUE ); $this->output->set_profiler_sections($sections);
分析器字段以下
benchmarks:各個計時點話費的時間以及總時間
config:配置變量
controller_info:被請求的控制器類和調用的方法
get:請求中的全部GET數據
http_headers:本次請求的HTTP頭部
memory_usage:本次請求消耗的內存
post:請求中的全部POST數據
queries:列出全部執行的數據庫查詢以及執行時間
uri_string:本次請求的URI
session_data:當前會話存儲的數據
query_toggle_count:指定顯示多少個數據庫查詢,剩下的默認摺疊
若是你不使用模板引擎,那麼你就只能在視圖文件中使用純PHP語法了
爲了精簡,推薦在寫控制結構或echo語句的時候使用PHP替代語法。
若是你發現替代語法不能使用,那就是在php.ini文件中禁用了短標記
CodeIgniter能夠動態的重寫全部段標記,這樣你的服務器不支持也可使用段標記
這個特性能夠再config/config.php文件中啓用
Echo替代語法
<?=$variable?>
控制結構替代語法
像if、for、foreach、while這樣的控制結構也能夠寫成精簡版。
<ul> <?php foreach ($todo as $item): ?> <li><?=$item?></li> <?php endforeach; ?> </ul>
注意,這裏沒有任何括號。全部的結束括號被替換成了endforeach
一樣也就endif、endfor、endforeach、endwhile
注意,每一個分支結構的後面都要跟一個冒號,而不是分號,這很是重要
<?php if ($username === 'sally'): ?> <h3>Hi Sally</h3> <?php elseif ($username === 'joe'): ?> <h3>Hi Joe</h3> <?php else: ?> <h3>Hi unknown user</h3> <?php endif; ?>
CodeIgniter嚴格限制URI中容許出現的字符,以此來減小惡意數據傳到你的應用可能性
URI中只容許包含一些字符:
字母數字、~、%、句號、分號、下劃線、連字號-、空格
輸入類有兩個用途
1.爲了安全性,對輸入數據進行預處理
2.提供了一些輔助方法來獲取輸入數據並處理
該類自動加載,無需手工加載
XSS過濾
輸入類能夠自動的對輸入數據進行過濾,若是但願每次POST或COOKIE自動運行過濾,能夠設置config.php中的參數
$config['global_xss_filtering'] = TRUE;
訪問表單數據
提供了幾個輔助方法來從POST、GET、COOKIE、SERVER數組中獲取數據。
能夠寫成以下幾個方法:
$this->input->post('')
$this->input->get('')
$this->input->cookie('')
$this->input->server('')
須要手動加載Session
$this->load->library('session');
而後就能夠直接使用session進行操做了
$this->session
獲取Session:$_SESSION['item'],$this->session->item
添加Session:$this->session->set_userdata('some_name','some_value')
檢查Session:isset($_SESSION['some_name']),$this->session->has_userdata('some_name');
刪除Session:unset($_SESSION['some_name'])
標記Session時效:首先須要建立一個Session,而後$this->session->mark_as_temp('some_name',300)單位爲秒
銷燬Session:session_destroy();
首先仍是要初始化
$this->load->library('unit_test');
而後使用它
$this->unit->run('test', 'expected result', 'test name', 'notes');
test是測試的代碼結果、expected result是指望返回的結果、test name是測試名稱,notes是備註
生成測試報告
能夠給每一個測試單獨生成報告
echo $this->unit->run($test, $expected_result);
或者顯示一份完整報告
echo $this->unit->report();
也能夠獲取報告數組數據
echo $this->unit->result();
初始化數據庫
$this->load->database();
多行結果查詢
$query = $this->db->query('SELECT name, title, email FROM my_table'); //對象形式 foreach ($query->result() as $row) { echo $row->title; echo $row->name; echo $row->email; } echo 'Total Results: ' . $query->num_rows(); //數組形式 foreach ($query->result_array() as $row) { echo $row['title']; echo $row['name']; echo $row['email']; }
單行結果查詢,返回結果集$query
$query = $this->db->query('SELECT name FROM my_table LIMIT 1'); //對象 $row = $query->row(); //傳遞一個數字參數來返回特定行數據 echo $row->name; //數組 $row = $query->row_array(); //傳遞一個數字參數來返回特定行數據 echo $row['name'];
標準插入方法,返回TRUE/FALSE
$sql = "INSERT INTO mytable (title, name) VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")"; $this->db->query($sql); echo $this->db->affected_rows();
查詢構造器查詢數據
$query = $this->db->get('table_name'); foreach ($query->result() as $row) { echo $row->title; }
查詢構造器插入數據
$data = array( 'title' => $title, 'name' => $name, 'date' => $date ); // // 生成這樣的SQL代碼: // INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}') // $this->db->insert('mytable', $data);
application/config/database.php用於存放數據庫配置文件
$db['default'] = array( 'dsn' => '', //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' => '', //替換默認的dbprefix 'encrypt' => FALSE, //是否使用加密鏈接 'compress' => FALSE, //是否使用客戶端壓縮協議 'stricton' => FALSE, //是否強制使用Strict Mode鏈接 'failover' => array() );
數據庫端口號修改,須要手動添加配置
$db['default']['port'] = 5432;
這是默認的數據庫配置,若是想指定數據庫配置,將上面的數組建明改一下
而後修改配置文件中的
$active_group = 'test';
經過數據庫配置文件的$query_builder變量對查詢構造器類進行全局設定,啓用設成TRUE,禁用設成FALSE
$query_builder = TRUE;
提交數據到你的數據庫以前,確保先對其進行轉義是個很是不錯的作法
escape()這個函數會檢測數據類型,僅轉義字符串類型的數據。會自動用單引號將你的數據括起來
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
escapse-like-str()這個函數用於處理LIKE語句中的字符串
$search = '20% raise'; $sql = "SELECT id FROM table WHERE column LIKE '%" . $this->db->escape_like_str($search)."%' ESCAPE '!'";
能夠簡化查詢語句,使用佔位符來自動拼接
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
也可使用數組中的數組來進行IN語句的轉換
$sql = "SELECT * FROM some_table WHERE id IN ? AND status = ? AND author = ?"; $this->db->query($sql, array(array(3, 6), 'live', 'Rick'));
錯誤處理
要獲取最近一次發生的錯誤信息,可使用error方法
if ( ! $this->db->simple_query('SELECT `example_field` FROM `example_table`')) { $error = $this->db->error(); // Has keys 'code' and 'message' }
num_rows方法:該方法返回查詢結果的行數
$query = $this->db->query('SELECT * FROM my_table'); echo $query->num_rows();
num_fields方法:該方法返回查詢結果列數
$query = $this->db->query('SELECT * FROM my_table'); echo $query->num_fields();
free_result方法:釋放資源所佔內存,在大量查詢後調用便可
$query->free_result();
$this->db->insert_id():返回最近一次插入行的id
$this->db->affected_rows():當執行INSERT\UPDATE\DELETE返回受影響的行數
$this->db->last_query():返回上一次執行的查詢語句
$this->db->count_all():用於獲取數據表的總行數
echo $this->db->count_all('my_table');
$this->db->platform():用於輸出正在使用的數據庫平臺
echo $this->db->platform();
$this->db->version():輸出你正在使用的數據庫版本
$this->db->insert_string():簡化INSERT語法書寫,返回正確格式化的INSERT
$data = array('name' => $name, 'email' => $email, 'url' => $url); $str = $this->db->insert_string('table_name', $data);
注:全部的值都已經被自動轉義了,是安全的值
$this->db->update_string():簡化了UPDATE語法書寫,返回正確格式化的UPDATE
$data = array('name' => $name, 'email' => $email, 'url' => $url); $where = "author_id = 1 AND status = 'active'"; $str = $this->db->update_string('table_name', $data, $where);
查詢表全部數據
$query = $this->db->get('mytable'); // Produces: SELECT * FROM mytable
分頁查詢表數據
$query = $this->db->get('mytable', 10, 20);
生成結果
$query = $this->db->get('mytable'); foreach ($query->result() as $row) { echo $row->title; }
條件查詢
$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);
SELECT指定列,當字段包含子查詢時,須要將第二個參數傳遞FALSE,意思是不保護字段類型
$this->db->select('title, content, date'); $query = $this->db->get('mytable');
MAX第二個參數能夠給別名
$this->db->select_max('age'); $query = $this->db->get('members'); // Produces: SELECT MAX(age) as age FROM members $this->db->select_max('age', 'member_age'); $query = $this->db->get('members'); // Produces: SELECT MAX(age) as member_age FROM members
MIN
$this->db->select_avg('age'); $query = $this->db->get('members');
SUM
$this->db->select_sum('age'); $query = $this->db->get('members');
JOIN
$this->db->select('*'); $this->db->from('blogs'); $this->db->join('comments', 'comments.id = blogs.id'); $query = $this->db->get(); // Produces: // SELECT * FROM blogs JOIN comments ON comments.id = blogs.id
若是查詢中有多個連接,能夠屢次調用這個方法,能夠傳第三個參數指定連接類型
有這樣幾種選擇:left,right,outer,inner,left outer 和 right outer 。
$this->db->join('comments', 'comments.id = blogs.id', 'left'); // Produces: LEFT JOIN comments ON comments.id = blogs.id
Where,一共提供四種方法編寫查詢語句
1.簡單Key-Value
$this->db->where('name', $name); // Produces: WHERE name = 'Joe' $this->db->where('name', $name); $this->db->where('title', $title); $this->db->where('status', $status); // WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
2.自定義Key-Value
$this->db->where('name !=', $name); $this->db->where('id <', $id); // Produces: WHERE name != 'Joe' AND id < 45
3.關聯數組
$array = array('name' => $name, 'title' => $title, 'status' => $status); $this->db->where($array); // Produces: WHERE name = 'Joe' AND title = 'boss' AND status = 'active' $array = array('name !=' => $name, 'id <' => $id, 'date >' => $date); $this->db->where($array);
4.自定義字符串
$where = "name='Joe' AND status='boss' OR status='active'"; $this->db->where($where);
注意有一個可選的第三個參數,若是設置爲FALSE,不保護表名和字段名
or_where
$this->db->where('name !=', $name); $this->db->or_where('id >', $id); // Produces: WHERE name != 'Joe' OR id > 50
where_in
$names = array('Frank', 'Todd', 'James'); $this->db->where_in('username', $names); // Produces: WHERE username IN ('Frank', 'Todd', 'James')
or_where_in
$names = array('Frank', 'Todd', 'James'); $this->db->or_where_in('username', $names); // Produces: OR username IN ('Frank', 'Todd', 'James')
where_not_in
$names = array('Frank', 'Todd', 'James'); $this->db->where_not_in('username', $names); // Produces: WHERE username NOT IN ('Frank', 'Todd', 'James')
or_where_not_in
$names = array('Frank', 'Todd', 'James'); $this->db->or_where_not_in('username', $names); // Produces: OR username NOT IN ('Frank', 'Todd', 'James')
like
$this->db->like('title', 'match'); $this->db->like('body', 'match'); // WHERE `title` LIKE '%match%' ESCAPE '!' AND `body` LIKE '%match% ESCAPE '!'
關聯數組
$array = array('title' => $match, 'page1' => $match, 'page2' => $match); $this->db->like($array); // WHERE `title` LIKE '%match%' ESCAPE '!' AND `page1` LIKE '%match%' ESCAPE '!' AND `page2` LIKE '%match%' ESCAPE '!'
or_like
$this->db->like('title', 'match'); $this->db->or_like('body', $match); // WHERE `title` LIKE '%match%' ESCAPE '!' OR `body` LIKE '%match%' ESCAPE '!'
not_like
$this->db->not_like('title', 'match'); // WHERE `title` NOT LIKE '%match% ESCAPE '!'
or_not_like
$this->db->like('title', 'match'); $this->db->or_not_like('body', 'match'); // WHERE `title` LIKE '%match% OR `body` NOT LIKE '%match%' ESCAPE '!'
group_by
$this->db->group_by("title"); // Produces: GROUP BY title
$this->db->group_by(array("title", "date")); // Produces: GROUP BY title, date
distinct
$this->db->distinct(); $this->db->get('table'); // Produces: SELECT DISTINCT * FROM table
having
$this->db->having('user_id = 45'); // Produces: HAVING user_id = 45 $this->db->having('user_id', 45); // Produces: HAVING user_id = 45
$this->db->having(array('title =' => 'My Title', 'id <' => $id)); // Produces: HAVING title = 'My Title', id < 45
or_having
同上
order_by
$this->db->order_by('title', 'DESC'); // Produces: ORDER BY `title` DESC
$this->db->order_by('title DESC, name ASC'); // Produces: ORDER BY `title` DESC, `name` ASC
$this->db->order_by('title', 'DESC'); $this->db->order_by('name', 'ASC'); // Produces: ORDER BY `title` DESC, `name` ASC
limit,限制返回結果數量
$this->db->limit(10); // Produces: LIMIT 10
$this->db->limit(10, 20);
count_all_results獲取符合條件的數量
echo $this->db->count_all_results('my_table'); // Produces an integer, like 25 $this->db->like('title', 'match'); $this->db->from('my_table'); echo $this->db->count_all_results(); // Produces an integer, like 17
count_all獲取表總行數
echo $this->db->count_all('my_table'); // Produces an integer, like 25
insert()
$data = array( 'title' => 'My title', 'name' => 'My Name', 'date' => 'My date' ); $this->db->insert('mytable', $data); // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
get_compiled_insert()
與insert同樣,可是不執行SQL,返回SQL
insert_batch批量插入
$data = array( array( 'title' => 'My title', 'name' => 'My Name', 'date' => 'My date' ), array( 'title' => 'Another title', 'name' => 'Another Name', 'date' => 'Another date' ) ); $this->db->insert_batch('mytable', $data);
update
$data = array( 'title' => $title, 'name' => $name, 'date' => $date ); $this->db->where('id', $id); $this->db->update('mytable', $data); // Produces: // // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
或者也可使用對象,包括insert也可使用
/* class Myclass { public $title = 'My Title'; public $content = 'My Content'; public $date = 'My Date'; } */ $object = new Myclass; $this->db->where('id', $id); $this->db->update('mytable', $object); // Produces: // // UPDATE `mytable` // SET `title` = '{$title}', `name` = '{$name}', `date` = '{$date}' // WHERE id = `$id`
update_batch
$data = array( array( 'title' => 'My title' , 'name' => 'My Name 2' , 'date' => 'My date 2' ), array( 'title' => 'Another title' , 'name' => 'Another Name 2' , 'date' => 'Another date 2' ) ); $this->db->update_batch('mytable', $data, 'title'); // Produces: // UPDATE `mytable` SET `name` = CASE // WHEN `title` = 'My title' THEN 'My Name 2' // WHEN `title` = 'Another title' THEN 'Another Name 2' // ELSE `name` END, // `date` = CASE // WHEN `title` = 'My title' THEN 'My date 2' // WHEN `title` = 'Another title' THEN 'Another date 2' // ELSE `date` END // WHERE `title` IN ('My title','Another title')
delete
$this->db->delete('mytable', array('id' => $id)); // Produces: // DELETE FROM mytable // WHERE id = $id $this->db->where('id', $id); $this->db->delete('mytable'); // Produces: // DELETE FROM mytable // WHERE id = $id
若是想從多個表刪除數據,能夠將多個代表組成數組傳遞給delete
$tables = array('table1', 'table2', 'table3'); $this->db->where('id', '5'); $this->db->delete($tables);
truncate
$this->db->from('mytable'); $this->db->truncate(); // or $this->db->truncate('mytable'); // Produce: // TRUNCATE mytable
經過將多個方法連接在一塊兒,能夠簡化你的語法
$query = $this->db->select('title') ->where('id', $id) ->limit(10, 20) ->get('mytable');
可使用$this->db->trans_start()和complete()兩個方法
$this->db->trans_start(); $this->db->query('AN SQL QUERY...'); $this->db->query('ANOTHER QUERY...'); $this->db->query('AND YET ANOTHER QUERY...'); $this->db->trans_complete();
在之間,能夠運行任意多個查詢,根據查詢執行成功或失敗,系統自動提交或回滾
$this->db->list_table():列出數據庫中全部的表
$tables = $this->db->list_tables(); foreach ($tables as $table) { echo $table; }
$this->db->table_exists():檢查表是否存在
if ($this->db->table_exists('table_name')) { // some code... }
$this->db->list_fields():列出表的全部列
$fields = $this->db->list_fields('table_name'); foreach ($fields as $field) { echo $field; }
也能夠從任何查詢結果上獲取
$query = $this->db->query('SELECT * FROM some_table'); foreach ($query->list_fields() as $field) { echo $field; }
$this->db->field_exists():檢測表中是否存在某個字段
if ($this->db->field_exists('field_name', 'table_name')) { // some code... }
http://codeigniter.org.cn/user_guide/database/caching.html
&