[蘇勇和他的 IterCast](https://www.zhihu.com/question/23871761/answer/25926171)。
學習環境:[runphponline](http://www.runphponline.com/?filename=php_default) 或 [anycodes](http://www.anycodes.cn/zh)。
- PHP學院 - phpxy.com
此站教程、手冊齊全。
- 7天學會PHP - phpbook.phpxy.com
簡明扼要。**看云上可以下載三種格式的電子書。**
> **對應短小精悍的視頻教程**:http://www.mobiletrain.org/video/php_download.html
- 李炎恢 HTML CSS JavaScript PHP Bootstrap
kancloud.cn/wizardforcel/liyanhui-tutorials/154156
==========
- 市場分析
目前PHP在全球網頁市場、手機網頁市場還有為手機提供API(程序接口)排名第一。
在中國微信開發大量使用PHP來進行開發。
- 我們把我們寫代碼的軟件和運行代碼的軟件統一的稱為開發環境。
時間寶貴,環境只要能滿足學習要求即可。
- 所謂服務器:不要把它想的太過于高深,不過就是提供一項特殊功能(服務)的「電腦」而已。
顯示網頁的叫網頁(web)服務器(server)。
幫我們代為收發電子郵件(email)的服務器叫郵件服務器。
幫我們把各個游戲玩家連接在一起的叫游戲服務器。
幫我們存儲數據的叫數據庫服務器。
> 所謂的 “\*\*服務器” 就是一臺長期開機、可以訪問的裝有對應功能軟件的電腦。
- 網頁服務器、數據庫服務器和PHP最核心的語法解釋器。
強烈建議初學者使用集成環境包(XAMPP)。
_我還是使用 vagrant 吧。_
- htdocs。
- http://127.0.0.1
- 選擇編輯器的標準:不帶提示,要有高亮。(Notepad++)
- 一看就懂,一寫就錯。
> **永遠不要騙自己,寫不出來代碼就是不會。**
==================================================
- 第一段PHP代碼。
~~~
<?php //從此處【尖括號、問號、PHP】這5個字符開始,往下的部份是PHP代碼
phpinfo(); // 一行代碼寫完,就必須要加分號
?> // 遇到上面的【問號、尖括號】說明PHP代碼寫完了。再之后的部份,跟我PHP沒有關系啦
~~~
- 源碼文件命名不要用中文,不要用特殊符號,不要中間加空格,嚴格區分大小。
(a-zA-Z0-9_-)
- 變量。
以$開始,首非數字,大小敏感,禁止中文。
下劃線不算特殊符號。
> 符號讀法:3\#井,4$刀,7&與,8\*星。
> 所謂“三井,四刀,七與,八星”。
- echo 是在PHP里面最常用的一個輸出、顯示功能的命令。
- 注釋
~~~
// 表示單行注釋
/*
* 多行注釋 這里是注釋區域代碼
*/
~~~
- 沒賦值的變量。變量值為空NULL。
- 字符串聲明
用單引號
用雙引號
用字界符(需要輸入非常大段的字符串時使用)
~~~
<?php
$dingjie = <<<ABC
如果
非要在這個滾犢子
前
面<br />
加上一段
<i>距離的話</i>
我想說:<h1>思想有多遠,你就跟我滾多遠</h1>
ABC;
?>
~~~
- **雙引號解析變量,但是單引號不解析變量。**
在雙引號里面插入變量,變量后面如果有英文或中文字符,它會把這個字符和變量拼接起來,【視為一整個變量】。
一定要在變量后面接上特殊字符,例如空格、!等分開。
如果在雙引號里面插變量的時候,后面不想有空格,可以拿【大括號】將變量包起來。
雙引號解析轉義字符,單引號不解析轉義字符。但,單引號能解析\' 和\
單引號效率高于雙引號,**【盡可能使用單引號】**
雙引號需要解析變量,因此雙引號的效率沒有單引號高。我們如果為了更高的效率,我們通常使用單引號。
雙號和單引號可以互插!!!雙引號當中插入單引號,單引號當中插入變量,這個變量會被解析。
神奇的字符串拼接膠水——**(.)點,用來拼接字符串。**
echo $shixi . $buran . $mimang . $xuexi;
因此,大括號的用法還是盡量少用,盡量使用字符串連接的方式比較好。
我們將定界符聲明字符串視為雙引號一樣的功能來看待。
- 不可見字符:主要是計算機規定的一些特殊符號。例如:回車(\n)、縮進(\t)等。
雙引號執行變量,所以……
- 浮點數。
php使用變量不用聲明,直接 $變量名 = 值。
- var_dump() 是一個函數。向括號()中間插入變量。這個函數,會打印出來數據類型,還會對應顯示變量的長度和值。
- if () {}
else {}
一句話的時候可以不寫大括號,但是規范。
- 空在英文里面表示是null,它是代表沒有。空(null)不是false,不是0,也不是空格。
【重點】知道null產生的三種情況,學習empty 和 isset兩個函數的區別。
主要有以下三空情況會產生空(null)類型:
通過變量賦值明確指定為變量的值為NULL
一個變量沒有給任何值
使用函數unset()將變量銷毀掉
- empty()可以向括號中間傳入一個【變量】,字面量不行。
這個變量的值如果為false或者為null的話,返回true。
否則返回false。
$four = 1;
var_dump(empty($four));
[注] 判斷【變量】是否為空。
- isset()可以向括號中間傳入一個或者多個【變量】,變量與變量間用逗號分開。
只要有一個變量為null,則返回false。
$four = null;
var_dump(isset($four));
否則,則返回true。
[注] 判斷【變量】是否被賦值
- unset()這個函數的功能是毀掉變量。
- 對象是一個復合類型。var_dump一個變量的時候看到的類型為object的,這個變量就是對象類型。
- 數組是一個復合類型。var_dump一個變量的時候看到的類型為array的,這個變量就是數組類型。
數組聲明。
$a = array(1,2,3);
var_dump($a);
- 資源。抽象。
電腦里面的資源是指:
word,excel等文件
有人收藏的美女圖片和我們的自拍照片等圖片
音樂
某些人愛看的AVI小電影
打開的網頁
數據庫
... ...
我們打開一個圖片,用PHP來操作它,我們就是操作的一個資源。
我們打開的數據庫**連接(就是你拽著的一條繩子,我們把這個也抽象成了資源,稱作“連接”)**,我們需要連接數據庫,數據庫就是我們操作的資源。
包括網絡連接,連接后發送郵件,我們也可以認為是一個資源。
本章重點:理解資源就提操作我們可見和不可見的文件、網絡和數據。
我們在以后的章節中,操作圖片和網絡的時候大家會有更為深刻的印象。
- 回調。
callback,英文中的call是叫,back是返回,回來的意思。
callback 漢譯過來的意思即為:回調。(執行完成,再調一次某個功能執行一次)
我們在講解函數類型和對象的時候,我們會演示講解回調函數。
Ajax 的異步。Ajax 是一種理念而非技術,這種理念是通過瀏覽器的內置對象支持實現的。
- gettype(傳入一個變量) 能夠獲得變量的類型。
var_dump(傳入一個變量) 輸出變類型和值。
判斷數據類型使用 is_* 系列函數。
is_int 是否為整型
is_bool 是否為布爾
is_float 是否是浮點
is_string 是否是字符串
is_array 是否是數組
is_object 是否是對象
is_null 是否為空
is_resource 是否為資源
is_scalar 是否為標量
is_numeric 是否為數值類型
is_callable 是否為【函數】
- 標量:整型(int) 浮點(float)、【布爾(bool)】、字符串(string)
混合類型: 數組(array)、對象(object)
特殊類型:空(null)、 資源(resouce)、回調(callback)
//換成echo,is_int試試,為什么echo執行假區間呢?
if(is_callable('var_dump')){
echo '執行真區間';
}else{
echo '執行假區間';
}
為什么最后的實驗中 echo 執行假區間呢?
答:因為「echo」不是函數,「是基本語法」。大家眼前可以不用理解函數和基本語法的區別。了解和不了解在實際開發中沒有影響。知道有這個知識點就行。
- PHP 7 的性能與 PHP5.6 相比,提升了性能接近 200%。
7中有些地方,我們可以強制指定類型,也可以不用強制指定類型來聲明變量。
5.x 階段都是完全的弱類型的編程語言。
- 自動類型轉換,就是數據類型在某些情況下,自動會變為其他的類型參與運算。
自動類型轉換的發生時機是:運算和判斷的時候某些值會自動進行轉換。
- 布爾值判斷時的自動類型轉換:
1. 整型的0為假,其他整型值全為真
2. 浮點的0.0,布爾值的假。小數點后只要有一個非零的數值即為真
3. 空字符串為假,只要里面有一個空格都算真
4. 字符串的0,也將其看作是假。其他的都為真
5. 空數組也將其視為假,只要里面有一個值,就為真
6. 空也為假
7. **未聲明成功的資源也為假**
- 強制類型轉換有三種方式:
1. 用后面的三個函數可以完成類型轉換,intval()、floatval()、strval()
2. 變量前加上()里面寫上類型,將它轉換后賦值給其他變量
3. settype(變量,類型) 直接改變量本身
- 常——漢語字面為:長久,經久不變。
常量那就好翻譯了:長久不變的值。
- define(常量名,常量值)
1. 常量值只能為上一章中我們講到的標量**(不能用數組去賦值)**
2. 常量名可以小寫,但是通常大寫
3. 常量名可以不加引號,但是通常加上引號
4. 在字符串中調用常量的時候,必須在引號外面
5. 常量名建議只用字母和下劃線
- 系統內置常量
LINE 當前所在的行
FILE 當前文件在服務器的路徑
FUNCTIOIN 當前函數名
CLASS 當前類名
METHOD 當前成員方法名
PHP_OS PHP運行的操作系統
PHP_VERSION 當前PHP的版本
TRAIT Trait 的名字,php5.4新加
DIR 文件所在的目錄
NAMESPACE 當前命名空間的名稱(區分大小寫)
- 為了防止其他人繞過安全檢查文件。
~~~
<?php
//嘗試將include 'version.php'這一行代碼注釋后再執行看看,對比結果
include 'version.php';
if(!defined('AUTH')){
echo '非法!非法!你嘗試跳過授權文件';
exit;
}
//模擬后面用戶注冊和用戶登陸的代碼xxx行
echo '用戶注冊';
?>
~~~
- 可變變量其實就是——已聲明的變量前,再上變量符。
~~~
<?php
$a = 'b';
$b = 'c';
echo $$a; // c
?>
~~~
- PHP 的外部變量是 PHP 在使用過程中規定好的一些變量。
這個變量的規定是這樣規定的,就這樣使用。
**其實就是一些PHP內置的小工具,被語言發明人在解釋器里寫好提供的。**
~~~html
<form action="reg.php" method="get">
<input type="text" name="username" />
<input type="password" name="pwd" />
<input type="submit" value="提交" />
</form>
~~~
把用戶和密碼,采用get方法,將數據發送給reg.php。
reg.php想辦法接收用戶傳過來的username和pwd這兩個值。
我們得出我們的第一個外部變量:**$_GET**。
$_GET 的主要作用是**拿到表單中get傳值的數據。**
>$_GET后面加上中括號,將username作為字符串放在中括號里面,就得到了表單里面的`<input type="text" name="username" />` 的值。
~~~
<?php
$u = $_GET['username'];
echo $u.'<br />';
$passwd = $_GET['pwd'];
echo $passwd.'<br />';
?>
~~~
- 需要使用到post傳值,post傳值是在地址欄中不可見的。
PHP的代碼里面的$_GET全改為了 **$_POST**。
通過我們看不見的瀏覽器的請求頭文件傳遞的數據。所以在URL(網址)欄不可見。
- **$_REQUEST** 即可以接收get傳值也可以接收post傳值。
- 常用外部變量。(超全局變量)
$_COOKIE 得到會話控制中cookie傳值
$_SESSION 得到會話控制中session的值
$_FILES 得到文件上傳的結果
$_GET 得到get傳值的結果
$_POST 得到post傳值的結果
$_REQUEST 即能得到get的傳值結果,也能得到post傳值的結果
- firebug 可以在 post 的同時查看請求頭的內容。查看header頭傳遞數據(網絡,點擊POST reg.php 選擇Post)。
若真是使用get傳密碼,密碼在地址欄里面顯示過后。瀏覽器的歷史記錄會自動記錄訪問過的地址。惡意用戶會通過查看
你的瀏覽器的歷史記錄,得到你曾經輸入的密碼。因此,不能使用get方式來作密碼的傳輸方式。
- chrome 的話,可以篩 method:POST,找到鏈接對應的 headers - form data。
- 環境變量。phpinfo();
和TCL察看當前文件的路徑什么的,一個道理。
$_SERVER["**REQUEST_METHOD**"] 請求當前PHP頁面的方法
$_SERVER["**REQUEST_URI**"] 請求的URI
$_SERVER["**SERVER_SOFTWARE**"] 用的是哪一種服務器
$_SERVER["**REMOTE_ADDR**"] 客戶的IP地址
$_SERVER["**SERVER_ADDR**"] 當前服務器的IP地址
$_SERVER["**SCRIPT_FILENAME**"] 主前請求文件的路徑
$_SERVER["**HTTP_USER_AGENT**"] 當前訪問這個網址的電腦和瀏覽器的情況
$_SERVER["**HTTP_REFERER**"] 上級來源(用戶從哪個地址進入當前網頁的)
$_SERVER["**REQUEST_TIME**"] 當前的時間
- URL帶有了主機地址部份,而URI不帶協議和主機地址部份。
- url:http://www.phpxy.com/abc.php?username=liwenkai
- uri:abc.php?username=liwenkai
- 變量引用。vs 指針。
$bar = &$fo;
一個變量名,對應了一個數據值(空間)。
兩個變量名,就對應兩個數據值(空間)。
……
而加上&(and 符后),把變量指向同一個存值空間了。
**存的是地址?不是。直接變引用。和java一樣,底層是指針,但是明面上你是讀不到這個地址值的。**
也就是說 $bar 和 $fo 現在是指向同一個值空間。一間房子,原來只有一條路,現在又多了一條路,房子變了,從哪條路走都是走到這個房子來。
- %,取余,取模。
支持 += 和 .= 等快捷運算符。
支持自加自減。(關于先加后賦值$a=++$x 和 先賦值后加$a=$x++)
- 等于 ==(賦值是=號,所以==規定為等于)。
全等(也叫判斷類型等于) ===
全不等(也叫判斷類型不等于) !==
$x = 5;
$y = '5';
== true, === false。$x為整型,$y為字符串類型。
- 短路的用法。
~~~
<?php
//如果為defined('AUTH')存在AUTH常量則為true,不訪問后面的exit了。如果為false則執行exit。
defined('AUTH') or exit('存在安全因素不準訪問');
php>
~~~
- 位運算。左移乘2,右移除以2。對應十進制,左移乘10,右移除以10。
- 不用記優先級,確定不了的時候號上括號把優先級標出來即可。
- 其他運算符:
- $x? 真代碼段(只能寫一句代碼):假代碼段(只能寫一句代碼)。判斷是否為真假 ? 真情況 : 假情況;
- \`\`(反引號) 反引號中間插代命令,執行系統命令,等價于shell_exec函數。echo \`ipconfig\`;(不過有些虛擬服務器是禁止執行這些的命令腳本的)
- @ 單行抑制錯誤,把這一行的錯誤不讓它顯示出來了,效率低不建議使用
- **=> 數組下標訪問符**
- **-> 對象訪問符**
- **instanceof 判斷某個對象是否來自某個類,如果是的返回true,如果不是返回false**
- switch。
~~~
<?php
switch(變量){ //字符串,整型
case 具體值:
執行代碼;
break;
case 具體值2:
執行代碼2;
break;
case 具體值3:
執行代碼3;
break;
default:
}
?>
~~~
可以不寫 break 玩穿透。
- do...while... 有可能用在資源處理如:文件打開等地方。
- exit exit 之前我們講過了,從當前處停止后續執行
break 之前遇到過,跳出循環或者跳出結構體執行后續代碼
continue 跳出此次循環,下次循環繼續
- PHP 5.3 起,可以使用 goto。通過標簽實現。
- declare 在基礎階段,大家應該跳過此處學習。
- 函數的英文叫作:function,而 function 的解釋項中有另外一個含義:功能。
函數 就是 功能。調用一個函數就是在調用一個功能。
函數是條狗,哪里需要哪里吼。
1. 需要用一個函數的時候,就吼一聲它的名字。
2. 函數可以反復去吼,吼了它的名字它就過來了。也就是函數可以反復調用。
我們明白后,那我們接下來來講解函數的分類,我們將函數分為兩大類別:
1. 自定義函數
2. 系統函數
- 自定義函數。
~~~
function 函數名([參數名1[=值1], 參數名2[=值2], 參數名n[=值n]])
{
函數中的功能體
[return 返回值]
}
~~~
函數名與變量命名規則基本一樣,但是不同的是:**函數名不區分大小寫**。
**PHP 函數不能被重載**。[偽重載方案](http://www.jb51.net/article/65711.htm)。
- 函數體的參數若是定義了,未傳參數,代碼會報錯。
但函數后的參數如果有默認值,參數可以不填,代碼也不會報錯。
函數后如果有默認值和無默認值的參數,通常把無默認值的參數寫在最前面。
- **函數**的執行沒有順序關系,**可以在定義處之前的位置調用**。
這一點與 TCL 著實不同。
- 回調函數:在一個函數的參數里面,再傳入一個函數名,將函數名加上()括號,識為變量函數,配合執行。
~~~
function woziji($one,$two,$func){
if(!is_callable($func)){
return false;
}
//$func是一個變量函數
echo $one + $two + $func($one,$two);
}
function plusx2( $foo , $bar){
$result = ($foo+$bar)*2;
return $result;
}
echo woziji(20,10,'plusx2');
~~~
- 變量部份,我們學習了可變變量($$a)。
可變函數僅僅是可變變量的一個變種、變形表達。
可變函數,我們也會稱呼為變量函數。
> 核心思想就是一句話:函數也是一種變量類型。可變函數也是一種可變變量。
~~~
function demo(){
echo '天王蓋地虎';
}
function test(){
echo '小雞燉蘑菇';
}
$fu = 'demo';
//把$fu變為了demo,把demo后加上了一個括號,就執行函數了
$fu();
~~~
- 所謂匿名,就是沒有名字。
匿名函數,也就是沒有函數名的函數。
匿名函數的第一種用法,直接把賦數賦值給變量,調用變量即為調用函數。
1. 變量函數式的匿名函數
函數體沒有函數名,通過$greent加上括號來調用的,這就是匿名函數。
~~~
$greet = function($name)
{
echo $name.',你好';
};
$greet('明天');
$greet('PHP學院');
~~~
2. 回調函數式的匿名函數
實際使用場景中,我們想通過一個函數實現一個功能。
但是,我又不想專門定義一個函數。
~~~
function woziji($one,$two,$func){
if(!is_callable($func)){
return false;
}
echo $one + $two + $func($one,$two);
}
woziji(20, 30, function($foo, $bar) {
$result = ($foo+$bar)*2;
return $result;
}
);
~~~
因此,函名函數在調用的時候沒有函數名。
- 內部函數,是指在函數內部又聲明了一個函數。
~~~
<?php
function foo()
{
echo '我是函數foo喲,調一下我才會執行定義函數bar的過程<br />';
function bar()
{
echo '在foo函數內部有個函數叫bar函數<br />';
}
}
//現在還不能調用bar()函數,因為它還不存在
bar();
foo();
//現在可以調用bar()函數了,因為foo()函數的執行使得bar()函數變為已定義的函數
bar();
//再調一次foo()看看是不是會報錯?
foo();
?>
~~~
1. 內部函數名,不能是已存在的函數名。
2. foo()調用兩次會報錯。
3. 如果不調foo()函數無法執行bar函數,因為bar是在foo的內部。**(調了一下母函數,內部函數才算初次聲明了)**
- 好像。
\`\`\` = <?
php = php
內容就是內容。
\`\`\` = ?>
- 變量作用域。
例外:超全局變量是外部變量,但在函數內部也是可以用。
$_COOKIE 得到會話控制中cookie傳值
$_SESSION 得到會話控制中session的值
$_FILES 得到文件上傳的結果
$_GET 得到get傳值的結果
$_POST 得到post傳值的結果
$_REQUEST 即能得到get的傳值結果,也能得到Post傳值的結果
- 通過 $GLOBLAS 在函數內創建、讀取和修改外部變量(定義在函數外部的變量)。
- 在函數內使用global關鍵詞后面跟一個或多個變量,就把變量變為了全局變量。我們越來越少的使用這種方式來聲明全局變量了。**在TCL里還存在。**
- 函數的參數引用,也是這個意思,將形參和實參指向到同一個位置。如果形參在函數體內發生變化,那么實參的值也發生變化。(函數傳參的“傳引用”用法,vs “傳參”)
- 遞歸函數。函數體內調用函數自己。主要是用在:文件和文件夾操作。
也可以用現成的文件和文件夾處理函數或文件處理類就可以。
>寫出迭代公式,確定終止條件。
- 靜態變量:函數被調用了多少次。
聲明一個靜態變量,第二次調用函數的時候,靜態變量不再初始化變量,會在原值的基礎上讀取執行。
聲明在函數內部,static $a = 0;
- 使用系統內置函數:依靠**手冊**。
http://down.phpxy.com/book%2Fphp_enhanced_zh.chm
1. 了解函數的功能,特別是常用函數的功能
2. 了解函數的參數
3. 了解函數的返回值
- 返回 bool 值的,通常為操作是否成功、驗證是否通過、檢查是否正確等。
- int array_unshift ( array &$array , mixed $value1 [, mixed $... ] )
&符,引用傳參。
Mixed 表示任何類型的數據,指可傳入任意類型。
所有遇到中括號的。都是指后面的參數可傳,也可以不傳。
...(省略號)。代表可以傳入任意多個參數。
~~~
<?php
$queue = array("鳳姐", "芙蓉");
array_unshift($queue, "楊冪", "姚晨");
print_r($queue);
?>
~~~
- bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] )
~~~
$shuaige = array("a" => "wuyanzhu", "b" => "huangxiaoming", "c" => "ninzetao");
function test_print($item2, $key)
{
echo $key ." ---". strtoupper($item2) . "<br />\n";
}
echo '<pre>';
var_dump($shuaige);
echo '</pre>';
array_walk($shuaige, 'test_print');
echo '用自定義函數test_print執行后的效果:';
echo '<pre>';
var_dump($shuaige);
echo '</pre>';
~~~
- 系統函數支持的版本號很重要。
- 文件包含函數。**模塊化編程。**
`如果被包含的 php 文件不存在:`
inlcude(返回一條警告) 文件繼續向下執行。通常用于動態包含
require(一個致命的錯) 代碼就不會繼續向下執行。通常包含極為重要的文件,整個代碼甭想執行
include_once(返回一條警告) 除了原有include的功能以外,它還會做once檢測,如果文件曾經已經被被包含過,不再包含
require_once(一個致命的錯) 除了原的功能一外,會做一次once檢測,防止文件反復被包含
- 所以,少用帶once的,因為它會消耗更多的資源去做檢測的工作。
- include 每次都會執行,同一個文件不能被包含兩次,因為函數不能定義兩次,否則會報錯。
- require_once:包含的文件必須存在,否則停止執行。會做重復包含檢查喲。
- 數學函數。看一遍知道PHP的數學函數里面為大家準備了這么多就可。
以后需要的時候,直接來用現查。
mt_rand():更好的隨機數。
- 日期常用函數。要記錄數據的地方就有時間。、
>[info] 我們為什么不直接用數據庫里面的時間,因為在實際開發過程中,我們需要把時間取出來再排序和顯示,所以單純的用數據庫里面的時間達不到我們的業務需求。
- 時區:1884年在華盛頓召開國際經度會議時,為了克服時間上的混亂,規定將全球劃分為24個時區。在中國采用首都北京所在地東八區的時間為全國統一使用時間。
- 世界時:格林尼治時間(英文簡寫:GMT)。各地都有各地的地方時間。如果對國際上某一重大事情,用地方時間來記錄,就會感到復雜不便。而且將來日子一長容易搞錯。因此,天文學家就提出一個大家都能接受且又方便的記錄方法,那就是以格林尼治(英國某地區)的地方時間為標準。
- Unix 時間戳:電腦本身不認識時間,我們在電腦里面設置一個時間方便運算。于是我們規定了一種計算方式,unix時間戳。從Unix紀元(1970 年 1月1日零時)開始到一個時間經過的秒數。
- echo date_default_timezone_get();
echo date_default_timezone_set(TIMEZONE);
http://php.net/manual/zh/timezones.php
- time()獲取當前的unix時間戳。
- date函數用于將一個時間進行格式化輸出,以方便時間的顯示或存儲。
>[success] date 函數的格式參數表。詳見原書。
- getdate獲取當前系統時間。
返回值是一個根據timestamp得到的**包含時間鍵值信息的數組**。如果沒有參數,則會返回當前的時間。
- print_r可以輸出一個數組中所有的鍵名與值。
- 日期驗證函數。checkdate可以判斷一個輸出的日期是否有效。在實際的工作中,我們需要經常用于檢測常用于用戶提交表單的數據驗證。
- mktime()。生成時間戳
- 程序執行時間檢測,測試某個函數效率的快慢時會用到:microtime(true)。記錄開始時刻和結束時刻。
#### 數組、字符串和數據庫是我們函數里面最、最、最常用的三類函數。
- 全文搜索:**“那你開始背函數吧”**。
- mb\* 和iconv\* 他們可以處理多字節字符,例如:中文。
中文主要用的是GBK和utf-8兩種編碼格式。
GBK和utf-8是兩個不同的編碼委員會對于漢字進行的編碼的標準。
- 他們規定**GBK是雙字節**,也就是一個漢字占用2Bytes。
- **utf-8是三字節**,一個漢字占用三個字節長度的存儲空間。
- >[warning] dump = 傾倒。
- 數組。
~~~
<?php
$shu = array(1 , 1.5 , true ,'天王蓋地虎,小雞燉蘑菇');
echo '<pre>';
var_dump($shu);
echo '</pre>';
?>
~~~
- array(size = 4) 說明里面有4個元素。
0 => int 1 最前的 0 代表的是值的讀取標識號,我們稱之為下標或者鍵(英文:key)。
=> 叫作:鍵值對應符。因此,以后再看到 0=> int 1 可以這樣來說。 **下標訪問符0 對應 整型的1。**
>[info] 我們還稱數組里面的鍵值對為元素,**元素是鍵值對的組合(而不只是值)。**
- 索引數組的聲明。通過 array() 函數返回數組對象。
所謂索引數組:就是下標全為整型的數組。
鍵值的增長規則與之前的規則一樣。都是最大值加1的原則。
向索引數組中增加元素用: 數組變量名[]、數組變量名[鍵值]這兩種方式來增加元素。
- 使用unset刪除變量的方式來刪除數組里面的值。
刪除了中間的值,并不會讓后面的下標向前自動移動。而是原來的值為多少就為多少
刪除掉其中的某個值,新加入的值不會替換掉原來的位置,依然遵循最大值加1的原則。
- 索引數組的其他聲明方式。
和 TCL 有異曲同工之妙。
~~~
//直接寫一個變量后面加上中括號,聲明變量
$qi[] = '可口可樂';
$qi[10] ='百事';
~~~或不使用 array() 而直接采用大括號。
- >[success] 還是統一使用 array() 的方式方法。
- 關聯數組就是下標可以是字符串的數組。聲明和使用方法同上。
- 數組元素的值還是數組,這是多維數組的實現方式。C語言本質也是如此。
- 讀取時使用多個\[ \]。
- 數組元素間的分割符為逗號,在數組中插入數組的時候,不要在結尾處寫成了分號(;)。
- 遍歷二字,從字面解釋就是一個接一個全讀訪問一次,顯示出來。
~~~
foreach( 要循環的數組變量 as [鍵變量 =>] 值變量){
//循環的結構體
}
~~~
- list() 函數:將索引數組下標為0的對應我變量1,下標1的對應變量2,依此類推。
**嚴格記住**:索引數組的一一對應原則。list第一個變量對應的是下標為0的數組元素,下標為1的對應的是list里面的第二個數組元素。
- each() 函數:讀一次向后移動一次【可以想象有一個記錄的箭頭在移動】,將其中的每個元素拆解成一個新數組。
>[success] 拆解規則詳見原書插圖。
- 混合使用。遍歷的代碼量減少,但增加了理解成本。
- 數組操作函數。
array_shift 彈出數組中的第一個元素【shift在鍵盤上的圖標就是一個向上的箭頭】
array_unshift 在數組的開始處壓入元素
array_push 向數組的末尾處壓入元素
array_pop 彈出數組末尾的最后一個元素【就當成是屁從后面出來吧】
current 讀出指針當前位置的值
key 讀出指針當前位置的鍵
next 指針向下移
prev 向上移
reset 指針到開始處
end 指針到結束處
- 數組的常用函數
array_combine() 生成一個數組,用一個數組的值作為鍵名,另一個數組值作為值
range() 創建并返回一個包含指定范圍的元素的數組。
compact() 創建一個由參數所帶變量組成的數組
array_fill() 用給定的值生成數組
array_chunk() 把一個數組分割為新的數組塊
array_merge() 把兩個或多個數組合并為一個數組
array_slice() 在數組中根據條件取出一段值,并返回
array_diff() 返回兩個數組的差集數組
array_search() 在數組中搜索給定的值,如果成功則返回相應的鍵名
array_splice() 把數組中的一部分去掉并用其它值取代
array_sum() 計算數組中所有值的和
in_array() 檢查數組中是否存在某個值
array_key_exists() 檢查給定的鍵名或索引是否存在于數組中
shuffle() 將數組打亂,保留鍵值
count() 計算數組中的單元數目或對象中的屬性個數
array_flip() 返回一個鍵值反轉后的數組
array_keys() 返回數組所有的鍵,組成一個數組
array_values() 返回數組中所有值,組成一個數組
array_reverse() 返回一個元素順序相反的數組
array_count_values() 統計數組中所有的值出現的次數
array_rand() 從數組中隨機抽取一個或多個元素,注意是鍵名
array_unique() 刪除重復值,返回剩余數組
sort() 按升序對給定數組的值排序,不保留鍵名
rsort() 對數組逆向排序,不保留鍵名
asort() 對數組排序,保持索引關系
arsort() 對數組逆向排序,保持索引關系
ksort() 按鍵名對數組排序
krsort() 將數組按照鍵逆向排序
natsort() 用自然順序算法對數組中的元素排序
natcasesort() 自然排序,不區分大小寫
array_filter() 去掉數組中的空元素或者預定元素
extract 將鍵變為變量名,將值變為變量值
- 世界上最難懂的是道士的鬼符、醫生的處方和程序員的正則表達式。
- 定界符//,就是定一個邊界,邊界以內的就是正則表達式。
- preg_match()。
- \d匹配一個0-9。
\D匹配一個非0-9的值。
\w匹配一個a-zA-Z0-9_。
\W匹配一個非a-zA-Z0-9_。
……
[] 指定范圍
- 元字符。
\* 是代表匹配前面的一個原子,匹配0次或者任意多次前面的字符。
\+ 匹配一次或多前前面的一個字符。
? 前面的字符可有可無【可選】 有或沒有。
. 更標準一些應該把點算作原子。匹配除了\n以外的所有字符。
|(豎線)或者。注:它的優先級最低了。
^ 必須要以抑揚符之后的字符串開始。
$ 必須要以$之前的字符結尾。
\b 詞邊界。
\B 非邊界。
{m} 有且只能出現m次。
{n,m} 可以出現n到m次。
{m,} 至少m次,最大次數不限制。
() 改變優先級或者將某個字符串視為一個整體,匹配到的數據取出來也可以使用它。
- /正則表達式/模式匹配符
- 把正則的貪婪特性取消掉,讓它找到了最近的匹配。
- 正則,**寫一點、測一點。**先列出可能情況,TDD。
- 常用正則函數。`P`hp `REG`ular。
preg_filter 執行一個正則表達式搜索和替換
preg_grep 返回匹配模式的數組條目
preg_match 執行一個正則表達式匹配
preg_match_all 執行一個全局正則表達式匹配
preg_replace_callback_array 傳入數組,執行一個正則表達式搜索和替換使用回調
preg_replace_callback 執行一個正則表達式搜索并且使用一個回調進行替換
preg_replace 執行一個正則表達式的搜索和替換
preg_split 通過一個正則表達式分隔字符串
- 學習文件處理本質上面就是學習文件處理的函數。
- readfile 讀取文件。
file_get_contents 打開文件后,能夠賦值給一個變量。
fopen、fread、fclose 操作讀取文件。
file_put_contents 寫入文件。
fwrite 配合 fopen 進行寫入操作。fwrite的別名函數是fputs。
- tmpfile ( )
功能:創建一個臨時文件,返回資源類型。關閉文件即被刪除。
~~~
<?php
//創建了一個臨時文件
$handle = tmpfile();
//向里面寫入了數據
$numbytes = fwrite($handle, '寫入臨時文件');
//關閉臨時文件,文件即被刪除
fclose($handle);
echo '向臨時文件中寫入了'.$numbytes . '個字節';
?>
~~~
- 重命名文件。bool rename($舊名,$新名);
復制文件。bool copy(源文件,目標文件);
刪除文件。bool unlink(指定路徑的文件);
- 文件屬性檢測函數。
bool file_exists ( $指定文件名或者文件路徑)
功能:文件是否**存在**
bool is_readable ( $指定文件名或者文件路徑)
功能:文件是否**可讀**javascript:;
bool is_writeable ( $指定文件名或者文件路徑)
功能:文件是否**可寫**
bool is_executable ( $指定文件名或者文件路徑)
功能:文件是否**可執行**
bool is_file ( $指定文件名或者文件路徑)
功能:是否**是文件**
bool is_dir ( $指定文件名或者文件路徑)
功能:是否**是目錄**
void clearstatcache ( void )
功能:清楚文件的**狀態緩存**
- 文件操作的常量。
平臺,分割符。
windows,\。
linux,/。
- 常量:DIRECTORY_SEPARATOR,\_\_FILE\_\_
- 文件指針操作函數。
rewind ( resource handle)
功能:指針回到開始處
fseek ( resource handle, int offset [, int from_where])
功能:文件指針向后移動指定字符
- filesize 檢測文件的大小。
file 把整個文件讀入一個數組中。
fgets 從文件指針中讀取一行,讀到最后返回false。
fgetc 從文件指針中讀取一個字符,讀到最后返回false。
ftruncate 將文件截斷到給定的長度。
- filectime 文件創建時間。
filemtime 文件修改時間。
fileatime 文件上次訪問時間。
- 文件鎖的用途:
若一個人在寫入一個文件,另外一個人同時也打個了這個文件進行寫入文件。
這情況下,如果遇到一定的碰撞概率的話,不知道到底誰的操作為準。
因此,這個時候我們引入鎖機制。
若用戶A在寫入或者讀取這個文件的時候,將文件加上共享鎖。我可以讀,其他人也可以讀。
但是,我如果這與的時候。我使用獨占鎖。這個文件歸我了,你們都別動,除非我將文件鎖進行釋放。
注意:加上了文件鎖后要注意釋放。
- bool flock ( resource $handle , int $operation)
LOCK_SH 取得共享鎖定(讀取的程序)
LOCK_EX 取得獨占鎖定(寫入的程序)
LOCK_UN 釋放鎖定(無論共享或獨占)
- 處理文件夾的基本思想如下:
1. 讀取某個路徑的時候判斷是否是文件夾
2. 是文件夾的話,打開指定文件夾,返回文件目錄的資源變量
3. 使用readdir讀取一次目錄中的文件,目錄指針向后偏移一次
4. 使用readdir讀取到最后,沒有可讀的文件返回false
5. 關閉文件目錄
- opendir 打開文件夾,返回操作資源
readdir 讀取文件夾資源
is_dir 判斷是否是文件夾
closedir 關閉文件夾操作資源
filetype 顯示是文件夾還是文件,文件顯示file,文件夾顯示dir
- 文件權限設置
chmod 修改讀取模式
chgrp 修改用戶組
chown 修改權限
- 文件路徑函數
pathinfo 返回文件的各個組成部分
basename 返回文件名
dirname 文件目錄部分
parse_url 網址拆解成各部分
http_build_query 生成url 中的query字符串
http_build_url 生成一個url
- 
程的項目也許用文件比較好,估計不會有那么大的訂戶。重復的話,可以進行文本去重。
>[warning] **文件上傳的處理步驟:**
> 1. 判斷是否有錯誤碼
> 2. 自定義判斷是否超出文件大小范圍
> 3. 判斷后綴名和mime類型是否符合
> 4. 生成文件名
> 5. 判斷是否是上傳文件
> 6. 移動臨時文件到指定位置
- php.ini 的配置項:
file_uploads on為 開啟文件上傳功能,off為關閉。
post_max_size 系統允許的POST傳參的最大值。
upload_max_filesize 系統允許的上傳文件的最大值。
memory_limit 內存使用限制。
max_execution_time,上傳超時參數的單位為秒。
- 系統返回的錯誤碼詳解:
0 無誤,可以繼續進行文件上傳的后續操作。
1 超出上傳文件的最大限制,upload_max_filesize = 2M php.ini中設置,一般默認為2M。可根據項目中的實際需要來修改
2 超出了指定的文件大小,根據項目的業務需求指定上傳文件的大小限制
3 只有部分文件被上傳
4 文件沒有被上傳
5 (php沒有設)
6 找不到臨時文件夾,可能目錄不存在或沒權限
7 文件寫入失敗,可能磁盤滿了或沒有權限
- MIME(Multipurpose Internet Mail Extensions)是多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用于指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。
- 文件上傳用的表單。
```
<html>
<head>
<meta charset="utf-8" />
<title>單文件上傳</title>
</head>
<body>
<form action="file.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上傳">
</form>
</body>
</html>
```
- PHP為文件類數據準備了一個專用的系統函數$\_FILES,上傳文件的所有相關數據,都保存在這個系統函數中。可以var_dump這個$\_FILES ,來觀察這個數組的結構。
>'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23)
- 根據這個數組提供的相關信息對文件進行上傳后的處理。
- 多個input,每個都是單文件上傳 = 多文件上傳。
- 從5.4開始,引入session.upload_progress的新特性,我們只需要在php.ini中開啟配置,即可通過session監控文件上傳進度。
---
- 學習圖像處理(GD系統的函數)。需要連帶GD庫一起來編譯 PHP。GD 庫和PHP可能需要其他的庫,這取決于你要處理的圖像格式。
- 用 phpinfo() 查看我們當前的機器是否安裝了GD擴展。存在了gd這個選項,就支持。
1.打開php.ini(在文件上傳這一章已有說明)
2.在 Windows 中,需要將GD2的DLL文件php_gd2.dll作為一個擴展包含在 php.ini 中。修改;extension = php_gd2.dll,將前面的分號去掉
3.重新啟動apache服務器
4.再次執行phpinfo嘗試查看是否存在gd擴展
- 用圖片處理函數畫一張圖:
1. 按照機器思維分析步驟。
- [《學完這招,你就可以開始用PPT畫畫了》](http://www.jianshu.com/p/99f75968e4fa)
2. 分析需要使用到的函數。
- 先把畫布準備好: imagecreate()
- 再準備顏料:imagecolorallocate()
3. 按步驟調用函數畫圖。
- allocate [??l?ke?t]:把…撥給。
- 生成驗證碼。根據驗證碼的效果來推理實現的過程。
- 圖像縮放和裁剪技術。(略)
圖片水印處理。(略)
- 在開發中,顯示錯誤對我們的開發非常有利。因為,顯示錯誤后能幫我們快速定位錯誤、解決問題。而在**生產環境(即公網)**給其他人訪問的的網站、微網站、手機網站、手機接口等,如果錯誤顯示出來了,就容易暴露:
1. 服務器的文件路徑和文件存儲規范
2. 有些人喜歡用個人名命名,通過社會工程學可以反向推理出密碼
3. 有時還會暴露mysql數據庫服務器的地址
......
上面這些信息特別容易被網上別有用心的一些人給利用。
- 在 php.ini 中可以控制 php 的錯誤顯示狀態:display_errors。
- ini_get() 和 ini_set() 函數。
修改完php.ini文件,需要重啟服務器。
- 錯誤級別。
1. error 最嚴重,必須要解決。不然程序無法繼續向下執行。
2. warning 也很重要。通常也必須要解決。如果明確的,故意的可以不用處理。
3. notice 你可以不用管。但是在有些公司,項目標準特別高。在高標準要求的項目中也必須要解決。因為,notice 會影響到 PHP 的執行效率。通常發生在函數未定義等。
4. parse 錯誤,是指語法寫錯了,必須要解決。
5. 代表全部類型的所有錯誤。
- 錯誤記錄日志。
專門的日志收集系統 vs 通過文件來當服務器的運行日志。
其中:PHP 的錯誤、警告這些是必須要收集的。
為了不讓用戶看到,設置好了錯誤報告級別號,又如何將錯誤收集到日志系統中呢?
- error_log() 函數可以把錯誤信息發送到web服務器的錯誤日志,或者到一個文件里。
>php.ini
log_errors on/off 是否開啟日志記錄
log_errors_max_len 整型,默認1024 單行錯誤最大記錄長度
error_log syslog或者指定路徑 錯誤日志記錄在什么地方
- syslog是指系統來記錄。windows系統在電腦的日志收集器里面。linux默認在:/etc/syslog.conf。若Linux系統啟動或修改了日志收集。可能存儲在第三方專用的日志收集服務器中。
- 自定義錯誤處理函數。有計劃開始要自己寫框架時、或者您做完了本書的第一個項目,再回頭來看。
- set_error_handler ( callable $回調的錯誤處理函數)
設置一個用戶定義的錯誤處理函數
trigger_error ( string $error_msg)
產生一個用戶級別的 error/warning/notice 信息
---
## MySQL對于PHP程序員來說就是將業務轉化成表結構。做好業務中的增、刪、改、查。
- 大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。
- 在最開始學習MySQL的時候,并不需要學習MySQL數據庫,學到DBA(數據庫管理員)的級別。
- [《3天入門MySQL》](http://mysql.phpxy.com/146038)。
- [sqlfiddle.com](http://www.sqlfiddle.com) 在線練習。
- 數據庫的五個基本單位
1. 數據庫服務器:用來運行數據庫服務的一臺電腦。
2. 數據庫
3. 數據表
4. 數據字段,也叫數據列。
5. 數據行
- 社會工程學中,人們喜歡用相同的密碼。因此,用戶的密碼必須要進行再次加密,不可逆向解密。因為害怕看到了某個用戶的密碼后,用這個密碼去嘗試用戶的其他銀行卡。
- 密碼必須使用md5等加密方式幫用戶進行加密。用戶輸入原密碼如:123456。我們使用md5將用戶輸入的123456加密后與數據庫的密碼進行對比。 一致則密碼通過。不一致則用戶將密碼輸入錯誤了。
- 搜索 mysql **server** 下載。
1. develop 是指服務器為開發機【推薦】
2. server only只安裝服務器
3. client only 只安裝客戶操作端
4. full 全部安裝
5. custom 自定義
- Config Type(配置文件類型)
1. Development Machine 是指開發服務器
2. Server Machine 服務器
3. Dedicated Machine 專用服務器僅作為數據庫服務器使用
TCP/IP 是指開放的端口:mysql 默認的端口是 3306。
- 設置 **數據庫管理系統中 root 用戶** 的密碼,并非 linux 系統中的 root 用戶密碼。
- 結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統;**同時也是數據庫腳本文件的擴展名**。
- SQL語句按照其功能范圍不同可分為3個類別:
**`結構`**:操作對象是數據庫、數據表、數據字段
- 數據**定義**語言(DDL ,Data Defintion Language)語句:數據定義語句,用于定義不同的數據段、數據庫、表、列、索引等。常用的語句關鍵字包括create、drop、alter等。
**`內容`**:操作對象是記錄
- 數據**操作**語言(DML , Data Manipulation Language)語句:數據操縱語句,用于添加、刪除、更新和查詢數據庫記錄,并檢查數據的完整性。常用的語句關鍵字主要包括insert、delete、update和select等。
**`權限`**:操作對象是用戶
- 數據**控制**語言(DCL, Data Control Language)語句:數據控制語句,用于控制不同數據段直接的許可和訪問級別的語句。這些語句定義了數據庫、表、字段、用戶的訪問權限和安全級別。主要的語句關鍵字包括grant、revoke等。
> 這里作者沒寫事務操作。
- 如果加入到了windows的環境變量中,可以在命令行下直接操作。
在命令行下,通過以下命可以連接到數據庫服務器:
> mysql -h localhost -u root -p
上面的命令中: mysql 表示 mysql數據庫啟動工具。
-h 表示數據庫連接地址,連接本機可不填
-u 表示要登錄的用戶
-p 表示使用密碼登錄
注:通常我們不直接輸入密碼。而是在回車之后,輸入密碼。
- 每一個命令結束可以輸入\g 或者 ;
- 需要幫助的話,通過 `help;` 或者 `\h` 命令來顯示幫助內容。
通過 `\c` 命令來清除命令行歷史。
- 操作數據庫:
```
create database 數據庫名;
show databases;
use 庫名;
show tables;
drop database 庫名;
```
- 操作數據表:
```
create table 表名(字段名1 字段類型, ...., 字段名n 字段類型n);
// int 代表整型。float 代表浮點。char 和 varchar 代表字符串。
// 可以在類型后接上長度。
desc 表名;
show create table 表名 \G;
// 還可以看到表的 engine(存儲引擎) 和 charset(字符集)等信息。
// “\G”選項的含義是使得記錄能夠按照字段豎著排列,
// 對于內容比較長的記錄更易于顯示。
drop table 表名;
```
- 在創建表最后,我們常用 MyISAM 或者 InnoDB 引擎。
在指定引擎時,我們可以使用:
> ENGINE=InnoDB
指定表默認字符集:
> DEFAULT CHARSET=utf8
效果如下:
> CREATE TABLE emp (
useraname varchar(10) DEFAULT NULL,
password date DEFAULT NULL,
) **ENGINE=InnoDB** **DEFAULT CHARSET=utf8**;
- 操作數據表:
```
alter table 表名 modify 字段名 varchar(20);
// 修改表字段類型 modify。
alter table 表名 add column 字段名 類型;
ALTER TABLE 表名 ADD 字段名 字段類型 AFTER 字段名;
ALTER TABLE 表名 ADD 字段名 字段類型 FIRST;
alter table 表名 drop column 字段名;
alter table 表名 change 字段原名 字段新名 字段類型;
```
字段 增加 和 修改 語句(add/change/modify)中,最后都可以加一個可選項 **first** | **after**。
```
alter table 舊表名 rename 新的表名;
```
- 數據類型。
1. 數值類型(整型、浮點)
2. 字符串類型
3. 日期時間類型
4. 復合類型
5. 空間類型(非科學性工作基本不用,不做講解)
- 整型。
tinyint 1字節 -128~127
smallint 2字節 -32768~32767
mediumint 3字節 -8388608~8388607
**int 4字節 范圍-2147483648~2147483647 // 正負21億**
bigint 8字節 +-9.22*10的18次方
- 浮點類型。
**float(m, d) 4字節 單精度浮點型,m總個數,d小數位**
double(m, d) 8字節 雙精度浮點型,m總個數,d小數位
decimal(m, d) decimal是存儲為字符串的浮點數
- 字符類型。
**CHAR 0-255字節 定長字符串**
**VARCHAR 0-255字節 變長字符串**
TINYBLOB 0-255字節 不超過255個字符的二進制字符串
TINYTEXT 0-255字節 短文本字符串
>[info] BLOB 0-65535字節 **二進制形式**的長文本數據
TEXT 0-65535字節 長文本數據
MEDIUMBLOB 0-16 777 215字節 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215字節 中等長度文本數據
LOGNGBLOB 0-4 294 967 295字節 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295字節 極大文本數據
VARBINARY(M) 允許長度0-M個字節的定長字節符串 值的長度+1個字節
BINARY(M) M 允許長度0-M個字節的定長字節符串
- CHAR 類型用于定長字符串,并且必須在圓括號內用一個**大小修飾符**來定義。這個大小修飾符的范圍從 0-255。比指定長度大的值將被截短,而比指定長度小的值將會用空格作填補。VARCHAR 類型把該長度視為最大值并且只使用存儲字符串實際需要的長度,類型不會被空格填補,但長于該指示器的值仍然會被截短。
因 VARCHAR 類型可以根據實際內容動態改變存儲值的長度,所以在不能確定字段需要多少字符時使用 VARCHAR 類型可以大大地節約磁盤空間。
- text類型與blob類型。
對于字段長度要求超過 255 個的情況下,MySQL 提供了 TEXT 和 BLOB 兩種類型。根據存儲數據的大小,它們都有不同的子類型。
這些大型的數據用于存儲文本塊或圖像、聲音文件等二進制數據類型。
BLOB 類型區分大小寫(**因為是二進制**),而 TEXT 不區分大小寫。
- **大小修飾符**不用于各種 BLOB 和 TEXT 子類型。
- blob = binary large object = 二進制大對象。
- 時間類型。
date 3字節 日期,格式:2014-09-18
time 3字節 時間,格式:08:42:30
datetime 8字節 日期時間,格式:2014-09-18 08:42:30
timestamp 4字節 自動存儲記錄修改的時間
year 1字節 年份
>[success] 時間類型在web系統中用的比較少,很多時候很多人喜歡**使用int來存儲時間。插入時插入的是unix時間戳**,因為這種方式更方便計算。在前端業務中用date類型的函數,再將unix時間戳轉成人們可識別的時間。有些人**為了在數據庫管理中方便查看,也有人使用datetime類型**來存儲時間。
- 復合類型。