|
|
|
| На портале ШОС вверху страницы есть блок с баннерами (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
(03.02.2012 в 10:23)
| | Еще актуально. Спасибо | |
|
|
|
|
|
|
|
для: mihdan
(08.02.2012 в 00:10)
| | Не повторялись для конкретного пользователя (юзер на каждой следующей странице получает банеры которых еще не видел) или не повторялись в пределах одной страницы?
если первое, то нужно куки подключать
если второе, то нужно не ордер бай ранд, а выбирать все в массив, функцией shuffle() перемешать и выдать нужное количество из полученного массива подряд. | |
|
|
|
|
|
|
|
для: Sfinks
(08.02.2012 в 00:21)
| | shuffle тоже будет давать повторы, куки в помощь
1 - формируешь массив из баннеров
2 - перед выводом баннера проверяешь существование куки
- если нету, создаешь, и записываешь первую позицию [0] баннера в куку и выводишь баннер
- если есть, получаешь позицию из куки, удаляешь баннер по этой позиции через unset(), применяешь ф-цию shuffle, чтобы перемешать массив.......и когда будет выбран случайный баннер, его же позицию пишем в куку
Вот вроде бы и все, один и тот же баннер никогда не будет показан. | |
|
|
|
|
|
|
|
для: TetRiska
(08.02.2012 в 15:01)
| | У меня порядка 120.000 баннеров, так что формировать из них массив не представляется возможным.
Код вывода баннеров (РНР) находится на домене отличном от домена, где данный код вызывается. См. ссылку в первом посте.
Поэтому не понятно как привязаться к кукам, хотя Яндекс как-то делает :) | |
|
|
|
|
|
|
|
для: 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="пМЦБУ Й ЕЗП "бъ Й с""><img ... alt="пМЦБУ Й ЕЗП "бъ Й с""></a>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(09.02.2012 в 09:26)
| | Спасибо за замечание по поводу кодировки, но это вторая задача. Баннеры выводятся восемью запросами | |
|
|
|
|
|
|
|
для: 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
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(08.02.2012 в 00:21)
| | Не повторялись в пределах одной страницы. Менять можно только код на РНР. JavaScript трогать нельзя! | |
|
|
|
|
|
|
|
для: 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] и все. | |
|
|
|
|
|
|
|
для: Гавриленко Дмитрий
(08.02.2012 в 16:01)
| | Вы не прочитали условие задачи. Нужно получать баннеры не одним запросом с лимитом в 8 штук, а 8 запросов (по одному на каждый баннер). Это принципиально. Да и JavaScript код менять нельзя, только РНР, поэтому и задаю вопрос в этой ветке. | |
|
|
|
|
|
|
|
для: mihdan
(09.02.2012 в 02:40)
| | 1. Сохранять в сессии или куках ID показанных баннеров, в случае с ORDER BY RAND() и выбирать баннервы которые не входят в список показанных.
2. Сохранять в сессии или куках ID последнего показанного баннера, в случае если они будут выводиться по порядку из базы, и показывать 8 следующих баннеров идущих после последнего. | |
|
|
|
|
|
|
|
для: ONYX
(09.02.2012 в 02:58)
| | Так домены разные! Или я чего-то не понимаю | |
|
|
|