我想用php写一个时事通讯。但我有一个问题:如何生成退订代码。事实上,我希望每个订阅者都有一个唯一的代码。例如,在“ http://net.tutsplus.com/ ”中,您可以看到如下内容:“ http://tutsplus.us1.list-manage.com/profile?u=0154weg635df2fdwied2541cbed&id=c5652sdfre7&e=8758563dfgde ”。另一个问题是这段代码是否应该保存在数据库中?(因为我认为如果它对每个人都是独一无二的,那么每次发送时事通讯时都没有必要生成)。任何想法?
问问题
19616 次
2 回答
20
生成用户 id + 一些秘密字符串的散列,将 id 和散列放入链接,并在验证散列后使用取消订阅用户的脚本提供它。
哈希不必在数据库中,只需即时计算即可。
创建取消订阅链接的脚本:
<?
$link = "unsubscribe.php?id=$user['id']&validation_hash=".md5($user['id'].$SECRET_STRING)
<a href="<?=$link?>">Unsubscribe</a>
处理取消订阅链接的脚本:
function unsubscribe() {
$expected = md5( $user['id'] . $SECRET_STRING );
if( $_GET['validation_hash'] != $expected )
throw new Exception("Validation failed.");
sql("UPDATE users SET wants_newsletter = FALSE WHERE id = " . escape($_GET['id']);
}
这不是有史以来最安全的事情,但已经足够好了。
于 2013-06-17T08:15:09.730 回答
2
是的,它应该保存在数据库中。你应该使用 wamp、lamp 或 xampp 之类的东西。这些是本地服务器,并为您提供了一个 mysql 数据库 (phpmyadmin) 来工作。
要连接数据库,您可以使用以下命令:
<?php
define("DB_HOST", "localhost");/*host*/
define("DB_USERNAME", "username");/*username*/
define("DB_PASSWORD", "pass123");/*password*/
define("DB_NAME", "mydatabase");/*database name*/
try
{
$db_conn = new PDO('pgsql:host='.DB_HOST.';dbname='.DB_NAME,DB_USERNAME,DB_PASSWORD);
}
catch(PDOException $e)
{
print "Error!:".$e->getMessage()."\n";
die();
}
?>
然后,您可以尝试在 mysql 中创建一个新表,如下所示:
CREATE TABLE subcribe
(
subscribeId INT,
emailadress VARCHAR(60),
....
);
然后,您可以像这样将订阅者添加到您的数据库中:
如果他登录,您为 is emailadress 设置一个 cookie:
setcookie('emailadress',$hisEmailadress,time()+3600);
然后添加订阅者:
$emailadress=$_COOKIE['emailadress'];
$subscriberId = $db_conn->prepare('SELECT MAX(subscriberId) FROM subcribe');
$subscriberId ->execute();
$row = $subscriberId ->fetch(PDO::FETCH_BOTH);
$subscriberId = $row[0]+1;/*unique number because it's one higher then max*/
$subscriber = $db_conn->prepare("INSERT INTO subscribe(subscriberId, emailadress) VALUES('$subscriberId','$emailadress')");
$subscriber ->execute();
要取消订阅,只需执行以下操作:
$unsubscribe = $db_conn->prepare('DELETE FROM subscribe WHERE emailadress=:emailadress');
$unsubscribe->bindParam(':emailadress',$_COOKIE['emailadress'],PDO::PARAM_STR);
$unsubscribe->execute();
要生成链接,您可以这样做并将其发送给人员电子邮件地址:
$length = rand(5, 10);
$link= "";
for($i=0;$i< $length;$i++)/*create random link*/
{
$char = rand(0, 256);
if(($char>=65 && $char<=90) || ($char>=97 && $char<=122) || ($char>=48 && $char<=57))
{
$char = chr($char);
$link.= $link;
}
else
$i--;
}
$hash = hash("ripemd160",$link);
setcookie('unsubscribe',$hash,time()+300);
$result = mail($emailadress, 'unsubscribe link', 'you are about to unsubscribe yourself. Click this link to unsubscribe: http://yourSite.php?link='.$link);
在此页面中,您可以使用代码删除订阅者,如上所述。
PS:链接本身不应该添加到数据库中,因为您可以设置一个在一定时间内有效的cookie(这里是5分钟)。在此页面的页面中,您可以添加一个 if-test 以查看是否设置了 cookie,然后删除订阅者。if(isset($_COOKIE['unsubscribe'])){...}
希望它有所帮助;)
于 2013-06-17T08:25:13.520 回答