PHP小教學(基本概念、檔案存取)、HTML補遺
接下來的一系列會稍微把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
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
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
12/31 09:26, 7F
推
12/31 16:16, , 8F
12/31 16:16, 8F
推
01/01 21:21, , 9F
01/01 21:21, 9F
→
01/01 22:56, , 10F
01/01 22:56, 10F
※ 編輯: joehuang92 來自: 59.121.20.41 (01/01 22:56)