Как создать ссылку для подписки на новостную рассылку?

Я хочу написать рассылку с php. но у меня есть вопрос: как я могу создать код для отказа от подписки. На самом деле я хочу уникальный код для каждого подписчика. например, в ' http://net.tutsplus.com/' вы можете увидеть что-то вроде этого: ' http://tutsplus.us1.list-manage.com/profile?u=0154weg635df2fdwied2541cbed&id=c5652sdfre7&e=8758563dfgde'. и другой вопрос заключается в том, что этот код должен быть сохранен в базе данных или нет?(потому что я думаю, что если он уникален для каждого человека, нет необходимости генерировать каждый раз при отправке информационных бюллетеней). любая идея?

2 ответа

Решение

Создайте хэш идентификатора пользователя + некоторую секретную строку, поместите идентификатор и хэш в ссылку и обслужите его, используя скрипт, который отписался бы от пользователя после проверки хеша.

Хеш не должен быть в базе данных, просто вычислить его на лету.

Скрипт создания ссылки на отписку:

<?
$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();
    }
?>

Затем вы можете попытаться создать новую таблицу в MySQL следующим образом:

CREATE TABLE subcribe
(
subscribeId     INT,
emailadress     VARCHAR(60),
....
);

Затем вы можете добавить подписчика в вашу базу данных следующим образом:

если он входит в систему, вы устанавливаете 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, чтобы увидеть, был ли установлен cookie, а затем удалить подписчика. if(isset($_COOKIE['unsubscribe'])){...}

Надеюсь, это помогло;)

Другие вопросы по тегам