Php 如何生成新闻稿的取消订阅链接?

Php 如何生成新闻稿的取消订阅链接?,php,subscription,newsletter,unsubscribe,Php,Subscription,Newsletter,Unsubscribe,我想用php写一篇时事通讯。但我有一个问题:如何生成用于取消订阅的代码。事实上,我希望每个订户都有一个唯一的代码。例如,在“”中可以看到如下内容:“”。 另一个问题是,该代码是否应该保存在数据库中?(因为我认为,如果它对每个人都是唯一的,那么不必每次发送时事通讯时都生成它)。有什么想法吗?生成一个用户id+一些秘密字符串的散列,将id和散列放到链接中,并使用一个脚本提供服务,该脚本将在验证散列后取消订阅用户 散列不必存在于数据库中,只需动态计算即可 创建取消订阅链接的脚本: <? $lin

我想用php写一篇时事通讯。但我有一个问题:如何生成用于取消订阅的代码。事实上,我希望每个订户都有一个唯一的代码。例如,在“”中可以看到如下内容:“”。
另一个问题是,该代码是否应该保存在数据库中?(因为我认为,如果它对每个人都是唯一的,那么不必每次发送时事通讯时都生成它)。有什么想法吗?

生成一个用户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']);
}

这不是有史以来最安全的东西,但已经足够好了。

是的,它应该保存在数据库中。您应该使用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();
    }
?>
然后,您可以向数据库中添加订阅服务器,如下所示:

如果他登录,您将为is EmailAddress设置cookie:

setcookie('emailadress',$hisEmailadress,time()+3600);
然后添加subcriber:

  $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);
$length=rand(5,10);
$link=“”;
对于($i=0;$i<$length;$i++)/*创建随机链接*/
{
$char=rand(0,256);

如果(($char>=65&&$char=97&&$char=48&&$chartnx对于你的答案,你的意思是散列可以保存在db中?但这样看来,每次新闻稿发送时,我们都有一个很大的过程!你不同意我的观点吗?哈哈,不,不太同意。从几个字母计算散列需要一纳秒。可能比查询数据库少几百倍。如果性能是你关心的问题,我建议离开PHP,使用Java.tnx作为你的建议!但是查询只是取消订阅时间,不是每天,而且是几百次!你的想法是什么?糟糕的解决方案。如果用户忘记登录,他将永远收到邮件。你为什么要使用cookies取消订阅某人?你知道吗相信每个人只使用一个系统登录电子邮件吗?
$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);