Board logo

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

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

表單資料的讀取
表單「Form」是資料傳遞的一個重要工具,它提供了必要的輸入介面讓使用者輸入資料,並將這些輸入的資料提交給PHP程式作後續的處理,而接收表單所傳遞的資料則必須使用「Request」物件,以簡單訪客留言為例,製作一表單,這不是真的留言版喔,我們並沒有將資料記錄到檔案或資料庫中!
  1. <html>
  2. <body bgcolor="#ffffff">
  3. <form action="go.php" method="get/post">
  4. <table border="1">
  5. <tr>
  6. <td>姓名:</td>
  7. <td><input type="text" size="15" name="name"></td>
  8. </tr>
  9. <tr>
  10. <td>Email:</td>
  11. <td><input type="text" size="30" name="email"></td>
  12. </tr>
  13. <tr>
  14. <td>留言:</td>
  15. <td><textarea name="memo" cols=30 rows=3></textarea></td>
  16. </tr>
  17. <tr>   
  18. <td colspan=2><input type=submit value="傳送"></td>
  19. </tr>
  20. </table>
  21. </form>
  22. </body>   
  23. </html>
  24. <form>
複製代碼

執行結果如下圖:
[attach]391[/attach]


自查詢字串取得資料
<form> 標籤的 method (傳輸方式)屬性值若為「Get」,則代表我們按下『傳送』按鈕後,瀏覽器將會立即主動的將資料傳給伺服器,使用這種方式並不太好!因為當我們按下『傳送』按鈕後,表單中的資料將會附在網址之後傳送到伺服器:
[attach]392[/attach]

上圖中,在「http://localhost/php/ch5/go.php」網址後端所串接的資料『?name=xxx&email=xxx&memo=xxxxx』,就是表單以「Get」方式所傳遞的欄位資料,在「?」之後的才是表單內的資料,「?」是網址與表單之間的區隔符號,在「=」左邊的是表單欄位名稱(資料輸出的識別名稱,參數名稱),在「=」右方就是「資料值(參數的資料值)」,表單欄位名稱是PHP程式讀取資料的識別依據,若有多項參數資料自表單中傳出,則各個參數資料間會以「&」符號區隔:
[attach]393[/attach]

若是表單以「Get」方式傳遞欄位資料,則我們在接收資料時便得使用「$_GET[“表單欄位名稱”]」的方式來取的參數資料:
  1. <?
  2. $name=$_GET["name"];
  3. $email=$_GET["email"];
  4. $memo=$_GET["memo"];
  5. if ($name=="" || $email=="" || $memo=="")
  6. {
  7.   echo "姓名或email或留言,任何一欄位不可為空白,請重新輸入";
  8. }
  9. else
  10. {
  11.   $memo=nl2br($memo);
  12. ?>
  13. <html>
  14. <body>
  15. <table border=1>
  16. <tr>
  17. <td>留言者:<?echo $name?></td><td>Email:<?echo  $email?></td>
  18. </tr>
  19. <tr bgcolor=#ffffcc><td colspan=2><?echo $memo?></td>
  20. </tr>
  21. </table>
  22. </body>
  23. </html>
  24. <?
  25. }
  26. ?>
複製代碼
若,我們在接收資料時使用「$_GET[“表單欄位名稱”]」的方式來取得參數資料,那資料的傳遞就不一定要透過表單了,我們亦可以在瀏覽器的網址中直接輸入資料,不過,參數名稱是必須相同的,而參數資料值則可由我們隨意變換:
[attach]394[/attach]


自表單取得資料
<form> 標籤的 method (傳輸方式)屬性值若為「Post」:『post』代表我們按下『傳送』按鈕後,瀏覽器將不會立即主動的將資料傳給伺服器,而會等候伺服端來讀取資料並加以處理,也就是當我們按下『傳送』按鈕後,表單中的資料不會附在網址之後:
[attach]395[/attach]


若是表單以「Post」方式傳遞欄位資料,則我們在接收資料時就必須改用「$_POST[“表單欄位名稱”]」的方式來取得參數資料:
  1. <?
  2. $name=$_POST["name"];
  3. $email=$_POST["email"];
  4. $memo=$_POST["memo"];
  5. if ($name=="" || $email=="" || $memo=="")
  6. //….略
  7. ?>
複製代碼
若,我們在接收資料時使用「$_POST[“表單欄位名稱”」的方式來取得參數資料,那資料的傳遞就一定要透過表單了,我們不可以在瀏覽器的網址中直接輸入資料,不然接收資料的PHP程式網頁是不會顯示任何參數資料的:
[attach]396[/attach]


提示!! 使用「Get」方式傳遞表單資料時,當我們按下傳送按鈕後,資料會立刻送出給伺服器,執行效能較高,但資料傳送量較小,最多只能傳送2K左右的資料;使用「Get」方式傳遞表單資料時,我們按下傳送按鈕後,資料不會立刻送出給伺服器,而是等待伺服器前來讀取,所以執行效能較低,但資料傳送量較大,傳送的資料不受限制。


如果表單的資料傳遞方式「Post」,而我又希望可以在瀏覽器的網址中直接輸入資料,那我們就可以直接使用「$_REQUEST[“參數名稱”」來接收資料,此時,分辨資料是來自QueryString或Form的任務就交給PHP Engine來處理,不過這樣會比較消耗系統資源喔!
  1. <?
  2. $name=$_REQUEST["name"];
  3. $email=$_REQUEST["email"];
  4. $memo=$_REQUEST["memo"];
  5. if ($name=="" || $email=="" || $memo=="")
  6. //….略
  7. ?>
複製代碼
提示!! 「$_REQUEST」、「$_GET」、「$_POST」皆為陣列變數,而且都是字串註標索引的陣列。
作者: 小誌    時間: 2010-5-14 17:10

讀取環境變數
讀取資料,不單是表單傳遞的資料,通常包含了使用者端(客戶端)的相關訊息,如瀏覽器的種類、表頭資訊及 Cookies....等,當然也包括伺服端的資訊喔!

想知道PHP中含有哪些環境變數嗎?很容易!只要使用「phpinfo()」函數即可:
  1. <? phpinfo(); ?>
複製代碼
環境境變數相當的多,下圖即為PHP環境變數列表。
[attach]397[/attach]


要讀取相關的環境變數資料,直接將變數值取出即可,格式如下:
  1. $Ans= $_SERVER["環境變數名"];
複製代碼
環境境變數相當的多,小誌僅就常用的加以介紹。


讀取瀏覽器資訊
當使用者透過瀏覽器來索取我們的PHP程式網頁資料時,我們就可以藉著這資料請求的動作,利用環境變數來獲得使用者瀏覽器(客戶端)的相關資訊:



實做學習:
  1. <html>
  2. <head>
  3. <title>讀取使用者端瀏覽器資訊</title>
  4. </head>
  5. <body>
  6. <table border="1" width="100%">
  7.   <tr>
  8.     <td>名稱</td>
  9.     <td>資料值</td>
  10.   </tr>
  11.   <tr>
  12.     <td>HTTP_USER_AGENT</td>
  13.     <td><?echo($_SERVER["HTTP_USER_AGENT"]);?></td>
  14.   </tr>
  15.   <tr>
  16.     <td>HTTP_ACCEPT_LANGUAGE</td>
  17.     <td><?echo($_SERVER["HTTP_ACCEPT_LANGUAGE"]);?></td>
  18.   </tr>
  19.   <tr>
  20.     <td>HTTP_ACCEPT</td>
  21.     <td><?echo($_SERVER["HTTP_ACCEPT"]);?></td>
  22.   </tr>
  23. </table>
  24. </body>
  25. </html>
複製代碼
[attach]398[/attach]


讀取IP位址
[attach]399[/attach]

在正常情況下「LOCAL_ADDR」環境變數可讀取伺服端機器的IP位址,而「REMOTE_ADDR」環境變數則可讀取客戶端的機器IP位址:
  1. <html>
  2. <head>
  3. <title>讀取IP</title>
  4. </head>
  5. <body>
  6. 伺服端位址:<?echo($_SERVER["LOCAL_ADDR"]);?>
  7. <BR>
  8. 客戶端位址:<?echo($_SERVER["REMOTE_ADDR"]);?>
  9. </body>
  10. </html>
複製代碼
如果您執行程式所見到的畫面如上圖般,代表我們是在單機中執行,所以伺服端位址與客戶端位址一樣,若您使用不同的機器為伺服端與客戶端則會兩者的IP就會不同:
[attach]400[/attach]
作者: 小誌    時間: 2010-5-14 17:24

表單與網址資訊
表單所傳送的資料可以透過「$_REQUEST[“參數名稱”」環境變數來讀取,至於資料的傳遞方式則可使用「$_SERVER["REQUEST_METHOD"]」環境變數來讀取:
  1. <?
  2. $name=$_REQUEST["name"];
  3. $email=$_REQUEST["email"];
  4. $memo=$_REQUEST["memo"];
  5. if ($name=="" || $email=="" || $memo=="")
  6. {
  7.   echo "姓名或email或留言,任何一欄位不可為空白,請重新輸入";
  8. }
  9. else
  10. {
  11.   $memo=nl2br($memo);
  12. ?>
  13. <html>
  14. <body>
  15. <table border=1>
  16. <tr>
  17. <td>留言者:<?echo $name?></td><td>Email:<?echo  $email?></td>
  18. </tr>
  19. <tr bgcolor=#ffffcc><td colspan=2><?echo $memo?></td>
  20. </tr>
  21. <tr>
  22. <td colspan=2>傳送方式:<?echo $_SERVER["REQUEST_METHOD"]?></td>
  23. </tr>
  24. <tr>
  25. <td colspan=2>傳送資料:<?echo $_SERVER["QUERY_STRING"]?></td>
  26. </tr>
  27. </table>
  28. </body>
  29. </html>
  30. <?
  31. }
  32. ?>
複製代碼
請注意:只有在表單傳送方式為「Get」時,「QUERY_STRING」環境變數才有資料值!
[attach]403[/attach]
提示!! 在上圖中您是否發現「QUERY_STRING」環境變數的資料值並非我們所輸入的文字?而是:
「name=%B7%A4p%BBx&email=Charles....」,參數名稱沒錯,但是參數值的部分只要是中文的內容卻都不一樣了,這是因為中文的部分在資料傳送過程中經過轉譯之故,不過這並不影響程式的正確性。


而表單傳送的資料量大小則可以透過「CONTENT_LENGTH」環境變數來取得,「CONTENT_LENGTH」環境變數只有在表單資料傳送方式為「Post」時,「CONTENT_LENGTH」環境變數才能顯示正確的傳送資料量大小:
[attach]404[/attach]
  1. <?
  2. $name=$_REQUEST["name"];
  3. $email=$_REQUEST["email"];
  4. $memo=$_REQUEST["memo"];
  5. if ($name=="" || $email=="" || $memo=="")
  6. {
  7.   echo "姓名或email或留言,任何一欄位不可為空白,請重新輸入";
  8. }
  9. else
  10. {
  11.   $memo=nl2br($memo);
  12. ?>
  13. <html>
  14. <body>
  15. <table border=1>
  16. <tr>
  17. <td>留言者:<?echo $name?></td><td>Email:<?echo  $email?></td>
  18. </tr>
  19. <tr bgcolor=#ffffcc><td colspan=2><?echo $memo?></td>
  20. </tr>
  21. <tr>
  22. <td colspan=2>傳送方式:<?echo $_SERVER["REQUEST_METHOD"]?></td>
  23. </tr>
  24. <tr>
  25. <td colspan=2>傳送資料量:<?echo $_SERVER["CONTENT_LENGTH"]?></td>
  26. </tr>
  27. </table>
  28. </body>
  29. </html>
  30. <?
  31. }
  32. ?>
複製代碼
若表單資料傳送方式為「Get」則「CONTENT_LENGTH」環境變數值為0:
[attach]405[/attach]
表單資料傳送方式為「Get」時,「QUERY_STRING」環境變數可以讀取網址後方的參數資料(「?」問號之後的傳遞參數),若我要的是「?」問號之前的網頁基底呢?這個時候就可以使用「SERVER_NAME」與「PHP_SELF」環境變數。

要得知被啟動的PHP程式網頁的實際檔案路徑則可使用「PATH_TRANSLATED」環境變數;要得知PHP程式網頁是由哪一個網頁所鏈結啟動的,則可使用「HTTP_REFERER」環境變數:
  1. <?
  2. $name=$_REQUEST["name"];
  3. $email=$_REQUEST["email"];
  4. $memo=$_REQUEST["memo"];
  5. if ($name=="" || $email=="" || $memo=="")
  6. {
  7.   echo "姓名或email或留言,任何一欄位不可為空白,請重新輸入";
  8. }
  9. else
  10. {
  11.   $memo=nl2br($memo);
  12. ?>
  13. <html>
  14. <body>
  15. <table border=1>
  16. <tr>
  17. <td>留言者:<?echo $name?></td><td>Email:<?echo  $email?></td>
  18. </tr>
  19. <tr bgcolor=#ffffcc><td colspan=2><?echo $memo?></td>
  20. </tr>
  21. </table>
  22. <p>
  23. 「SERVER_NAME」環境變數:
  24. <?echo $_SERVER["SERVER_NAME"];?><BR>
  25. 「PHP_SELF」環境變數:
  26. <?echo $_SERVER["PHP_SELF"];?><BR>
  27. 「PATH_TRANSLATED」環境變數:
  28. <?echo $_SERVER["PATH_TRANSLATED"];?><BR>
  29. 「HTTP_REFERER」環境變數:
  30. <?echo $_SERVER["HTTP_REFERER"];?><BR>

  31. </body>
  32. </html>
  33. <?
  34. }
  35. ?>
複製代碼
[attach]406[/attach]




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