PHP. Баннерная система. Часть - 1

Баннерная система.

Вот решился ради практики написать простую баннерную систему, кому то может пригодится.

Начнем.

Что из себя представляет баннер?
Это блок в который выводится рекламное сообщение на сайте.

Что из себя будет представлять баннерная система?
1. Блок управления баннерами - назовем "Панель управления"
2. Система инициализации - это способ которым будем инициализировать вывод баннеров.
3. База данных в которой будем хранить информацию о файлах баннеров.

Что должен уметь баннер?
1. При клике мышкой по баннеру надо переходить на сайт рекламодателя.
2. Нужно вести статистику показов, переходов и т.д.
3. Нужно система лимитов на показы, переходы и т.д.

Приступим.

Реализация базы данных.
Предположим что наша банерная система вынуждена будет работать с ограниченным количеством баз данных, по этому правильно будет разместить свои данные в базе данных(БД) сайта. По этому создадим для себя таблицы.
Для демонстрации будем предполагать что БД будет носить название WORK
Сразу заложим такие параметры для подключения к БД.
БД - mysql
Сервер - localhost
Пользователь - root
Пароль - отсутствует
Имя БД - work

для удобства таблицу будем создавать самим скриптом баннерной системы.
таблица нам понадобится такая:
Поле Тип Параметры Описание
id int(11) NOT NULL AUTO_INCREMENT Уникальный идентификатор
caption varchar 255 Название банера
url varchar 255 Ссылка для перехода
imgname varchar 255 название картинки для показа
click int(11) default 0 количество кликов
limitclick int(11) default -1 лимит на клики, -1 значит что отключено
views int(11) default 0 Счетчик показов
limitviews int(11) default -1 Лимит на показы, -1 - отключен контроль
dateexpired date Дата истичения
enable int(11) default 0 Включен или выключен банер

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

Приступим к разработке ajax файла, назовем его banners.php
Именно к нему будем обращаться через ajax запросы.
Далее текст будет обрамлет // в виде коментариев, для любителей копипаста

Код:
<?php
//Ajax скрипт обработки запроса баннеров
//Конфигурация
$cfg['host']    =    'localhost';  
$cfg['base']    =    'banners';       
$cfg['user']    =    'root';          
$cfg['pass']    =    '';              
$cfg['table']    =    'banners';  
$cfg['path']    =    '/banner/';
       
/*

Подключение к серверу
работать с БД будет через PDO
*/
$dsn = "mysql:host={$cfg['host']};dbname={$cfg['base']};charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $cfg['user'], $cfg['pass'], $opt);
$pdo->query('SET NAMES utf8');

//проверка таблицы на наличие, если таблицы нет то создаем ее
$sql="CREATE TABLE IF NOT EXISTS {$cfg['table']}(
        id int(11) NOT NULL AUTO_INCREMENT,
        caption varchar(255),
        url varchar(255),
        imgname varchar(255),
        click int(11) default 0,
        limitclick int(11) default -1,
        views int(11) default 0,
        limitviews int(11) default -1,
        dateexpired date,  
        enable int(11) default 0,  
        PRIMARY KEY(id)
        ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;";

$pdo->prepare($sql)->execute(); 

//используем prepare что бы при последующих показах не терять время на запрос


/* 

Обработка запроса 
Будем обрабатывать и GET и POST запросы. 
Но по факту использовать будем только POST запросы
*/
$url=$_GET['url'];
if($url!='')$action='go_url';
else
$action=$_POST['action'];



/*
Дальше смотрим что от нас хочет запрос
get_banner  - получить банер
go_url - перейти по банеру
 */

switch ($action){
    case 'get_banner':{

        //тут посмотрим сколько банеров от нас хочет получить запрос
        $count=$_POST['count'];
        if($count=='')$count=1;//если неуказано то вернем 1 банер
        //Количество доступных банеров(отметаем отключенные)
        $sql="select count(*) as enable_banners from {$cfg['table']} where enable=1";
        $query=$pdo->prepare($sql);
        $query->execute();
        $row=$query->fetch();
        //выберем count банеров для показа
        $sql="select id,imgname,url from {$cfg['table']} where (enable=1) order by rand() limit {$count}";
        $query=$pdo->prepare($sql);
        $query->execute();

        //Будем вести массив где будут хранится ID выбранных банеров
        $b=array();
        while($row=$query->fetch()){
            print "<div class='banner'><a href='.{$cfg['path']}ajax/banners.php?url={$row['id']}'><img src='.{$cfg['path']}data/{$row['imgname']}'></a></div";
            $b[]=$row['id'];
        }
        $in  = str_repeat('?,', count($b) - 1) . '?';
        //Накрутим счетчик показов только тем банерам которые в массиве $b[]
        $sql="update {$cfg['table']} set views=views+1 where id IN ({$in})";
        $query=$pdo->prepare($sql);
        $query->execute($b);
        //Если количество показов превышает указанное то отключаем
        $sql="update {$cfg['table']} set enable=0 where (limitviews<>-1) and(views>=limitviews) and(enable=1) and( id IN ({$in}))";
        $query=$pdo->prepare($sql);
        $query->execute($b);
      
        //Если дата показа истекла - отключаем
        $sql="update {$cfg['table']} set enable=0 where (dateexpired IS NOT NULL) and(CURDATE()>=dateexpired) and(enable=1)";
        $query=$pdo->prepare($sql);
        $query->execute();
      
        break;
    };
    case 'go_url':{
        //$url - индекс ссылки, пометим что по ней был выполнен клик
        $sql="update {$cfg['table']} set click=click+1 where id={$url}";
        $pdo->query($sql);
        //Если количество переходов превышает указанное то отключаем
        $sql="update {$cfg['table']} set enable=0 where (limitclick<>-1) and(click>=limitclick) and(enable=1) and( id={$url})";
        $query=$pdo->prepare($sql);
        $query->execute($b);
        //переход
        $sql="select url as url_banner from {$cfg['table']} where id={$url}";
        $query=$pdo->prepare($sql);
        $query->execute();
        $row=$query->fetch();  
        header('Location: '.$row['url_banner']);
        break;
    }
}
//Попрощаемся с базой
$pdo=null;
?>



Как будем вызывать банеры с сервера?
Давайте делать будем красиво, а именно в виде плагина к jQuery но об этом с следующей статье.

Комментариев нет:

Отправить комментарий