3.
資料庫讀取與程式的整併
一、 關於函數
- 函數有兩種,一組是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的變數過濾
- 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()
來過濾。
五、 PHP的 filter_var 過濾器
- 其用法為
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']) : '';
七、 PHP的運算符
- 算術運算符:也就是+(加)-(減)*(乘)/(除) %(餘數) 這類的運算符號。
數學運算符 |
範例 |
範例解釋 |
範例結果 |
+(加) |
$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 用法
switch ($變數) {
case '特定值':
# 動作...
break;
default:
# 動作...
break;
}
switch
可以判斷某個變數值,當該變數值符合指定條件時,就去執行哪些動作,基本上就是「一個口令,一個動作」之意。
case
到 break
就是完整一組,可以自行添加無限多組。
break;
不加也符合語法,但會一直執行到下方動作。
default
即預設動作,當變數跟任一個「特定值」都不相符時要進行的動作,一般放在最下方。
九、 讀出的SQL語法
- 讀取資料庫的內容,一律用
select
語法:
SELECT `查詢的欄位` [FROM `資料表名稱` 附加的篩選條件]
- 其中篩選條件語法如下(有順序關係,需注意):
[where 篩選條件]
[group by `欄位名稱`][having group的篩選條件]
[order by {unsigned_integer | `欄位名稱` | formula} [asc | desc] ,...]
[limit [起點,] 筆數]
十、 PHP從資料庫取得資料的方法
- 寫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迴圈用法
- 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}
十四、 製作PHP頁首頁尾檔(整併PHP檔)
- 可以製作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;
}