<MyRusakov.ru />

PHP и MySQL с Нуля до Гуру

PHP и MySQL с Нуля до Гуру

Данный курс - это более 20-ти часов видеоуроков по изучению PHP и MySQL. Ключевой момент курса - это создание движка для сайта с нуля. Каждая строчка комментируется. Практически для каждого урока имеются упражнения. Причём данные упражнения направлены не только на закрепление материала, но и на реализацию реальных задач, встающих перед Web-разработчиками при создании сайтов. После курса Вы сможете без проблем создавать движки для любых сайтов.

Также почти к каждому уроку идут упражнения для закрепления материала.

Просмотрев курс и выполнив упражнения, Вы сможете без проблем создавать функциональные движки для самых различных сайтов.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

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

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

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

Для того, чтобы сделать подписку на обновления сайта, надо воспользоваться одним из двух вариантов:

  1. Воспользоваться каким-нибудь сторонним сервисом. Могу порекомендовать feedburner.google.com. Это наиболее простой способ, но, правда, Вы будете зависеть от стороннего сервиса, вдобавок, в каждое письмо будут вставляться чужие ссылки, что не очень хорошо.
  2. Сделать собственную подписку на сайте. Этот способ более трудоёмкий, но зато абсолютно всё под Вашим контролем. Что отправлять, как отправлять, куда отправлять - всё решаете Вы. Вот об этом способе я и расскажу ниже немного подробнее.

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

Самая главная проблема, который возникнет - это ограничение хостингов на количество отсылаемых писем. Вывод из этого простой: нельзя отправлять сразу всем подписчикам письма. И нужно каждую рассылку разбивать на несколько этапов. Например, отправлять каждые 10 минут по 10 писем.

Теперь давайте создадим таблицу подписчиков со следующими полями:

  • id - уникальный идентификатор подписчика.
  • name - имя подписчика.

Безусловно, это почти самый минимум (можно и без имени). В реальности же можно добавить ещё дату подписки, список разделов, на которые подписывается пользователь и прочее.

И теперь необходимо создать таблицу, которая позволит решить проблему с ограничением количества отправляемых писем:

  • id - уникальный идентификатор последней рассылки.
  • post_id - уникальный идентификатор статьи (или поста) на сайте, о котором рассылается уведомление.
  • subscriber_id - уникальный идентификатор последнего подписчика, которому был отправлен выпуск.
  • end - закончена рассылка или нет.

Думаю, что с формой подписки и её обраткой Вы справитесь (если нет, то используйте 1-й вариант подписки на обновления, либо изучайте основы PHP).

А вот с самой рассылкой чуть посложнее, поэтому напишу шаблон кода скрипта, который Вам необходимо будет поставить на автозапуск в Cron (например, запуск через каждые 10 минут).

<?php
  $db = new mysqli("localhost", "root", "", "mydb"); // Подключаемся к базе данных
  $result_set = $db->query("SELECT * FROM `subscribe` WHERE `end`='0' LIMIT 1"); // Получаем 1 неоконченную рассылку
  $last_subscribe = $result_set->fetch_assoc(); // Преобразуем result_set в массив
  /* Если все рассылки уже отправлены, то смотрим: нет ли новых статей на сайте */
  if ($result_set->num_rows == 0) {
    $result_set = $db->query("SELECT * FROM `posts` WHERE `id`>'".$last_subscribe["post_id"]."' LIMIT 1");
    if ($result_set->num_rows == 0) exit; // Если ничего нового нет, то просто выходим
    $post = $result_set->fetch_assoc(); // Получаем данные о новой статье
    $db->query("INSERT INTO `subscribe` (`post_id`, `subscriber_id`, `end`) VALUES ('".$post["id"]."', '0', '0')"); // Добавляем в очередь новую рассылку
    exit; // Выходим, а через 10 минут данный скрипт будет снова запущен, и уже пойдёт непосредственно рассылка писем
  }
  $last_id = $last_subscribe["subscriber_id"]; // Получаем id подписчика, которому было отправлено письмо в последний раз
  $result_set = $db->query("SELECT * FROM `subscribers` WHERE `id`>$last_id");
  $count = 0;
  while (($row = $result_set->fetch_assoc()) !== false) {
    $subscriber_id = $row["id"];
    /* Здесь код для отправки письма через функцию mail() */
    $count++;
    if ($count == 10) {
      $db->query("UPDATE `subscribe` SET `subscriber_id`='$subscriber_id' WHERE `id`='".$last_subscribe["id"]."'"); // Обновляем информацию о последнем подписчике, которому было отправлено письмо
      break; // Выходим после 10-ти отправлений
    }
  }
  if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`=''".$last_subscribe["id"]."''"); // Всё отправлено
?>

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

Ещё раз повторяю, что данный способ рассчитан уже не новичков в PHP и MySQL, поэтому если Вам просто нужна самая обычная подписка на сайте, то используйте сторонние сервисы. А если у Вас уже есть нормальный опыт, и Вы хотите полностью контролировать все процессы рассылки обновлений сайта, то используйте 2-й варинт.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (24):

lion337 lion337 05.05.2012 16:05:51

Михаил спасибо , как раз создаю скрипт рассылки, будет где подглядеть :))))!

Ответить

wanderer wanderer 05.07.2012 12:03:55

НУ и как получилось?

Ответить

TemkA62 TemkA62 17.05.2012 20:40:24

ссылку поправьте на http://feedburner.google.com/ не правильно работает.

Ответить

Admin Admin 17.05.2012 22:43:34

Исправил. Спасибо!

Ответить

wanderer wanderer 08.07.2012 19:29:26

Михаил а, вот ты говорите чтоб не загружать работой сервер, или у хостера есть ограничение на рассылку сообщений(типа лимита) ... Нельзя ли поставить в конце цикла функцию sleep(); ? Будет ли это выходом при том что хостер слабенький?

Ответить

Admin Admin 08.07.2012 22:01:25

sleep(), в принципе, выход, но это всё-таки работа скрипта. А если будет много сообщений, то скрипт будет вынужденно непрерывно работать часами, либо вообще вечно. И если случайно будет сбой, то Вы об этом нескоро узнаете, поскольку скрипт не запустится без Вас.

Ответить

kva191098 kva191098 04.11.2012 16:07:25

Я не понимаю а как сделать так сделать форму подписки и куда указывать ссылку на кнопке подписаться. И как мне статью каторую я разместил поставить на очередь рассылки.

Ответить

Admin Admin 04.11.2012 19:10:32

Ответ один на все данные вопросы: изучайте PHP, другого выхода нет.

Ответить

kva191098 kva191098 05.11.2012 05:01:19

а как мне называть таблицу ?

Ответить

Admin Admin 05.11.2012 10:37:24

Это не важно, как угодно. Если придумаете совсем не подходящее имя, phpmyadmin Вам об этом сообщит.

Ответить

malina95 malina95 10.11.2012 02:25:08

Исправьте опечатку, вы забыли восклицателтный знак, или мне кажется? ( if ($result_set->num_rows == 0) { $result_set = $db->query("SELECT * FROM `posts` WHERE `id`>'".$last_subscribe["post_id"]."' LIMIT 1"); )

Ответить

Admin Admin 10.11.2012 07:48:40

Здесь всё правильно, если всё уже было отправлено (то есть количество записей равно 0), то ищем новые статьи.

Ответить

Tatyana8888 Tatyana8888 19.11.2012 13:25:55

Михаил, здравствуйте! А как сделать так, чтобы подписчикам отправлялась не вся статья (как происходит с моей подпиской, сделанной через Smartresponder), а только её анонс? Спасибо.

Ответить

Admin Admin 19.11.2012 14:07:46

Отправлять только анонс, как бы очевидно это не звучало.

Ответить

malina95 malina95 03.04.2013 21:56:41

Ни как не могу понять данную строчку, может вы мне подробнее объясните? if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`='$last_id'"); // Всё отправлено

Ответить

Admin Admin 03.04.2013 22:05:21

Каждый раз отправляется по 10 сообщений, и если в выборке было только 10 сообщений или меньше, то, значит, письма все отправлены, и ставится флаг в базе, чтобы больше к этой рассылке скрипт не возвращался.

Ответить

malina95 malina95 03.04.2013 22:08:23

Спасибо.

Ответить

malina95 malina95 11.04.2013 21:58:29

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

Ответить

malina95 malina95 11.04.2013 23:26:00

Михаил, а как составить правило в крон чтобы запускалось каждые 10 минут?

Ответить

Admin Admin 12.04.2013 11:39:32

http://myrusakov.ru/use-cron.html

Ответить

malina95 malina95 12.04.2013 00:54:10

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

Ответить

malina95 malina95 12.04.2013 13:28:50

И вот ещё ошибка с переменной, как может быть айди рассылки равной айди подписчика? if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`='$last_id'"); // Всё отправлено А нужно так if ($result_set->num_rows <= 10) $db->query("UPDATE `subscribe` SET `end`='1' WHERE `id`='$id'"); // Всё отправлено А в переменную $id поставить значение: $id = $last_subscribe['id'];

Ответить

Admin Admin 12.04.2013 14:52:01

Спасибо, исправил!

Ответить

bo4kov bo4kov 31.01.2016 18:29:40

Спасибо, Михаил, все работает. Только у меня возникла сложность при рассылке подписчикам по категории. Можете хоть на словах объяснить как это реализовать? (У меня статья может быть в нескольких категориях и пользователь может подписаться на несколько категорий). Пробовал вот такой запрос - $result_set = $db->query("SELECT * FROM `shop_users` WHERE `id`>'$last_id' AND `podpiska_cat` IN( SELECT `cat_id` FROM `shop_art_cat` WHERE `art_id` = ".$last_subscribe['art_id'].")"); но отправляет письмо только тому подписчику у которого id категории стоит на первом месте(в столбце `podpiska_cat`). Что-то я не могу сообразить!

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.