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做轉義,讓標籤失效,例如`<`轉成`<`,預設只轉雙引號(單引號無效),用`htmlspecialchars(文字,ENT_QUOTES) `更好。
4. HTML Entity Name 字符實體列表 :[https://www.w3schools.com/html/html\_entities.asp](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頁首檔 ```
assign('op', $op);
$smarty->assign('title', _PAGE_TITLE);
$smarty->display(_PAGE_TEMPLATE);
```
### 十五、 製作樣板頁首頁尾檔(整併樣板檔)
1. 可以製作header.tpl及footer.tpl,把每個樣板檔案都會引入的東西放在裡面。
2. 可用 `{include file="header.tpl"}` 引入。
### 十六、 \[補充\]影片背景
1.
2. 影片語法,加在` .img-container` ```
```
3. 接著在my.css中加入,將影片置於背景下 ```
.video {
position: absolute;
z-index: -10;
}
```