線上書籍

Home

[1062] PHP7入門

一、 關於函數
  1. 函數有兩種,一組是PHP內建函數,另一種是自訂的函數。
  2. 一個函數通常都有其獨特的功能,可視為具特定功能的小零件,直接呼叫使用即可,如:phpinfo(),有些有傳回值,有些沒有;有些需要輸入參數,有些不用。
  3. 完整函數手冊:http://www.php.net/manual/en/funcref.php
  4. 函數基本結構:傳回值 函數名稱(參數1,參數2...);
  5. 函數傳回值有:string(字串)、int(整數)、array(陣列)、object(物件)、bool(布林值)、void(無傳回值)、mixed(不一定)、new(建立物件)
二、 自訂函數
  1. 自訂函數的基本語法為: function 函數名稱($參數1='預設值' , $參數2='預設值',...){ global $外面的變數1, $外面的變數2; //函數內容,任何有效的 PHP 程式碼,包括其它函數和class定義 ; return 傳回值; }
  2. 參數不見得要有,傳回值也不一定要有。
  3. 超級全域變數可直接在函數中使用,外面的一般變數無法進到函數中,除非做成參數或是用 global 宣告。當然,函數裡面的變數外面也無法取用,除非return出去。
  4. 函數可放在檔案中任何地方,放在呼叫之前或之後都沒關係。使用時,呼叫函數名稱即可。
  5. 建議建立一個function.php檔案,若同一個函數會被兩個以上的檔案呼叫時,即可把該函數放到此檔,以便讓其他檔案共用,例如可以把連線資料庫寫成函數試試。
三、 資料類型
  1. 不管變數常數,都會有值,只要有值,就會扯到值的資料類型。PHP有以下資料類型:
    • (1) 布林值(boolean):true、false,無須引號。
    • (2) 整數(integer):就數字123456,無須引號。
    • (3) 浮點數(float):有小數點的數字,如3.14,無須引號。
    • (4) 字串(string):一般文字,一定要有引號。
    • (a)  雙引號中,變數有效,可用{}將變數和文字隔開
    • (b)  單引號中,變數會失效
    • (5) 陣列(array):可以放很多值的變數,形狀為:「$arra['索引']=值」
      • (a)  索引可以數字也可以文字,沒填索引預設會從0開始
      • (b)   一維陣列(即一個索引值): $stu[1]="tad"; $stu[2]="joe"; $stu=[ 1=>"tad", 2=>"joe" ]; $stu=array( 1=>"tad", 2=>"joe" );
      • (c)  二維陣列(即兩個索引值): $stu[1][1]="tad"; $stu[1][2]="joe"; $stu[2][1]="hui"; $stu[2][2]="kai"; $stu = [ 1 => [1 => "tad", 2 => "joe"], 2 => [1 => "hui", 2 => "kai"] ]; $stu = array( 1 => [1 => "tad", 2 => "joe"], 2 => [1 => "hui", 2 => "kai"] );
    • (6) 物件(object):可自行定義物件成員、物件方法等。
    • (7) 資源(resource):PHP在引用其他資源時所產生的一種類型。
    • (8) 無值(null):NULL不分大小寫,不須引號,代表沒東西或不存在。
四、 PHP的變數過濾
  1. PHP的變數簡單分可分為在頁面中自己定義的變數,以及外面傳來的變數。
  2. 凡是外面傳來的變數,一律要進行變數過濾。
  3. 文字部份, htmlspecialchars(文字) 函數會將HTML做轉義,讓標籤失效,例如<轉成&lt;,預設只轉雙引號(單引號無效),用htmlspecialchars(文字,ENT_QUOTES) 更好。
  4. HTML Entity Name 字符實體列表 :https://www.w3schools.com/html/html_entities.asp
  5. htmlentities() 函數也可轉義,但並不適用中文,因為會連同中文字一起轉義。
  6. 用 htmlentities() 和 htmlspecialchars() 只能防止XSS攻擊(避免被值入javascript),不能防止SQL隱碼攻擊。
  7. 用filter_var($變數)亦可,會直接把HTML語法直接刪除。
  8. 數字的過濾,只要加個(int)即可,如$sn=(int)$_POST['sn'];
  9. 不同過濾器的運用時機:要在php檔案中運算用的,請用PHP來過濾,要寫入資料庫的,用資料庫的real_escape_string()來過濾。
五、 PHP的 filter_var 過濾器
  1. 其用法為filter_var($變數, 過濾器, 選項) ,幾種常用過濾方法:
    • (1) FILTER_SANITIZE_STRING:(預設)去除標籤或特殊字元,html標籤會直接消除
    • (2) FILTER_SANITIZE_ENCODED:與urlencode()相同,過濾特殊字串
    • (3) FILTER_SANITIZE_MAGIC_QUOTES:過濾針對SQL injection做過濾
    • (4) FILTER_SANITIZE_SPECIAL_CHARS:同htmlspecialchars()
    • (5) FILTER_SANITIZE_EMAIL :過濾e-mail,刪除e-mail格式不該出現的字元
    • (6) FILTER_SANITIZE_URL:  過濾URL,刪除URL格式不該出現的字元
    • (7) FILTER_SANITIZE_NUMBER_INT:刪除所有字元,只留下數字與+-符號
    • (8) FILTER_VALIDATE_INT:判斷數字是否有在範圍內
    • (9) FILTER_VALIDATE_BOOLEAN:判斷布林值,1、true、on、yes都會判斷成true,反之為false,若是這些以外的值會回傳NULL
    • (10) FILTER_VALIDATE_URL:URL驗證
    • (11) FILTER_VALIDATE_EMAIL:e-mail驗證
    • (12) FILTER_VALIDATE_IP:IP驗證
六、 三元運算式:
  1. 條件 ? 真動作一 :假動作二 $op = isset($_REQUEST['op']) ? filter_var($_REQUEST['op']) : '';
七、 PHP的運算符
  1. 算術運算符:也就是+(加)-(減)*(乘)/(除) %(餘數) 這類的運算符號。

     

    數學運算符 範例 範例解釋 範例結果
    +(加) $a + $b $a加$b 10+4的結果:14
    -(減) $a - $b $a減$b 10-4的結果:6
    *(乘) $a * $b $a乘以$b 10*4的結果:40
    /(除) $a / $b $a除以$b 10/4的結果:2.5
    %(求餘數) $a % $b $a除以$b的餘數 10%4的結果:2
  2. 賦值運算符:如$a=3,其中的=就是賦值運算符。 $a = $a + 2; 可改寫成 $a += 2;
  3. 比較運算符:就是之前我們學的if(5>3),這類<、>、 <=、>=、==、!=的比較運算。 例子 運算符意義 解釋
    $a == $b ==相等 $a和$b的值相等時,才為真
    $a === $b ===全等 $a和$b的值以及資料形態都相等時才為真!
    $a != $b !=不相等 $a和$b的值不相等時,才為真
    $a <> $b !=不相等 $a和$b的值不相等時,才為真
    $a !== $b !==不全等 $a和$b的值或資料形態不相等時才為真!
    $a < $b <小於 $a小於$b才為真
    $a > $b >大於 $a大於$b才為真
    $a <= $b <=小於等於 $a小於或等於$b才為真
    $a >= $b >=大於等於 $a大於或等於$b才為真
    $a <=> $b 比較 PHP7才新增的 <=> 運算符,只會傳回 -1、0、1三種值!
    -1,代表左邊小於右邊;
    1,代表左邊大於右邊;
    0,那就代表左右兩邊相等。
  4. 錯誤控制運算符:指的是@這個符號,可以抑制錯誤訊息產生。
  5. 遞增、遞減運算符:如++$a這類的用法。 運算符 意義 說明
    ++$a 先遞增 $a值加1之後才傳回$a值
    $a++ 後遞增 先傳回$a值之後再將$a值加1
    --$a 先遞減 $a值減1之後才傳回$a值
    $a-- 後遞減 先傳回$a值之後再將$a值減1
  6. 邏輯運算符:也就是and、or這類的用法。 範例 邏輯運算符 意義
    $a and $b and(與) 只有$a 與 $b兩者皆為真,結果才為真
    $a && $b and(與) 只有$a 與 $b兩者皆為真,結果才為真
    $a or $b or(或) 只要$a 或 $b兩者之一為真,結果就為真
    $a || $b or(或) 只要$a 或 $b兩者之一為真,結果就為真
    $a xor $b exclusive or(互斥) 只有$a 與 $b一為真、一為假時,結果才為真
    !$a not(否) 只有$a為假時,結果才為真
  7. 字串運算符:小黑點「.」,用來連接字串和變數、常數或函數用的! echo "嗨!" . $user_name . "您好!"; echo "資料庫名稱:" . _DB_NAME; echo "今天是:" . date("Y年m月d日");
八、 switch 用法 switch ($變數) { case '特定值': # 動作... break; default: # 動作... break; }
  1. switch 可以判斷某個變數值,當該變數值符合指定條件時,就去執行哪些動作,基本上就是「一個口令,一個動作」之意。
  2. case 到 break 就是完整一組,可以自行添加無限多組。
  3. break; 不加也符合語法,但會一直執行到下方動作。
  4. default 即預設動作,當變數跟任一個「特定值」都不相符時要進行的動作,一般放在最下方。
九、 讀出的SQL語法
  1. 讀取資料庫的內容,一律用 select 語法: SELECT `查詢的欄位` [FROM `資料表名稱` 附加的篩選條件]
  2. 其中篩選條件語法如下(有順序關係,需注意): [where 篩選條件] [group by `欄位名稱`][having group的篩選條件] [order by {unsigned_integer | `欄位名稱` | formula} [asc | desc] ,...] [limit [起點,] 筆數]
十、 PHP從資料庫取得資料的方法
  1. 寫SQL送去資料庫執行後,會傳回一個資源變數物件,如$result
  2. 可以利用$result的各種取得資料方法,將資料一筆一筆取回。
  3. 一筆資料以上的資料,請放至while(){}迴圈中取回。
  4. 利用 $result->fetch_assoc() 取出的資料陣列,會以資料表欄位名稱為陣列索引; 以$result->fetch_row() 取出的資料陣列,是以欄位順序為陣列索引,通常搭配list()使用
  5. $data=$result->fetch_assoc(); 得到的結果為: $data['sn']=1; $data['title']='文章標題'; $data['content']='文章內容'; $data['create_time']='2017-10-28 11:21:30'; $data['update_time']='2017-10-28 11:21:30';
  6. $data=$result->fetch_row(); 得到的結果為: $data[0]=1; $data[1]='文章標題'; $data[2]='文章內容'; $data[3]='2017-10-28 11:21:30'; $data[4]='2017-10-28 11:21:30';
  7. 常會寫成這樣: list($sn, $title, $content, $create_time, $update_time)=$result->fetch_row();
十一、 幾個常用的迴圈用法
  1. 不曉得迴圈數的 while(條件為真){ //執行動作 }
  2. 已知道迴圈數 for($i=0;$i<迴圈數;$i++){ //執行動作 }
  3. 抽取陣列 foreach($陣列 as $索引=>$值){ //執行動作 }
十二、 字串長度及裁切
  1. 計算多語系編碼的字串長度:mb_strlen($字串, 編碼); 預設會自斷判斷系統編碼,例如: $len = mb_strlen($data['content']);
  2. 裁切多語系編碼的字串:mb_substr($字串, 起點, 字數, 編碼);,例如: $data['content'] = mb_substr($data['content'], 0, 100);
十三、 Smarty迴圈用法
  1. Smarty 若接收到陣列,可用迴圈用來處理,常用方法如下:
  2. Smarty3用法 {foreach $來源 as $別名} {$別名.索引} {foreachelse} 該變數沒有值時要出現的內容 {/foreach}
  3. Smarty2用法(也是XOOPS用法,亦相容3) {foreach from=$來源 key=索引 item=項目 name=別名} {$項目.索引} {foreachelse} 該變數沒有值時要出現的內容 {/foreach}
  4. 迴圈還有一些特別的用法(左為Smarty3用法,右為Smarty2用法):
    • (1) 迴圈第一圈:{$別名@first} 或 {$smarty.foreach.別名.first}
    • (2) 迴圈最後一圈:{$別名@last} 或 {$smarty.foreach.別名.last}
    • (3) 取得迴圈的索引值:{$別名@index} 或 {$smarty.foreach.別名.index},依序輸出0、1、2......
    • (4) 取得迴圈的計數值:{$別名@iteration} 或 {$smarty.foreach.別名.iteration},依序輸出1、2、3......
    • (5) 取得迴圈執行總數:{$別名@total}  或 {$smarty.foreach.別名.total}
十四、 製作PHP頁首頁尾檔(整併PHP檔)
  1. 可以製作header.php及footer.php,把每個檔案都會引入的東西放在裡面。
  2. 可用require_once() 或 include_once()引入。
  3. header.php頁首檔 <?php require_once "config.php"; require_once "function.php"; require_once 'smarty/libs/Smarty.class.php'; $smarty = new Smarty; $db = link_db();
  4. footer.php頁尾檔 <?php $smarty->assign('op', $op); $smarty->assign('title', _PAGE_TITLE); $smarty->display(_PAGE_TEMPLATE);
十五、 製作樣板頁首頁尾檔(整併樣板檔)
  1. 可以製作header.tpl及footer.tpl,把每個樣板檔案都會引入的東西放在裡面。
  2. 可用 {include file="header.tpl"} 引入。
十六、 [補充]影片背景
  1. https://www.videezy.com/
  2. 影片語法,加在 .img-container <video loop muted autoplay poster="影片圖檔.jpg" class="video"> <source src="影片.mp4" type="video/mp4"> </video>
  3. 接著在my.css中加入,將影片置於背景下 .video { position: absolute; z-index: -10; }