麻辣家族討論版版's Archiver

小誌 發表於 2010-5-18 00:10

(PHP+IIS+MsSQL教學第34篇) 實戰應用_Email問卷

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

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

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

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


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

本範例資料庫名稱為「QUESTION」,在範例壓縮檔\DataBase目錄中有一個SQL資料庫「QUESTION」,主資料檔QUESTION.mdf、記錄檔QUESTION.ldf,請您將檔案複製到您的硬碟裡並附加到SQL Server中,本範例所使用的資料表放置其中,您可直接加以利用。
[list=1]
[*]本範例程式可使用之問卷題目類型只有選擇題與問答題兩種,利用時請直接於資料庫『題型』欄位中指定即可。
[attach]608[/attach]
[*]問卷題目可無限增加,若你要增加問卷的題目,直接於資料庫資料表中新增資料即可。
[*]選項欄位也就是選擇題的備選答案,預設為三個被選項目,若欲增減項目請記得同時更改問卷程式網頁in.php與自動送信程式sentmsg.php中For迴圈敘述的終止值。
[/list]


[color=RoyalBlue][size=4][font=微軟雅黑][b]本實戰應用_Email問卷的完整程式內容與資料庫下載:[/b][/font][/size][/color][attach]612[/attach]

小誌 發表於 2010-5-18 00:20

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

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

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

所以當程式網頁執行後,我們檢視網頁的原始碼將如下所示:[code]<B>1.請問您贊成自由從網路上下載MP3音樂嗎?
</B><BR>
<INPUT Type=Radio Name=No1 Value=贊成>
贊成<BR>
<INPUT Type=Radio Name=No1 Value=反對>
反對<BR>
<INPUT Type=Radio Name=No1 Value=沒意見>
沒意見<BR>[/code]在本範例中設定了兩種題型:選擇題與問答題,因此,我們必須根據資料錄的題型欄位來決定我們問題的顯示方式:[code]<?
while (($fielddatas=mssql_fetch_array($datalist)))
{
?>
<B><?=$fielddatas["題號"];?>.<?=htmlspecialchars($fielddatas["題目"]);?>
</B><BR>
<?
if ($fielddatas["題型"]=="選擇")
{
for ($I=1;$I<=3;$I++)
{
?>
<INPUT Type=Radio Name=No<?=$fielddatas["題號"];?>
Value=<?=$fielddatas["選項" . $I] ;?>>
<?=htmlspecialchars($fielddatas["選項" . $I]);?><BR>
<?
}
}
else
{
?>
<INPUT Type=Text Name=No<?=$fielddatas["題號"];?> size="20"><BR>
<?
}
}
?>
[/code][list=1]
[*]程式碼第2行:使用While迴圈敘述配合改變作用中資料錄位置的mssql_fetch_array()函數,將所有的問卷題目自資料庫資料表中讀取出來。
[*]程式碼第8行:利用If判斷敘述來辨別資料錄『題型』欄位中所設定的問卷題目型式。
[*]程式碼第10行:如果『題型』是選擇題,則利用For迴圈敘述列出各備選答案,請注意,本範例的備選答案只有三個,所以For迴圈的起始值為1,而終值為3。
[*]程式碼第13~15行:列出備選答案的選擇鈕屬性值敘述是「<?=$fielddatas["選項" . $I] ;?>」,但是,在網頁中列印出選項說明文字的敘述則為「<?=htmlspecialchars($fielddatas["選項" . $I]);?>」。
[*]程式碼第22行:如果『題型』是問答題則直接設定單行文字輸入方塊即可。
[/list]


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

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

<HTML>
<H2 align="center"><font size="2">
<img border="0"src="asktitle.gif"></font></h2>
<FORM Action=sentmsg.php Method=post>
<fontsize="2">
姓名
<INPUT Type=Text Name=Name size="20">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E-Mail
<INPUT Type=Text Name=Email size="20">
</font>
<HR size="1" color="#0000FF">
<font size="2">
<?
while (($fielddatas=mssql_fetch_array($datalist)))
{
?>
<B><?=$fielddatas["題號"];?>.<?=htmlspecialchars($fielddatas["題目"]);?>
</B><BR>
<?
if ($fielddatas["題型"]=="選擇")
{
for ($I=1;$I<=3;$I++)
{
?>
<INPUT Type=Radio Name=No<?=$fielddatas["題號"];?>
Value=<?=$fielddatas["選項" . $I] ;?>>
<?=htmlspecialchars($fielddatas["選項" . $I]);?><BR>
<?
}
}
else
{
?>
<INPUT Type=Text Name=No<?=$fielddatas["題號"];?> size="20"><BR>
<?
}
}
?>
<INPUT Type=Submit Value="送出問卷">
</font></FORM></HTML>
[/code]

小誌 發表於 2010-5-18 00:23

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

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


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

在信件內容的部分,除了要有問卷填寫者所選擇的答案與意見外,本範例中還加上相對應的問卷題目本文,如果不加上原始題目的內容,我們怎能知道答案的意義?[code]//列出問卷題目及問卷填寫者的答案
     $I=1;
    while (($fielddatas=mssql_fetch_array($datalist)))
    {
     //列出問卷題目
     $Body = $Body . $I . ". " . $fielddatas["題目"] . "\r\n";
     //取得相對應於題目的問卷答案
     $Ans=$_REQUEST["No" . $fielddatas["題號"]];
     //列出答案
     $Body = $Body . $Ans . "\r\n";
     $I++;
    }
   
// 寄出信件
    mail($To ,$Subject ,$Body ,$From);[/code][list=1]
[*]使用While迴圈敘述配合改變作用中資料錄位置與提取資料的mssql_fetch_array()函數,將所有的問卷題目自資料庫資料表中讀取出來。
[*]利用$_REQUEST[“表單欄位”]敘述取得來自問卷程式網頁中相對於題目的答案欄位屬性值(Value)。
[*]呼叫mail()函數將信件寄出。
[/list]

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

sentmsg.php[code]<?
//連結SQL Server
    $conn = mssql_connect("127.0.0.1", "sa", "12345");
//選擇資料庫
    mssql_select_db("QUESTION", $conn);  
//建立查詢字串
$SQL="Select * From question Order By 題號";
//將回傳結果存放於變數中
$datalist=mssql_query($SQL);
                        
//建立郵件基本項目       
    //以問卷程式網頁中所填寫的E-mail為寄件者
    $From= "From: " . $_REQUEST["Email"];
    //收件者為管理員或問卷調查主持人的E-Mail
    $To= $_REQUEST["Email"];
    //信件主題,通常為問卷的主題
    $Subject="網路問卷調查";
    //信件內容
    $Body = "網友" . $_REQUEST["Name"] . "問卷意見:" . "\r\n";
   
//列出問卷題目及問卷填寫者的答案
     $I=1;
    while (($fielddatas=mssql_fetch_array($datalist)))
    {
     //列出問卷題目
     $Body = $Body . $I . ". " . $fielddatas["題目"] . "\r\n";
     //取得相對應於題目的問卷答案
     $Ans=$_REQUEST["No" . $fielddatas["題號"]];
     //列出答案
     $Body = $Body . $Ans . "\r\n";
     $I++;
    }
   
// 寄出信件
    mail($To ,$Subject ,$Body ,$From);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; chaRSet=big5">
<title>感謝您的意見!!</title>
</head>
<body>
感謝您的意見
</body>
</html>[/code]

小誌 發表於 2010-5-18 00:27

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

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

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

    $CDONTS->Body=$Body;
// 寄出信件
    $CDONTS->Send();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; chaRSet=big5">
<title>感謝您的意見!!</title>
</head>
<body>
感謝您的意見
</body>
</html>[/code]

unitytap 發表於 2015-11-5 00:26

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=962&ptid=336]1#[/url] [i]小誌[/i] [/b]


    我因報告需求,想得到此Email的整個檔案,但因權限不足無法下載,可以請大大跟改一下權限,讓小學生也能下載。謝謝

unitytap 發表於 2015-11-6 22:02

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=83569&ptid=336]5#[/url] [i]unitytap[/i] [/b]


可以回復我一下嗎?

ILovePanda 發表於 2016-2-26 14:44

[quote]回復  小誌


    我因報告需求,想得到此Email的整個檔案,但因權限不足無法下載,可以請大大跟改一下 ...
[size=2][color=#999999]unitytap 發表於 2015-11-5 00:26[/color] [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=83569&ptid=336][img]http://forum.twbts.com/images/common/back.gif[/img][/url][/size][/quote]


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

頁: [1]

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