sábado, 24 de dezembro de 2011

Editando arquivos texto pelo PHP

Neste tutorial veremos como editar arquivos texto usando apenas o PHP.

Para começar, crie um arquivo com o nome de editar.php e coloque o seguinte código nele.

View source
<?php
 
 $arquivo = "teste.txt";
 
 $arquivo = file("$arquivo");
 
 echo "<form action=\"gravar.php\" id=\"form\" name=\"form\" method=\"post\">";
 
 echo "Digite o texto:<br /><textarea name=\"texto\" rows=\"20\" cols=\"90\">";
 
 foreach($arquivo as $texto) {
 
 echo "$texto";
 
 }
 
 echo "</textarea><br />";
 
 echo "<input type=\"submit\" value=\"Enviar\">";
 
 echo "</form>";
 
 ?> 
Feito isso, crie um novo arquivo com o nome de gravar.php contendo este código:

View source
<?php
 
 $arquivo = "teste.txt";
 
 $texto = $_POST["texto"];
 
 if(is_writable($arquivo)) {
 
 $manipular = fopen("$arquivo", "w");
 
 if(!$manipular) {
 
 echo "Erro
 
 
 
 Não foi possível abrir o arquivo.";
 
 }
 
 if(!fwrite($manipular, $texto)) {
 
 echo "Erro
 
 
 
 Não foi possível gravar as informações no arquivo.";
 
 }
 
 echo "O texto foi gravado com sucesso!";
 
 fclose($manipular);
 
 }
 
 else {
 
 echo "O $arquivo não tem permissões de leitura e/ou escrita.";
 
 }
 
 ?>
Agora, no mesmo local onde estão esses arquivos, crie um arquivo com o nome de teste.txt (não digite nada nele). Rode o script e veja que o arquivo é aberto e está pronto para ser editado... Digite alguma coisa e clique no botão Enviar...
Pronto... Abra novamente o arquivo e confira seu conteúdo !!!!

Criando um sistema simples de enquete em PHP

Olá pessoal. Aqui está mais um tutorial de PHP para vocês. Desta vez falaremos sobre a criação de um sistema de enquete simples (aquela enquete que permite que você vote quantas vezes quiser). Num próximo tutorial veremos como fazer essa enquete permitindo apenas um voto por IP.

Em primeiro lugar, baixe as imagens que serão as barras indicadoras de quantidade de votos aqui: DOWNLOAD.

Agora que você tem as imagens, vamos criar a seguinte estrutura (coloque em um servidor ou em localhost):
enquetes
admin
admin.php
enqadic.html
encadic.php
index.php
login.php
logout.php
imagens
barra1.gif
barra2.gif
barra3.gif
barra4.gif
enquete.php
votar.php
OBS.: Já deixe os arquivos criados, depois é só colocar o código.

Feito isso, hora de criar o banco de dados para armazenar as enquetes, votos e o login de administrador.

Abra o PhpMyAdmin e crie um banco de dados (com o nome que desejar, no tutorial demos o nome de “enquete” – sem aspas). Nesse banco de dados, vá na guia SQL e cole o seguinte código:

-- phpMyAdmin SQL Dump
-- version 2.11.3deb1ubuntu1.3
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Jan 04, 2010 as 09:40 PM
-- Versão do Servidor: 5.0.51
-- Versão do PHP: 5.2.4-2ubuntu5.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `enquetes`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `tblenc`
--

CREATE TABLE IF NOT EXISTS `tblenc` (
`encid` int(11) NOT NULL auto_increment,
`encprg` varchar(50) default NULL,
`encrpt1` varchar(50) default NULL,
`encrpt2` varchar(50) default NULL,
`encrpt3` varchar(50) default NULL,
`encrpt4` varchar(50) default NULL,
`encval1` int(11) NOT NULL default '0',
`encval2` int(11) NOT NULL default '0',
`encval3` int(11) NOT NULL default '0',
`encval4` int(11) NOT NULL default '0',
`enctot` int(11) NOT NULL default '0',
PRIMARY KEY  (`encid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Extraindo dados da tabela `tblenc`
--


-- --------------------------------------------------------

--
-- Estrutura da tabela `tblusuario`
--

CREATE TABLE IF NOT EXISTS `tblusuario` (
`nomeusuario` varchar(16) NOT NULL,
`senha` varchar(32) NOT NULL,
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Extraindo dados da tabela `tblusuario`
--

INSERT INTO `tblusuario` (`nomeusuario`, `senha`, `id`) VALUES
('admin', '123456', 1);

Altere acima o nome do usuário (admin) e a senha (123456) para o desejado.

Veja na próxima página como criar o login a parte de “administração” das enquetes, onde você vai adicionar as enquetes.


A partir daqui, todos os arquivos a serem abertos são os da pasta “admin”. No arquivo index.php (que será a página de login) digite o seguinte código:

View source
<html>
 
 <head>
 
 <meta content="text/html; charset=ISO-8859-1"
 
 http-equiv="content-type">
 
 <title></title>
 
 </head>
 
 <body>
 
 <form method="post" action="login.php">Nome de Usuário: <input
 
 name="login" type="text"><br>
 
 Senha: <input type="password"><br>
 
 <input value="Enviar"></form>
 
 </body>
 
 </html>
Feito isso, abra o arquivo login.php e digite o seguinte código:

View source
<?
 
 session_start();
 
 $servidor="localhost"; //servidor do banco de dados, normalmente é localhost
 
 $usuario="seu_usuario"; //seu usuário do banco de dados
 
 $password="sua_senha"; //a senha do seu banco de dados
 
 $base="seu_banco_de_dados"; //o nome do seu banco de dados
 
 $SQLid = mysql_connect($servidor,$usuario,$password); //faz a conexão com o banco de dados
 
 mysql_select_db($base,$SQLid); //seleciona o banco de dados
 
 
 
 $login = $_POST['login']; //”recupera” o texto digitado no campo login
 
 $senha = $_POST['senha']; //”recupera” o texto digitado no campo senha
 
 
 
 if(!$login || !$senha){ //se a variável $login ou a variável $senha estiverem vazias
 
 echo "Você não digitou o usuário ou senha."; //avisa que os campos não foram preenchidos
 
 exit; //termina a execução do script
 
 } //termina o if(!$login || !$senha)
 
 $SQL = "select * from tblusuario where nomeusuario='$login' and senha='$senha'"; //seleciona todos os campos da tabela tblusuario onde o campo ‘nomeusuario’ seja igual a variável $login e o campo ‘senha’ seja igual a variável $senha
 
 $resultado=mysql_query($SQL) or die("Erro no banco de dados"); //executa o SQL acima
 
 $total=mysql_num_rows($resultado); //retorna o total de “linhas” encontradas pela consulta executada acima
 
 
 
 if($total){ //se $total tiver algum valor
 
 $dados=mysql_fetch_array($resultado); //retorna um array que corresponde a linha obtida
 
 if(!strcmp($senha, $dados["senha"])){ //se a senha digitada (armazenada na variável $senha) for igual a armazenada no banco de dados
 
 $_SESSION["id"] = $dados["id"]; //cria uma variável de sessão com o nome “id” e armazena o “id” do usuário
 
 $_SESSION["login"] = $dados["nomeusuario"]; //cria uma variável de sessão com “login” e armazena o “nomeusuario”
 
 $_SESSION["senha"] = $dados["senha"]; //cria uma variável de sessão com o nome “senha” que armazena a “senha”
 
 header("Location: admin.php"); //redireciona para a página “admin.php”
 
 exit; //termina a execução do script
 
 } //termina o if(!strcmp($senha,$dados[“senha”]))
 
 else{ //caso contrário (ou seja, se a senha digitada for diferente da armazenada no banco de dados)
 
 echo "Senha inválida"; //avisa que a senha está errada
 
 exit; //termina a execução do script
 
 } //termina o else
 
 } //termina o if($total)
 
 else{ //caso o usuário não exista no banco de dados
 
 echo "O usuário fornecido não existe"; //avisa que o usuário não existe
 
 exit; //termina a execução do script
 
 } //termina o else
 
 ?>
Agora que já temos o login, precisamos do logout. Abra o arquivo logout.php e digite o seguinte código:

View source
<?
 
 session_start(); //inicia a sessão
 
 session_destroy(); //destrói a sessão
 
 header("Location:index.php"); // redireciona para a página index.php
 
 ?>
Vamos agora codificar a página do administrador. Abra o arquivo admin.php e digite o seguinte código:

View source
<p align="center"><a href="/enqadic.html">Adicionar Enquete</p>
 
 <p align="center"><a href="/logout.php">Logout</a></p>
No momento, só falta um formulário para colocar os dados da nova enquete, e também o arquivo php que adiciona a enquete no banco de dados.
Abra o arquivo enqadic.html e digite o seguinte código:

View source
<form name="adiciona" method="post" action="enqadic.php">
 
 Pergunta: <input type="text"><br>
 
 Resposta 01: <input type="text"><br>
 
 Resposta 02: <input type="text"><br>
 
 Resposta 03: <input type="text"><br>
 
 Resposta 04: <input type="text"><br>
 
 <input type="submit" value="Enviar">
 
 </form>
Por último, abra o arquivo enqadic.php e digite o seguinte código:
View source
<?
 
 session_start();
 
 $pergunta = $_POST["txtperg"];
 
 $resp1 = $_POST["txtresp1"];
 
 $resp2 = $_POST["txtresp2"];
 
 $resp3 = $_POST["txtresp3"];
 
 $resp4 = $_POST["txtresp4"];
 
 $servidor="localhost";
 
 $usuario="seu_usuario"; //seu usuário do banco de dados
 
 $password="sua_senha"; //sua senha do banco de dados
 
 $base="seu_banco_de_dados"; //o nome do seu banco de dados
 
 $SQLid = mysql_connect($servidor,$usuario,$password);
 
 mysql_select_db($base,$SQLid);
 
 
 
 if(!$_SESSION["login"] || !$_SESSION["senha"]){
 
 echo "Você deve estar logado para adicionar uma enquete";
 
 exit;
 
 }else{
 
 $inclui = "INSERT INTO `$base`.`tblenc` (
 
 `encid` ,
 
 `encprg` ,
 
 `encrpt1` ,
 
 `encrpt2` ,
 
 `encrpt3` ,
 
 `encrpt4` ,
 
 `encval1` ,
 
 `encval2` ,
 
 `encval3` ,
 
 `encval4` ,
 
 `enctot`
 
 )
 
 VALUES (
 
 NULL , '$pergunta', '$resp1', '$resp2', '$resp3', '$resp4', '0', '0', '0', '0', '0'
 
 );";
 
 $executa = mysql_query($inclui);
 
 if($executa){
 
 echo "Enquete adicionada com sucesso. <a href='../index.php'>Clique aqui para voltar para a página principal";
 
 }else{
 
 echo "Erro ao adicionar a enquete";
 
 }
 
 }
 
 ?>
Pronto, a parte de administração (adição de enquete) está feita. Os arquivos que serão editados agora estão na raiz (direto na pasta enquetes).


Abra o arquivo enquete.php e digite o seguinte código (lembrando que os arquivos a serem editados daqui pra frente estão direto na pasta enquetes):

View source
<?
 
 //recebo o voto
 
 $voto = $_POST["voto"];
 
 //recebo o id da enquete
 
 $encid = $_POST["encid"];
 
 
 
 $servidor="localhost";
 
 $usuario="seu_usuario"; //seu usuário do banco de dados
 
 $password="sua_senha"; //sua senha do banco de dados
 
 $base="seu_banco_de_dados"; //o nome do seu banco de dados
 
 $SQLid = mysql_connect($servidor,$usuario,$password);
 
 mysql_select_db($base,$SQLid);
 
 $SQLquery = "UPDATE tblenc SET encval$voto = encval$voto+1, enctot = enctot+1 where encid=$encid";
 
 $SQLresult = mysql_query($SQLquery,$SQLid);
 
 $SQLquery = "SELECT * FROM tblenc where encid=$encid";
 
 $SQLresult = mysql_query($SQLquery,$SQLid);
 
 $SQLrow = mysql_fetch_array($SQLresult);
 
 ?>
 
 <P ALIGN="center"><font size="4"><strong><em>RESULTADOS PARCIAIS DA
 
 ENQUETE</em></strong></font></P>
 
 <P ALIGN="center"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
 
 <?
 
 echo $SQLrow["encprg"] ;
 
 ?>
 
 </font></strong></P>
 
 <TABLE ALIGN="center" WIDTH="75%" BORDER="0" CELLSPACING="1" CELLPADDING="1">
 
 <!--DWLayoutTable-->
 
 <TR>
 
 <TD ALIGN="left" WIDTH="23%"><? echo $SQLrow["encrpt1"];?>
 
 <div align="left"></div></TD>
 
 <TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval1"]*100/$SQLrow["enctot"];?>%" SRC="imagens/barra1.gif"></TD>
 
 <TD ALIGN="center" WIDTH="14%"><? echo $SQLrow["encval1"];?> votos</TD>
 
 </TR>
 
 <TR>
 
 <TD ALIGN="left"><? echo $SQLrow["encrpt2"];?>
 
 <div align="left"></div></TD>
 
 <TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval2"]*100/$SQLrow["enctot"];?>%" SRC="imagens/barra2.gif"></TD>
 
 <TD ALIGN="center"><? echo $SQLrow["encval2"];?> votos</TD>
 
 </TR>
 
 <TR>
 
 <TD ALIGN="left"><? echo $SQLrow["encrpt3"];?>
 
 <div align="left"></div></TD>
 
 <TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval3"]*100/$SQLrow["enctot"];?>%" SRC="imagens/barra3.gif"></TD>
 
 <TD ALIGN="center"><? echo $SQLrow["encval3"];?> votos</TD>
 
 </TR>
 
 <TR>
 
 <TD ALIGN="left"><? echo $SQLrow["encrpt4"];?>
 
 <div align="left"></div></TD>
 
 <TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval4"]*100/$SQLrow["enctot"];?>%" SRC="imagenes/barra4.gif"></TD>
 
 <TD ALIGN="center"><? echo $SQLrow["encval4"];?> votos</TD>
 
 </TR>
 
 </TABLE>
 
 <P ALIGN="center">Total de votos emitidos: <? echo $SQLrow["enctot"];?></P>
Por ultimo, abra o arquivo votar.php e digite o seguinte código:

View source
<?
 
 $servidor="localhost";
 
 $usuario="seu_usuario"; //seu usuário do banco de dados
 
 $password="sua_senha"; //sua senha do banco de dados
 
 $base="seu_banco_de_dados"; //o nome do seu banco de dados
 
 $SQLid = mysql_connect($servidor,$usuario,$password);
 
 mysql_select_db($base,$SQLid);
 
 $SQLquery = "SELECT * FROM tblenc order by encid desc";
 
 $SQLresult = mysql_query($SQLquery,$SQLid);
 
 $SQLrow = mysql_fetch_array($SQLresult);
 
 ?>
 
 <form method="post" action="enquete.php">
 
 <input name="encid" value="<?echo $SQLrow[0]?>">
 
 <table width="100" border="0" align="center" cellpadding="0" cellspacing="0">
 
 <tr>
 
 <td bgcolor="#000000"><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-serif">::::::::::::::::::</font></td>
 
 </tr>
 
 <tr>
 
 <td bgcolor="#000000"> <div align="center"><font color="#ffffff" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>
 
 <? echo $SQLrow[1]?>
 
 </strong></font></div></td>
 
 </tr>
 
 <tr>
 
 <td bgcolor="#000000"> <p> <font color="#ffffff" size="2">
 
 <label>
 
 <input value="1">
 
 <? echo $SQLrow[2]?></label>
 
 <br>
 
 <label>
 
 <input value="2">
 
 <? echo $SQLrow[3]?></label>
 
 <br>
 
 <label>
 
 <input value="3">
 
 <? echo $SQLrow[4]?></label>
 
 <br>
 
 <label>
 
 <input value="4">
 
 <? echo $SQLrow[5]?></label>
 
 <br>
 
 </font></p></td>
 
 </tr>
 
 <tr>
 
 <td bgcolor="#000000"> <div align="center">
 
 <input value="Aceitar">
 
 </div></td>
 
 </tr>
 
 </table>
 
 </form>
 
 
Pronto, seu sistema de enquetes está feito. Para adicionar a enquete na página principal, a mesma deve ser salva com a extensão .php e você deve adicionar o seguinte código onde desejar que ela apareça:

View source
<? include "votar.php"; ?>
É isso aí. Espero que tenham gostado e qualquer dúvida, só falar. Lembrando que no próximo tutorial iremos melhorar este sistema, permitindo apenas um voto por IP e adicionando o recurso de poder excluir uma enquete.

Entendendo os avisos Undefined Variable e Undefined index

Nesse artigo irei explicar o que significa a mensagem do PHP “Notice: Undefined variable ou Undefined index” e como evitar esse tipo de erro.
Para entender esse tipo de mensagem, observe o exemplo abaixo:

View source
  1. <?php
  2.  
  3. $x = $y + 10;
  4.  
  5. ?>
Executando esse script, que valor deve conter a variável $x?
Você deve responder, impossível dizer, não sei qual é o valor da variável $y. Para o PHP a resposta é a mesma, para ele está sendo feito a seguinte operação internamente:

View source
  1. <?php
  2.  
  3. $x = valor indefinido + 10;
  4.  
  5. ?>
A maneira correta e fazer a seguinte operação:

View source
  1. <?php
  2.  
  3. $y = 5;
  4.  
  5. $x = $y + 10;
  6.  
  7. ?>
ou

View source
  1. <?php
  2.  
  3. $y = 0;
  4.  
  5. $x = $y + 10;
  6.  
  7. ?>
Toda vez que é feita uma operação com uma variável “valor indefinido” o PHP exibe a mensagem Notice: Undefined variable.
Muitas vezes os nossos problemas de programação são mais complexos, pois estamos trabalhando com variáveis passadas por SESSION, GET, POST e outros métodos, para trabalhar dessa forma e necessário avaliar a condição da variável, por exemplo:

View source
  1. <?php
  2.  
  3. if (!isset($y)) {
  4.  
  5. $y = 0;
  6.  
  7. }
  8.  
  9. ?>
Esse script verifica se a variável existe, se a variável não existir é atribuído zero.
Pode ocorrer o mesmo erro quando estamos trabalhando com arrays e tentamos acessar uma posição que não existe, por exemplo:

View source
  1. <?php
  2.  
  3. $info_funcionario = array(
  4.  
  5. "nome" => "Patrick Espake",
  6.  
  7. "profissao" => "Programador");
  8.  
  9. echo $info_funcionario["email"];
  10.  
  11. ?>
No script acima estou tentando acessar o índice “email” no array, esse índice não existe e o PHP exibe a mensagem Notice: Undefined index email.
Você pode fazer a seguinte afirmação: “Já programei assim em PHP e nunca apareceu esse erro!”.
O que acontece é que essas notificações de erros podem ser configuradas no PHP.INI, muitos programadores em ambiente de desenvolvimento deixam configurado para exibir todos os erros e em ambiente de produção deixam configurado para não exibir os erros de notificação.
Para configurar o PHP.INI para mostrar todos os erros, você deve deixar a cláusula error_reporting da seguinte forma:

View source
error_reporting = E_ALL
Para configurar o PHP.INI para não exibir as mensagens de notificação você deve deixar da seguinte forma:

View source
  1. error_reporting = E_ALL & ~E_NOTICE
Em outras linguagens de programação uma variável não inicializada pode conter qualquer coisa, no PHP é considerado como nulo ou como 0 em uma operação aritmética.
Além disso, é mais rápido escrever:

View source
  1. <?php
  2.  
  3. echo $_GET['id'];
  4.  
  5. ?>
do que

View source
  1. <?php
  2.  
  3. if isset($_GET['id'])) echo $_GET['id'];
  4.  
  5. ?>
Em casos extremos você pode usar o @ para ocultar as mensagens de notificação.

View source
  1. <?php
  2.  
  3. @echo $_GET['id'];
  4.  
  5. ?>
Eu considero esse método muito rigoroso, então é melhor fazer o que você acha melhor. Essas notificações podem ajudar durante o desenvolvimento, para detectar determinados erros.