Board logo

標題: [教學] (PHP+IIS+MsSQL教學第15篇) 資料的讀取與輸出 中篇 [打印本頁]

作者: 小誌    時間: 2010-5-14 17:35     標題: (PHP+IIS+MsSQL教學第15篇) 資料的讀取與輸出 中篇

資料輸出
在前面章節中,要輸出資料到網頁畫面中,筆者使用了echo()函數,可是筆者又使用了很多不同的格式,您可能弄得一團霧水,所以本章節將說明一下,又,除了echo()函數可輸出資料到網頁畫面中外,還有幾個函數也有資料輸出的功能,這些函數我們也要認識一下。


echo()函數
echo()函數負責將字串資訊輸出至使用者端,也可與HTML標示混合使用,標準格式如下:
標準echo()函數格式
  1. echo ( string arg1 [, string argn...]);
複製代碼
例如:
  1. <?
  2. echo (“這是由PHP輸出的文字”);
  3. ?>
複製代碼
看到了吧!標準的echo()函數用法是將字串內容用一組括號包起來,而要輸出的字串再用一對雙引號括起來,因為echo()函數是用來輸出字串資料的。

好累喔!又是括號又是雙引號的,嫌麻煩ㄚ,那好,我們把最外面的括號拿掉,這樣也行:
  1. <?
  2. echo “這是由PHP輸出的文字”;
  3. ?>
複製代碼
可是,我有特定的變數值要跟字串一起輸出耶!沒關係!我們用「.」小黑點把它連起來,「.」小黑點前後要加空格(space)喔!您不用擔心這個空格,echo()函數在輸出資料時會忽略掉這些空格:
  1. <?
  2. $x="PHP";
  3. echo "這是由" . $x . "輸出的文字";
  4. ?>
複製代碼
您又嫌麻煩了喔!沒關係!把「.」小黑點拿掉吧!將變數跟字串全部放在雙引號中就好:
  1. <?
  2. $x="PHP";
  3. echo "這是由$x 輸出的文字";
  4. ?>
複製代碼
在上例中,變數的$字元前可以不加空格,但是變數名稱後要加個空格,不然PHP會把「$x輸出的文字」當成是一個變數,而造成程式錯誤,不過,這個空格echo()函數在輸出資料時不會忽略掉,會拔它當成是字串的內容。

那我要同時印出變數名稱跟變數值時該如何做?要印出變數名稱則必須於變數的「$」之前加上反斜線「\」,原因在於「$」為一個脫逸字元,用來識別變數:
  1. <?
  2. $x="PHP";
  3. echo " $x ";   //印出變數值”PHP”
  4. echo " \$x ";  //印出變數名稱”$x”
  5. ?>
複製代碼
若要將HTML標籤加入echo()函數的輸出資料時,因為HTML標籤的屬性設定值多會以雙引號括起來,而這個雙引號又是PHP的脫逸字元之一,所以,千萬別忘了在「”」之前加上反斜線「\」:
  1. <html>
  2. <head>
  3. <title>ex05_07</title>
  4. </head>
  5. <body>
  6. 大家來學PHP
  7. <hr>
  8. 今天是:
  9. <?echo "<font color=\"#FF0000\">" . date("Y年m月j日");?>
  10. </body>
  11. </html>
複製代碼
上例執行結果如下圖所示,我們可以很清楚的看到PHP網頁執行後的畫面,我們利用『echo()』方法輸出了一個日期資料,而這個這個日期字串我們還加上了HTML標籤「<font color="#FF0000">」來設定它的文字顏色,問題是標籤內使用了雙引號,在「”」之前加上再加上反斜線「\」。
[attach]407[/attach]

如果我喜歡將不會變動的網頁資料也利用echo()函數來編寫,可不可以呢?當然也可以!但是,這樣就變成編寫一支完整的PHP程式了,所以全部的敘述都必須放在 『<? 』與『?>』之中,同時,所有的HTML標籤都必須寫在雙引號 『 " 』之中:
  1. <?
  2. echo "<html>";
  3. echo "<head>";
  4. echo "<title>ex05_08</title>";
  5. echo "</head>";
  6. echo "<body>";
  7. echo "大家來學PHP";
  8. echo "<hr>";
  9. echo "今天是:";
  10. echo "<font color=\"#FF0000\">" . date("Y年m月j日");
  11. echo "</body>";
  12. echo "</html>";
  13. ?>
複製代碼
上兩個範例的寫法,其結果是相同的,筆者個人比較喜歡第一種HTML標籤資料混合寫的方式,至少不用打那麼多字,不過,有前輩指出,HTML標籤資料混合寫的方式在執行效率上較差,因為系統會在HTML解析與PHP Engine持續切換,如何在開發時間與系統執行效率間取捨就看您囉!



簡化echo()函數敘述
在前面幾個章節,筆者都沒有使用簡化的輸出敘述,它的用法類似ASP的「<%=XXX%>」敘述寫法,例如:
  1. <?echo date("Y年m月j日");?>
  2. <?=date("Y年m月j日")?>
複製代碼
上例的兩行程式敘述執行結果都是一樣地,後者似乎比較簡明對吧!但是,簡化的「<?=XXX?>」 敘述只能在單行敘述能用喔!在敘述區塊中是不能用的,例如下例:
  1. <?
  2. echo "大家來學PHP";
  3. echo "<hr>";
  4. ="今天是:"
  5. echo "<font color=\"#FF0000\">" . date("Y年m月j日");
  6. ?>
複製代碼
如果將「="今天是:"」這行敘述獨立用一組「<? ?>」括起來就可以了:
  1. <?
  2. echo "大家來學PHP";
  3. echo "<hr>";
  4. ?>
  5. <?="今天是:"?>
  6. <?
  7. echo "<font color=\"#FF0000\">" . date("Y年m月j日");
  8. ?>
複製代碼
哈!這樣好像有點畫蛇添足!筆者建議:在程式區塊中作輸出就使用完整的echo()函數敘述,若是在與HTML標籤資料混合的場合才使用「<?=XXX?>」的敘述寫法。
作者: 小誌    時間: 2010-5-14 17:39

print() 函數
print():也是用來輸出資料的,用法也如同echo()一般:
  1. <?
  2. print "大家來學PHP";
  3. print "<hr>";
  4. ?>
  5. <?="今天是:"?>
  6. <?
  7. print "<font color=\"#FF0000\">" . date("Y年m月j日");
  8. ?>
複製代碼
print()雖然可以將資料輸出到網頁畫面中,但echo()可以利用「,」逗號來合併列印多項資料,print()卻做不到:
  1. <?
  2. $x="我愛";
  3. $y="PHP";
  4. echo $x . $y; //印出'我愛php'
  5. echo $x,"PHP"; //印出'我愛php'
  6. print $x . $y; //印出'我愛php'
  7. print $x,$y;  //錯誤,print()不認識','逗號
  8. ?>
複製代碼
以上例來看,print()似乎不如echo()有用,事實不然,print()有它特別的作用,echo()只管將資料做輸出的動作,資料有沒有正確的輸出,echo()並不會告訴您,而print()在做資料輸出的動作後,會有回傳值,通知我們資料是否已正確的輸出:
  1. <?
  2. $x="我愛";
  3. $y="PHP";
  4. $test=print $x . $y; //印出'我愛php'
  5. print $test; //資料輸出成功回傳1
  6. ?>
複製代碼
printf()函數
printf()函數可根據我們的格式設定來輸出格式化的字串,printf()函數跟print()函數不同,資料輸出後不會有回傳值:
printf()函數格式
  1. void printf ( string format [, mixed args])
複製代碼
上式中:「format」為格式設定,例如:
  1. <?
  2. $age="20 歲";
  3. printf("%d" ,"$age"); //輸出20
  4. ?>
複製代碼
上例中,我們的格式設定為「%d」乃是將字串「"20 歲"」格式化為十進制資料而輸出「20」。
例如:輸出小數點後3位小數的浮點指數
  1. <?
  2. $age="20 歲";
  3. printf("%.3e" ,"$age"); //輸出2.00e+1
  4. ?>
複製代碼
格式化的字串中也可以包含我們要顯示的文字,例如:
  1. <?
  2. $age="20 歲";
  3. printf("我%.3e歲" ,"$age"); //我2.00e+1歲  
  4. ?>
複製代碼
下表為格式化的可用資料類型:

類型

說明

%

格式化的前置符號

c

字元

s

字串

d

十進制整數

b

二進制整數

o

八二進制整數

x

小寫的十六進制整數

X

大寫的十六進制整數

f

浮點數

e

指數


printf()函數亦可用於置換同時格式化,例如:
  1. <?
  2. $name="居易";
  3. $tall="170";
  4. $me="我的名字是 %s ,身高 %X 公分";
  5. printf($me , $name , $tall);
  6. //輸出:我的名字是 居易,身高 AA 公分  
  7. ?>
複製代碼

作者: 小誌    時間: 2010-5-14 17:44

檔頭資訊
檔頭資訊:網頁文件中被<HEAD>…</HEAD>標籤包括起來的文件資訊,常見的有文件抬頭(被<TITLE>…</TITLE>標籤包括起來)以及文件的類型、所使用的編碼字集等:
  1. <html>
  2. <head>
  3. <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
  4. <meta name="ProgId" content="FrontPage.Editor.Document">
  5. <meta http-equiv="Content-Type" content="text/html; charset=big5">
  6. <title>新增網頁1</title>
  7. </head>
  8. <body>
  9. 網頁的顯示內容
  10. </body>
  11. </html>
複製代碼
這些檔頭資訊我們都可以透過PHP的「header()」函數來做輸出:
header()函數格式
  1. int header ( string string [, bool replace [, int http_response_code]])
複製代碼
也就是:
  1. header(“網頁資訊名稱: 資訊內容”);
複製代碼
網頁轉向
網頁資訊「Location」可轉向其他網頁或網址,這個方法也就所謂的『自動鏈結』:
  1. header(“Locatiom: 欲前往的網址”);
複製代碼
例如:
  1. <?
  2. //載入網頁後,自動轉接鍊結至與主網頁同一目錄中的message.htm網頁
  3. header("Location: message.htm");
  4. //載入主網頁後,自動轉接鍊結至主網頁上一層目錄中的ex04_01.asp網頁
  5. header("Location: ../ch4/ex04_01.php");
  6. //載入主網頁後,自動轉接鍊結至與另一網址中的網頁
  7. header("Location: http://www.twbts.com");
  8. ?>
複製代碼
header()函數只可用在尚未有任何資料輸出至瀏覽器之前才可呼叫。尚未有任何資料輸出至瀏覽器之前才可呼叫?這是什麼意思?就是在程式開端符號『<?』之前都不能有任何資料啦!如下例:
  1. <html><body>
  2. <%
  3. Response.Redirect "message.htm"
  4. %>
  5. </body>
  6. </html>
複製代碼
上例結果將會獲得下圖的錯誤訊息:
[attach]409[/attach]


網頁的時效
網頁資訊「Expires」可用來設定網頁的有效期限,當我們網頁會常常更新,擔心瀏覽者會讀到Proxy或cache的舊網頁資料時,我們就可以設定「Expires」:
  1. <?
  2. header("Expires: " . date("D, d M Y H:i:s") . "GMT");
  3. ?>
  4. <html><body>
  5. 歡迎光臨!!
  6. </body>
  7. </html>
複製代碼
當我們檢視瀏覽器的暫存目錄時,您可以發現範例網頁已被設定了有效期限:
[attach]410[/attach]




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)