Создаем реферальную программу для сайт
Создание реферальных на PHP для сайта. Теория и рабочий пример
Al-Sher
Сегодня я решил поделиться статьей на тему партнерской программы и реферальных ссылок на PHP. Начнем с главного, а именно с вопроса: Что такое реферальные ссылки и для чего их используют на сайте?
Вопрос, конечно, актуальный для немногих, но, всё же, если начинать рассказывать, то с самого начала. И так, что же это такое? На данный вопрос даже википедия может ответить и вот цитата:
Реферальная ссылка — это идентификационная ссылка предназначенная для привлечения рефералов для конкретного пользователя (реферера).
Судя из этой цитаты, реферальная ссылка предназначена для привлечения новых клиентов. Данный вид партнерской программы очень популярный и используется во многих сервисах, например Dropbox и reg.ru, поэтому и вам я рекомендую вам использовать такой вид поощрения ваших пользователей.
Давайте подумаем о том, что нам необходимо для этого. Итак, для начала нам надо добавить в таблицу пользователей 2 поля. Конечно намного лучше реализовать свою таблицу для реф. ссылок, так как это, в теории, должно увеличить скорость подсчета рефералов, но мы же делаем что-то простое. Вот SQL-код, который буду использовать я для нашего примера
CREATE TABLE `user` (
`id` INT(255) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(255) NOT NULL ,
`email` VARCHAR(255) NOT NULL ,
`referral` VARCHAR(255) NOT NULL ,
`owner` INT(255) NOT NULL DEFAULT '0' ,
PRIMARY KEY (`id`)
)
Тут мы создаем таблицу user с полями id(индификатор пользователя), name(Имя пользователя), email(Email пользователя), referral(Реферальная ссылка пользователя), owner(Чьим рефералом является пользователь).
На этом теоретическую часть можно заканчивать и начинать "творить" код. Давайте начнем с генерации уникального кода, то есть реферальной ссылки. Конечно я сразу же выложу готовый код, который будет генерировать ссылку, пользуясь данными email:
function referralGenerator($email) {
return md5($email);
}
Это является самой простой функцией для реализации уникального ключа, но он будет уникальным лишь при условии уникальности email-адреса в БД.
Как добавлять данные в таблицу я думаю описывать не стоит, поэтому перейдем к реализации страницы, обрабатывающей данные коды. Назовем нашу страницу ref.php и положим её в корень, то есть адрес должен получиться следующим: http://domen.ru/ref.php. На этой же странице мы делаем проверку на наличие кода, если он отсутствует, то сразу "редиректим" пользователя на главную сайта.
if(!isset($_GET['r'])) header("Location: http://domen.ru");
Мы используем переменную r для передачи нашего кода. Раз мы используем md5 хеш для генерации ссылки, то можно сразу проверить и длину кода, ведь если верить документациям md5 занимает 128 бит, но, так как мы получаем сами символы, его вес увеличивается до 256 бит и занимает 32 символа.
if(strlen($_GET['r'])!=32) header("Location: http://domen.ru");
И так, самые простые проверки мы реализовали, поэтому остались лишь проверки данных в БД. Надеюсь все уже знакомы с mysqli и его описание здесь не требуется. Давайте соединимся с нашей БД.
$db=new mysqli('localhost','user','password','table');
$db->set_charset('utf-8);
Тут я сразу указал кодировку utf-8, так как считаю это важной частью. Она способна избавить от лишних поисков проблем с кодировкой, что сохранит вам время. Вернемся к проверкам в ref.php. Следующей проверкой нам необходимо узнать, есть ли такой код в БД. Давайте узнаем это:
$rq=$db->query("SELECT `id` FROM `user` WHERE `referral`='".$_GET['r']."'");
$r=$rq->fetch_array();
if(isset($r['id']) and $r['id']!='') {
setCookie('ref',$r['id'],time()+2678400);
header("Location: http://domen.ru");
} else header("Location: http://domen.ru");
Давайте разберем код. Сначала мы выполняем проверку реферальной ссылки и если она существует, то создаем куку ref с id пользователя, которому принадлежит ссылка, сроком в месяц, иначе делаем редирект на главную. Стоит заметить, что редирект на главную происходит и при правильном коде, сделано это для скрытия информации о реферальной ссылки. Конечно пользователь легко может поймать редирект с помощью консоли браузера или найти куку ref, но мы же тренируемся, нам это простительно ?
Осталось лишь дополнить регистрацию новых пользователей... Так как процесс регистрации на каждом сайте проходит по своему, дать универсальный код у меня нет возможности, но я готов предложить набросок с проверкой наличия ref куки.
$ref = ((isset($_COOKIE['ref']) and $_COOKIE['ref']>0)) ? $_COOKIE['ref'] : 0;
Пользователь, зашедший без реферальной ссылки, должен получить owner=0, то есть не является рефералом.
Кстати, для скрытия реферальных ссылок люди используют сервисы коротких ссылок, как, например, наш сервис ur0.ru.
Вот такая небольшая статья вышла, но из неё можно реализовать настоящую реферальную систему! Спасибо за внимание и удачи в вашем творчестве
Al-Sher
Почтовый адрес для связи указан на странице "Контакты". К сожалению времени свободного очень мало, поэтому не уверен, что смогу своевременно помочьАлексей
Понятно. Там же id ауто инкремент стоит. Автоматически айди присваивается следущий номер. А подскажите как с вами можно связаться проконсультироваться по реф программе? Можно и платно.Al-Sher
"Генерация по емайл не обязательна же?" - не обязательна, можно использовать тот же id пользователя без всякого хэширования. Данный метод был предложен, чтобы переходящий по ссылке не знал идентификатор пригласившего. "где столбец referral = парметру адресной строки браузера и теперь если ади из таблиц и айди гет параметра не равны 0,то создаем куки рефералу и редиректим на главную?" - да. Если мы нашли пользователя, то это и есть пригласивший, поэтому его id записываем в куку. "А если нет рефки то инсертом присваиваем в бд к гет параметру +1 к реф ссылке. и получиться в реферал № рефеоальной ссылки+1" - не знаю для чего это. Если нет пользователя с таким id, то, обычно, мы просто редиректим пользователя на главную, без куки.Алексей
Спасибо за ответы. Хотел уточнить. Генерация по емайл не обязательна же? И по коду: if(!isset($_GET['r'])) header("Location: http://domen.ru"); Здесь у нас если гет параметр из строки адреса отсутсвует,а он в самом начале отсутсвует, то редиректим на главную. Подключаемся к базе данных: $db=new mysqli('localhost','user','password','table'); $db->set_charset('utf-8); Здесь делаем запрос к бд:id пользователя из таблицы user , где столбец referral = парметру адресной строки браузера и теперь если ади из таблиц и айди гет параметра не равны 0,то создаем куки рефералу и редиректим на главную? А если нет рефки то инсертом присваиваем в бд к гет параметру +1 к реф ссылке. и получиться в реферал № рефеоальной ссылки+1. $rq=$db->query("SELECT `id` FROM `user` WHERE `referral`='".$_GET['r']."'"); $r=$rq->fetch_array(); if(isset($r['id']) and $r['id']!='') { setCookie('ref',$r['id'],time()+2678400); header("Location: http://domen.ru"); } else header("Location: http://domen.ru");Al-Sher
Да, примерно это. Только думал, что рефералы обычно регистрируются, а у вас в testreg.php идет авторизация. И следует подправить$result2 = mysql_query ("INSERT INTO users (login,password) VALUES('$login','$password')");
К следующему виду:$result2 = mysql_query ("INSERT INTO users (login,password,owner) VALUES('$login','$password','$owner')");
То есть при создании пользователя, мы присваиваем ему идентификатор пригласившего его пользователя. Проверка делается на случай, если пользователь пытался подставить не валидные данные в качестве реферальной ссылки Проверка делается на случай, если пользователь пытался подставить не валидные данные в качестве реферальной ссылкиАлексей
Что -то вроде этого? Это неколько файлов простой регистарции,я добавил в файл тестрег этот код. Я создал таблицу user с столбцами referral и owner. Только не понятно для чего делаеться проверка на существование кода,реф ссылки? Она же тогда уже должна быть ,по которой пришел реферал? Или рефссылка присваивает номер id зарегестрированного пользователя? 1)db.php <?php $db = mysql_connect ("localhost","reg","X1q8Z4h1"); mysql_select_db ("user1918670_registration",$db); ?> 2)index.php <?php // вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!! session_start(); ?> <html> <head> <title>Главная страница</title> </head> <body> <h2>Главная страница</h2> <form action="testreg.php" method="post"> <!--**** testreg.php - это адрес обработчика. То есть, после нажатия на кнопку "Войти", данные из полей отправятся на страничку testreg.php методом "post" ***** --> <p> <label>Ваш логин:<br></label> <input name="login" type="text" size="15" maxlength="15"> </p> <!--**** В текстовое поле (name="login" type="text") пользователь вводит свой логин ***** --> <p> <label>Ваш пароль:<br></label> <input name="password" type="password" size="15" maxlength="15"> </p> <!--**** В поле для паролей (name="password" type="password") пользователь вводит свой пароль ***** --> <p> <input type="submit" name="submit" value="Войти"> <!--**** Кнопочка (type="submit") отправляет данные на страничку testreg.php ***** --> <br> <!--**** ссылка на регистрацию, ведь как-то же должны гости туда попадать ***** --> <a href="reg.php">Зарегистрироваться</a> </p></form> <br> <?php // Проверяем, пусты ли переменные логина и id пользователя if (empty($_SESSION['login']) or empty($_SESSION['id'])) { // Если пусты, то мы не выводим ссылку echo "Вы вошли на сайт, как гость<br><a href='#'>Эта ссылка доступна только зарегистрированным пользователям</a>"; } else { // Если не пусты, то мы выводим ссылку echo "Вы вошли на сайт, как ".$_SESSION['login']."<br><a href='http://tvpavlovsk.sk6.ru/'>Эта ссылка доступна только зарегистрированным пользователям</a>"; } ?> </body> </html> 3)reg.php <html> <head> <title>Регистрация</title> </head> <body> <h2>Регистрация</h2> <form action="save_user.php" method="post"> <!--**** save_user.php - это адрес обработчика. То есть, после нажатия на кнопку "Зарегистрироваться", данные из полей отправятся на страничку save_user.php методом "post" ***** --> <p> <label>Ваш логин:<br></label> <input name="login" type="text" size="15" maxlength="15"> </p> <!--**** В текстовое поле (name="login" type="text") пользователь вводит свой логин ***** --> <p> <label>Ваш пароль:<br></label> <input name="password" type="password" size="15" maxlength="15"> </p> <!--**** В поле для паролей (name="password" type="password") пользователь вводит свой пароль ***** --> <p> <input type="submit" name="submit" value="Зарегистрироваться"> <!--**** Кнопочка (type="submit") отправляет данные на страничку save_user.php ***** --> </p></form> </body> </html> 4)save_user.php <?php if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } //заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); } //если логин и пароль введены, то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести $login = stripslashes($login); $login = htmlspecialchars($login); $password = stripslashes($password); $password = htmlspecialchars($password); //удаляем лишние пробелы $login = trim($login); $password = trim($password); // подключаемся к базе include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь // проверка на существование пользователя с таким же логином $result = mysql_query("SELECT id FROM users WHERE login='$login'",$db); $myrow = mysql_fetch_array($result); if (!empty($myrow['id'])) { exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин."); } // если такого нет, то сохраняем данные $result2 = mysql_query ("INSERT INTO users (login,password) VALUES('$login','$password')"); // Проверяем, есть ли ошибки if ($result2=='TRUE') { echo "Вы успешно зарегистрированы! Теперь вы можете зайти на сайт. <a href='index.php'>Главная страница</a>"; } else { echo "Ошибка! Вы не зарегистрированы."; } ?> 5)testreg.php <?php session_start();// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!! if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} } //заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную if (empty($login) or empty($password)) //если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт { exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!"); } //если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести $login = stripslashes($login); $login = htmlspecialchars($login); $password = stripslashes($password); $password = htmlspecialchars($password); //удаляем лишние пробелы $login = trim($login); $password = trim($password); // подключаемся к базе include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь if(!isset($_GET['r'])) header("Location: http://domen.ru"); set_charset('utf-8'); $r = $db->real_escape_string($_GET['r']); $rq=$db->query("SELECT `id` FROM `user` WHERE `referral`='".$r."' limit 1"); $r=$rq->fetch_array(); if (isset($r['id']) and $r['id']) { setCookie('ref',$r['id'],time()+2678400); } } header("Location: http://domen.ru"); ?> $owner = isset($_COOKIE['ref']) ? $db->real_escape_string($_COOKIE['ref']) : null; $result = mysql_query("SELECT * FROM users WHERE login='$login'",$db); //извлекаем из базы все данные о пользователе с введенным логином $myrow = mysql_fetch_array($result); if (empty($myrow['password'])) { //если пользователя с введенным логином не существует exit ("Извините, введённый вами login или пароль неверный."); } else { //если существует, то сверяем пароли if ($myrow['password']==$password) { //если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел! $_SESSION['login']=$myrow['login']; $_SESSION['id']=$myrow['id'];//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь echo "Вы успешно вошли на сайт! <a href='index.php'>Главная страница</a>"; } else { //если пароли не сошлись exit ("Извините, введённый вами login или пароль неверный."); } } ?>Al-Sher
Здравствуйте! Написать универсальную инструкцию, к сожалению, невозможно, поскольку существует разница в чтении/записи в Базу данных и не только. Попробую написать более подробно с использованием sql запросов. Допустим, мы ждем рефералов на странице ref.php, тогда в данном файле нам необходимо расположить следующий код:set_charset('utf-8'); $r = $db->real_escape_string($_GET['r']); $rq=$db->query("SELECT `id` FROM `user` WHERE `referral`='".$r."' limit 1"); $r=$rq->fetch_array(); if (isset($r['id']) and $r['id']) { setCookie('ref',$r['id'],time()+2678400); } } header("Location: http://domen.ru"); ?>
В принципе данный код можно расположить и на всех страницах сайта, но проверку на существование реферального ключа в БД рекомендую тогда делать при регистрации. Допустим регистрация проходит на странице reg.php. Тогда на данной странице, в месте, где идет обработка полученных от пользователя данных, добавляем следующий код:$owner = isset($_COOKIE['ref']) ? $db->real_escape_string($_COOKIE['ref']) : null;
После чего owner подставляем в insert-запросАлексей
Здравствуйте. Можете написать более подробно код и файлы,куда и что вставлять. С базой данных и таблицей разобрался, а дальше не понимаю.В один файл все данные закидывать или раздельно.Если есть на сайте только форма регисстрации и авторизации, как можно их соединить что бы они работали с рефералкой? За ранее спасибо.