麻辣家族討論版版's Archiver

小誌 發表於 2010-5-14 16:59

(PHP+IIS+MsSQL教學第14篇) 資料的讀取與輸出 上篇

[color=DarkOrange][size=5][b]表單資料的讀取[/b][/size][/color]
表單「Form」是資料傳遞的一個重要工具,它提供了必要的輸入介面讓使用者輸入資料,並將這些輸入的資料提交給PHP程式作後續的處理,而接收表單所傳遞的資料則必須使用「Request」物件,以簡單訪客留言為例,製作一表單,這不是真的留言版喔,我們並沒有將資料記錄到檔案或資料庫中![code]<html>
<body bgcolor="#ffffff">
<form action="go.php" method="get/post">
<table border="1">
<tr>
<td>姓名:</td>
<td><input type="text" size="15" name="name"></td>
</tr>
<tr>
<td>Email:</td>
<td><input type="text" size="30" name="email"></td>
</tr>
<tr>
<td>留言:</td>
<td><textarea name="memo" cols=30 rows=3></textarea></td>
</tr>
<tr>   
<td colspan=2><input type=submit value="傳送"></td>
</tr>
</table>
</form>
</body>   
</html>
<form> [/code][list]
[*]標籤的 action (動作)屬性值設定為『go.php』代表我們按下『傳送』按鈕後,將由伺服端的『go.php』接收由此網頁所傳出的網頁資料並加以處理。
[*]<form> 標籤的 method (傳輸方式)屬性值:設定表單資料的傳送方式。
[*]文字輸入欄位<input>:『type』屬性為輸入欄位的類型,其文字欄位設定值有三種,分別為:『Text』文字輸入欄位(只能輸入單行文字)、『Password』保密輸入欄位(單行文字輸入,輸入的文字將以星字號代替)、『Textarea』文字輸入區塊(可輸入多行文字)。
[*]文字輸入欄位<input>:『size』屬性為文字輸入欄位的寬度。
[*]文字輸入欄位<input>:『name』屬性為資料輸出的識別名稱。
[*]文字輸入欄位<input>:『cols』 屬性與『rows』屬性分別為設定『Textarea』文字輸入區塊的欄位數及行數。
[*]若將『type』 屬性值設為『submit』,則代表此一欄位為一資料傳送按鈕(Button),按下此按鈕則可將表單中的資料送出,其『value』 屬性值是用來設定按鈕的標題文字(Caption)。
[/list]
執行結果如下圖:
[attach]391[/attach]


[color=Green][size=4][b]自查詢字串取得資料[/b][/size][/color]
<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[“表單欄位名稱”]」的方式來取的參數資料:[code]<?
$name=$_GET["name"];
$email=$_GET["email"];
$memo=$_GET["memo"];
if ($name=="" || $email=="" || $memo=="")
{
  echo "姓名或email或留言,任何一欄位不可為空白,請重新輸入";
}
else
{
  $memo=nl2br($memo);
?>
<html>
<body>
<table border=1>
<tr>
<td>留言者:<?echo $name?></td><td>Email:<?echo  $email?></td>
</tr>
<tr bgcolor=#ffffcc><td colspan=2><?echo $memo?></td>
</tr>
</table>
</body>
</html>
<?
}
?>[/code]若,我們在接收資料時使用「$_GET[“表單欄位名稱”]」的方式來取得參數資料,那資料的傳遞就不一定要透過表單了,我們亦可以在瀏覽器的網址中直接輸入資料,不過,參數名稱是必須相同的,而參數資料值則可由我們隨意變換:
[attach]394[/attach]


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


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


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


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

小誌 發表於 2010-5-14 17:10

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

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


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


[color=Green][size=4][b] 讀取瀏覽器資訊[/b][/size][/color]
當使用者透過瀏覽器來索取我們的PHP程式網頁資料時,我們就可以藉著這資料請求的動作,利用環境變數來獲得使用者瀏覽器(客戶端)的相關資訊:
[list]
[*]HTTP_USER_AGENT:讀取使用者的瀏覽器名稱與版本。
[*]HTTP_ACCEPT_LANGUAGE:使用者瀏覽器所支援的語言。
[*]HTTP_ACCEPT:使用者瀏覽器所接受的MIME類型。
[/list]


[color=Magenta][b][size=4]實做學習:[/size][/b][/color][code]<html>
<head>
<title>讀取使用者端瀏覽器資訊</title>
</head>
<body>
<table border="1" width="100%">
  <tr>
    <td>名稱</td>
    <td>資料值</td>
  </tr>
  <tr>
    <td>HTTP_USER_AGENT</td>
    <td><?echo($_SERVER["HTTP_USER_AGENT"]);?></td>
  </tr>
  <tr>
    <td>HTTP_ACCEPT_LANGUAGE</td>
    <td><?echo($_SERVER["HTTP_ACCEPT_LANGUAGE"]);?></td>
  </tr>
  <tr>
    <td>HTTP_ACCEPT</td>
    <td><?echo($_SERVER["HTTP_ACCEPT"]);?></td>
  </tr>
</table>
</body>
</html>[/code][attach]398[/attach]


[color=Green][size=4][b]讀取IP位址[/b][/size][/color]
[attach]399[/attach]

在正常情況下「LOCAL_ADDR」環境變數可讀取伺服端機器的IP位址,而「REMOTE_ADDR」環境變數則可讀取客戶端的機器IP位址:[code]<html>
<head>
<title>讀取IP</title>
</head>
<body>
伺服端位址:<?echo($_SERVER["LOCAL_ADDR"]);?>
<BR>
客戶端位址:<?echo($_SERVER["REMOTE_ADDR"]);?>
</body>
</html>
[/code]如果您執行程式所見到的畫面如上圖般,代表我們是在單機中執行,所以伺服端位址與客戶端位址一樣,若您使用不同的機器為伺服端與客戶端則會兩者的IP就會不同:
[attach]400[/attach]

小誌 發表於 2010-5-14 17:24

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


而表單傳送的資料量大小則可以透過「CONTENT_LENGTH」環境變數來取得,「CONTENT_LENGTH」環境變數只有在表單資料傳送方式為「Post」時,「CONTENT_LENGTH」環境變數才能顯示正確的傳送資料量大小:
[attach]404[/attach][code]<?
$name=$_REQUEST["name"];
$email=$_REQUEST["email"];
$memo=$_REQUEST["memo"];
if ($name=="" || $email=="" || $memo=="")
{
  echo "姓名或email或留言,任何一欄位不可為空白,請重新輸入";
}
else
{
  $memo=nl2br($memo);
?>
<html>
<body>
<table border=1>
<tr>
<td>留言者:<?echo $name?></td><td>Email:<?echo  $email?></td>
</tr>
<tr bgcolor=#ffffcc><td colspan=2><?echo $memo?></td>
</tr>
<tr>
<td colspan=2>傳送方式:<?echo $_SERVER["REQUEST_METHOD"]?></td>
</tr>
<tr>
<td colspan=2>傳送資料量:<?echo $_SERVER["CONTENT_LENGTH"]?></td>
</tr>
</table>
</body>
</html>
<?
}
?>[/code]若表單資料傳送方式為「Get」則「CONTENT_LENGTH」環境變數值為0:
[attach]405[/attach]
表單資料傳送方式為「Get」時,「QUERY_STRING」環境變數可以讀取網址後方的參數資料(「?」問號之後的傳遞參數),若我要的是「?」問號之前的網頁基底呢?這個時候就可以使用「SERVER_NAME」與「PHP_SELF」環境變數。

要得知被啟動的PHP程式網頁的實際檔案路徑則可使用「PATH_TRANSLATED」環境變數;要得知PHP程式網頁是由哪一個網頁所鏈結啟動的,則可使用「HTTP_REFERER」環境變數:[code]<?
$name=$_REQUEST["name"];
$email=$_REQUEST["email"];
$memo=$_REQUEST["memo"];
if ($name=="" || $email=="" || $memo=="")
{
  echo "姓名或email或留言,任何一欄位不可為空白,請重新輸入";
}
else
{
  $memo=nl2br($memo);
?>
<html>
<body>
<table border=1>
<tr>
<td>留言者:<?echo $name?></td><td>Email:<?echo  $email?></td>
</tr>
<tr bgcolor=#ffffcc><td colspan=2><?echo $memo?></td>
</tr>
</table>
<p>
「SERVER_NAME」環境變數:
<?echo $_SERVER["SERVER_NAME"];?><BR>
「PHP_SELF」環境變數:
<?echo $_SERVER["PHP_SELF"];?><BR>
「PATH_TRANSLATED」環境變數:
<?echo $_SERVER["PATH_TRANSLATED"];?><BR>
「HTTP_REFERER」環境變數:
<?echo $_SERVER["HTTP_REFERER"];?><BR>

</body>
</html>
<?
}
?>[/code][attach]406[/attach]

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供