<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [蘇勇和他的 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 - ![](https://box.kancloud.cn/document_2015-09-09_55efe05a2efff.png =300x300) 程的項目也許用文件比較好,估計不會有那么大的訂戶。重復的話,可以進行文本去重。 >[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類型**來存儲時間。 - 復合類型。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看