PHP初探

10.1:什麼是PHP

什麼是 PHP 呢?我們拿 Wiki 上面的說明來看看:(https://zh.wikipedia.org/wiki/PHP)

PHP(全稱:PHP:Hypertext Preprocessor,即「PHP:超文字預處理器」)是一種開源的通用電腦手稿語言,尤其適用於網路開發並可嵌入HTML中使用。PHP的語法借鑑吸收C語言、Java和Perl等流行電腦語言的特點,易於一般程式設計師學習。PHP的主要目標是允許網路開發人員快速編寫動態頁面,但PHP也被用於其他很多領域。

也就是說,PHP 是一種網頁程式語言,是一種直譯式的程式語言,無須再次編譯,即可在伺服器端進行程式的運作。很多在網站上面的程式都是透過 PHP 來撰寫的, 例如架站機 Xoops、討論區 phpBB、部落格軟體 lifetype 等等,都是透過 PHP 所撰寫出來的搭配資料庫即可運作的套裝軟體喔!

那 PHP 怎麼用呢?在 HTML 檔案裡面要使用到某些標籤就得透過 來處理,而 PHP 是涵蓋在 HTML 檔案內的,因此可以直接在檔案裡面使用: <?php ... ?> 來處理即可!底下就是一個簡單的顯示 hello world 的程式碼:

<?php
	echo "hello world";
?>			

此外,要特別注意的地方是,你再也無法複製別人的檔案了!『這是因為 PHP 是寫給伺服器運作時看的,所以伺服器會根據 PHP 程式碼的運作結果, 將結果以純文字的方式傳輸到瀏覽器上,因此瀏覽器顯示的只會是執行的結果,而不會是程式碼!』 !這點非常重要!

另外,伺服器能不能執行 PHP 程式碼,與伺服器有沒有安裝支援 PHP 的網頁伺服器軟體有關,不是所有的網頁伺服器都會支援 PHP 的喔! 我們上課練習用的伺服器是支援 PHP 的,只是要讓伺服器執行 PHP 你還需要知道:

10.2:Windows XAMPP安裝及設定

什麼是XAMPP??,根據Wiki上的說明:(https://zh.wikipedia.org/zh-tw/XAMPP)

XAMPP是一個把Apache網頁伺服器與PHP、Perl及MariaDB集合在一起的安裝包,允許使用者可以在自己的電腦上輕易的建立網頁伺服器。

XAMPP安裝
  1. 先到XAMPP官網下載安裝檔: https://www.apachefriends.org/zh_tw/download.html
    選擇Windows版本
  2. 啟動XAMPP安裝檔 然後按照指示按 "Next" 上面要安裝的工具直接用預設全部安裝 安裝路徑也是預設在"C槽的xampp" 語言預設英文(好像也沒中文可以選) 將方框的勾勾拿掉 繼續按"Next" 等待安裝......

    安裝完成
    中間方框不拿掉,按下Finish後幫我開啟XAMPP控制台 將"Apache"和"MySQL"的Start按下去啟用 測試Apache有沒有成功
    在瀏覽器輸入 "http://localhost" 看會不會出現XAMPP的測試頁。
    像下面圖片這樣:

修改XAMPP首頁路徑

網頁伺服器都會有預設網頁的檔案要放置的路徑,XAMPP預設的路徑是在C:\xampp\htdocs,意思就是說在瀏覽器上輸入http://localhost時,XAMPP會到C:\xampp\htdocs底下讀取網頁的檔案,但如果我們不想把網頁的檔案放在預設路徑上,想放到自己習慣的資料夾上,那就必須到XAMPP的設定檔做修改。

到C槽的xampp資料夾 -> 進到apache資料夾 -> 再進到 conf資料夾裡,找到httpd.conf的檔案



用記事本打開httpd.conf這個檔案,打開後會看到一堆英文,像下方圖片這樣
在記事本左上角點 "編輯" -> "尋找" 或是 用快捷鍵 "Ctrl + F",打開尋找框。
在尋找目標打上 " DocumentRoot ",將 "大小寫視為相異" 和 "環繞" 的小白框打勾,然後按 "找下一個"。
找到 :
	DocumentRoot "C:/xampp/htdocs"
	<Directory "C:/xampp/htdocs">
像下方圖片這樣:

這兩行的 C:/xampp/htdocs 就是XAMPP的網頁預設路徑, 我們可以將這兩行的 C:/xampp/htdocs 改成我們自己想要的路徑資料夾。

我想要將網頁預設路徑放在C槽底下的www的資料夾裡,那我就把這兩行的C:/xampp/htdocs 改成C:/www
像下方這樣:

修改完就可以儲存關掉
再到C槽新增一個 www的資料夾(!!! 這一步記得要做,不然重新啟動Apache會有問題 !!!)
然後到XAMPP的控制台,將Apache和MySQL重新啟動

重新啟動方法,只要按Apache和MySQL的"Stop"按鈕變成"Start"後,再按一次"Start"按鈕就可以

例題10.2.1:製作個人首頁,在剛剛建立的www資料夾製作個人的首頁:
  • 請在www資料夾裡新增一個index.html的檔
    (index是網頁伺服器預設的首頁檔名)
  • 請用前幾章教過的html、css寫一個個人首頁,風格內容都隨意即可
  • 完成後請到瀏覽器輸入 http://localhost 看看會不會出現個人首頁
類似下面這樣:

既然首頁及資料夾都已經有了,那之後做的所有網頁都要放在www的資料夾裡面,並且在首頁放上連結可以直接點了就直接跳過去。

什麼意思呢?  像這樣:

當我在首頁點選連結時,會有跳頁展示的效果,方法就是用前幾章講HTML時有提到的 <a href=""> </a>的方法。


設定開機自動啟動Aapche和Mysql

當我們的電腦重新開機時會將一些服務關閉,每次只要重新啟動電腦時都要在自己手動將服務在開起來其實有點麻煩,所以我們將XAMPP裡的Apache和Mysql設定成自動啟動,只要當電腦重新啟動時XAMPP會自動將Apache和Mysql自動開起來,這樣就可以不用手動開啟了。

  1. 點開windows桌面左下角找到 XAMPP ,用滑鼠 "右鍵"點選XAMPP,選擇 "更多" ,再點 "以系統管理員身分執行" 。
    如圖:

    如果直接用左鍵點開XAMPP系統只會以一般使用者的身分打開XAMPP,這樣會無法設定自動啟動,所以我們要用管理員的身分打開XAMMPP才能設定開機自動啟用。

  2. 打開後可以看到XAMPP控制面板左邊的Service那直排框框會出現紅色叉叉,那就是我們要修改的地方,如果框框內是顯示 紅色叉叉 代表就是不會自動啟動。



    點選Apache和Mysql的紅色叉叉,點選後會出現確認窗選擇yes,之後方框就會變成綠色勾勾這樣就可以了。
    Service變成綠色勾勾後記得 點Apache和Mysql的Start按鈕將他們開啟。像圖片這樣:



  3. 之後將電腦重新開機後,用一般使用者打開XAMPP,可以看到Apache和Mysql都已經是開著的

    打開瀏覽器,網址輸入 http://localhost,可以順利進到首頁
10.3:PHP程式撰寫

上面有提到PHP是需要在伺服器安裝相關軟體才可以使用,上面做的那些動作就是要將我們現在的電腦變成簡易的網頁伺服器,XAMPP本身就已經有包含PHP的相關軟體,所以我們現在就可以開始寫php網頁囉。
!!!記得上面有提到PHP網頁的副檔名是.php不是.html,不然是沒辦法寫php喔。!!!

例題10.3.1:製作第一個PHP網頁,檔名為/www/unit10-3-1.php
  • 其他底下的所有設計項目,請使用 class 來處理,且放置於網頁最上方的 <style> 內
  • 使用 h2 顯示『我的第一個 PHP 網頁』
  • 在底下使用『 echo "hello world" 』顯示出執行的結果
  • 在底下再以 pre 直接秀出你寫的程式碼~
    (做完請在首頁建立一個可以到這頁的連結)

在你完成這個網頁之後,請直接右鍵查看一下原始碼,看看能不能看到剛剛寫的 PHP 程式碼呢?


PHP 的變數設定與變數相加

變數設定是一個很重要的工具!你可以固定程式碼,程式碼裡面含有變數,那麼在不更動程式碼的原則, 只要設定新的變數,那就會得到不同的結果。PHP 的變數設定基本規則是這樣的:

設計網頁或程式時,我們一直強調,要將『一直出現的部份獨立出來,或者是製作成為變數』,這樣在未來的維護上面會比較輕鬆。

例題 10-3-2:設定兩個變數,分別為 firstname 與 lastname,其中 firstname 請設定你的名字,lastname 請設定你的姓氏, 然後透過 這個檔案 的內容,用變數取代『姓氏』與『名字』,最後來呈現正確的資料。檔名請取為 unit10-3-2.php。
(做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:

從上面的練習可以發現到,你只要設定好變數,後面的文字內容部份就會全部跟著變動,而不用一個一個資料去重新修改, 這就是變數設定的目的之一。

另外,文字的累加與四則運作是不太一樣的喔!

以下面這題為例:

例題 10-3-2-1:利用變數設定來計算操場每條跑道的距離為多長
  • 新增一個名叫unit10-3-2-1.php的檔案
  • 第 1,2 行設定兩個變數,一個設定為400,另一個設定3.14
  • 第 3 行以後,分別顯示『第 1 跑道距離:』連結『 $mybasic + 2 * $mypi * 1.22 * (0~7) 』
  • $mybasic 為 400 數值, $mypi 則是 3.14 ,[0-7] 指的是第 1 到第 8 跑道要加上的距離
  • 最終將程式碼寫入到後面的 pre 當中,以備查驗
  • (做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:


PHP 的迴圈功能

PHP 有個迴圈的功能是很有幫助的,語法是這樣的:

<?php
	for ( $i = 1; $i <= 10; $i++ ) {
		echo $i ;
	}
?>

直接帶入 PHP 網頁時,就會輸出 1 ~ 10 的數字。我們來使用網頁安全色,那就是:

以 51 為倍數,最多為 5 倍,就可以得到所有的網頁色彩,因此總共就會有 6*6*6=216 種顏色搭配。如果要將這些顏色一個一個寫入網頁上, 用以前的手動設定方式,應該會崩潰的。此時,我們可以透過三個迴圈功能,讓每個迴圈從 0~5 搭配,然後每次都乘上 51 這個數值, 這樣就能夠直接輸出 216 種顏色喔!基本上有點像這樣:

<?php
    for ( $i = 0; $i <= 5; $i++ ) {
        for ( $j = 0; $j <= 5; $j++ ) {
            for ( $k = 0; $k <= 5; $k++ ) {
		echo "rgb(" . $i*51 . "," . $j*51 . "," . $k*51 . ")" ;
            }
        }
    }
?>
例題 10.3.3-0:用PHP for迴圈列出 1 ~ 10

例題 10.3.3-1~3:透過上述的功能,使用 table 表格化,每一列使用 6 個欄位,一個一個輸出每個色彩,使用 background-color 搭配 rgb 的色碼來顯示。 一般來說,你要處理的每個表格欄位 (td) 應該會有點像這樣:
<td style="background-color: rgb(xx,xx,xx)">rgb(xx,xx,xx)</td>
請依據上面的這個提示,分別製作 單迴圈、雙迴圈、三迴圈的色票樣式。
(做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:
單迴圈:檔名就存檔為 unit10-3-3-1.php。
雙迴圈:檔名就存檔為 unit10-3-3-2.php。
三迴圈:檔名就存檔為 unit10-3-3-3.php。

上面的作法當中,框框內的文字最好使用對比色來處理,不然黑壓壓一片,某些顏色就看不到文字了!那對比色怎麼處理呢?其實對比色就是 R, G, B 的顏色, 都用 255 去減,就會得到對比色。例如 rgb(0,0,255) 的對比色就會是 rgb(255,255,0)。同樣的,讓我們使用上述的檔案來重新建立一個新的具有對比色文字的表格。

例題 10.3.4:承上題,基本上的表格內文語法要加上如下的樣式:
<td style="background-color: rgb(xx,xx,xx); color: rgb(yy,yy,yy)">rgb(xx,xx,xx)</td>
請依據上面的這個提示,來處理好你的相關色碼資料即可,檔名就存檔為 unit10-3-4.php。
(做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:

比較需要注意的是,如果有兩個以上的運算子,建議使用括號來將數值圈起來,例如 (255-$i*51) 這樣,可以避免比較多的錯誤狀況的發生喔。


PHP 的日期功能

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

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

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

例題 10.3.5:我需要讓用戶連線到 unit10-3-5.php 時,就在網頁上面顯示目前的時間 (當然,每次時間都會不同才對!)。
(做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:


PHP 的條件判斷式

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

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

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

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

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

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

如果有涉及到多重判斷,那就得要使用底下更複雜的語法了:

<?php
	if ( 第一個條件判斷 ) {
		第一個條件成立情況下所進行的程式碼 A;
	} elseif ( 第二個條件判斷) {
		第二個條件成立情況下所進行的程式碼 B;
	} elseif ( 第三個條件判斷) {
		第三個條件成立情況下所進行的程式碼 C;
	} else {
		所有條件都不成立情況下所進行的程式碼 D;
	}
?>

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

<?php
	if ( $abc == $cde )   // 判斷兩個變數是否相同
	if ( $abc > $cde )    // 比對兩個數值變數的大小
	if ( isset ( $abc ) ) // 判斷 $abc 這個變數是否存在於程式當中
	if ( 條件判斷一 && 條件判斷二 ) 兩個條件都成立才算成立 (and)
	if ( 條件判斷一 || 條件判斷二 ) 兩個條件當中,只要任何一個成立就算成立 (or)
?>
例題 10.3.6:我們想讓網頁上面的某個區塊顯示問候語,問候的時間跟語言相關性是這樣的:
  • 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』
網頁檔名設定為 unit10-3-6.php
(做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:

10.4:共同功能的檔案呼叫

某些時刻,我們的語法是會被重複呼叫的!例如上面的問候語,你可能會想要在某些場合重複的使用上述的語法。那麼是否需要將全部的語法通通寫一遍在不同的網頁中? 似乎不需要吧!我們可以將可共用的程式碼獨立出來放在某些檔案彙整中,例如常見的 function.php 檔案的檔名,通常就放了很多的可以共享共用的函式或語法。 又例如我們在網頁當中瘋狂重複載入的 overall.css 也是同樣的想法。

那我們知道 CSS 的載入可以在 head 位置上使用『<link href="/where/to/find/your/style.css" rel="stylesheet" />』來載入, 那麼 php 該如何載入外部的檔案呢?那就使用 include ('filename') 吧!

例題 10.4.1:我們想讓網頁上面的某個區塊顯示問候語,問候的時間跟語言相關性是這樣的:
  • 在 /www/include 裡面建立一個名為 function.php 的檔案,並且將 unit10-3-6.php 裡面關於問候語的程式碼編寫在內。
  • 建立 /www/unit10-4-1.php ,內容與 unit10-3-6.php 類似,不過僅需直接呼叫 function.php 檔案, 就直接使用訊息變數來顯示問候語於網頁上
(做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:

同學可以透過這個練習知道 PHP 是可以去呼叫外部的檔案的!如此一來未來很多檔案就可以共用程式碼了!當你的 function.php 裡面的資料更新時, 所有呼叫該檔案的網頁就會跟著變動與更新!維護上就會變得很方便。


使用 function 的函數功能

除了直接呼叫程式碼之外,我們也能夠透過自訂的函數去處理動作!函數簡單的說,就是一個特別的指令,這個指令可以完成許多複雜的任務。 製作 PHP 的函數很簡單,使用底下的語法即可:

<?php
	function yourfunctionname() {
		your code here..;
		your code here..;
	}

	yourfunctionname();  <==這裡執行上述的指令串
?>

只是函數與正常的程式碼不一樣,在函數中的很多變數與資料是沒辦法回傳給主程式的~此時,我們可能還需要透過一個所謂的 return 功能, 讓函數有個回傳值~這樣才知道函數執行的結果這樣。

例題 10.4.2:模仿 10.4.1 的內容,完成如下的設定:
  • 在include裡新建一個function2.php的檔案,內容和function.php一樣,並在 function2.php 裡面增加一個名為 gettimemsg() 的函數,該函數就是問候語程式碼。此外,該函數運作時,就會顯示問候語。
  • 將 gettimemsg() 的執行寫入 unit10-4-2.php 檔案中。
(做完請在首頁建立一個可以到這頁的連結)
完成的圖示有點像底下這樣:

雖然執行結果相同的,但是這才是比較正確的作法!透過函數去處理某些任務,或者是透過函數去取得某些變數內容, 要比直接匯入固定程式碼來的有效率喔!處理上也比較直覺~

10.5: PHP取得用戶變數值
使用 GET 方式取得用戶上傳的變數

網頁有時候網址列會是長這樣:『 http://remote.host.name/somefile.php?var=content 』,亦即是在檔名後面, 先加上問號之後,以變數設定的方式,指定變數與變數值。這就是使用 GET 的方式,透過網址,將使用者需要的資料丟到伺服器, 再由伺服器的 PHP 去抓下來處理。

要將變數資料從網址列抓下來,就得要使用一些比較特別的方法。以 GET 的方式來說,就得要這樣做:

	$phpvar = $_GET['變數名稱'];

那個 $phpvar 是 PHP 裡面再設定一個變數名稱。我們同樣以賽道資訊來說明一下,假設操場的賽道標準長度為 400, 300, 200 這三種, 我想要透過設定一個 mybaic 變數,且透過網址列直接傳輸時,就得要透過上述的 $_GET['mybasic'] 來將變數內容抓下來才行。

例題 10.5.1:以GET的方法,將變數設定從網址抓下來
  • 新增一個名為unit10-5-1.php的檔案,將unit10-3-2-1.php的內容複製過來
  • 將 $mybasic = 400 改成『 $mybasic = $_GET['mybasic'];』的模樣
  • 最終將程式碼寫入到後面的pre當中
  • 檔案執行應該是加上變數與內容:『 unit10-5-1.php?mybasic=400』這個樣子
  • 做完請在首頁建立一個可以到這頁的連結
完成結果類似像這樣:


本章節首頁

本章節完成後預計會有這些實作檔,如下圖:

資料來源
鳥哥上課教材資料: