Ахтунг крутые Php программеры!!!

eof-

Member
Joined
Jan 23, 2005
Messages
63
Reaction score
0
Age
31
Добрый день!

О крутые PHP программеры!!! =) Помогите мне пожалуйста реализовать скрипт из книжки! Я пытался раз уже 10 и никак :mad:
ПОЖАЛУЙСТА помогите реализовать ИМЕННО (!!!) этот скрипт!

---------------------------------------------------------------------------------
Не секрет, что в наше время интернет страницы просто переполнены графикой. Без этого уже трудно представить себе какой-нибудь популярный проект. Одна часть этой графики — дизайн сайта, другая — баннеры (рекламная информация других сайтов в виде графической, часто даже анимированной, картинки). Посетителей это может раздражать, но все же хорошо сделанный баннер привлекает внимание к себе и, как следствие, к рекламируемому ресурсу. Мы поговорим не о самих баннерах, а о системах управления ими.
Если вам удалось сделать хороший, полезный и посещаемый интернет-проект, значит, вы неизбежно сталкивались с баннерами. Часто Web-мастеры предлагают обмен, иногда самому хочется разместить свой баннер на каком-либо ресурсе. В любом случае очень полезно иметь информацию о том, сколько раз ваш баннер был показан и показывается ли он вообще. Это избавит от необходимости раз в неделю (день, месяц, год и т.д.) проверять, работает ли ваш баннер на чужом сайте или давно удален.
Первое, что необходимо сделать, — определиться с кодом баннера. Код выглядит, как правило, так:

<а href="http://myhost.com">
<IMG SRC="http://myhost.com/ banner.gif" alt="Mou баннер" border="0">
</a>

Конечно, это только шаблон, но с его помощью мы сможем построить то, что будет нужно. А нужно нам будет знать, сколько раз показывается тот или иной баннер на определенном сайте и, допустим, время последнего показа.
Для этого надо выделить один файл учета. Структура файла выглядит следующим образом: каждая строка соответствует одному из сайтов, на котором показывают ваши баннеры. Разделителем между строками является, как обычно, перевод строки. Разделителем в строке между информационными данными можно выбрать символ ^. Этот символ не встречается в адресной строке браузера и нам очень подходит.
Структура строки файла базы данных:

Адрес ^ время последнего посещения ^ количество посещений

Таким образом, получится три поля, которые нужно в дальнейшем будет менять в зависимости от того, откуда вызывается баннер. Чтобы это знать, надо ввести в код баннера специальный параметр — идентификатор сайта. Для каждого из сайтов, участвующих в обмене баннерами, идентификатор должен быть различным.
Чтобы обработать этот идентификатор, вам потребуется вызывать не сам баннер, а специальный скрипт РНР, который сначала обработает все данные, а затем выведет на экран нужный баннер. Вот что у нас получилось из кода баннера:

<а href="http://myhost.com">
<IMG SRC="http://myhost.com/banner.phtml?id=1" alt="Mou баннер" border= "0">
</a>

Как видите, поменялось имя файла и добавился параметр id. Теперь вызывается не непосредственно сам баннер, а скрипт banner.phtml, который и ведет статистику показов и времени посещения. В конце скрипта должен обязательно быть переход на баннер вот в таком виде:

header ("Location: banner.jpg");

Теперь перейдем к вопросу о ведении статистики. Несложно сделать простой подсчет показов — достаточно считать в массив базу данных посещений, и затем увеличить на единицу ячейку массива с индексом, соответствующим переменной id. Это наш идентификатор.
Однако у нас более сложная задача — организовать возможность просмотра всей статистики в дальнейшем и запомнить время последнего показа баннера. Значит, необходимо записывать в базу и время, и адрес сайта, с которого вызывается баннер. Адрес мы будем запоминать только для того, чтобы в дальнейшем можно было узнать статистику показов, а в самой процедуре подсчета он не учавствует
Итак, наш скрипт прежде всего должен проверить на правильность полученную переменную $id. Если она не больше установленного значения и не меньше ноля, то все нормально, иначе присваиваем переменной $id ноль или выводим сообщение об ошибке (как кому как нравится). Значение переменной $id с индексом ноль нужно специально зарезервировать для таких случаев, когда помещен неправильный код.
Если же все нормально, а так чаще всего и бывает, скрипт должен считать в память файл с базой данных:

$adds = "url.txt";
$txt = file($adds);

Вся информация оказывается в массиве с именем $txt. Идентификатор указывает на индекс элемента массива, содержащего данные сайта, с которого вызван баннер. Обратиться к этим данным очень просто:

$str = trim(str_replace ("\n","", $txt [$id]));

Одновременно мы удалили пробелы в начале и в конце строки и символ перевода строки.
Можно при необходимости проверить, есть ли такая учетная запись. Дальше надо разложить информацию на три составляющие — адрес, время последнего доступа и количество показов. Вот как это проще всего сделать:
list ($add, $time, $counter) = split ("^", $str);
Мы использовали наш разделитель — ^. Вся информация извлечена, теперь ее надо обновить и снова записать в файл. Для этого нужно просто увеличить переменную $counter на единицу, считать текущее время и присвоить его значение.
Если со счетчиком все ясно, то текущее время требует пояснения. Лучше и проще всего считывать его в формате Unix (см. приложение 6). Полученное значение будет равно количеству секунд, прошедшему с 1 января 1970 года. Это количество секунд очень легко преобразуется в дальнейшем в конкретные даты, а хранить его еще проще, так как это, по сути, просто большое число.
Получить его можно так:
$time = time(void); $counter++;
Заодно увеличили показания счетчика. Теперь осталось только записать всю информацию снова в файл. Объединяем строку и заносим полученное значение в нужную ячейку массива (напомню, на нее указывает идентификатор в переменной $id):
$txt[$id] = $add."^".$time."^".$counter."\n";
И тут тоже не забываем о нашем разделителе и о переводе строки в конце для правильного считывания в дальнейшем. Перед тем как записать весь массив в файл с базой данных, необходимо сначала объединить массив в одну строку:

$str= implode("", $txt) ; $fp =fopen("$adds, "w") ;
if ($fp) {$fw = fwrite($fp, $str) ; fclose ($fp);}
Вот и все, так как все поставленные задачи мы выполнили.
 

jonjonson

Member
Joined
Mar 4, 2004
Messages
145
Reaction score
28
Age
52
Либо покажи не работающий код, что бы тебе можно было помочь его поправить.
Либо говори, сколько готов заплатить за готовый скрипт.
 

eof-

Member
Joined
Jan 23, 2005
Messages
63
Reaction score
0
Age
31
Да че то я код сразу не выложил... Извини! Вот:
---------------file_baner.php-------------- "тут код банера"
<html>
<body>
<a href="http://myhost.com"><img src="baner.php?id=1" alt="My baner" border="0"></a>
</body>
</html>
------------------------------------
-------------------url.txt------------------ "база данных"
www.mail.ru^19.08.2005^0
--------------------------------------------
------------------baner.php------------- собственно скрипт
<html>
<head>
<title></title>
</head>
<body>
<?php
/*тут надо проверить значение переменной id
1-я непонятная вещь: в файле file_baner.php я пишу, что src="baner.php?id=1"
но КАК скрипт baner.php получит значение переменной id????? это же не GET и не POST!!!*/
$adds="url.txt";
$txt=file($adds);
$str=trim(str_replace ("\n","",$txt[$id]));
list ($add, $time, $counter)=split("^", $str);
$add=$add;//т.е эту переменную я не трогаю
$time=time (void);
$counter++;
$txt=$add."^".$time."^".$counter."\n";
$str=implode ("", $txt);
$fp=fopen ($adds, "w");
if ($fp) {$fw=fwrite ($fp, $str); fclose($fp);}
header ("Location: baner.jpg");
?>
</body>
</html>
---------------------------------------------
 
Last edited by a moderator:

jonjonson

Member
Joined
Mar 4, 2004
Messages
145
Reaction score
28
Age
52
тут надо проверить значение переменной id
1-я непонятная вещь: в файле file_baner.php я пишу, что src="baner.php?id=1"
но КАК скрипт baner.php получит значение переменной id????? это же не GET и не POST!!!
Передача параметра в URL в данном случае и будет соответствовать запросу GET
и определить ее значение можно через $_GET
PHP:
if(isset($_GET["id"]) &&             // параметр id в URL определен
   0 <= (int) $_GET["id"] &&         // id больше или равен 0 (0 - первая зап. в массиве)
   count($text) > (int) $_GET["id"]){    // id попадает в размер массива
   // вносим изменения в статистику...
   $str=trim($txt[(int)$_GET["id"]]); // str_replace ("\n","", бла) не нужна, ибо 
                                                        // trim и ак уберет перевод строки
   // ...
}
 
Last edited by a moderator:

eof-

Member
Joined
Jan 23, 2005
Messages
63
Reaction score
0
Age
31
ок. Это поправил. Спасибо. Хоть он и продолжает не писать в файл=(

А вот еще! Почему тогда на file_baner.php у меня иконка не отображается?

Вот мое творение =( : http://rapidshare.de/files/4544556/111.rar.html
 

jonjonson

Member
Joined
Mar 4, 2004
Messages
145
Reaction score
28
Age
52
Посмотрел твои исходники и ужаснулся. Это и не должно работать. Ты совсем не разобрался в порядке действий, не говоря уже в самом php.

Вот навоял тут рабочий код...

// baner.php
PHP:
<?php

$baners_file="url.txt";

if(!file_exists($baners_file)) die("Error: File not found!");

$links_list = file($baners_file);

if(!is_array($links_list) || !$links_list) die("Error: File is empty!");


if(isset($_GET["id"]) && array_key_exists((int)$_GET["id"], $links_list)){
    // считаем для полученного id
    list ($url, $time, $counter) = explode("^", $links_list[(int)$_GET["id"]]);
    $time=time();
    $counter = $counter+1;
    // подгатавливаем информацию для записи в файл
    $text = "";
    foreach($links_list as $key => $value){
        if($key == (int)$_GET["id"]){
            $text .= "$url^$time^$counter";
        }else{ 
            $text .= "$value";
        }
    }
    // записываем
    $fp= fopen($baners_file, "w");
    if($fp){
        fwrite($fp, $text);
        fclose($fp);
        // редиректим на картинку банера
        header ("Location: /baner.jpg");
    }
}else{
    // id не определен или не правильный?
    // все одно редиректим на картинку банера
    header ("Location: /baner.jpg");
}
?>

// код банера на одной странице page01.php
HTML:
<a href=""><img src="paner.php?id=0" alt="My baner" border="0"></a>

// код банера на одной странице page02.php
HTML:
<a href=""><img src="paner.php?id=3" alt="My baner" border="0"></a>

// url.txt
http://mail.ru^0^0
http://mail.com^0^0
http://mail.uz^0^0
http://mail.org^0^0

// и еще файл для просмотра статистики stat.php
PHP:
<?php

$baners_file="url.txt";

if(!file_exists($baners_file)) die("Error: File not found!");

$links_list = file($baners_file);

if(!is_array($links_list) || !$links_list) die("Error: File is empty!");
?>
<b>Baner stat:</b><br>
<table width="100%" border="1">
  <tr>
    <td align="center">baner id</td>
    <td align="center">url</td>
    <td align="center">last show</td>
    <td align="center">counter</td>
  </tr>
<?
foreach($links_list as $id => $info_string){ 
    $info_array = explode("^", $info_string);
?>
  <tr>
    <td align="center"><?=$id?></td>
    <td align="center"><?=$info_array[0]?></td>
    <td align="center"><?=date("Y-m-d H:i:s", $info_array[1])?></td>
    <td align="center"><?=$info_array[2]?></td>
  </tr>
<? } ?>
</table>
 
Last edited by a moderator:

eof-

Member
Joined
Jan 23, 2005
Messages
63
Reaction score
0
Age
31
jonjonson! Гениально! Я согласен, критика справедлива на все 100! Но не судите строго! Я запустил, все афигенно работает! Ты очень крут в PHP! Спасибо тебе огромное!!!!
 
Top