2013-06-17 3 views
3

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

ответ

13

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

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

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

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

Это не самая безопасная вещь когда-либо, но достаточно хорошо.

+0

TNX для вашего ответа, вы имеете в виду, что хэш сохраняются в БДЕ? – Highlan

+0

Пример с псевдокодом добавлен –

+0

, но таким образом, кажется, у нас есть большой процесс каждый раз, когда рассылку отправляет! вы не согласны со мной? – Highlan

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), 
.... 
); 

затем, вы можете добавить абонента в базе данных, как это:

, если он входит в систему, установить куки для является emailadress:

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); 

На этой странице вы можете использовать код для удаления подписчика, как указано выше.

PS: ссылку не следует добавлять в базу данных, потому что вы можете установить cookie, действительный в течение определенного времени (здесь 5 минут). на странице этой страницы вы можете добавить if-тест, чтобы узнать, установлен ли файл cookie, а затем удалить абонента. if(isset($_COOKIE['unsubscribe'])){...}

Надеется, что это помогло;)

+2

Плохое решение. Если пользователь забудет логин, он будет получать почту на вечность. –

+0

Почему вы используете cookie для отказа от подписки? вы считаете, что каждый использует только одну систему для входа в электронную почту? –

Смежные вопросы