Sistema De Notícias Em PHP E MySQL Parte2

Outros artigos desta série Sistema de Notícias em PHP e MySQL:

Estrutura Do Sistema de Notícias

Upload De Imagens

Decidi atender ao pedido de um leitor e integrar já um sistema de upload de imagens. A mensagem desta minha decisão é simples: Somos Uma Comunidade! Este sistema de notícias irá evoluir de acordo com os vossos comentários. A decisão sobre as funcionalidades deste sistema de notícias é vossa. Sem prejuízo do princípio subjacente a este projeto: não queremos criar um Joomla, um WordPress ou um Drupal. Esses CMS já existem e são open source e grátis. Queremos um sistema de notícias simples e fácil de usar, por 2 razões:

  • Este tutorial tem como destinatários aqueles leitores que estão a aprender PHP e MySQL e a aprendizagem é como uma escada que vai do simples até ao mais complexo. Vamos começar pelo simples.
  • Muitas vezes, até para a maioria dos sites para empresas, um Joomla ou um Drupal são demasiado complexos. E um sistema de notícias simples é mais vantajoso para o programador e especialmente para o utilizador final, que não vai ter 101 opções de configuração e não vai precisar de ler um manual para editar um artigo.

Não criamos um módulo autónomo para o sistema de upload. Mas, podemos fazer isso no futuro. Depende da evolução do script. É um sistema de upload muito simples e que nem mexemos na base de dados. Vamos utilizar um campo já existe na base de dados MySQL para guardar o nome do ficheiro da imagem: n_img.

Em relação ao script publicado na Parte1, alteramos os seguintes ficheiros:

  • index.php
  • admin/admin.php
  • admin/inserir-noticia.php

O Ficheiro admin/admin.php

Não alteramos muito o código do formulário. Vamos analisar em pormenor as alterações do ficheiro admin/admin.php:


// A seguinte linha de código:

<form id="inserir" name="inserir" method="post" action="inserir-noticia.php">

// Foi substituída por esta linha de código:

<form name="inserir" id="inserir" method="post" action="inserir-noticia.php"  enctype="multipart/form-data" >

// Este linha de código foi substituída:

<input name="imgs" type="text" id="imgs" size="40" />

// por esta linha de código:

<input name="imgs" type="file" id="imgs" size="45" />

enctype=”multipart/form-data”: Adicionamos, pois o nosso formulário vai processar um ficheiro de imagem e vai utilizar um campo de input do tipo type=”file”.

O Ficheiro admin/inserir-noticia.php

As principais alterações ocorrem neste ficheiro. É aqui que acontece a acção!



// Esta é a variável $imgs na versão anterior.

$imgs  =  $_POST['imgs'];

// A variável $imgs deixa de ser um $_POST e transforma-se num $_FILES['imgs'], e criamos uma nova variável a $trimimg

$imgs  =  $_FILES['imgs'];

$trimimg=  str_replace(" ", "", strtolower($_FILES["imgs"]["name"]));

A $trimimg vai ao MIME data stream do $_FILES['imgs'] e fica a saber o nome do ficheiro da imagem: $_FILES["imgs"]["name"].

Dado que o nome do ficheiro pode ter várias formatações: escrito em letras MAIÚSCULAS, escrito em letras minúsculas ou até com uma combinação de letras maiúsculas e micúsculas (Exemplo.JPG.), decidi utilizar o strtolower para alterar o nome do ficheiro de modo que seja um nome só com letras minúsculas.

Outro problema de formatação é o nome do ficheiro ter espaços. Por exemplo: “Nome do ficheiro.jpeg”. Decidi usar o str_replace, para remover os espaços no nome do ficheiro.

Se desenvolvermos um módulo autónomo para o upload de ficheiros, podemos também remover acentos do nome dos ficheiros e também criar automaticamente um nome de ficheiro único.

A seguir vamos criar uma condição baseada no $_FILES["imgs"]["type"] e restringir o upload dos ficheiros a 3 tipos de ficheiros: gif, png e jpeg. Aproveitamos a boleia e restringimos também o tamanho do ficheiro a ficheiros inferiores a 120 kb.



if ((($_FILES["imgs"]["type"] == "image/pjpeg") || ($_FILES["imgs"]["type"] == "image/jpeg") || ($_FILES["imgs"]["type"] == "image/gif") || ($_FILES["imgs"]["type"] == "image/png")) && ($_FILES["imgs"]["size"] < 120000)) {

Vamos efectuar o INSERT desta nova informação na base de dados MySQL. Não esquecer que a variável não é a $imgs. A variável é a $trimimg.



mysql_query("INSERT INTO noticias (n_data, n_titulo, n_texto, n_img) VALUES ('$data', '$titulo', '$texto', '$trimimg')");

O upload de imagens está a ser efectuado para a pasta admin/img. O código que determina a pasta para onde vai ser efectuado o upload é o seguinte:



move_uploaded_file($_FILES["imgs"]["tmp_name"], "img/" . $trimimg);

Nesta linha de código, movemos o ficheiro da pasta temporária no servidor “tmp_name”, onde ficou uma cópia do ficheiro, para a pasta para onde vamos efectuar o upload dos ficheiros das imagens, na nossa conta de alojamento ou na pasta onde estão os ficheiros do nosso script no nosso computador. No servidor, é importante que o utilizador que executa os ficheiros PHP tenha permissões de escrita nessa pasta, para onde vamos efectuar o upload dos ficheiros das imagens.

admin/img/exemplo.gif

Como o código vai ser processado na pasta admin, indicamos a pasta img/ e o nome do ficheiro que vai ser escrito nessa pasta. O nome do ficheiro vamos buscar à variável $trimimg. Neste código:


move_uploaded_file($_FILES["imgs"]["tmp_name"], "img/" . $trimimg);

o pedaço de código que faz exactamente isso é este: “img/” . $trimimg.

O Ficheiro index.php

Estamos próximos do fim da Parte2 deste tutorial. Falta actualizar o ficheiro index.php, para poder ler as imagens, uma vez que deixamos de usar url e vamos passar a ler a imagem na pasta admin/img/.


echo  "<p>".$linha['n_texto']." <img src='admin/img/".$linha['n_img']."' alt='' align='left' /> "."</p>";

Que novas funcionalidades querem para este sistema de notícias em PHP e MySQL?

Download do código: Sistema De Notícias Em PHP E MySQL Parte2

Be Sociable, Share!

14 Comentários

  1. Ricardo De Melo

    Olá, sou iniciante em PHP e estou gostando muito dos seus tutoriais. Hoje em dia não se acha tutoriais passo-a-passo explicativo pela net com tanta facilidade, já que muitos desenvolvedores preferem simplesmente disponibilizar o código.
    Estou acompanhando esta série, e devo lhe dizer, que o fato dela começar bem simples facilita a vida do iniciante, já que posso acompanhar a evolução do sistema.

    Dúvida…
    No arquivo admin.php, da pasta admin, ao rodar o script surgem dois erros: na linha 19 e na linha 36
    Linha 19: <?php if ($_GET['accao']!='noticia') { ?>
    Linha 36: <?php if ($_GET['accao']=='noticia') { ?>

    Poderia me ajudar a resolver esse erro?

    • Olá Ricardo,

      Na verdade não são 2 erros mas sim; 2 notificações;
      "Notice: Undefined index: accao in ***adminadmin.php on line 19"
      Indica que a variável accao não foi definida. Logo na linha 19, a quem aparece a notificação, pode substituir:
      <?php if ($_GET['accao'] != 'noticia') { ?>
      Pela seguinte linha:
      <?php if (!(isset($_GET['accao']))) {$_GET['accao'] = "NULL";} if ($_GET['accao'] != 'noticia') { ?>

    • Olá Ricardo,

      Na verdade não são 2 erros mas sim; 2 notificações;
      "Notice: Undefined index: accao in ***\\admin\\admin.php on line 19"
      Indica que a variável accao não foi definida. Logo na linha 19, a quem aparece a notificação, pode substituir:
      <?php if ($_GET['accao'] != 'noticia') { ?>
      Pela seguinte linha:
      <?php if (!(isset($_GET['accao']))) {$_GET['accao'] = "NULL";} if ($_GET['accao'] != 'noticia') { ?>

  2. Bruno

    Olá
    Primeiro quero felicita-lo por esta iniciativa, pois ainda existem muitos poucos artigos na net sobre este assunto !
    Estou a seguir passo por passo, mas não estou a conseguir inserir informação na base de dados…

    Ao introduzir texto no formulário admin.php, aparece uo erro do último echo do ficheiro inserir-noticia.php "Ficheiro não permitido". Isto mesmo sem inserir imagens…

    Já fiz download do ficheiro zip que disponibilizou mas continua a dar o mesmo erro…

    A versão que uso do phpMyAdmin é a 3.2.4 e a do PHP: 5.3.1

    Qual será o problema?

    Cumprimentos

    • Olá! Tenho que perguntar aso programador, mas parece-me que é necessário incluir uma imagem. Caso contrário, ocorre esse erro. Mas, este sistema de notícias é um projecto em evolução e o vosso feedback é que irá decidir o seu caminho. Um Abraço Rui Soares

  3. Bruno

    Olá !

    Ao que parece terá a ver com o tamanho da imagem. 100kb será o máximo permitido, ainda não encontrei a linha de código que limita o tamanho, mas testei com vários tamanhos e formatos e apenas consigo adicionar imagens menores ou igual a 100kb.

    Abraço

    • Olá Bruno! Vou pedir ao António para responder. Ele é que está a escrever este tutorial. Um Abraço Rui Soares

      • tiago

        Amigo sobre o tutorial 1 2 3 como faço? instalo o 1 depois sobreponha la no segundo na pasta e depois o 3 ???ou tem q ir mudando dentro do script do 1???

        seria legal sistema de comentarios abaixo da noticia com contador de quantos comentarios… obg

    • Olá Bruno,

      Procura a seguinte variável: ($_FILES["imgs"]["size"] < 120000)

      Basta mudares os 120000 Bytes para o valor que precisas, sempre em Bytes.

  4. Marcelo pessoa

    Olá parabéns pelo post.
    Teria como vc me passar uma forma de upload de imagem que fizesse com que a imagem tivesse uma miniatura e tambem modificase o tamanho da imagem pois se coloco uma imagem com resolução muito alta ela fica muito grande. Queria como se fosse um padrão para que esta imagem nunca passe deste tamanho.

    Muito obrigado.

  5. Nii

    Olá, sou uma estudante do 12º ano e também estou a dar php e para a PAP estou a fazer um site o que tambem é um projecto duma disciplina… Este tutorial foi muito útil mesmo, porque é bastante simples e é tudo feito passo a passo, muitos parabéns por este excelente trabalho.Mas tenho um problema, eu usei este sistema de noticias para o meu site, mas agora estou com o mesmo problema que o Marcelo, queria que as imagens que são inseridas, tivesses um tamanho exacto, não em termos de bytes mas em termos de pixeis, ou seja o tamanho da imagem e não o peso.Se me pudessem ajudar agradecia.Obrigada, cumprimentos.

  6. Mawote

    Ola, so hoje conheci este site quando procurava por um sistema de noticias em php. Como sou um iniciante em php, desejo saber como adiciaonar categorias categoria de noticias ou noticias por categorias?

    Agradeco desde ja a vossa disponibilidade.

Participa! Comenta... para Bruno