[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ротация баннеров ("крутящийся барабан")
Turboworld1
Добрый день!

Есть сайт, на нем есть несколько рекламных мест. На каждом из рекламных мест крутятся баннеры (не более N штук на место).

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


<?php
$n=5;
$rnd_value=mt_rand(1,$n);

if ($rnd_value==1) {
// Показываем баннер номер 1
};

if ($rnd_value==2) {
// Показываем баннер номер 2
};

....


if ($rnd_value==5) {
// Показываем баннер номер 5
};
?>


Такой способ (случайный выбор номера баннера из заданного диапазона) неплох, но имеет недостатки в эффективности. А именно - например, одному посетителю может показаться баннер №1 - 3 раза, а другому посетителю баннер №2 тоже 3 раза, третьему посетителю баннер №3 так же 3 раза. Вроде бы баннеры показывались одинаковое количество раз, но распределение показов по посетителям жутко неравномерное.

Это навело меня на мысль о том, что лучше показывать баннеры в ротации не случайным образом, а по принципу "крутящегося барабана", т.е. последовательность баннеров будет жестко заданной и для каждого посетителя она будет одинаковой. Например посетитель ходит по ссылкам внутри сайта и баннеры меняются таким образом: 1 --> 2 --> ... --> N, затем опять показывается 1-ый, 2-ой и т.д..

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

И написал я следующий код:


<?php

$rot_min=1;
$rot_max=5;

if (!(isset($_SESSION['rotator']))) {
// Если нет в сессии еще переменной ротации (первый заход), тогда ее создаем.
$_SESSION['rotator']=$rot_min;
$rnd_value=$_SESSION['rotator'];
} else {
// Если уже есть переменная ротации
$rnd_value=$_SESSION['rotator'];
};

// Показываем баннер

if ($rnd_value==1) {
// Показываем баннер номер 1
};

if ($rnd_value==2) {
// Показываем баннер номер 2
};

....


if ($rnd_value==5) {
// Показываем баннер номер 5
};


// Делаем +1 шаг по "барабану"

$_SESSION['rotator']=$_SESSION['rotator']+1;
// Если перескочили за максимум, тогда возвращаем к минимуму
if ($_SESSION['rotator']>$rot_max) {
$_SESSION['rotator']=$rot_min;
};



?>


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

Но если начать переходить со страницы на страницу - тогда получаются прыжки через одного в последовательности баннеров... Отчего получается так, что в этом случае баннеры показываются не с шагом 1? :unsure:

Пример:
Показ баннера №1
Показ баннера №3
Показ баннера №5
Показ баннера №2
Показ баннера №4

:blink:

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

P.S.: код вставки ротатора баннеров одинаков.










Спустя 4 часа, 4 минуты, 23 секунды (27.05.2011 - 22:50) Snus написал(а):
Используй куки, записывай id последнего показанного баннера и прибавляй единицу.

setcookie('val', $id);
$_COOKIE['val'];

Спустя 52 минуты, 38 секунд (27.05.2011 - 23:43) Turboworld1 написал(а):
Благодарю за совет! Попробую...

Но мне интересно еще - почему сессии пробуксовывают? huh.gif

Спустя 2 дня, 13 часов, 30 минут, 4 секунды (30.05.2011 - 13:13) Turboworld1 написал(а):
C куками всё получилось.
Только пришлось перенести скрипт чтения/записи куков отдельным файлом и вставить его ДО команд вывода.

Может и со сессиями поэтому проблема была, что надо было код поднять ДО операций вывода (echo и прочие), т.е. до отправки HTTP-заголовков? unsure.gif

Спустя 2 минуты, 19 секунд (30.05.2011 - 13:15) neadekvat написал(а):
Turboworld1, кукисы - это тоже часть заголовка (а не заголовков), поэтому их надо ставить до любого вывода информации на экран, да.

Спустя 21 минута, 36 секунд (30.05.2011 - 13:37) Turboworld1 написал(а):
А сессии? Как-нибудь завязаны на http-заголовок?

Спустя 6 часов, 24 минуты, 2 секунды (30.05.2011 - 20:01) Turboworld1 написал(а):
Почему не работало со сессиями, я не знаю. Сессии никак не завязаны с http-заголовком и командами вывода?

В общем, сделал я на кукисах. Код см. ниже. Так всё работает.

Этот кусок кода должен быть вставлен ДО команд вывода:
// ++++++++++++++++++++++++++++++++++++++++++++++++

// Вычисляем переменную $banner2 (номер для показа баннера формата 240x400)


$banner2_min=1;

$banner2_max=5;

if (isset($_COOKIE['bnr2'])) {

// Если уже есть переменная ротации, тогда считываем ее - получаем НАСТОЯЩЕЕ значение

$banner2=$_COOKIE['bnr2'];

} else {

// Если нет в куках еще нет переменной ротации (первый заход), тогда ее ставим.

$banner2=mt_rand($banner2_min,$banner2_max);

setcookie('bnr2', $banner2, time()+60*60*24*30); // на 30 дней

};

// Записываем в куки СЛЕДУЮЩЕЕ значение для переменной

if ($banner2+1<=$banner2_max) {

setcookie('bnr2', $banner2+1);

} else {

// Если перескочили за максимум, тогда возвращаемся на минимум

setcookie('bnr2', $banner2_min);

};

// ++++++++++++++++++++++++++++++++++++++++++++++++




А это уже код вывода самих баннеров:


if ($banner2==1) {

// Выводим баннер 1

};

if ($banner2==2) {

// Выводим баннер 2

};

if ($banner2==3) {

// Выводим баннер 3

};

if ($banner2==4) {

// Выводим баннер 4

};

if ($banner2==5) {

// Выводим баннер 5

};





Спустя 6 часов, 56 минут, 31 секунда (31.05.2011 - 02:57) kirik написал(а):
Цитата (Turboworld1 @ 30.05.2011 - 13:01)
Сессии никак не завязаны с http-заголовком и командами вывода?

Завязаны. При установке сессии клиенту отправляется заголовок, устанавливающий сессионную куку, а потом клиент эту куку отправляет серверу при каждом последующем обращении.
А вы стартовали сессию (session_start()) перед тем как использовать сессионные переменные? Если что функция session_start() тоже должна вызываться до любого другого вывода (если только не используется буферизация выводимого контента).

Спустя 21 день, 14 часов, 1 минута, 21 секунда (22.06.2011 - 16:59) Turboworld1 написал(а):
В общем, прикол biggrin.gif

Заметил и с куками такую же фигню (сабж). В ротации было 2 баннера на 1 место. При этом когда переходил по пунктам меню - получалось что видел всегда 1 баннер, при нажатии просто F5 баннеры менялись нормально.

Причина сего действа оказалась нетривиальной. Пункты меню у меня - это <div></div> с событием onclick. А внутри дива уже ссылка <a>. Дык вот если кликать на ссылку - то отрабатывали ДВА запроса GET - сначала переход по ссылке, а через несколько миллисекунд уже onclick. Получалось что кука считывалась и ставилась дважды. И получалось, что я видел всегда один баннер (двойной проворот "барабана" из двух сторон). Если баннеров больше - то происходил переход по сторонам барабана с шагом 2 ("двойной" шаг). В итоге, если баннеров четное число - половина баннеров не показывалась при переходах по ссылкам меню (т.к. при таком раскладе - с шагом 2 - показывались либо только четные, либо только нечетные).

Обнаружил я это, услышав "двойной" звук клика по ссылкам меню в браузере (у меня Avant Browser).

Так что вот такая загогулина biggrin.gif Вероятно и со сессиями такое же было точно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.