最近有一個讀者問我關於ThickBook新聞列表中處理訂閱/退訂的機制,並且是如何與實際的發送資訊相配合,給郵件清單中的所有收信人的。問題提的不錯,有一個相當輕易的方法,但是我首先要說的是我所做的沒有任何投機取巧的地方,因為我非常的酷----就是有,我使用這個方法也只是因為我懶。注重,在市面上有非常多的郵件清單軟體,可以把它裝在系統上,並且也有一些別的,更多的是結合在一起的指令碼集,你 也可以用來做同樣的事情。但是,正如我所說,我是一個懶人,不想下載和安裝任何東西,所以我產生了幾 個相當簡單的頁面,用來執行我所要求的工作。很希望,有人能從中學到一些東西。
首先是訂閱/退訂指令碼,它所做的工作就是從資料庫表中增加或刪除記錄。把它叫做"manage.phtml" 或 差不多的什麼東西。這樣呢,就需要後台是某種資料庫,在上面可以建立訂閱表。根據政治中的半數原則,所以我將使用MySQL作為這個例子的資料庫。你可以使用任何你常用的資料庫,只是據PHP手冊替換正確的資料庫相關函數。
在我的訂閱表中,我使用了兩個欄位:郵件地址(email_addr)和添加日期(date_added)。你可以根據需要增加欄位,或者將date_added欄位刪除。在這個例子中,我只是向你展示我做了什麼,你可以適當的進行 修改。在我的訂閱表中,email_addr欄位是一個不重複欄位,意味著你不能增加另一個與之完全一樣的e-mail 地址。這個可以避免重複訂閱,而且當使用者想退訂時,也使刪除記錄的方法變得簡單和可靠。
那麼,讓我們建立訂閱/退訂表單吧(manager.phtml或你想起的什麼名字)。我使用同一個檔案處理訂閱和退訂,也包括表格自身的動作,所以可能有點複雜。我將從頭到尾講解,然後把所有的片段組合在一起,放在一個表單中。
在指令碼的開始處,是開啟資料庫和預備時間戳記。在開始時處理這些不顯眼的東西總是可以為我減輕一點壓力。
--------------------------------------------------------------------------------
// 串連資料庫
$db = mysql_connect("servername", "username", "password") or die ("不能串連。");
mysql_select_db("yourDB", $db) or die ("不能選擇資料庫。");
// 得到時間戳記
$add_date = date("Y-m-d"); --------------------------------------------------------------------------------
我們希望$op的值是"ds"。它不是複雜的程式縮寫----我創的,表示"do something(做某事)" 。所以,指令碼的第一件事就是查看$op的值是不是等於"ds"。這個值只有當表單被提交後才會被發送上來。所以假如$op的值不是"ds",那麼說明使用者還沒有看過表單,所以應該把表單顯示出來:
--------------------------------------------------------------------------------
if ($op != "ds") {
//需要訂閱/退訂
$text_block = "
<form name="form" method=post action="$PHP_SELF">
<input type=hidden name=op value=ds>
<p><strong>your e-mail address:</strong><br>
<input type=text name="email" size=25></p>
<p><strong>action:</strong><br>
<input type=radio name="action" value="sub" checked> sub
<input type=radio name="action" value="unsub"> unsub</p>
<P><input type=submit name="submit" value="do it"></p>
</form>
";
}--------------------------------------------------------------------------------
你會注重到我把文本放在$text_block變數中。通過把文本放在一個變數中,接下來我所要做的就是在後面在主HTML模板內輸出$text_block的值。這是個人習慣問題,你可以根據你喜歡的時間和方式輸出文本。
這個表單的動作是$PHP_SELF ,可以想象一下,它的意思就是當按下了提交按鈕之後,它將會被重新裝入。然後,你可以看到這個表單有三個欄位:一個隱藏欄位,用於給$op賦值為"ds" ;一個文字欄位,叫做"email",在這裡使用者將填入他或她的email地址;還有一個是選項按鈕集,叫做"action",根據它,使用者可以決定執行哪一個動作(訂閱或退訂)。
在表單被提交之後,$op將等於"ds",並且$action的值將包含"sub"或"unsub"。那麼,我們繼續看上面 的if...語句,一旦提交,它將被跳過(因為$op=="ds")。假如$op的值為"ds"並且$action的值"sub"(訂閱),下面的else if...句被執行。這段代碼檢查e-mail是否已經存在於訂閱表中,假如不存在則將其插入到表中並列印出響應,否則忽略。
--------------------------------------------------------------------------------
else if (($op == "ds") && ($action == "sub")) {
// 檢查郵件還未提交則提交它們,否則返回資訊
$check = "select email_addr from subscribers
where email_addr = "$email"";
$check_result = mysql_query($check)
or die("不能執行地e-mail地址的檢查。");
$check_num = mysql_num_rows($check_result);
if ($check_num == 0) {
// 假如$check_num為0,則沒有找到匹配的記錄,使用者應該被提交
$sql = "insert into subscribers
values("$email", "$add_date")";
@mysql_query($sql) or die ("Couldn't insert email.");
$text_block = "
<P>感謝您的註冊!</p>