Я уже писал когда-то очень давно статью по созданию подписки на сайте , однако, за это время я уже разработал более простой и удобный механизм реализации подписки на сайте , и давайте его разберём.

Как сделать подписку на сайте (V2)

Я уже писал когда-то очень давно статью по созданию подписки на сайте, однако, за это время я уже разработал более простой и удобный механизм реализации подписки на сайте, и давайте его разберём.

Так же как и в прошлой версии у Вас должна быть таблица со статьями или постами на блоге. Так же у Вас должна быть таблица подписчиков на обновления и таблица с очередью рассылки.

Таблица со статьями (articles):

  • id - уникальный идентификатор.
  • title - заголовок статьи.
  • text - текст статьи.

Таблица с подписчиками (subscribers):

  • id - уникальный идентификатор.
  • email - e-mail подписчика.

Таблица с очередью рассылки (turn):

  • id - уникальный идентификатор.
  • email - e-mail подписчика, которому нужно отправить сообщение. Вместо него можно использовать subscriber_id, но в целях упрощения понимания, возьмём простейший вариант.
  • article_id - уникальный идентификатор той статьи, по которой нужно отправить уведомление
  • is_send - отправлено письмо или нет.

Разберём код 1-го скрипта, отвечающего за добавление подписчиков в очередь рассылки:

<?php
  $mysqli = new mysqli("localhost", "root", "", "mydb"); // Подключаемся к базе
  $rs = $mysqli->query("SELECT MAX(`article_id`) as `max` FROM `turn`"); // Узнаём id последней отправленной статьи
  $row = $rs->fetch_assoc();
  $last_article_id = $row["max"];
  $rs = $mysqli->query("SELECT `id` FROM `articles` WHERE `id` > '$last_article_id'"); // Берём все новые статьи (то есть те, которые ещё не отправлены)
  $rs_subscribers = $mysqli->query("SELECT * FROM `subscribers`"); // Получаем всех подписчиков
  while (($row = $rs->fetch_assoc()) != false) {
    /* Перебор новых статей */
    $article_id = $row["id"];
    while (($row_subscribers = $rs_subscribers->fetch_assoc()) != false) {
      /* Перебор подписчиков */
      $mysqli->query("INSERT INTO `turn` (`email`, `article_id`, `is_send`) VALUES ('".$row_subscribers["email"]."', '$article_id', '0')"); // Добавляем в очередь рассылки каждого подписчика
    }
  }
  $mysqli->close();
?>

Теперь рассмотрим код 2-го скрипта, отвечающего за непосредственную отправку:

<?php
  $mysqli = new mysqli("localhost", "root", "", "mydb"); // Подключаемся к базе
  $rs = $mysqli->query("SELECT * FROM `subscribers` WHERE `is_send` = '0' ORDER BY `id` LIMIT 10"); // Берём 10 подписчиков, которым ещё не отправлено письмо
  while (($row = $rs->fetch_assoc()) != false) {
    $rs_article = $mysqli->query("SELECT * FROM `articles` WHERE `id`='".$row["article_id"]."'"); // Берём информацию о статье
    $row_article = $rs_article->fetch_assoc();
    $success = mail($row["email"], $row_article["title"], "Появилась новая статья..."); // Отправляем e-mail
    if ($success) $mysqli->query("UPDATE `turn` SET `is_send` = '1' WHERE `id` = '".$row["id"]."'"); // Если e-mail отправлен, то ставим is_send=1, сообщающий о том, что подписчику отправлено письмо
  }
  $mysqli->close();
?>

Теперь самое основное - смысл алгоритма. Скрипт запускается автоматически через cron, анализирует появление новых статей и добавляет сразу же в очередь рассылки всех подписчиков. Далее другой автоматический скрипт просто берёт всех тех, кому ещё не отправлено письмо и отправляет его.

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