Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Избежать повторения баннеров на одной странице
 
 автор: mihdan   (03.02.2012 в 10:23)   письмо автору
 
 

На портале ШОС вверху страницы есть блок с баннерами (id=inforos_banner).
Вызываются они таким кодом:


<script type="text/javascript">
(function(){            
    var head = document.getElementsByTagName('head')[0];            
    var area = 'inforos_banner';
            
    for (var i = 0; i < 8; i++) {                                
        var ib = document.createElement('script');
        ib.type = 'text/javascript';        
        ib.src = 'http://unisco.ru/banners/infoshos/view.php?area='+area+'&width=130&height=44&amount=1';
        head.appendChild(ib);
    }
})();
</script>


А скрипт view.php берет из базы баннеры (ORDER BY RAND()) и выводит их через echo.


<?php
header
('Content-type: application/javascript; charset=UTF-8');
echo 
"document.getElementById('inforos_banner').innerHTML=document.getElementById('inforos_banner').innerHTML+'Код баннера';";
?>


Что можно придумать, чтобы баннеры не повторялись? Может добавить какое поле в таблицу или помудрить с куками (у меня ничерта не получилось)?

  Ответить  
 
 автор: mihdan   (08.02.2012 в 00:10)   письмо автору
 
   для: mihdan   (03.02.2012 в 10:23)
 

Еще актуально. Спасибо

  Ответить  
 
 автор: Sfinks   (08.02.2012 в 00:21)   письмо автору
 
   для: mihdan   (08.02.2012 в 00:10)
 

Не повторялись для конкретного пользователя (юзер на каждой следующей странице получает банеры которых еще не видел) или не повторялись в пределах одной страницы?

если первое, то нужно куки подключать
если второе, то нужно не ордер бай ранд, а выбирать все в массив, функцией shuffle() перемешать и выдать нужное количество из полученного массива подряд.

  Ответить  
 
 автор: TetRiska   (08.02.2012 в 15:01)   письмо автору
 
   для: Sfinks   (08.02.2012 в 00:21)
 

shuffle тоже будет давать повторы, куки в помощь

1 - формируешь массив из баннеров
2 - перед выводом баннера проверяешь существование куки
- если нету, создаешь, и записываешь первую позицию [0] баннера в куку и выводишь баннер
- если есть, получаешь позицию из куки, удаляешь баннер по этой позиции через unset(), применяешь ф-цию shuffle, чтобы перемешать массив.......и когда будет выбран случайный баннер, его же позицию пишем в куку

Вот вроде бы и все, один и тот же баннер никогда не будет показан.

  Ответить  
 
 автор: mihdan   (09.02.2012 в 02:38)   письмо автору
 
   для: TetRiska   (08.02.2012 в 15:01)
 

У меня порядка 120.000 баннеров, так что формировать из них массив не представляется возможным.

Код вывода баннеров (РНР) находится на домене отличном от домена, где данный код вызывается. См. ссылку в первом посте.

Поэтому не понятно как привязаться к кукам, хотя Яндекс как-то делает :)

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 09:26)   письмо автору
 
   для: mihdan   (09.02.2012 в 02:38)
 

Я в JS не шарю, поэтому не могу по коду понять, ПХП, который делает 8 запросов к базе, делает это 8 раз в одном запуске или вызывается 8 раз и возвращает по 1 банеру?
В первом случае перед выборкой создаете массив $bans = array() и запускаете цикл выборки. После каждого ответа БД проверяете есть ли возвращенный банер в $bans. Если нет - заносите, если есть, игнорируете и повторяете. После того как count($bans) станет ==8, формируете результирующий код и выводите.
Во втором случае немного сложнее. Стартуете сессию. Проверяете существует ли переменная $_SESSION['bans'] (она тоже будет массивом). Если нет - создаете. Дальше делаете запрос к бд, проверяете на совпадения, игнорируете или либо выводите код и заносите банер в массив. проверяете, если число банеров ==8, убиваете сессию session_unset(); session_destroy();

Это какой же процент дублей в БД, если из 120000 столько повторов выходит???
___
P.S. У вас проблема с кодировкой в банерах. Видели?
<a href="..." title="пМЦБУ Й ЕЗП &quot;бъ Й с&quot;"><img ... alt="пМЦБУ Й ЕЗП &quot;бъ Й с&quot;"></a>

  Ответить  
 
 автор: mihdan   (10.02.2012 в 23:37)   письмо автору
 
   для: Sfinks   (09.02.2012 в 09:26)
 

Спасибо за замечание по поводу кодировки, но это вторая задача. Баннеры выводятся восемью запросами

  Ответить  
 
 автор: Sfinks   (09.02.2012 в 10:03)   письмо автору
 
   для: mihdan   (09.02.2012 в 02:38)
 

Разглядел, что вызывается 8 раз. Можно так еще:
<?php
  session_start
();
  if(isset(
$_SESSION["bans_id"]))
    
$q "SELECT * FROM bans WHERE id_ban NOT IN ( {$_SESSION["bans_id"]} ) ORDER BY rand() LIMIT 1";
  else
    
$q "SELECT * FROM bans ORDER BY rand() LIMIT 1";
  
$ban mysql_fetch_array(mysql_query($q));
  if(isset(
$_SESSION["bans_id"])) $_SESSION["bans_id"] .= ",".$ban["id"];
  else                            
$_SESSION["bans_id"] = $ban["id"];
  
$count count(explode(",",$_SESSION["bans_id"]));
  if(
$count == 8){ session_unset(); session_destroy(); }
  
// теперь вывод кода полученного банера
  // по данным в $ban
?>

  Ответить  
 
 автор: mihdan   (09.02.2012 в 02:34)   письмо автору
 
   для: Sfinks   (08.02.2012 в 00:21)
 

Не повторялись в пределах одной страницы. Менять можно только код на РНР. JavaScript трогать нельзя!

  Ответить  
 
 автор: Гавриленко Дмитрий   (08.02.2012 в 16:01)   письмо автору
 
   для: mihdan   (03.02.2012 в 10:23)
 

У можно извлечь сразу нужное кол-во банеров, в PHP сделать так

<?php
//
// SELECT * ...... ORDER BY RAND() limit 8


echo 'var banners = new Array()';

while(
$row mysql_fetch_array($result))
{
echo 
"\n";
echo 
'banners.push('.$row['banner'].')';

{

//
?>


Где $row['banner'] твой код от баннера.

JS код измени так, что бы document.getElementById('inforos_banner').innerHTML=document.getElementById('inforos_banner').innerHTML+'Код баннера'; был в самом HTML файле, а точнее в том цикле. Вместо "Код баннера" поставишь banners[i] и все.

  Ответить  
 
 автор: mihdan   (09.02.2012 в 02:40)   письмо автору
 
   для: Гавриленко Дмитрий   (08.02.2012 в 16:01)
 

Вы не прочитали условие задачи. Нужно получать баннеры не одним запросом с лимитом в 8 штук, а 8 запросов (по одному на каждый баннер). Это принципиально. Да и JavaScript код менять нельзя, только РНР, поэтому и задаю вопрос в этой ветке.

  Ответить  
 
 автор: ONYX   (09.02.2012 в 02:58)   письмо автору
 
   для: mihdan   (09.02.2012 в 02:40)
 

1. Сохранять в сессии или куках ID показанных баннеров, в случае с ORDER BY RAND() и выбирать баннервы которые не входят в список показанных.
2. Сохранять в сессии или куках ID последнего показанного баннера, в случае если они будут выводиться по порядку из базы, и показывать 8 следующих баннеров идущих после последнего.

  Ответить  
 
 автор: mihdan   (10.02.2012 в 23:36)   письмо автору
 
   для: ONYX   (09.02.2012 в 02:58)
 

Так домены разные! Или я чего-то не понимаю

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования