Ana Claudia

Programação e Design Web

Banners Aleatórios

posted by Ana Claudia On fevereiro - 1 - 2009 9 COMMENTS

Banners são anúncios, que geralmente são exibidos no topo, mas podem ser exibidos em qualquer outro lugar da tela. Eles podem ser exibidos numa ordem pré-definida ou simplesmente não ter uma ordem, que será o demosntrado neste post. Uma boa prática é contabilizar o número de vezes que o banner foi mostrado (views) e quantas vezes ele foi clicado (clicks) para se definir se o banner está atingindo as metas estabelecidas para ele. Neste post irei demostrar todo o processo de gravação das informações do banner e imagens até a exibição do banner e a contagem de views e clicks.
O primeiro passo é criar uma pasta onde você irá organizar as imagens de seus banners. A minha pasta eu dei o nome de banner_img. Em seguida, crie em seu banco de dados uma tabela chamada banner, que guardará as informações do banner:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE banner(
 banner_id INT(4) NOT NULL auto_increment,
 banner_nome VARCHAR(64) DEFAULT NULL,
 banner_url VARCHAR(255) DEFAULT NULL,
 banner_imagem VARCHAR(100) DEFAULT NULL,
 banner_texto_html TEXT,
 impressoes_expira int(5) DEFAULT '0',
 banner_data_expira DATETIME DEFAULT NULL,
 banner_data_agendada DATETIME DEFAULT NULL,
 banner_data_adicionada DATETIME DEFAULT NULL,
 banner_data_status DATETIME DEFAULT NULL,
 banner_status TINYINT(3)  DEFAULT NULL,
 PRIMARY KEY(banner_id)
);

Em seguida vamos criar a tabela banner_historico, que guardará as informações de views e clicks.

1
2
3
4
5
6
7
8
CREATE TABLE banner_historico(
 banner_id_historico int(10) NOT NULL auto_increment,
 banner_id int(4) default NULL,
 banner_view int(10) default NULL,
 banner_click  int(10) default NULL,
 banner_data_historico DATETIME default NULL,
 PRIMARY KEY (banner_id_historico)
);

Em seguida devemos criar o arquivo que fará a conexão com o Mysql e com o banco de dados respectivamente. Ele será incluido nas páginas PHP que necessitam fazer as operações no Mysql, como selecionar, inserir e atualizar as tabelas.
conexao.php

1
2
3
4
5
6
7
8
9
10
11
<?
     $server   = "localhost"; //nome do servidor Mysql, geralmente Localhost
     $user     = "root";      //nome do usuario Mysql
     $password = "123";       //senha do usuario
     $bd       = "banners";    //nome do banco de dados onde esta a tabela
 
    //Conectando ao Mysql
    $conn = mysql_connect($server,$user,$password);
   //Conctando ao banco de dados
   mysql_select_db($bd,$conn);
?>

A seguir, vamos criar o formulário onde serão colocados os dados para posterior gravação na tabela banner.
banner_cadastro.php

1
2
3
4
5
6
7
8
9
10
<form id="frm_banner" method="post" action="banner_cadastrar.php"  enctype="multipart/form-data">
 <p>Nome: <input name="banner_nome" type="text" size="50" /></p>
 <p>Link: <input name="banner_url" type="text" size="50" /> <p>
 <p>Imagem: <input name="banner_imagem" type="file" size="50" ></p>
 <p>Texto HTML<br /><textarea name="banner_texto_html" cols="50" rows="5"></textarea></p>
 <p>Agendado para: <input name="banner_data_agendada" type="text" size="10" maxlength="10" /> dd/mm/aaaa</p>
 <p>Expira em:<input name="banner_data_expira" type="text" size="10" maxlength="10" /> ou após <br />
    <input name="impressoes_expira" type="text" size="4" />impressões</p>
 <p><input name="btn_salvar" type="submit" value="Salvar" /></p>
</form>

Verificando o formulário acima já podemos perceber como o banner irá se comportar. Temos os campos “Imagem” e “Texto HTML”, onde o primeiro irá exibir a imagem do banner, e o segundo irá criar um banner em HTML. Apenas um destes campos devem ser preenchidos, mas caso os dois sejam preenchidos um deles deve ter prioridade de visualização. No meu caso escolhi o texto html para ser exibido, como você pode acompanhar mais adiante. O campo “Agendado para” permite agendar uma data para começar a exibir o banner. O campo “Expira em” define uma data para terminar de exibir o banner, bem como o campo seguinte, que define quantas vezes o banner deve ser mostrados até que ele pare de ser exibido.

banner_cadastrar.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?
   require_once("conexao.php");
   $banner_nome  = $_REQUEST["banner_nome"];
   $banner_url	 = $_REQUEST["banner_url"];
   $banner_imagem = $_FILES["banner_imagem"];
   $banner_texto_html = $_REQUEST["banner_texto_html"];
   $banner_data_agendada = $_REQUEST["banner_data_agendada"];
   $banner_data_expira = $_REQUEST["banner_data_expira"];  	     
   $impressoes_expira = $_REQUEST["impressoes_expira"];
 
   if(empty($expira_impressoes)) $expira_impressoes = 0;
 
   //1. Cadatrar o banner na tabela
   $SQL = "INSERT INTO banner SET 
   banner_nome='$banner_nome',banner_url='$banner_url',   
   banner_texto_html='$banner_texto_html',
  impressoes_expira='$impressoes_expira',banner_status='1',
   banner_data_adicionada = NOW(),banner_data_status=NOW()";
 
   //só insere a data_agendada se a a variavel não estiver vazia
   if(!empty($banner_data_agendada)) 
     $SQL .= ", banner_data_agendada = '".retornaData($banner_data_agendada)."'";
 
   if(!empty($banner_data_expira))
     $SQL .= ", banner_data_expira = '".retornaData($banner_data_expira)."'";
 
    $result = mysql_query($SQL,$conn) or die(mysql_error());
    //Código seguencial do banner recém cadastrado; 
    $banner_id = mysql_insert_id($conn); 
 
   //2. Cadatrar o histórico do banner
   $SQL = "INSERT INTO banner_historico SET
   banner_id = '$banner_id',
   banner_view  = '0',
   banner_click = '0'";
   $result = mysql_query($SQL,$conn) or die(mysql_error());
 
   //3. Inserir Imagem do Banner  (se houver)
   if(!empty($banner_imagem["name"]))
   {
     $ext   = strtolower(substr($banner_imagem["name"],-4));
     $name = substr($banner_imagem["name"],0,strlen($banner_imagem["name"])-4)."_".$banner_id;
     $banner_imagem_arq  = $name.$ext;
 
     if(!copy($banner_imagem["tmp_name"],"banner_img/".$banner_imagem_arq))
     {
      echo "Aconteceu um erro durante o envio da imagem ".$banner_imagem["error"]."<br />";
      exit();
     }
     else
    {
       //Atualiza a tabela de banner para com o nome do arquivo a imagem
       $SQL = "UPDATE banner SET banner_imagem='$banner_imagem_arq' 
       WHERE   banner_id='$banner_id'";
       $result = mysql_query($SQL,$conn) or die(mysql_error());
    }
  }
  header("location: banner_cadastro.php");
 
  function retornaData($data)
  {
      return implode("-",array_reverse(explode("/",$data)));
  }
?>

No código acima vamos inserir efetivamente as informações do banner na tabela (linhas 14 a 27). Os campos banner_data_agendada e banner_data_expira só serão gravados na tabela, caso os mesmos não estejam vazios. O campo expira_impressoes guardará o número de impressões que serão feitas deste banner até que este não seja mais visualizado, cada vez que o banner é visualizado, é subtraido uma impressão deste campo. Na linha 29, será pego o código de Identificação (ID) do registro recém inserido na tabela banner, para que possamos inserir seu histórico na tabela banner_historico e a informação da imagem, se existir, na tabela banner.
Nas linhas 33 a 37, será inserido o histórico do banner, ou seja os clicks e views do banner. Como ainda não existem essas informações, os campos banner_view e banner_click serão gravados com 0.
A partir da linha 40 até 57, é feita o upload da imagem do banner e a atualização da tabela banner para guardar o nome do arguivo gerado. Esse código só será executado caso tenha sido escolhido uma imagem no formulário. Nas linhas 42 a 44 eu personalizei o nome do arquivo para inserir o ID do registro após o nome do arquivo, para que não haja problemas de sobreposição de arquivos. Logo após o cadastro do banner, a página será redirecionada novamente para o formulário de cadastro do banner.
Nas linhas 60 a 63, há a funçao retornaData, que irá converter data do formato dd/mm/aaaa (dia/mes/ano) para o formato aaaa-mm-ddd (ano-mês-dia), que é o formato que o Mysql compreende. Para visualizar a ordem aleatória dos banner, recomendo que se cadastre 5 ou
mais banners para teste.

Agora vamos ver como os banners serão exibidos na tela no código a seguir:
mostra_banner.php – parte 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 <?
   require_once("conexao.php");
   $SQL = "SELECT b.banner_id,b.banner_nome, b.banner_url,b.banner_imagem,b.banner_texto_html
   FROM banner b
   INNER JOIN banner_historico bh  ON  b.banner_id = bh.banner_id
   WHERE banner_status = '1'
   AND ((impressoes_expira - banner_view) > 0 OR banner_data_expira < NOW())
   AND (banner_data_agendada >= NOW() OR banner_data_agendada IS NULL)
   ORDER BY RAND() LIMIT 1";
   $rs = mysql_query($SQL,$conn) or die(mysql_error());
 
   while($banner = mysql_fetch_array($rs))
   {
      //1. Verificar tipo (HTML tem prioridade)
      if(!empty($banner["banner_texto_html"]))
        $conteudo = $banner["banner_texto_html"];
      else if(!empty($banner["banner_imagem"]))
      {
          $conteudo = "<img src='banner_img/".$banner["banner_imagem"]."' alt='".$banner["banner_nome"]."'
          border='0'  id='img_banner' />";
      }
      $link = "<a href='conta_click_banner.php?banner_id=".$banner["banner_id"].
     "&amp;url=".$banner["banner_url"]."'>".$conteudo."</a>";
   }
   echo "<div id='banner'>$link</div>\n";
?>

Na query acima (linhas 3 a 9), será exibido somente os banners ativos (linha 6), ou seja, qualquer coisa com status diferente de 1 será ignorada. Nas linhas 7 e 8 será feito as verificações necessárias para a visualização do banner (data e número de impressões). A “mágica” da visualização não seguencial está na função que é o reposnsável por embaralhar os registros da tabela banner. Como só queremos que seja exibido um banner por vez, a instrução LIMIT se encarrega disso, onde 1 é o numero de registros a ser exibidos. Em seguida é criado o link e exibido o banner(linhas 12 a 25) , lembrando que o texto HTML tem prioridade sobre a imagem.

Agora vamos contablilizar a view do banner e guardar a informação na tabela banner_historico.Obs: Essa parte deve ser colocada antes do fechar o “while”
mostra_banner.php – parte 2

22
23
24
25
26
27
28
29
<?
    //2. Cadastrar impressão
    $SQL = "UPDATE banner_historico SET
    banner_view           = banner_view + 1,
    banner_data_historico = NOW()
    WHERE banner_id = '".$banner["banner_id"]."'";
    $result = mysql_query($SQL) or die(mysql_error());
?>

No código acima, podemos perceber na query, na linha 25, que o campos banner_view foi acrescentado 1 a ele. Na linha 26, o campo banner_data_historico atualiza a data que a modificação foi feita, ou seja, a data que foi feita a última visualização do banner.

E por último, mas não mais importante, vamos contablizar o click feito pelo usuário no banner.
conta_click_banner.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
   require_once("conexao.php");
   $banner_id   = $_GET["banner_id"];
   $url         = $_GET["url"];
   if(strpos($url,"http://") === false)
     $url = "http://". $url;
 
   //Cadastrar clique
   $SQL = "UPDATE banner_historico SET banner_click = banner_click + 1 WHERE   banner_id = '$banner_id'";
   $result = mysql_query($SQL) or die(mysql_error());
 
   //Redirecionar para o link do banner
   header("location: $url");
?>

O que fizemos no código acima foi, acrescentar mais uma click ao campo banner_click do banner( linha 9) e a seguir redirecionamos para o link do banner (linha 13).
E aqui termino meu tutorial sobre banners aleatórios. Uma dica que eu deixo é colocar na tabela um campo para cadastro de tamanho do banner, para que seja possivel ter um banner com tamanho dinâmico.
Aproveitando a oportunidade gostaria que sugerissem assuntos para os posts seguintes para que esse blog para a melhoria contínua deste blog.

Categories: HTML, Mysql, PHP

9 Comments

  1. Faz tempo que eu estava procurando isso!!rs valeu!!

    olha sh..acessa ai http://www.projetofamiliaforte.com.br Eh o blog do meu pai, e nao tem nenhum leitor no widget do BlogBlogs…da uma força ai!!!rsrs Valeu!!

  2. eu estava a muito tempo atras disso mesmo só que eu fiz aqui tudo criei bem direitinho só que ta dando esse erro aqui!

    PHP Warning: require_once(conexao.php) [function.require-once]: failed to open stream: No such file or directory in E:\home\hgbblog\Web\banner\banner_cadastrar.php on line 2
    PHP Fatal error: require_once() [function.require]: Failed opening required ‘conexao.php’ (include_path=’.;C:\php5\pear’) in E:\home\hgbblog\Web\banner\banner_cadastrar.php on line 2

    se poder ajudar eu agradeço muito obrigado!

  3. Ola Hugo

    O problema pode estar ocorrendo porque você pode ter esquecido de criar o arquivo conexao.php ou criado com outro nome

  4. certo relamente errei feio salvei o arquivo com ~ mais tudo bem corrigo eu creio! quando publico o banner ele não da msg de feito com sucesso mais não da mais erro! agora eu queria saber o seguinte ja registrei 2 banners mais não aparece ou se não estou olhando na pagina errada!posso esta errando alguma coisa tbm! pode me ajudar?

  5. Gente havia um erro no script,no arquivo mostrar_banner – parte 1, na linha 8. Onde antes era
    AND (banner_data_agendada < = NOW() OR banner_data_agendada IS NULL)

    agora é

    AND (banner_data_agendada >= NOW() OR banner_data_agendada IS NULL)

    Ou seja, a data de agendamento para mostrar o banner deve ser maior ou igual a data atual, e não menor ou igual a data atual.

    Graças a ajuda do Hugo que não estava vendo o banner na tela, eu revisei a consulta e vi que estava errado

    Foi mal Galera

  6. cara ana claudia estou adorando aqui o seu site me ajudo muito certo mais assim sem querer ser chato hehehe

    mais continua dando erro não aparece fica branco direto e nem atualizando muda!

    então queria saber se eu tenho que posta os banners de novo?

  7. vc quer todos os codigos? ou basta o que vai mostra-lo?

  8. podemos falar no msn se vc poder é que eu to precisando só disso para concluir meu site se poder eu agradeço muito!

  9. conseguir peço desculpas pra vc ana pois estava postando no local errado o banner eu teria que colocar no caso link pq no texto html não estava dando certo e depois que coloquei o link deu certo então a mesma coisa que eu coloquei no link eu coloquei no tesxto tbm pra garantir que iria dar certo! mil desculpas pelas duvidas pois estou começando a mexer com isso agora obrigado mesmo seu post foi de muito valor pra mim e vc explico muito bem! obrigado mesmo até pela correção valeu mesmo ana parabens ai!

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Comentários Recentes

  • Hugo: conseguir peço desculpas pra vc an
  • Hugo: podemos falar no msn se vc poder é
  • Hugo: vc quer todos os codigos? ou basta
  • Hugo: cara ana claudia estou adorando aqu
  • Ana Claudia: Gente havia um erro no script,no ar
  • Hugo: certo relamente errei feio salvei o