[1062] PHP7入門
一、 關於函數
- 函數有兩種,一組是PHP內建函數,另一種是自訂的函數。
- 一個函數通常都有其獨特的功能,可視為具特定功能的小零件,直接呼叫使用即可,如:phpinfo(),有些有傳回值,有些沒有;有些需要輸入參數,有些不用。
- 完整函數手冊:http://www.php.net/manual/en/funcref.php
- 函數基本結構:傳回值 函數名稱(參數1,參數2...);
- 函數傳回值有:string(字串)、int(整數)、array(陣列)、object(物件)、bool(布林值)、void(無傳回值)、mixed(不一定)、new(建立物件)
- 自訂函數的基本語法為: function 函數名稱($參數1='預設值' , $參數2='預設值',...){ global $外面的變數1, $外面的變數2; //函數內容,任何有效的 PHP 程式碼,包括其它函數和class定義 ; return 傳回值; }
- 參數不見得要有,傳回值也不一定要有。
- 超級全域變數可直接在函數中使用,外面的一般變數無法進到函數中,除非做成參數或是用 global 宣告。當然,函數裡面的變數外面也無法取用,除非return出去。
- 函數可放在檔案中任何地方,放在呼叫之前或之後都沒關係。使用時,呼叫函數名稱即可。
- 建議建立一個function.php檔案,若同一個函數會被兩個以上的檔案呼叫時,即可把該函數放到此檔,以便讓其他檔案共用,例如可以把連線資料庫寫成函數試試。
- 不管變數常數,都會有值,只要有值,就會扯到值的資料類型。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的變數簡單分可分為在頁面中自己定義的變數,以及外面傳來的變數。
- 凡是外面傳來的變數,一律要進行變數過濾。
- 文字部份, htmlspecialchars(文字) 函數會將HTML做轉義,讓標籤失效,例如<轉成<,預設只轉雙引號(單引號無效),用htmlspecialchars(文字,ENT_QUOTES) 更好。
- HTML Entity Name 字符實體列表 :https://www.w3schools.com/html/html_entities.asp
- htmlentities() 函數也可轉義,但並不適用中文,因為會連同中文字一起轉義。
- 用 htmlentities() 和 htmlspecialchars() 只能防止XSS攻擊(避免被值入javascript),不能防止SQL隱碼攻擊。
- 用filter_var($變數)亦可,會直接把HTML語法直接刪除。
- 數字的過濾,只要加個(int)即可,如$sn=(int)$_POST['sn'];
- 不同過濾器的運用時機:要在php檔案中運算用的,請用PHP來過濾,要寫入資料庫的,用資料庫的real_escape_string()來過濾。
- 其用法為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驗證
- 條件 ? 真動作一 :假動作二 $op = isset($_REQUEST['op']) ? filter_var($_REQUEST['op']) : '';
- 算術運算符:也就是+(加)-(減)*(乘)/(除) %(餘數) 這類的運算符號。
數學運算符 範例 範例解釋 範例結果 +(加) $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 - 賦值運算符:如$a=3,其中的=就是賦值運算符。 $a = $a + 2; 可改寫成 $a += 2;
- 比較運算符:就是之前我們學的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,那就代表左右兩邊相等。 - 錯誤控制運算符:指的是@這個符號,可以抑制錯誤訊息產生。
- 遞增、遞減運算符:如++$a這類的用法。
運算符 意義 說明 ++$a 先遞增 $a值加1之後才傳回$a值 $a++ 後遞增 先傳回$a值之後再將$a值加1 --$a 先遞減 $a值減1之後才傳回$a值 $a-- 後遞減 先傳回$a值之後再將$a值減1 - 邏輯運算符:也就是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為假時,結果才為真 - 字串運算符:小黑點「.」,用來連接字串和變數、常數或函數用的! echo "嗨!" . $user_name . "您好!"; echo "資料庫名稱:" . _DB_NAME; echo "今天是:" . date("Y年m月d日");
- switch 可以判斷某個變數值,當該變數值符合指定條件時,就去執行哪些動作,基本上就是「一個口令,一個動作」之意。
- case 到 break 就是完整一組,可以自行添加無限多組。
- break; 不加也符合語法,但會一直執行到下方動作。
- default 即預設動作,當變數跟任一個「特定值」都不相符時要進行的動作,一般放在最下方。
- 讀取資料庫的內容,一律用 select 語法: SELECT `查詢的欄位` [FROM `資料表名稱` 附加的篩選條件]
- 其中篩選條件語法如下(有順序關係,需注意): [where 篩選條件] [group by `欄位名稱`][having group的篩選條件] [order by {unsigned_integer | `欄位名稱` | formula} [asc | desc] ,...] [limit [起點,] 筆數]
- 寫SQL送去資料庫執行後,會傳回一個資源變數物件,如$result
- 可以利用$result的各種取得資料方法,將資料一筆一筆取回。
- 一筆資料以上的資料,請放至while(){}迴圈中取回。
- 利用 $result->fetch_assoc() 取出的資料陣列,會以資料表欄位名稱為陣列索引; 以$result->fetch_row() 取出的資料陣列,是以欄位順序為陣列索引,通常搭配list()使用
- $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';
- $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';
- 常會寫成這樣: list($sn, $title, $content, $create_time, $update_time)=$result->fetch_row();
- 不曉得迴圈數的 while(條件為真){ //執行動作 }
- 已知道迴圈數 for($i=0;$i<迴圈數;$i++){ //執行動作 }
- 抽取陣列 foreach($陣列 as $索引=>$值){ //執行動作 }
- 計算多語系編碼的字串長度:mb_strlen($字串, 編碼); 預設會自斷判斷系統編碼,例如: $len = mb_strlen($data['content']);
- 裁切多語系編碼的字串:mb_substr($字串, 起點, 字數, 編碼);,例如: $data['content'] = mb_substr($data['content'], 0, 100);
- Smarty 若接收到陣列,可用迴圈用來處理,常用方法如下:
- Smarty3用法 {foreach $來源 as $別名} {$別名.索引} {foreachelse} 該變數沒有值時要出現的內容 {/foreach}
- Smarty2用法(也是XOOPS用法,亦相容3) {foreach from=$來源 key=索引 item=項目 name=別名} {$項目.索引} {foreachelse} 該變數沒有值時要出現的內容 {/foreach}
- 迴圈還有一些特別的用法(左為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}
- 可以製作header.php及footer.php,把每個檔案都會引入的東西放在裡面。
- 可用require_once() 或 include_once()引入。
- header.php頁首檔 <?php require_once "config.php"; require_once "function.php"; require_once 'smarty/libs/Smarty.class.php'; $smarty = new Smarty; $db = link_db();
- footer.php頁尾檔 <?php $smarty->assign('op', $op); $smarty->assign('title', _PAGE_TITLE); $smarty->display(_PAGE_TEMPLATE);
- 可以製作header.tpl及footer.tpl,把每個樣板檔案都會引入的東西放在裡面。
- 可用 {include file="header.tpl"} 引入。
- https://www.videezy.com/
- 影片語法,加在 .img-container <video loop muted autoplay poster="影片圖檔.jpg" class="video"> <source src="影片.mp4" type="video/mp4"> </video>
- 接著在my.css中加入,將影片置於背景下 .video { position: absolute; z-index: -10; }