php w3c

PHP 程式設計初探 - 上課教材

PHP 程式設計初探 > 課程內容 > 第 03 章 - PHP日期時間與條件判斷

第 03 章 - PHP日期時間與條件判斷

上次更新日期 2020/03/18

有時候我們需要透過日期判斷來進行某些資料的改寫,這時就得要有可以抓取時間參數的資料,因此需要知道 PHP 怎麼取得時間。 另外,很重要的是,我們也需要進行某些『判斷』來處理更多的雜務!因此,這個章節我們會來介紹如何取得時間與進行條件判斷喔!

學習目標:

  1. 了解 PHP 怎麼取得時間與時間的應用
  2. 了解 PHP 內部的 if 相關應用
  3. 了解亂數的應用

3.1: PHP 時間的取得

我們有時候會需要 Server 提供目前 Server 的日期~要注意,用戶端可能來自於不同的地方,所以 Server / client 由於處於地球的兩個地方, 很可能具有不一樣的時間參數。PHP 取得的時間是 Server 的時間,而 javascript 則取得的是 client 的時間,這是有所差異的。那麼 PHP 的日期參數是什麼呢? 基本上,取得日期使用的是 date 這個函數,而這個函數可以輸出不同的格式,例如想要輸出台灣常見的 20YY/MM/DD 這樣的日期格式,可以使用如下的方式來呼叫:

<?php
	echo "今天的日期是:" . date("Y/m/d") . "<br />";
?>

在 date 裡面還有常用的參數有:

  • Y: 代表西元年
  • m: 代表月份 (01, 02..., 12)
  • d: 代表日期 (01, 02..., 31)
  • l: 代表星期幾
  • H: 代表 24 小時的小時值 (01, 02... ,23)
  • G: 代表 24 小時的小時值 (1, 2... ,23)
  • i: 代表分鐘 (01, 02..., 59)
  • s: 代表秒 (01, 02..., 59)
  • e: 代表時區喔!
例題 3.1-1:由 PHP 取得伺服器的時間參數
  1. 先建立一個新檔案,檔名就稱為 /www/php/unit03-1-1.php,後續將程式碼寫入 body 當中 ;
  2. 檔案最上方需要載入 functions.php 喔!
  3. 這個網頁會一直持續顯示目前的日期與時間,日期與時間格式請參考下圖顯示的結果。
  4. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  5. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: 由 PHP 抓取時間參數

另外,可能某些時刻你的時區會跑掉 (畢竟大家的預設時間都不一樣),此時,你可以強迫 PHP 使用你指定的時區喔! 例如台灣時區為 Asia/Taipei 這樣,所以,你可以在 functions.php 裡面額外指定這個項目在最上方:

	date_default_timezone_set("Asia/Taipei");
例題 3.1-2:設定 PHP 的預設時區
  1. 直接重複修改 /www/php/functions.php 的檔案內容
  2. 最上方加入上面寫到設定時區的參數,並且先將時區設定為 Japan,然後重複查看 unit03-1-1.php 看看;
  3. 確定沒問題,將時區設定為 Asia/Taipei,然後重複查看 unit03-1-1.php 看看;
  4. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  5. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: 取得正確的時區

3.2: 簡單條件判斷

取得時間後,能不能依據時間給予早安、午安、晚安、快去睡覺的對話顯示框呢?這就需要 PHP 的條件判斷了!基本條件判斷是這樣的:

<?php
	if ( 條件判斷 ) {
		條件成立情況下所進行的程式碼;
	}
?>

如果條件成立就進行 A 動作,若不成立就進行 B 動作,那就會將上面的程式變成如下模樣:

<?php
	if ( 條件判斷 ) {
		條件成立情況下所進行的程式碼 A;
	} else {
		條件不成立情況下所進行的程式碼 B;
	}
?>

如果將上面的程式碼以人類看得懂的中文字來說明,那就會變成:

<?php
	如果 ( 條件判斷成立 ) 我就
		條件成立情況下所進行的程式碼 A;
	要不然我就
		條件不成立情況下所進行的程式碼 B;
	結束
?>

常見的條件判斷中,也有底下幾種比對的方式喔!

<?php
	if ( $abc == $cde )   // 判斷兩個變數是否相同
	if ( $abc > $cde )    // 比對兩個數值變數的大小
	if ( isset ( $abc ) ) // 判斷 $abc 這個變數是否存在於程式當中
	if ( 條件判斷一 && 條件判斷二 ) 兩個條件都成立才算成立 (and)
	if ( 條件判斷一 || 條件判斷二 ) 兩個條件當中,只要任何一個成立就算成立 (or)
?>
例題 3.2-1:從當日的時間去推敲問候語
  1. 將 /www/php/unit03-1-1.php 另存新檔成為 unit03-2-1.php,然後進行修改
  2. 設定一個變數,可以假定為 $mytime,同時取得的資料為當時的小時數值 (例如 6 點或 15 點)
  3. 依據底下的說明,設定問候語:
    • 06:00~10:59 顯示『早安』
    • 11:00~14:59 顯示『午安』
    • 15:00~16:59 顯示『傍晚黃昏、再努力一下』
    • 17:00~18:59 顯示『下班回家請慢走』
    • 19:00~21:59 顯示『還在忙嘛?記得收拾收拾囉!』
    • 22:00~23:59 顯示『快去洗洗睡』
    • 00:00~05:59 顯示『睡睡睡zzZZ』
  4. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  5. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: 時間問候語
  • 常見的比較運算子

事實上,那個 if 裡面給予的就是真的或假的 (true or false) 而已,那麼,什麼情況可以比較之後傳遞真的或假的呢?基本上有這幾種:

比較的符號 說明 常見範例運算結果
== 是否相等 $var1 == $var2 若 $var1 與 $var2 為相同,則回傳 true,否則回傳 false
=== 是否完全相等 $var1 === $var2 $var1 與 $var2 不但內容相同,而且連型別都要相同,才回傳 true,否則回傳 false
!= 是否不同 $var1 != $var2 當 $var1 與 $var2 不一樣的時候,就回傳 true,否則回傳 false
< 小於 $var1 < $var2 若 $var1 比 $var2 小,則回傳 true,否則回傳 false
> 大於 $var1 > $var2 若 $var1 大於 $var2 則回傳 true,否則回傳 false
<= 小於等於 $var1 <= $var2 $var1 等於或小於 $var2 就回傳 true,否則回傳 false
>= 大於等於 $var1 >= $var2 $var1 等於或大於 $var2 就回傳 true,否則回傳 false

另外還有邏輯運算子,常見的有

邏輯符號範例 說明
$test1 && $test2 當 $test1 為真的,且 $test2 也是真的,就回傳 true,否則回傳 false。 例如前面的 $mytime >= 5 && $mytime <= 10 ,就是 $mytime 得要滿足兩者的限制,才會回傳 true 的意思。
$test1 || $test2 當 $test1 為真的,或者 $test2 是真的,也就是兩者之間有一個為真的,那就回傳 true,否則回傳 false。 例如,我們如果只想要抓出晚上 22 點以後,以及早上 5 點以前,那可以簡單的說: $mytime >= 22 || $mytime <= 5 , 因為 $mytime 不可能同時大於 22 又同時小於 5 啊!而是兩者之間有一個成立,那就是抓到了!
isset (判斷) 這個不應該放在這裡,不過暫時放在這裡一起看。isset 是說『有沒有此設定』的意思,可以知道括號內的判斷式是否存在! 舉例來說,要判斷系統有沒有一個名為 $mytime 的變數,可以用 isset($mytime) 這樣,若有存在,則回傳 true,否則回傳 false。

一般來說,手機上面有個『夜光』的功能,可以讓螢幕變得比較暗。設計在網頁上的話,我們可以讓螢幕的背景變成黑色, 然後前景變成灰色,讓網頁稍微具有夜光的功能,那該如何做?

例題 3.2-2:讓網頁的背景自動依據時間變化
  1. 將 /www/php/unit03-2-1.php 另存新檔成為 unit03-2-2.php,然後進行修改
  2. 在網頁最上方增加 PHP 程式碼,先抓下當前的時間,以 $myt 作為變數
  3. 承上,當 $myt 大於等於 22 ,或者是小於等於 5 的時候,增加一個變數,名稱為 $mybody,內容為 『"color: gray; background-color: black;"』,但是,若非為上述的時間時,就給予 $mybody 的內容為: 『"color: black; background-color: white;"』
  4. 在 html 裡面的 body 項目,增加 style= 項目,使用 php 的 echo 將 $mybody 帶入其中。
  5. 你可以調整上述的 22 與 5 的項目,來測試網頁的背景色~測試成功,再轉回正確的數值即可。
  6. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  7. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: hello PHP

上面這個例題的測試,就可以知道,其實很多網站可以透過這些基本的時間控制,自動處理預先規劃好的網頁風格,如此一來, 就可以在特定的時間點,顯示比較特別的效果喔!

3.3: 大量輸入資料 (nowdoc)

  • 大量輸入資料,透過 nowdoc 的方法

如果你有機會在 PHP 程式碼裡面嵌入 HTML 原始碼,那麼得要考慮到非常多的單引號、雙引號的問題,還有錢字號的變數狀態等等! 所以通常我們會反過來,在 HTML 裡面嵌入 PHP 程式碼。問題是,很多時候,你就是需要設定一些大量資料的變數內容, 這時,可能可以使用 nowdoc 的設定方式喔!語法有點像這樣:

	$var = <<<eof
	HTML 的原始碼通通放在這裡
	......
eof;

通常我們會使用 eof (end of file) 這個關鍵字作為資料輸入的結尾。要注意的是, eof 最後一定要獨立放在一行上面! 而且, eof 一定要寫在行首 (最前面),前面不能有任何字元!這樣,你就可以在 PHP 程式碼裡面放入一個大量資料的變數,比較好在未來做進一步的使用。

  • 單一檔案進行上傳/下載表單設計

在上一章,我們都是用兩個檔案來填表單+接收表單,那能不能透過一個檔案,直接填表單或接收表單呢?也是可以的。 而且,我們可以根據判斷來決定是否要提供數值哩!底下這個範例也會用到上面的 nowdoc

例題 3.3-1:同一個網頁進行表單與上傳資料的結果
  1. 將 /www/php/unit02-8-1.php 另存新檔成為 unit03-3-1.php,然後進行修改
  2. 檔案最上方需要載入 functions.php 喔!
  3. 使用一個條件判斷式,判斷式為『 isset($_REQUEST['myh']) 』這個條件,且:
    • 條件成立 (有上傳的資料),(1)使用 $myh = $_REQUEST['myh'] 等,將 $myh 與 $myw 抓下來,(2)計算 BMI 數值,以 $mybmi 為變數去計算; (3)建立一個 $mymsg 的變數,使用 nowdoc 的方法,增加類似如下的訊息『<div> <p>你的BMI是: $mybmi</p></div>』!
    • 條件失敗 (沒有上傳資料,第一次使用這個網頁),(1)設定 $myh, $myw 為 0 ,且 $mymsg 為空值
  4. 將 action 裡面的檔案,寫成本檔案的檔名,亦即是 $_SERVER['PHP_SELF']
  5. 判斷 input 裡面的 myh 與 myw 資料,使用『若 $myh 不為 0 ,就輸出 value='$myh' 』,讓上次輸入的數值可以在這裡繼續存在。
  6. 在 form 下方,若 $mymsg 不為空,就顯示 $mymsg !若為空,就不顯示 (用 if 喔!)
  7. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  8. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: 單一表單上傳與下載,透過 isset 喔!
  • 單選的項目來出拳

有時候你可能會需要跟電腦猜拳,那麼你得要先出拳才行!那如何出拳呢?好簡單!就用單選出拳!然後讓選單將你的出拳紀錄後, 將你的拳頭用圖片顯示出來就好!看看底下的例題:

例題 3.3-2:單選配合出拳來顯示剪刀石頭布
  1. 將 /www/php/unit03-3-1.php 另存新檔成為 unit03-3-2.php,然後進行修改
  2. 先在表單內,以 input type="radio" 的方式,建立變數名稱為 hand 的變數,有三種數值,分別是 s 代表剪刀、 r 代表石頭、 p 代表布;
  3. 剪刀石頭布的檔案可以在這裡下載: 剪刀, 石頭,
  4. 檔案最上方,使用 isset 判斷有沒有 hand 的變數:
    • 如果有變數,然後 (1)使用 $myhand 抓下 $_REQUEST['hand']; (2)以三個條件判斷,若 $myhand 為 s 則顯示 $myfig 為 scissors.png, 分別代表三個圖檔的檔名就是了;
    • 如果沒有變數,代表初次進入本檔案,則設計 $myhand = "" 且 $myfig = ""
  5. 在 head 裡面增加 style,設定 .myhand 的樣式,提供寬度 300 、高度 300、框線 1 像素的實線。
  6. 在 head 裡面增加 style,設定 .myhand img 的樣式,提供寬度 100%。
  7. 在表單後面,若 $myfig 不為空,就帶入一個 img ,且將圖片顯示在內!
  8. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  9. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: 出拳!

3.4: PHP 亂數產生器 rand(min,max)

雖然 PHP 屬於伺服器端的網頁程式語言,因此太過使用 PHP 會讓伺服器的 loading 增加。此外,通常 PHP 還是拿來做正事比較好, 包括內含 SQL 語言的資料庫連動,會是比較正常的一般應用模式。不過,PHP 畢竟是網頁程式語言,如果用於開發一些比較小的遊戲,基本上,應該還是無傷大雅啦!

  • 使用 rand(min,max) 進行整數亂數取得,同時用在猜拳遊戲

許多時候我們可以拿亂數的資料來進行小遊戲~舉例來說,使用亂數來取得剪刀、石頭、布的出拳結果,然後讓兩個人去比賽。 不過,我們尚未講到表單,所以這裡我們使用簡單的隨機的兩個人去處理一個猜拳的結果~不過,首先,我們還是來瞭解一下 PHP 取得整數亂數 rand() 的用法吧!

rand(最小值,最大值)

來看看怎麼在全班的同學,猜出好玩的座號

例題 3.4-1:亂數選座號
  1. 將 /www/php/unit03-3-2.php 另存新檔成為 unit03-4-1.php,然後進行修改
  2. 在 form 裡面,使用兩個 input type="text" 的方塊,並且提供 mymin 與 mymax 兩個變數名稱;
  3. 在 form 裡面,使用 type="submit" 讓使用者送出選擇
  4. 在檔案最上方,判斷 $_REQUEST['mymin'] 是否存在:
    • 若存在,則抓下來 $mymin, $mymax,據以推算出 $mynum 為 rand 函數內容
    • 若不存在,則上面三個變數內容都為空值
  5. 回到 input 內部,若有 $mymin 不為空,則給予數值
  6. 表單底下,判斷是否有 $mynum,若不為空,才給予顯示幸運座號的資料!
  7. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  8. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: 抽號碼

這樣,就很容易選號了!哈哈哈!既然知道亂數了,那就讓電腦自動猜拳!假設 1 為剪刀、 2 為石頭 3 為布,加以選擇吧!

例題 3.4-2:讓電腦自己出拳
  1. 將 /www/php/unit03-3-2.php 另存新檔成為 unit03-4-2.php,然後進行修改
  2. 檔案最上方直接使用 rand 去取出 1~3 之間的數值
  3. 根據 1, 2, 3 給予 $myfig 變數,內容就是剛剛上傳的圖片
  4. 直接透過 div 的方式,將圖片顯示出來即可!你可以反覆刷新該檔案,應該會看到每次電腦出拳都不一樣!
  5. 最終將程式碼寫入到後面的 pre 當中,以備查驗
  6. 在 /www/php/index.php 加入這個程式的連結
完成的結果會有點像這樣: 電腦出拳

3.5: 小小挑戰題

上面我們用到了電腦出拳,還有你出拳!那麼,請將兩者結合,你出拳電腦也出拳, 可以使用到 $pchand 與 $myhand 去比對!看看誰的拳頭大!做完的情況有點像這樣:

hello PHP

3.6: 參考資料