Board logo

標題: [教學] (PHP+IIS+MsSQL教學第34篇) 實戰應用_Email問卷 [打印本頁]

作者: 小誌    時間: 2010-5-18 00:10     標題: (PHP+IIS+MsSQL教學第34篇) 實戰應用_Email問卷

本範例程式的流程很簡單,共分為三個部分,in.php(問卷填寫)、sentmsg.php(傳送問卷結果)、SQL資料庫(問卷題目資料庫),如下圖所示:
[attach]611[/attach]

in.php程式網頁
 當連結進入in.php程式網頁後,網頁中將會顯示問卷的題目與意見選擇或意見填寫的欄位,如下圖所示:
[attach]606[/attach]

除了列出問卷的題目與意見選擇或意見填寫的欄位,我們還增加了一個姓名欄位(這樣您才知道這份問卷是誰填寫的),還有一個填寫E-mail的欄位(這就是寄件人(From)屬性值),而所列出的問卷題目及意見選項則是讀取自QUESTION資料庫的Question資料表。

sentmsg.php程式
 在in.php程式網頁中按下『送出問卷』按鈕後,表單中的資料就會送交sentmsg.php程式處理,sentmsg.php程式將會把問卷填寫結果與填寫者的資料,以E-Mail自動傳送的方式寄送至管理者或是問卷調查主持人的手中。


資料庫結構
本範例中的SQL資料庫QUESTION中只有一個資料表question,用來存放我們的問卷題目及被選答案(題型為選擇題才用的到),其欄位結構如下圖:
[attach]607[/attach]

本範例資料庫名稱為「QUESTION」,在範例壓縮檔\DataBase目錄中有一個SQL資料庫「QUESTION」,主資料檔QUESTION.mdf、記錄檔QUESTION.ldf,請您將檔案複製到您的硬碟裡並附加到SQL Server中,本範例所使用的資料表放置其中,您可直接加以利用。



本實戰應用_Email問卷的完整程式內容與資料庫下載:[attach]612[/attach]
作者: 小誌    時間: 2010-5-18 00:20

問卷程式網頁
首先在問卷程式網頁中設定一個姓名的單行文字欄位,及一個填寫E-mail的單行文字欄位;姓名的單行文字欄位Name屬性就設定為name,而填寫E-mail的單行文字欄位Name屬性則設定為email:
姓名
  1. <INPUT Type=Text Name=Name size="20">
  2. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E-Mail
  3. <INPUT Type=Text Name=email size="20">
複製代碼
在問卷程式網頁中最麻煩的部分就是如何把我們資料庫中的題目給讀取並顯示出來,因為在我們問卷表單的設計上為了配合題型的不同而分為單行文字方塊(Text)與單選按鈕(Radio),如果問卷題型為選擇題的話,我們必須列出備選的答案,而問卷題型若是問答題的話則必須有文字欄位供問卷填寫者填寫意見:
[attach]609[/attach]

因此,我們必須先判斷我們問卷題目的題型,如果是選擇題的話,則三個答案選項的Name屬性都必須相同,而選項的屬性值(Value)則必須隨備選答案的不同而變更;若是問答題就比較好處理只要設定文字欄位的Name屬性就可以了。

在各個題目答案的命名,我們都採用『No』加上『$fielddatas["題號"]』來命名,例如:問卷第一題,雖然有三個備選答案選項,但是它們的Name屬性都是『No1』:而備選答案選項的值則依我們資料庫中『選項』欄位的的值而變動!!
[attach]610[/attach]

所以當程式網頁執行後,我們檢視網頁的原始碼將如下所示:
  1. <B>1.請問您贊成自由從網路上下載MP3音樂嗎?
  2. </B><BR>
  3. <INPUT Type=Radio Name=No1 Value=贊成>
  4. 贊成<BR>
  5. <INPUT Type=Radio Name=No1 Value=反對>
  6. 反對<BR>
  7. <INPUT Type=Radio Name=No1 Value=沒意見>
  8. 沒意見<BR>
複製代碼
在本範例中設定了兩種題型:選擇題與問答題,因此,我們必須根據資料錄的題型欄位來決定我們問題的顯示方式:
  1. <?
  2. while (($fielddatas=mssql_fetch_array($datalist)))
  3. {
  4. ?>
  5. <B><?=$fielddatas["題號"];?>.<?=htmlspecialchars($fielddatas["題目"]);?>
  6. </B><BR>
  7. <?
  8. if ($fielddatas["題型"]=="選擇")
  9. {
  10. for ($I=1;$I<=3;$I++)
  11. {
  12. ?>
  13. <INPUT Type=Radio Name=No<?=$fielddatas["題號"];?>
  14. Value=<?=$fielddatas["選項" . $I] ;?>>
  15. <?=htmlspecialchars($fielddatas["選項" . $I]);?><BR>
  16. <?
  17. }
  18. }
  19. else
  20. {
  21. ?>
  22. <INPUT Type=Text Name=No<?=$fielddatas["題號"];?> size="20"><BR>
  23. <?
  24. }
  25. }
  26. ?>
複製代碼



提示!!
Htmlspecialchars()函數為HTML編碼敘述,如果在資料欄位中含有Html標籤敘述,則這個標籤敘述將不會被瀏覽器解譯出來,而當成是一般的文字顯示出來(如果題目本身就有HTML標籤為其題目內容),這只是一個預防措施。

in.php
  1. <?
  2. //連結SQL Server
  3.     $conn = mssql_connect("127.0.0.1", "sa", "12345");
  4. //選擇資料庫
  5.     mssql_select_db("QUESTION", $conn);  
  6. //建立查詢字串
  7. $SQL="Select * From question Order By 題號";
  8. //將回傳結果存放於變數中
  9. $datalist=mssql_query($SQL);
  10. ?>

  11. <HTML>
  12. <H2 align="center"><font size="2">
  13. <img border="0"src="asktitle.gif"></font></h2>
  14. <FORM Action=sentmsg.php Method=post>
  15. <fontsize="2">
  16. 姓名
  17. <INPUT Type=Text Name=Name size="20">
  18. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E-Mail
  19. <INPUT Type=Text Name=Email size="20">
  20. </font>
  21. <HR size="1" color="#0000FF">
  22. <font size="2">
  23. <?
  24. while (($fielddatas=mssql_fetch_array($datalist)))
  25. {
  26. ?>
  27. <B><?=$fielddatas["題號"];?>.<?=htmlspecialchars($fielddatas["題目"]);?>
  28. </B><BR>
  29. <?
  30. if ($fielddatas["題型"]=="選擇")
  31. {
  32. for ($I=1;$I<=3;$I++)
  33. {
  34. ?>
  35. <INPUT Type=Radio Name=No<?=$fielddatas["題號"];?>
  36. Value=<?=$fielddatas["選項" . $I] ;?>>
  37. <?=htmlspecialchars($fielddatas["選項" . $I]);?><BR>
  38. <?
  39. }
  40. }
  41. else
  42. {
  43. ?>
  44. <INPUT Type=Text Name=No<?=$fielddatas["題號"];?> size="20"><BR>
  45. <?
  46. }
  47. }
  48. ?>
  49. <INPUT Type=Submit Value="送出問卷">
  50. </font></FORM></HTML>
複製代碼

作者: 小誌    時間: 2010-5-18 00:23

自動送信程式
當問卷填寫者在in.php程式網頁中按下『送出問卷』按鈕後,表單中的資料就會送交自動送信程式sentmsg.php處理,sentmsg.php程式將會把問卷填寫結果與填寫者的資料以E-Mail自動傳送的方式寄送至管理者或是問卷調查主持人的手中。

在信件傳送之前,我們必須先設定mail()函數的收件人(To)、寄件人(From)、信件主旨(Subject)與信件內容(Body)等四項屬性,信件主旨我們可以自行設定為固定文字,收件者則為管理者或是問卷調查主持人的E-Mail帳號(這也是固定的),信件傳送的寄件者與信件內容(問卷結果)則是隨著問卷填寫者所填寫的內容而變動。
  1. //建立郵件基本項目       
  2.     //以問卷程式網頁中所填寫的E-mail為寄件者
  3.     $From= "From: " . $_REQUEST["Email"];
  4.     //收件者為管理員或問卷調查主持人的E-Mail
  5.     $To= $_REQUEST["Email"];
  6.     //信件主題,通常為問卷的主題
  7.     $Subject="網路問卷調查";
  8.     //信件內容
  9.     $Body = "網友" . $_REQUEST["Name"] . "問卷意見:" . "\r\n"; //以下略….
複製代碼
請觀察上列這段程式敘述,您可以清楚的看到我們From(寄件者郵件信箱)屬性值是設定為:問卷填寫者在in.php程式網頁中Email欄位中所填寫的郵件信箱,這麼做最主要的目的是為了讓管理者或是問卷調查主持人能夠即時的以E-Mail方式回應問卷填寫者所提出的意見。


      提示!!本範例中From(寄件者郵件信箱)與To(收件者郵件信箱)屬性值設定是相同的,也就是自己寄信給自己,在實際應用時請自行更改To(收件者郵件信箱)屬性值設定。

在信件內容的部分,除了要有問卷填寫者所選擇的答案與意見外,本範例中還加上相對應的問卷題目本文,如果不加上原始題目的內容,我們怎能知道答案的意義?
  1. //列出問卷題目及問卷填寫者的答案
  2.      $I=1;
  3.     while (($fielddatas=mssql_fetch_array($datalist)))
  4.     {
  5.      //列出問卷題目
  6.      $Body = $Body . $I . ". " . $fielddatas["題目"] . "\r\n";
  7.      //取得相對應於題目的問卷答案
  8.      $Ans=$_REQUEST["No" . $fielddatas["題號"]];
  9.      //列出答案
  10.      $Body = $Body . $Ans . "\r\n";
  11.      $I++;
  12.     }
  13.    
  14. // 寄出信件
  15.     mail($To ,$Subject ,$Body ,$From);
複製代碼


提示!!
程式碼中的「\r\n」為一換行符號,其作用就是將我們的信件內容分段顯示!若未加上此換行符號,則我們的信件內容將會全部串接成一個段落。

sentmsg.php
  1. <?
  2. //連結SQL Server
  3.     $conn = mssql_connect("127.0.0.1", "sa", "12345");
  4. //選擇資料庫
  5.     mssql_select_db("QUESTION", $conn);  
  6. //建立查詢字串
  7. $SQL="Select * From question Order By 題號";
  8. //將回傳結果存放於變數中
  9. $datalist=mssql_query($SQL);
  10.                         
  11. //建立郵件基本項目       
  12.     //以問卷程式網頁中所填寫的E-mail為寄件者
  13.     $From= "From: " . $_REQUEST["Email"];
  14.     //收件者為管理員或問卷調查主持人的E-Mail
  15.     $To= $_REQUEST["Email"];
  16.     //信件主題,通常為問卷的主題
  17.     $Subject="網路問卷調查";
  18.     //信件內容
  19.     $Body = "網友" . $_REQUEST["Name"] . "問卷意見:" . "\r\n";
  20.    
  21. //列出問卷題目及問卷填寫者的答案
  22.      $I=1;
  23.     while (($fielddatas=mssql_fetch_array($datalist)))
  24.     {
  25.      //列出問卷題目
  26.      $Body = $Body . $I . ". " . $fielddatas["題目"] . "\r\n";
  27.      //取得相對應於題目的問卷答案
  28.      $Ans=$_REQUEST["No" . $fielddatas["題號"]];
  29.      //列出答案
  30.      $Body = $Body . $Ans . "\r\n";
  31.      $I++;
  32.     }
  33.    
  34. // 寄出信件
  35.     mail($To ,$Subject ,$Body ,$From);
  36. ?>
  37. <html>
  38. <head>
  39. <meta http-equiv="Content-Type" content="text/html; chaRSet=big5">
  40. <title>感謝您的意見!!</title>
  41. </head>
  42. <body>
  43. 感謝您的意見
  44. </body>
  45. </html>
複製代碼

作者: 小誌    時間: 2010-5-18 00:27

使用CDONTS物件寄送問卷結果
為了不顧此薄彼,小誌也寫了利用CDONTS_NewMail物件寄送問卷結果的範例程式:「sentmsg_cdonts.php」,程式設計原理與sentmsg.php相同,因此就不多言了,此範例程式請配合「in_cdonts.php」使用。
  1. <?
  2. //連結SQL Server
  3.     $conn = mssql_connect("127.0.0.1", "sa", "12345");
  4. //選擇資料庫
  5.     mssql_select_db("QUESTION", $conn);  
  6. //建立查詢字串
  7. $SQL="Select * From question Order By 題號";
  8. //將回傳結果存放於變數中
  9. $datalist=mssql_query($SQL);

  10. //建立信件傳送物件
  11. $CDONTS = new COM("CDONTS.NewMail");

  12. //建立郵件基本項目       
  13.     //以問卷程式網頁中所填寫的E-mail為寄件者
  14.     $CDONTS->From=$_REQUEST["Email"];
  15.     //收件者為管理員或問卷調查主持人的E-Mail
  16.     $CDONTS->To= $_REQUEST["Email"];
  17.     //信件主題,通常為問卷的主題
  18.     $CDONTS->Subject="網路問卷調查";
  19.     //信件內容
  20.     $Body = "網友" . $_REQUEST["Name"] . "問卷意見:";
  21.    
  22. //列出問卷題目及問卷填寫者的答案
  23.      $I=1;
  24.     while (($fielddatas=mssql_fetch_array($datalist)))
  25.     {
  26.      //列出問卷題目
  27.      $Body =$Body . "\r\n" . $I . ". " . $fielddatas["題目"] . "\r\n";
  28.      //取得相對應於題目的問卷答案
  29.      $Ans=$_REQUEST["No" . $fielddatas["題號"]];
  30.      //列出答案
  31.      $Body = $Body . $Ans ;
  32.      $I++;
  33.     }

  34.     $CDONTS->Body=$Body;
  35. // 寄出信件
  36.     $CDONTS->Send();
  37. ?>
  38. <html>
  39. <head>
  40. <meta http-equiv="Content-Type" content="text/html; chaRSet=big5">
  41. <title>感謝您的意見!!</title>
  42. </head>
  43. <body>
  44. 感謝您的意見
  45. </body>
  46. </html>
複製代碼

作者: unitytap    時間: 2015-11-5 00:26

回復 1# 小誌


    我因報告需求,想得到此Email的整個檔案,但因權限不足無法下載,可以請大大跟改一下權限,讓小學生也能下載。謝謝
作者: unitytap    時間: 2015-11-6 22:02

回復 5# unitytap


可以回復我一下嗎?
作者: ILovePanda    時間: 2016-2-26 14:44

回復  小誌


    我因報告需求,想得到此Email的整個檔案,但因權限不足無法下載,可以請大大跟改一下 ...
unitytap 發表於 2015-11-5 00:26



 為什麼要因你的報告需求而更改權限呢? 沒爬文唷,此舉就如小白一樣喔。




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