第 03 章 - PHP日期時間與條件判斷
上次更新日期 2020/03/18
有時候我們需要透過日期判斷來進行某些資料的改寫,這時就得要有可以抓取時間參數的資料,因此需要知道 PHP 怎麼取得時間。 另外,很重要的是,我們也需要進行某些『判斷』來處理更多的雜務!因此,這個章節我們會來介紹如何取得時間與進行條件判斷喔!
學習目標:
- 了解 PHP 怎麼取得時間與時間的應用
- 了解 PHP 內部的 if 相關應用
- 了解亂數的應用
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: 代表時區喔!
- 先建立一個新檔案,檔名就稱為 /www/php/unit03-1-1.php,後續將程式碼寫入 body 當中 ;
- 檔案最上方需要載入 functions.php 喔!
- 這個網頁會一直持續顯示目前的日期與時間,日期與時間格式請參考下圖顯示的結果。
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
另外,可能某些時刻你的時區會跑掉 (畢竟大家的預設時間都不一樣),此時,你可以強迫 PHP 使用你指定的時區喔! 例如台灣時區為 Asia/Taipei 這樣,所以,你可以在 functions.php 裡面額外指定這個項目在最上方:
date_default_timezone_set("Asia/Taipei");
- 直接重複修改 /www/php/functions.php 的檔案內容
- 最上方加入上面寫到設定時區的參數,並且先將時區設定為 Japan,然後重複查看 unit03-1-1.php 看看;
- 確定沒問題,將時區設定為 Asia/Taipei,然後重複查看 unit03-1-1.php 看看;
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /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) ?>
- 將 /www/php/unit03-1-1.php 另存新檔成為 unit03-2-1.php,然後進行修改
- 設定一個變數,可以假定為 $mytime,同時取得的資料為當時的小時數值 (例如 6 點或 15 點)
- 依據底下的說明,設定問候語:
- 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』
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /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。 |
一般來說,手機上面有個『夜光』的功能,可以讓螢幕變得比較暗。設計在網頁上的話,我們可以讓螢幕的背景變成黑色, 然後前景變成灰色,讓網頁稍微具有夜光的功能,那該如何做?
- 將 /www/php/unit03-2-1.php 另存新檔成為 unit03-2-2.php,然後進行修改
- 在網頁最上方增加 PHP 程式碼,先抓下當前的時間,以 $myt 作為變數
- 承上,當 $myt 大於等於 22 ,或者是小於等於 5 的時候,增加一個變數,名稱為 $mybody,內容為 『"color: gray; background-color: black;"』,但是,若非為上述的時間時,就給予 $mybody 的內容為: 『"color: black; background-color: white;"』
- 在 html 裡面的 body 項目,增加 style= 項目,使用 php 的 echo 將 $mybody 帶入其中。
- 你可以調整上述的 22 與 5 的項目,來測試網頁的背景色~測試成功,再轉回正確的數值即可。
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
上面這個例題的測試,就可以知道,其實很多網站可以透過這些基本的時間控制,自動處理預先規劃好的網頁風格,如此一來, 就可以在特定的時間點,顯示比較特別的效果喔!
3.3: 大量輸入資料 (nowdoc)
- 大量輸入資料,透過 nowdoc 的方法
如果你有機會在 PHP 程式碼裡面嵌入 HTML 原始碼,那麼得要考慮到非常多的單引號、雙引號的問題,還有錢字號的變數狀態等等! 所以通常我們會反過來,在 HTML 裡面嵌入 PHP 程式碼。問題是,很多時候,你就是需要設定一些大量資料的變數內容, 這時,可能可以使用 nowdoc 的設定方式喔!語法有點像這樣:
$var = <<<eof HTML 的原始碼通通放在這裡 ...... eof;
通常我們會使用 eof (end of file) 這個關鍵字作為資料輸入的結尾。要注意的是, eof 最後一定要獨立放在一行上面! 而且, eof 一定要寫在行首 (最前面),前面不能有任何字元!這樣,你就可以在 PHP 程式碼裡面放入一個大量資料的變數,比較好在未來做進一步的使用。
- 單一檔案進行上傳/下載表單設計
在上一章,我們都是用兩個檔案來填表單+接收表單,那能不能透過一個檔案,直接填表單或接收表單呢?也是可以的。 而且,我們可以根據判斷來決定是否要提供數值哩!底下這個範例也會用到上面的 nowdoc
- 將 /www/php/unit02-8-1.php 另存新檔成為 unit03-3-1.php,然後進行修改
- 檔案最上方需要載入 functions.php 喔!
- 使用一個條件判斷式,判斷式為『 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 為空值
- 將 action 裡面的檔案,寫成本檔案的檔名,亦即是 $_SERVER['PHP_SELF']
- 判斷 input 裡面的 myh 與 myw 資料,使用『若 $myh 不為 0 ,就輸出 value='$myh' 』,讓上次輸入的數值可以在這裡繼續存在。
- 在 form 下方,若 $mymsg 不為空,就顯示 $mymsg !若為空,就不顯示 (用 if 喔!)
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
- 單選的項目來出拳
有時候你可能會需要跟電腦猜拳,那麼你得要先出拳才行!那如何出拳呢?好簡單!就用單選出拳!然後讓選單將你的出拳紀錄後, 將你的拳頭用圖片顯示出來就好!看看底下的例題:
- 將 /www/php/unit03-3-1.php 另存新檔成為 unit03-3-2.php,然後進行修改
- 先在表單內,以 input type="radio" 的方式,建立變數名稱為 hand 的變數,有三種數值,分別是 s 代表剪刀、 r 代表石頭、 p 代表布;
- 剪刀石頭布的檔案可以在這裡下載: 剪刀, 石頭, 布
- 檔案最上方,使用 isset 判斷有沒有 hand 的變數:
- 如果有變數,然後 (1)使用 $myhand 抓下 $_REQUEST['hand']; (2)以三個條件判斷,若 $myhand 為 s 則顯示 $myfig 為 scissors.png, 分別代表三個圖檔的檔名就是了;
- 如果沒有變數,代表初次進入本檔案,則設計 $myhand = "" 且 $myfig = ""
- 在 head 裡面增加 style,設定 .myhand 的樣式,提供寬度 300 、高度 300、框線 1 像素的實線。
- 在 head 裡面增加 style,設定 .myhand img 的樣式,提供寬度 100%。
- 在表單後面,若 $myfig 不為空,就帶入一個 img ,且將圖片顯示在內!
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
3.4: PHP 亂數產生器 rand(min,max)
雖然 PHP 屬於伺服器端的網頁程式語言,因此太過使用 PHP 會讓伺服器的 loading 增加。此外,通常 PHP 還是拿來做正事比較好, 包括內含 SQL 語言的資料庫連動,會是比較正常的一般應用模式。不過,PHP 畢竟是網頁程式語言,如果用於開發一些比較小的遊戲,基本上,應該還是無傷大雅啦!
- 使用 rand(min,max) 進行整數亂數取得,同時用在猜拳遊戲
許多時候我們可以拿亂數的資料來進行小遊戲~舉例來說,使用亂數來取得剪刀、石頭、布的出拳結果,然後讓兩個人去比賽。 不過,我們尚未講到表單,所以這裡我們使用簡單的隨機的兩個人去處理一個猜拳的結果~不過,首先,我們還是來瞭解一下 PHP 取得整數亂數 rand() 的用法吧!
rand(最小值,最大值)
來看看怎麼在全班的同學,猜出好玩的座號
- 將 /www/php/unit03-3-2.php 另存新檔成為 unit03-4-1.php,然後進行修改
- 在 form 裡面,使用兩個 input type="text" 的方塊,並且提供 mymin 與 mymax 兩個變數名稱;
- 在 form 裡面,使用 type="submit" 讓使用者送出選擇
- 在檔案最上方,判斷 $_REQUEST['mymin'] 是否存在:
- 若存在,則抓下來 $mymin, $mymax,據以推算出 $mynum 為 rand 函數內容
- 若不存在,則上面三個變數內容都為空值
- 回到 input 內部,若有 $mymin 不為空,則給予數值
- 表單底下,判斷是否有 $mynum,若不為空,才給予顯示幸運座號的資料!
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
這樣,就很容易選號了!哈哈哈!既然知道亂數了,那就讓電腦自動猜拳!假設 1 為剪刀、 2 為石頭 3 為布,加以選擇吧!
- 將 /www/php/unit03-3-2.php 另存新檔成為 unit03-4-2.php,然後進行修改
- 檔案最上方直接使用 rand 去取出 1~3 之間的數值
- 根據 1, 2, 3 給予 $myfig 變數,內容就是剛剛上傳的圖片
- 直接透過 div 的方式,將圖片顯示出來即可!你可以反覆刷新該檔案,應該會看到每次電腦出拳都不一樣!
- 最終將程式碼寫入到後面的 pre 當中,以備查驗
- 在 /www/php/index.php 加入這個程式的連結
3.5: 小小挑戰題
上面我們用到了電腦出拳,還有你出拳!那麼,請將兩者結合,你出拳電腦也出拳, 可以使用到 $pchand 與 $myhand 去比對!看看誰的拳頭大!做完的情況有點像這樣:
3.6: 參考資料
- PHP 的 date 函數:https://www.php.net/manual/en/function.date.php