直播中
首先是訂閱/退訂腳本,它所做的工作就是從數(shù)據(jù)庫表中增加或刪除記錄。把它叫做"manage.phtml" 或
差不多的什么東西。這樣呢,就需要后臺是某種數(shù)據(jù)庫,在上面可以創(chuàng)建訂閱表。根據(jù)政治中的半數(shù)原則,
所以我將使用MySQL作為這個(gè)例子的數(shù)據(jù)庫。你可以使用任何你常用的數(shù)據(jù)庫,只是根據(jù)PHP手冊替換正確的
數(shù)據(jù)庫相關(guān)函數(shù)。
在我的訂閱表中,我使用了兩個(gè)字段:郵件地址(email_addr)和添加日期(date_added)。你可以根據(jù)需
要增加字段,或者將date_added字段刪除。在這個(gè)例子中,我只是向你展示我做了什么,你可以適當(dāng)?shù)倪M(jìn)行
修改。在我的訂閱表中,email_addr字段是一個(gè)不重復(fù)字段,意味著你不能增加另一個(gè)與之完全一樣的e-mail
地址。這個(gè)可以避免重復(fù)訂閱,而且當(dāng)用戶想退訂時(shí),也使刪除記錄的方法變得簡單和可靠。
那么,讓我們創(chuàng)建訂閱/退訂表單吧(manager.phtml或你想起的什么名字)。我使用同一個(gè)文件處理訂
閱和退訂,也包括表格自身的動作,所以可能有點(diǎn)復(fù)雜。我將從頭到尾講解,然后把所有的片段組合在一起,
放在一個(gè)表單中。
在腳本的開始處,是打開數(shù)據(jù)庫和準(zhǔn)備時(shí)間戳。在開始時(shí)處理這些不顯眼的東西總是可以為我減輕一點(diǎn)
壓力。
--------------------------------------------------------------------------------
// 連接數(shù)據(jù)庫
$db = mysql_connect("servername", "username", "password") or die ("不能連接。");
mysql_select_db("yourDB", $db) or die ("不能選擇數(shù)據(jù)庫。");
// 得到時(shí)間戳
$add_date = date("Y-m-d"); --------------------------------------------------------------------------------
我們希望$op的值是"ds"。它不是復(fù)雜的程序縮寫----我創(chuàng)的,表示"do something(做某事)" 。所以,
腳本的第一件事就是查看$op的值是不是等于"ds"。這個(gè)值只有當(dāng)表單被提交后才會被發(fā)送上來。所以如果
$op的值不是"ds",那么說明用戶還沒有看過表單,所以應(yīng)該把表單顯示出來:
--------------------------------------------------------------------------------
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變量中。通過把文本放在一個(gè)變量中,接下來我所要做的就是在
后面在主HTML模板內(nèi)輸出$text_block的值。這是個(gè)人習(xí)慣問題,你可以根據(jù)你喜歡的時(shí)間和方式輸出文本。
這個(gè)表單的動作是$PHP_SELF ,可以想象一下,它的意思就是當(dāng)按下了提交按鈕之后,它將會被重新裝
入。然后,你可以看到這個(gè)表單有三個(gè)字段:一個(gè)隱藏字段,用于給$op賦值為"ds" ;一個(gè)文本字段,叫做
"email",在這里用戶將填入他或她的email地址;還有一個(gè)是單選按鈕集,叫做"action",根據(jù)它,用戶可
以決定執(zhí)行哪一個(gè)動作(訂閱或退訂)。
在表單被提交之后,$op將等于"ds",并且$action的值將包含"sub"或"unsub"。那么,我們繼續(xù)看上面
的if...語句,一旦提交,它將被跳過(因?yàn)?op=="ds")。如果$op的值為"ds"并且$action的值"sub"(訂閱),
下面的else if...句被執(zhí)行。這段代碼檢查e-mail是否已經(jīng)存在于訂閱表中,如果不存在則將其插入到表中
并打印出響應(yīng),否則忽略。
--------------------------------------------------------------------------------
else if (($op == "ds") && ($action == "sub")) {
// 檢查郵件還未提交則提交它們,否則返回信息
$check = "select email_addr from subscribers
where email_addr = \"$email\"";
$check_result = mysql_query($check)
or die("不能執(zhí)行地e-mail地址的檢查。");
$check_num = mysql_num_rows($check_result);
if ($check_num == 0) {
// 如果$check_num為0,則沒有找到匹配的記錄,用戶應(yīng)該被提交
$sql = "insert into subscribers
values(\"$email\", \"$add_date\")";
@mysql_query($sql) or die ("Couldn't insert email.");
$text_block = "
<P>感謝您的注冊!</p>
";
} else {
// 如果$check_num不為0,則用戶已經(jīng)提交過了,你應(yīng)該讓他們知道
$text_block = "
<P>你已經(jīng)訂閱過了!</p>
";
}
}--------------------------------------------------------------------------------
下一步:當(dāng)$action的值為"unsub"(unsubscribe,退訂)而不是"sub"時(shí)應(yīng)該做些什么。好,就象上面
一樣簡單,那么對else if...語句擴(kuò)展一下,多加一塊代碼,用于檢查e-mail在被刪除前是否存在于訂閱表
中,如果存在則刪除它并且打印響應(yīng),否則忽略它。
--------------------------------------------------------------------------------
else if (($op == "ds") && ($action == "unsub")) {
// 檢查已經(jīng)訂閱過,然后將他們退訂,否則返回信息
$check = "select email_addr from subscribers
where email_addr = \"$email\"";
$check_result = mysql_query($check)
or die("不能執(zhí)行對e-mail地址的檢查。");
$check_num = mysql_num_rows($check_result);
if ($check_num == 0) {
// 如果$check_num為0,則沒有找到匹配記錄,用戶不能被退訂
$text_block = "
<P>不能在列表中找到你的e-mail地址!</p>
<P>你還沒有被退訂,因?yàn)槟闼斎氲膃-mail不在數(shù)據(jù)庫中。";
} else {
// 如果$check_num不為0,則用戶在列表中,所以可以被退訂
$sql = "delete from subscribers
where email_addr = \"$email\"";
@mysql_query($sql) or die ("不能刪除email。");
$text_block = "
<P>退訂成功!</p>
";
}
}
?>--------------------------------------------------------------------------------
現(xiàn)在所有艱難的工作已經(jīng)做完了,只剩下在一塊HTML中輸出$text_block變量了:
--------------------------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>訂閱/退訂</TITLE>
</HEAD>
<BODY>
<h1>訂閱/退訂</h1>
<?php echo "$text_block"; ?>
</BODY>
</HTML>
--------------------------------------------------------------------------------
下面是完整的程序清單:
--------------------------------------------------------------------------------
<?
// 連接數(shù)據(jù)庫
$db = mysql_connect("servername", "username", "password")
or die ("不能連接。");
mysql_select_db("yourDB", $db) or die ("不能選擇數(shù)據(jù)庫。");
// 得到時(shí)間戳
$add_date = date("Y-m-d");
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>
";
} else if (($op == "ds") && ($action == "sub")) {
// 檢查郵件還未提交則提交它們,否則返回信息
$check = "select email_addr from subscribers
where email_addr = \"$email\"";
$check_result = mysql_query($check)
or die("不能執(zhí)行地e-mail地址的檢查。");
$check_num = mysql_num_rows($check_result);
if ($check_num == 0) {
// 如果$check_num為0,則沒有找到匹配的記錄,用戶應(yīng)該被提交
$sql = "insert into subscribers
values(\"$email\", \"$add_date\")";
@mysql_query($sql) or die ("Couldn't insert email.");
$text_block = "
<P>感謝您的注冊!</p>
";
} else {
// 如果$check_num不為0,則用戶已經(jīng)提交過了,你應(yīng)該讓他們知道
$text_block = "
<P>你已經(jīng)訂閱過了!</p>
";
}
} else if (($op == "ds") && ($action == "unsub")) {
// 檢查已經(jīng)訂閱過,然后將他們退訂,否則返回信息
$check = "select email_addr from subscribers
where email_addr = \"$email\"";
$check_result = mysql_query($check)
or die("不能執(zhí)行對e-mail地址的檢查。");
$check_num = mysql_num_rows($check_result);
if ($check_num == 0) {
// 如果$check_num為0,則沒有找到匹配記錄,用戶不能被退訂
$text_block = "
<P>不能在列表中找到你的e-mail地址!</p>
<P>你還沒有被退訂,因?yàn)槟闼斎氲膃-mail不在數(shù)據(jù)庫中。";
} else {
// 如果$check_num不為0,則用戶在列表中,所以可以被退訂
$sql = "delete from subscribers
where email_addr = \"$email\"";
@mysql_query($sql) or die ("不能刪除email。");
$text_block = "
<P>退訂成功!</p>
";
}
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>訂閱/退訂</TITLE>
</HEAD>
<BODY>
<h1>訂閱/退訂</h1>
<?php echo "$text_block"; ?>
</BODY>
</HTML>
--------------------------------------------------------------------------------
現(xiàn)在你已經(jīng)有了合適的訂閱/退訂機(jī)制,我將向你展示如何發(fā)出一封新聞信件,只使用一個(gè)簡單的表單
和一個(gè)郵件腳本。("while"循環(huán)是你的好朋友?。?。首先,是名為"send_mail.html"的表單。表單的動作
應(yīng)該是象"do_send_mail.phtml"的什么東西,并且我只使用了一個(gè)用來寫主題的文本字段(subject)和一個(gè)
寫信件內(nèi)容的文本域字段(newsletter)。你可以根據(jù)需要使用表單字段,只要適當(dāng)?shù)匦薷谋韱魏湍_本。
--------------------------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>發(fā)送郵件</TITLE>
</HEAD>
<BODY>
<h1>Send a Newsletter</h1>
<FORM ACTION="do_send_mail.phtml" METHOD="post">
<P><strong>給出一個(gè)主題:</strong><br>
<input type="text" name="subject" size=30></p>
<P><strong>郵件內(nèi)容:</strong><br>
<textarea name="newsletter" cols=40 rows=30 wrap=virtual></textarea>
<p><input type="submit" name="submit" value="Send Newsletter"></p>
</form>
</BODY>
</HTML>
--------------------------------------------------------------------------------
最后一點(diǎn)說明的是關(guān)于表單的動作,這個(gè)腳本叫做"do_send_mail.phtml"。腳本首先查找$subject和
$newletter的值,并且如果他們的值有一個(gè)為空就重定向到表單:
--------------------------------------------------------------------------------
if (($subject =="") || ($newsletter == "")) {
header("Location: http://www.yourdomain.com/send_mail.phtml");
exit;
}--------------------------------------------------------------------------------
接著,連接到數(shù)據(jù)庫并且從訂閱表中取出郵件地址:
--------------------------------------------------------------------------------
// 連接數(shù)據(jù)庫
$db = mysql_connect("servername", "username", "password")
or die ("不能連接。");
mysql_select_db("yourDB", $db) or die ("不能選擇數(shù)據(jù)庫。");
$sql = "select email_addr from subscribers";
$res = mysql_query($sql) or die("不能得到郵件地址。");
--------------------------------------------------------------------------------
在進(jìn)入到發(fā)送郵件信息的循環(huán)之前,要建立額外的郵件頭。在這里,我只用了"From:"行:
$headers = "From: \"Your Mailing List\" <you@yourdomain.com>\n";
現(xiàn)在進(jìn)入發(fā)送郵件的循環(huán)中。首先,使用mysql_fetch_array 函數(shù)(或同你的數(shù)據(jù)庫相似的函數(shù))將每
條記錄放在一個(gè)數(shù)組中。如果你取回的字段多于一個(gè)可能更有意義,我用它是因?yàn)樗?。下面的語句對結(jié)果
集進(jìn)行遍歷并且通過mail()函數(shù)對每個(gè)在列表中的郵箱發(fā)送e-mail:
--------------------------------------------------------------------------------
while ($row = mysql_fetch_array($res)) {
$email_addr = $row[0];
mail("$email_addr", "$subject", $newsletter, $headers);
}
--------------------------------------------------------------------------------
$subject和$newletter的值是在前面的表單中輸入的。在腳本的最后增加一行輸出語句,以便你知道執(zhí)
行完畢了。這就是全部處理了!完整的"do_send_mail.phtml"腳本看上去為:
--------------------------------------------------------------------------------
<?
if (($subject =="") || ($newsletter == "")) {
header("Location: http://www.yourdomain.com/send_mail.phtml");
exit;
} else {
// 連接數(shù)據(jù)庫
$db = mysql_connect("servername", "username", "password")
or die ("不能連接。");
mysql_select_db("yourDB", $db) or die ("不能選擇數(shù)據(jù)庫。");
$sql = "select email_addr from subscribers";
$res = mysql_query($sql) or die("不能得到郵件地址。");
$headers = "From: \"Your Mailing List\" <you@yourdomain.com>\n";
while ($row = mysql_fetch_array($res)) {
$email_addr = $row[0];
mail("$email_addr", "$subject", $newsletter, $headers);
}
echo "郵件發(fā)送完畢!";
}
?>
--------------------------------------------------------------------------------
轉(zhuǎn)自WeberDev.com
limodou譯