Livro de visitas com PHP e MySQL Construção de um livro de visitas utilizando a tecnologia de programação de páginas dinâmicas de servidor PHP e a base de dados MySQL. CAPÍTULOS DO MANUAL 1.- Introdução ao livro de visitas com PHP e MySQL Primeiras notas e referências prévias de interesse antes de mostrar o funcionamento do exercício. 2.- Esquema de funcionamento do livro de visitas PHP Como funciona nosso script para a criação de um livro de visitas com PHP e MySQL. 3.- A base de dados MySQL do livro de visitas A base de dados em um sistema MySQL necessária para a realização de um livro de visitas. 4.- Mostrando as assinaturas do livro de visitas Código para mostrar as assinaturas que nosso livro de visitas tenha registrado. 5.- O formulário para assinar o livro de visitas Código HTML do formulário que utilizamos para a criação de um livro de visitas com PHP e MySQL. 6.- Comprovar se os dados recebidos são corretos Antes de inserir os dados recebidos pelo formulário na aplicação Livro de Visitas, devemos comprovar que a informação é correta, ou seja, que os dados recebidos são válidos. 7.- Inserimos os dados na base de dados Uma vez comprovado que os dados são corretos, os insiro na tabela do livro de visitas. Livro de visitas com PHP e MySQL Manual por: Criar Web, manuais e recursos para desenvolvimento web Versão on-line: http://www.criarweb.com/manuais/19 Introdução ao livro de visitas com PHP e MySQL Ante os numerosos pedidos de nossos leitores de comentar um código para fazer um livro de visitas ao longo da vida deste site, decidimos realizar este manual sobre a criação de um livro de visitas, programado em PHP e com base de dados MySQL. É um livro de visitas muito parecido ao que utilizamos em CriarWeb, na URL: http://criarweb.com/livro_visitas/, um pouco mais simplificado e com uns campos de formulário um pouco mais gerais, para que possa servir no maior número de web sites da temática mais variada. O exercício que faremos pode ser seguido com conhecimentos mínimos de PHP, de modo que está ao alcance de qualquer pessoa que tenha iniciado nesta interessante linguagem de programação páginas de servidor. No obstante, antes de começar, vale a pena mostrar algumas referências a manuais que podem nos ajudar a entender os scripts tratados. Manual de PHP: http://criarweb.com/php/ Com os temas mais básicos sobre a tecnologia, que todos os leitores deveriam conhecer. Manual de MySQL: http://criarweb.com/manuais/mysql/ Com artigos práticos sobre o trabalho com a base de dados MySQL. A informação se complementa também com outros dois manuais: Workshop de PHP e Manual de PHP 5 onde podemos encontrar mais recursos PHP disponíveis em CriarWeb.com. Informe de M. A. A. Tradução Juliana Monteiro Mail: [email protected] Esquema de funcionamento do livro de visitas PHP Vejamos o diagrama de funcionamento da aplicação do livro de visitas em PHP para termos uma idéia inicial, que completaremos mais adiante com o código de cada script. Vamos basear todo o trabalho em uma mesma página, que será a encarregada de mostrar todas as assinaturas dos visitantes e buscar os dados vindos pelo formulário de participação para introduzi-los na base de dados. Isto pode complicar um pouco o código do exercício final, mas veremos o script por partes para que seja simples. Agora somente temos que entender sua estrutura geral. Explicação A página do livro de visitas pode ou não receber por um formulário e dependendo disso, deveria fazer umas ou outras ações. Portanto, o primeiro que vamos fazer é averiguar se recebemos ou não os dados pelo formulário. 1) Se não recebe dados do formulário Mostro as últimas 10 assinaturas do livro de visitas. Conseguiremos isto com um acesso à base de dados e um loop que percorre os resultados da busca. No caso de que não receba os dados, depois de mostrar as últimas assinaturas, devemos saber se existem ou não mais assinaturas na base de dados para visualizar. 1.1) Se existem mais assinaturas, mostro a mensagem para vê-las. 1.2) Se não existem mais assinaturas, não faço nada. Por último, coloco o formulário de assinatura para que os visitantes possam participar. 2) Se recebo dados pelo formulário Isto quer dizer que o visitante preencheu o formulário de assinatura do livro e o enviou. Então devo registrar esta assinatura, embora seja também muito importante realizar uma pequena comprovação e/ou conserto dos dados do formulário para evitar que um usuário malicioso tente estragar o script inserindo certos elementos suscetíveis de provocar erros como etiquetas HTML ou PHP. Entre as comprovações também nos certificamos, por exemplo, de que o usuário escreveu algum dado no formulário, mas veremos todas estas comprovações mais tarde. 2.1) Se os dados eram corretos Se todas as comprovações foram positivas, introduziremos os dados no formulário e daremos um obrigado ao visitante por assinar o livro. 2.2) Se os dados não eram corretos Advertiremos ao visitante que deve preencher os campos corretamente. Informe de M. A. A. Tradução Juliana Monteiro Mail: [email protected] A base de dados MySQL do livro de visitas Para o trabalho com o livro de visitas, como já apontamos, se requer o uso de uma base de dados. Bom, na verdade o que necessitaremos é contar com uma tabela adicional para a base de dados que já contenha seu web site. Referência: O trabalho com base de dados está relatado no manual de Programação em PHP. No mesmo manual também dispomos de algumas indicações práticas que explicam como colocar uma base de dados no servidor remoto. A tabela livrovisitas_php Neste exercício deveremos criar uma tabela com a informação das assinaturas. Chamaremos de livrovisitas_php e conterá os seguintes campos: Nome do campo Tipo Id_livrovisitas_php int(11) nome varchar(150) email varchar(100) valoracao tinyint(4) comentario text O campo id_livrovisitas_php será um campo auto numérico, que será a chave primária da tabela. Os campos nome e e-mail serão do tipo cadeia de texto, com 150 e 100 caracteres de tamanho máximo respectivamente. O campo valoração salvará um número, neste caso de tamanho pequeno (tinyint) porque só vamos salvar números do 1 ao 5. Por último, o comentário, que é uma cadeia de texto com longitude indeterminada. Poderemos criar a tabela em nosso servidor de bases de dados com a seguinte sentença Crearte Table: CREATE TABLE livrovisitas_php ( id_livrovisitas_php int(11) unsigned NOT NULL auto_increment, nome varchar(150) NOT NULL, email varchar(100) NOT NULL, valoracao tinyint(4), comentario text, PRIMARY KEY (id_livrovisitas_php) ); Informe de M. A. A. Tradução Juliana Monteiro Mail: [email protected] Mostrando as assinaturas do livro de visitas Recordando a explicação geral deste exercício, lembraremos que a página do livro de visitas tinha dois grandes blocos, que se decidiam comprovando se se recebe ou não algo pelo formulário. Para isso podemos utilizar um enunciado if como este: if (!$HTTP_POST_VARS) No caso de não receber dados pelo formulário este if se avaliaria com resultado positivo. Preste atenção na negociação para entender a correta avaliação do if. Neste capítulo vamos relatar a parte do if na qual não se recebem dados por um formulário, ou seja, a avaliação positiva do if. Extrair as últimas assinaturas Neste caso, o primeiro a realizar é a extração das últimas assinaturas da base de dados. Para isso, devemos construir uma sentença SQL que selecione da base de dados tais assinaturas. //se não recebo nada pelo formulário de assinatura do livro, mostro as assinaturas do livro //construo a sentença SQL $ssql = "SELECT * FROM livrovisitas_php"; //se mostrarão as últimas assinaturas, embora haja um link na parte debaixo que se poderá clicar para ver mais assinaturas. if (isset($_GET["vermais"])) $ssql .= " where id_livrovisitas_php<=" . $vermais; //ordeno a sentença e limito o número de resultados $ssql .= " ORDER BY id_livrovisitas_php desc limit 11"; //tomo o jogo de resultados $resultid = mysql_query($ssql,$conn); Esta sentença se constrói em várias partes. Primeiro, cria-se a primeira parte do select e logo outras partes mais complicadas de ver. Será necessário um corte para entender a parte na qual se avalia se existe ou não a variável vermais, recebida por URL ($_GET["vermais"]). Isto vem porque na parte debaixo das assinaturas, no caso de existirem mais assinaturas das quais se tenham mostrado, se colocaria um link para ver mais assinaturas, que conteria uma referência a este próprio livro de visitas com a variável vermais igual ao identificador da próxima assinatura que tenha que se visualizar. Algo como livrovisitas/index.php?vermais=960 Se havíamos recebido a variável vermais, selecionamos somente as assinaturas que tenham o identificador menor ou igual que o índice recebido em vermais. AS assinaturas devem ser vistas em ordem decrescente, para que se mostrem primeiro as últimas assinaturas inseridas. É o que se indica na parte que põem ORDER BY. Ademais se devem selecionar somente 10 assinaturas por página, embora na prática selecionaremos 11, apesar da última não se mostrar, só se extrai para saber o índice que tem e utiliza-lo para construir o link vermais, no caso de que existam outras assinaturas por visualizar. Na última linha se executa a sentença SQL para extrair os dados. Loop While Realiza-se a seguir um loop para percorrer os resultados. É um simples percorrido por um conjunto de resultados de uma consulta a base de dados. Tem a particularidade de que se contam os resultados mostrados para, no caso de que se tenha mostrado já 10, não seguir mostrando mais. while (($damefila=mysql_fetch_object($resultid)) && ($num_filas<10)) { ?> <table align="center" width="100%" cellspacing="2" cellpadding="0" border="0"> <tr> <td valign="top" class=fuente8><b> <? //se o visitante não introduziu nome mostro como nome "Anônimo" if ($damefila->nome == "-"){ "Anônimo"; }elseif ($damefila->email != "-") { echo '<a href="mailto:' . $damefila->email . '">' . $damefila->nome . '</a>'; }else{ echo $damefila->nome; } ?></b>:<br> </td></tr> <tr><td bgcolor=cccccc colspan="2"><img src="images/pixeltrans.gif" width=1 height=1 border="0"></td></tr> <td class=fuente8 valign="top"> <?echo strip_tags($damefila->comentario)?> <td valign="top" align="right" nowrap class=fuente8> Valoracao: <?echo $damefila->valoracao?> </td> </tr> </table> <br> <? $num_filas++; } //termina o loop while Os resultados se mostram em uma tabela, por isso pode ficar um pouco confuso este código no meio de tantas etiquetas HTML, mas não foi revisto nenhuma complicação especial. Mostrar o link de vermais Ao final da página, se havia mais assinaturas por ver, há que mostrar o link de vermais. Para isso, simplesmente avaliamos a variável que contém o ponteiro ao registro atual. Se o loop anterior finalizou porque tal ponteiro havia chegado ao da lista de valores, então é que não há mais assinaturas para ver. Se ao contrário, o loop finalizou e ainda faltava alguma assinatura no ponteiro é que há que mostrar o link de vermais e colocar o índice da assinatura que seria visualizada a seguir. //se faltam mais valorações no conjunto de resultados, mostro o link de "Ver mais" if ($damefila) echo "<div align=center><b><a href=\"index.php?vermais=$damefila->id_lirovisitas_php\">Ver mais mensagem</a></b></div><br>"; Mostrar o formulário de assinatura Por último, deveria ser mostrado o formulário da assinatura. Nós o separamos em um diretório a parte para que fique tudo mais organizado. No código de nosso exercício nesta seção, o único que encontraremos será o include com o arquivo HTML que contém o formulário. include ("formul_mensagem.html"); Informe de M. A. A. Tradução Juliana Monteiro Mail: [email protected] O formulário para assinar o livro de visitas O código do formulário para que os visitantes possam incluir sua assinatura no livro de visitas é o seguinte. <form name=livrovisitas action="index.php" method="post"> <table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td class=titcol> <b>Assine o Livro de Visitas</b></td> </tr> <tr> <td class=fuente8> Deixe sua mensagem no livro de visitas e dê sua opinião do site <br> <br> </td> </tr> <tr> <td> <table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td class=fuente8 align="center"> Nome <br> <input type="Text" name="nome" size="20" maxlength="150"> <br> <br> Email <br> <input type="Text" name="email" size="20" maxlength="100"> <br> <br> Valoracao <br> <select name="valoracao"> <option value=1>Péssima <option value=2>Ruim <option value=3 selected>Regular <option value=4>Boa <option value=5>Fantástica </select> </td> <td ALIGN=CENTER class=fonte8 valign="middle"> Comentarios: <br> <textarea name="comentario" cols="30" rows="7"></textarea> </td> </tr> <tr> <td colspan=2 align=center class=fonte8> <br> <input type="submit" value=" Enviar a assinatura ao livro de visitas "> </td> </tr> </table> </td> </tr> </table> </form> Não há nenhuma complicação para entender isto. Simplesmente deveremos conhecer um pouco a forma de criar formulários HTML. Informe de M. A. A. Tradução Juliana Monteiro Mail: [email protected] Comprovar se os dados recebidos são corretos A outra parte do script do livro de visitas em PHP que nos falta comentar contém a codificação das ações a fazer no caso de que se recebem dados do formulário. Tais ações são basicamente comprovar se os dados são corretos e, se assim for, inserir a informação na base de dados. As comprovações servem para assegurarmos que a informação introduzida vai ser sempre válida, para que as assinaturas se mostrem perfeitamente. Determinadas informações poderiam dar lugar a erros ao introduzir a informação na base de dados ou na hora de mostrar as assinaturas na página. Eliminar as etiquetas HTML ou PHP É muito importante apagar toda etiqueta HTML ou PHP do texto dos campos introduzidos pelo visitante. Se um visitante colocasse este comentário: Olá <b>Amigos</b> Teria como resultado que, ao visualizar sua assinatura, se mostrasse a palavra "Amigos" em negrito. Isto não seria um problema, mas se se pode incluir uma etiqueta assim, também poderiam colocar links, imagens ou determinados elementos que pudessem deslocar a página, mudar nossos estilos habituais ou incluir scripts que pudessem molestar a outros visitantes ou aos administradores do web site. //eliminamos as etiquetas HTML e PHP das cadeias de texto $nome = strip_tags($_POST["nombre"]); $email = strip_tags($_POST["email"]); $comentario = strip_tags($_POST["comentario"]); Cortamos as cadeias muito longas Para não tentar introduzir textos na base de dados que na verdade não cabem, recorto os textos até seu tamanho máximo. //Cortamos as cadeias muito longas $nome=substr($nome,0,150); $email=substr($email,0,80); Comprovamos que o visitante preencheu algo Também devemos comprovar que todos os campos introduzidos não estão vazios, porque nesse caso queria dizer que o usuário está tratando de assinar com nenhum dado sobre seu nome ou comentários do web e não desejamos que isto ocorra. <? if (strlen($nome)==0 and strlen($email)==0 and strlen($comentario)==0) { ?> <div align="center"><b>Obrigado pelo envio</b>.<br><br>Agradecemos porém, se não for muito esforço, que preenchesse algum dos campos para deixar constância de sua visita.</div> <? } ?> Se não havia preenchido nada mostramos uma mensagem avisando-o. Caso contrário, ou seja, se tudo está correto, insiro na base de dados a informação. Informe de M. A. A. Tradução Juliana Monteiro Mail: [email protected] Inserimos os dados na base de dados Se todas as comprovações foram corretas, se introduz na base de dados do livro de visitas a informação recebida como assinatura. Mas antes se realizará um pequeno ajuste adicional dos dados a introduzir. //se algum dos campos falta prefiro colocar um travessão ou "sem comentários" if (!$nome)$nome="-"; if (!$email) $email="-"; if (!$comentario) $comentario="Sin comentarios"; Simplesmente se faz isso para comprovar se algum dos dados faltava, pois nesse caso preferimos introduzir um caractere ou texto especial ao invés de introduzir um string vazio. Aliás, a variável que salva a valoração da página, teoricamente não precisa ser comprovada, porque sempre a receberemos bem, já que o formulário contém este valor em um campo SELECT de HTML, onde sempre se seleciona um valor válido introduzido pelo usuário, entre os possíveis, que os define o programador de tal campo SELECT. Logo, devemos codificar uma sentença SQL com um INSERT com os dados do formulário. A sentença de inserção se realizará concatenando os dados do formulário com a própria sentença SQL. Referência: Pode ser interessante para pessoas sem experiência repassar o artigo onde se explicam as inserções em base de dados. Este artigo está englobado no Manual de PHP de CriarWeb.com. //Geramos a ssql e inserimos o registro $ssql = "INSERT INTO livrovisitas_php (nome,email,valoracao,comentario) VALUES ('" . $nome . "','" . $email . "'," . $_POST["valoracao"] . ",'" . $comentario . "')"; mysql_query($ssql,$conn); Por último mostra-se uma mensagem agradecendo ao visitante que assinou o livro de visitas. <div align="center"><b>Muito obrigado pela sua participação </b></div> Pode-se ver em em funcionamento aqui.