PHP小教學(基本概念、檔案存取)、HTML補遺

看板b95902HW作者 (++紅色世界++)時間17年前 (2006/12/29 21:57), 編輯推噓6(604)
留言10則, 6人參與, 最新討論串1/1
接下來的一系列會稍微把PHP的一些小觀念闡釋清楚,會的人就跳過吧XD <什麼是PHP?> PHP是一種伺服器端的程式語言。與Javascript不同,Js是在用戶端的電腦執行程式,而 PHP則是在伺服器端被執行,而結果則再透過伺服器送到用戶端。 瀏覽器基本上只會看的懂HTML的語言,並不懂PHP,那麼PHP是怎麼被內嵌到網頁的呢? 在一個內嵌PHP語言的網頁中,當用戶對伺服器提出瀏覽網頁的要求,伺服器會先"看過" 一次網頁,執行其中的PHP程式,並將結果寫入網頁的HTML,最後將整個HTML原始碼給 送到用戶端。於是,用戶端可以看到的是PHP經過伺服器處理後的純HTML,並不會看到其 中的程式。 此外,PHP的優勢也有很多:高效能、支援資料庫、免費、易學,可攜性也高。尤其是 易學這點,只要有C或是Perl的基礎,就幾乎不太需要學新的東西了。 可惜的是,PHP並不是想用就可以使用的。PHP的網頁必須讓"看的懂PHP"的伺服器閱讀, 也就是伺服器端必需擁有"PHP引擎"。像我之前說過的Apache Server就是擁有PHP引擎的 伺服器軟體,現在也有越來越多的網路空間支援PHP。 <表單> 學過HTML的人多少應該也會知道表單,也就是將使用者輸入的資訊提交給伺服器的區塊。 當時我並沒有明確解釋表單的傳送,現在再將其做個解釋: 一個可處理資料的表單通常是這樣寫的: <form method="post" action="processor.php"> ...... </form> 其中注意到form的兩個重要屬性,method跟action。method屬性是描述表單的傳送方式, 而action則是表單傳送的目標網頁,也就是原始碼中的processor.php。 於是,當使用者填寫表單並送出,所有表單內的資料會被傳送到processor.php當作變數 ,然後伺服器執行processor.php中的程式,並將結果寫在processor.php的html部分,然 後再送回用戶端。 <開始使用PHP> 如同很多的HTML標籤,如果要在HTML原始碼中嵌入PHP的程式,必須要有特殊的對應標 籤: <html> <head></head> <body> <? 裡面是php程式碼 ?> </body> </html> 如果還記得<script>這個標籤,也可以使用這個標籤: <script language="php"> 程式碼 </script> 既然有了預備知識了,現在來開始寫第一個php程式。 <? echo "hello!"; ?> 這樣子就是一個簡短的程式,其中echo的作用類似於C的printf,用法等一下在解釋。 如果html內的body標籤只有這段程式,那麼在執行了這段程式之後,用戶端看到的原始 碼將會是: <html> <head></head> <body> hello! <!--這行是被php程式寫入的--> </body> </html> 所以在用戶端就會看到hello!的文字。 所以說,php可以用來"寫html",例如我們要再網頁中放入一張圖,利用php,可以: <? echo "<img src='abc.jpg'>"; ?> 這樣的話,在執行過這段程式之後,那個位置就會出現<img>的標籤。 不過這樣的程式,不用寫光用html就夠了,現在再加入一些動態的內容: <? echo "<p>The time now is:<br>"; echo date('H:i, jS F'); echo "</p>" ?> 這樣就會印出當時的時間了,當然,是寫入html的。 <從表單得到變數> 當然,大部分的PHP應用會是從某個地方得到一些資料的,而資料的來源經常是表單, 那麼現在稍微解釋一下變數的概念。 有寫過C應該就不會對變數的概念陌生,PHP中當然也免不了會使用很多變數。在PHP中變 數的使用比起C來說更為自由,PHP的變數不需要宣告型別,甚至不需要宣告。一切就是 "愛用就用",唯一和C不同的地方,就是PHP的變數必須在前方加上$的符號。 因此: <? $num = 5; echo $num; ?> 會輸出5。 現在進入正題:要怎麼從表單取得資料。 現在先看看表單的html頁: ... <form method="post" action="process.php"> <input name="word" type="text"> </form> ... 這個表單包含了一個文字欄位,name屬性則是word。記得當時曾經提過,這個屬性在php中十 分重要。接下來我們看看process.php的原始碼: <? $word = $_POST['word']; ?> <html> <head></head> <body> <? echo "You have typed word" . $word . "in the form."; ?> </body> </html> 注意前三行,我們用變數word(也可以改名)接收了由原表單傳來的"word欄位"資料,方式 則是post。在我們接收了這筆資料並存入變數之後,這個變數就可以在程式中自由使用 了。在上面的範例,我們用echo混合變數做出輸出。 根據表單傳送方法的不同(get或post),我們在程式中接收變數的方式也不同,大概大 家也猜的出來,如果當時表單的method屬性是get,一開始的那段程式就會是: <? $word = $_GET['word']; ?> get方法跟post方法有什麼不一樣?有的時候我們可能常常看到有的網頁在網址列會長的 這個樣子: http://bbs.wefong.com/forumdisplay.php?fid=135 (這是微風的某論壇分頁) 網頁名稱是php,這表示裡面有php的程式語言。要注意的是後面的?fid=135,這代表的是 get的傳送方法,變數以get方式出現在網址列並被程式接收,所以: <? $num = $_GET['fid']; ?> 這個時候,$num的值就會是135了。 如果使用post方法,在網頁上就不會看到這些資訊,而是以幕後的方式來取得這些變數。 不過,如果網頁使用的是頁框,由於使用者不會看到頁框內連結的網頁網址,這兩種方法 是沒有差異的。 <PHP的其他架構> 如果我們把PHP跟C做比較,兩者實在是非常相似的,包括所有的操作和程式結構,規則等 ,都幾乎跟C一樣。舉例: <? if($reply=='yes') echo "your reply is yes"; elseif($reply=='no') echo "your reply is no"; for( $i=0 ; $i<10 ; $i++ ) echo $i . "<br>"; ?> 想必大家也都知道這兩段程式在做什麼了,一段是熟悉的if/else結構,另一個則是for 迴圈,用法完全相同。在之後,還會有更多像這樣完全雷同的使用狀況。 看了幾段程式,大家想必也發現PHP也有使用分號的規定,不使用也一樣會造成編譯錯誤 (在網頁被執行時會顯示,而且也會有貼心的錯誤提示)。 這裏把echo的使用概念作一解釋: echo主要是用來輸出東西到html上,使用的時候只需要在echo後方隔著一個空白然後接上 欲輸出的東西。在php中,雙引號跟單引號都代表字串,而echo後面可以直接接上字串。 要注意的是輸出變數,在輸出變數的時候不需要加上任何引號,程式會自動判斷你的變 數來輸出。不過,在字串跟變數之間,必須加入連結運算子"."。 那麼,如果我們要輸出型如 hello "everybody"!這類的文字該怎麼輸出? echo "hello "everybody"!"; 這樣的表示肯定行不通,程式只會把它看成兩個分開的字串。在這種狀況下,我們可以 把單引號跟雙引號交替的作使用。 echo 'hello "everybody"!'; 這樣就可以輸出了。 <檔案處理> PHP不一定只能把儲存的資料作輸出,也可以透過檔案將其儲存。 要寫入一個檔案,步驟跟C也完全一樣:打開檔案、寫入、關閉檔案。 要打開檔案,方式更是完全相同: <? $fin = fopen("...","w"); ?> 這個就是熟悉的fopen,關閉檔案的時候,一樣使用C中的fclose把檔案指標關掉就好。 這裡不做參數的說明。 值得注意的是其中的檔案路徑,PHP預設以$DOCUMENT_ROOT作為網頁所在資料夾路徑的 常數,所以,假設要讀入同資料夾下的file.txt我們會這樣寫: fopen("$DOCUMENT_ROOT/../file.txt","r"); ※12/30新增:根據測試,其實直接輸入檔名也是可以的。 至於寫入檔案,在PHP中我們使用的是fwrite函式,做法如下: fwrite($fin,$string); 這樣,就會把存在$string中的變數內容存到檔案了。 此外,存入的檔案內容一樣可以使用C中的一些存入法,例如: $string = $date . "\t" . $name . "\n"; 如果把上面的$string存進檔案,就可以相同的製造出tab或是換行動作。 至於讀取檔案,我們則使用fgets函式,方法則是: fgets($fin,1001); fgets函式會一次從檔案讀取到換行字元、EOF,或是讀取到後面參數所指定的位元組為 止。要注意的是,所謂讀到指定位元為止,就是指每次只會讀取參數減1的位元組。 另外介紹另一個類似的函式fgetss,它跟fgets相同,但是會忽略讀取檔案中的html標籤 ,這對防止有人在留言中放入惡意的html程式碼有很大的助益。如果要在fgetss中建立 例外,可以照這樣寫: fgetss($fin,1001,"<br>"); 這樣會代表要留下html中的<br>標籤,其他的標籤則予以刪除。 另一個很有用的讀取函式是fgetcsv,這個標籤可以把讀取的字串做分割處理,譬如: fgetcsv($fin,1001,"\t"); 這樣會代表把讀進來的字串以tab鍵為分割,分開成數個字串,再以陣列的方式回傳,至於 PHP的陣列,以後就會提到。 如果只要讀取單一字元的話,可以使用fgetc函式,用法很簡單: fgetc($fin); 這個用法的一個小缺陷是它可能會回傳不是文字的字元,譬如換行或EOF,處理時要小 心。 此外還可以一次讀取整個檔案,如果要讀取完之後直接輸出到html,我們可以使用 readfile函式,如果只是要存成變數,則使用file函式,file函式會把讀進來的檔案以行 為範圍來分割字串,並以陣列回傳。這兩個函式的用法分別如下: readfile("...filepath"); file("...filepath"); 如果只是想要單純的讀取數個位元組,則可以使用fread函式: fread($fin,1001); 當然,如果讀取的檔案小於指定的位元也會造成讀取結束。 接下來再介紹一些可能會用到的函式: feof($fin) 檔案結尾 測定目前檔案的讀取指標是否是EOF,傳回值是布林值。 file_exist(...filepath) 檔案是否存在 測定檔案是否存在,傳回值是布林值。 filesize(...filepath) 檔案大小 測定目標檔案大小,傳回值是位元組(整數)。 如果把這個函式跟fread混合使用,可以一次讀入整個檔案,配合echo之後更可以一次 輸出內容。 ex: echo nl2br(fread($fin,filesize("$DOCUMENT_ROOT/../myfile.txt"))); 其中nl2br函式會將字串中所有換行符號改以<br>輸出。 unlink(...filepath) 刪除檔案 刪除目標檔案,失敗時傳回false的布林值。 rewind($fin) 檔案指標歸0 將目前的檔案讀取指標回到起點。 flock($fin, int operation ) 鎖定檔案 因為PHP會讀取的檔案往往會頻繁讀寫,為了避免在A讀取檔案的時候B卻開始寫入檔案, 有的時候必須加上鎖定的動作。格式如上所述,後面的參數可以有這些值: LOCK_SH / 1 鎖定讀取 LOCK_EX / 2 鎖定寫入 LOCK_UN / 3 解除鎖定 LOCK_NB / 4 排除無法鎖定的狀況 要注意的是,通常如果對一個檔案進行鎖定,請記得在每個用到這個檔案的網頁都加上 鎖定函式。 PHP暫時先講到這裡,其他幾個重要的東西慢慢講XD 接下來稍微補遺幾個HTML的小知識: <色碼> 在HTML中常常頻繁的使用顏色,而RGB16進位色碼又是最常用的方式。 RGB的色碼表示很簡單,主要是由一個#號跟6個數字構成,6個數字分成三組,每組兩個, 分別代表了RGB中的三個顏色值。因為是16進位,兩個數字可以表示的狀況從0~255都行 。 RGB,分別表示的是Red Green Blue,也就是光的三原色,顏色的構成遵從物理的疊加。 因此,白色會是(255,255,255),也就是三個顏色都是最大值。這個數值把它換成色碼之 後,由於255會是FF,白色的色碼表示就是#FFFFFF。 以此類推,幾個熟悉的色碼分別如下: 紅色 (255,0,0)→#FF0000 綠色 (0,255,0)→#00FF00 藍色 (0,0,255)→#0000FF 黃色(綠+紅) (255,255,0)→#FFFF00 紫紅色(藍+紅) (255,0,255)→#FF00FF 青色(藍+綠) (0,255,255)→#00FFFF 灰色(紅藍綠等值) (170,170,170)→#AAAAAA 黑色(紅藍綠皆為0) (0,0,0)→#000000 所以,基本上只要有配色觀念,什麼顏色都可以嘗試配出來。 這個網頁有不少頁面配色建議,給大家做做參考: http://www.colorschemer.com/online.html <HTML的標籤無法使用!> 有的時候,可能會發現有些標籤讀不出來,或者是排版不如預期,這可能是正常的。 原因是因為瀏覽器不同,所以可能會有些標籤的判讀或支援不一樣。對這樣的狀況,有 幾種處理方式,一種是給他死不管了,只要顧及大部分的瀏覽器支援。另一種則是設定 兩種以上的網頁,在對方瀏覽器不支援的狀況下可以使用支援該瀏覽器的網頁。後者的 方法往往可以配合偵測瀏覽器的Javasrcipt使用。 <路徑> 在很多標籤中,往往必須連結外部檔案或是網頁,而需要用到路徑。在了解路徑前,先分 清楚何謂相對路徑,何謂絕對路徑。 先說明絕對路徑,絕對路徑是清楚的描述該檔案或網頁的完整路徑,譬如: <a href="" rel="nofollow">http://www.google.com"> <img src="c:\new\pic.jpg"> 之類的就是絕對路徑。 至於相對路徑,則是指目標"相對於"此網頁的路徑,譬如: <a href="main.htm"> <img src="..\pic.jpg"> 此即所謂相對路徑。對相對路徑來說,有幾個情況: 1.目標與網頁再同一資料夾:直接打檔名 2.目標在子資料夾: 透過資料夾往下搜尋並指定路徑 3.目標在父資料夾: ..\之後輸入路徑 什麼情況會用到這兩種不同的路徑? 試想,如果一開始在電腦寫的檔案都是以絕對路徑來命名,那麼在上線到伺服器之後, 往往會因為路徑的改變而找不到檔案,而相對路徑則不會有這種困擾。 通常,絕對路徑只建議用在連結往不同伺服器的檔案或連結用,至於自己的網站內,則 一律使用相對路徑,可以減少困擾。 <書籤、郵件連結> 在講連結的時候,曾經提過有一種連結叫頁內連結,透過書籤的方式來在頁內移動到特定 位置。這在很多網頁都會看到,尤其是大篇幅的網頁。這種方式是怎麼做的呢? 請注意<a>標籤其實也是有name屬性的,如同<a>標籤可以透過target屬性指定頁框name 值來連結,<a>標籤也可以透過其他<a>標籤的name做連結: (me.htm) ... <body> hello! My name is <a href="me.htm#birthday">joe</a>. My registration number is b95902066. My star sign is scorpio. <a name="birthday">My birthday is 10/27</a>. </body> 連結的方式就是在網頁的後方加註#符號,然後在後方指定<a>標籤的name值。 此外<a>的href屬性也可以指定郵件信箱,這樣的話這個聯結就會開啟預設的郵件軟體 了。就像這樣: <a href="mailto:joehuang90@yahoo.com.tw">寫信給我</a> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.20.41 ※ 編輯: joehuang92 來自: 59.121.20.41 (12/30 01:41) ※ 編輯: joehuang92 來自: 59.121.20.41 (12/30 09:46)

12/30 13:52, , 1F
相對路徑是 ../ 不是 ..\ 吧? :P
12/30 13:52, 1F

12/30 17:03, , 2F
對電腦內部的檔案路徑而言,是使用\而非/
12/30 17:03, 2F

12/30 17:04, , 3F
不過對上線的伺服器而言則是/
12/30 17:04, 3F

12/30 22:31, , 4F
布林值?
12/30 22:31, 4F

12/30 22:45, , 5F
TRUE或FALSE的值叫布林值
12/30 22:45, 5F
※ 編輯: joehuang92 來自: 59.121.20.41 (12/30 23:03)

12/31 00:29, , 6F
謝謝><
12/31 00:29, 6F

12/31 09:26, , 7F
喬喬大謝 >w< , 你把上次的打上來了....真辛苦...
12/31 09:26, 7F

12/31 16:16, , 8F
boolean
12/31 16:16, 8F

01/01 21:21, , 9F
大推~~不過if裡面那個不用==(2個=)嗎?
01/01 21:21, 9F

01/01 22:56, , 10F
感謝指正>"<,已經修改了
01/01 22:56, 10F
※ 編輯: joehuang92 來自: 59.121.20.41 (01/01 22:56)
文章代碼(AID): #15bHxQaZ (b95902HW)