Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Desenvolvimento web com PHP e MySQL, Notas de estudo de Informática

Autor: Evaldo Junior Bento

Tipologia: Notas de estudo

2017

Compartilhado em 14/07/2017

eduardo-costa-fhd
eduardo-costa-fhd 🇧🇷

4.8

(19)

11 documentos

Pré-visualização parcial do texto

Baixe Desenvolvimento web com PHP e MySQL e outras Notas de estudo em PDF para Informática, somente na Docsity! Desenvolvimento web com PHP e MySQL 7 Casa do Código EVALDO JUNIOR BENTO Casa do Código Agradecimentos Avida não é uma sequência de acontecimentos aleatórios. Muita coisa teve que acon- tecer em uma certa ordem para que este livro fosse possível, desde uma longínqua oportunidade de fazer o primeiro curso de informática, passando por curso técnico, faculdade, grupos de estudo, palestras, até a chance de trabalhar com pessoas que me fizeram evoluir. Por isso agradeço a Deus por ter me dado as ferramentas e o discernimento necessários para encontrar os caminhos que me trouxeram até este livro. Este livro não seria uma realidade sem o apoio da minha amada esposa Cássia Luz. Quando eu falei para ela da oportunidade de escrever um livro, ela disse você tem que escrever um livro! e isso me motivou bastante a encarar essa tarefa tão difícil. Obrigado, Cassinha! (E obrigado também pela ideia da ilustração da capa, ficou demais!) Agradeço também aos meus pais, Silvana e Evaldo, meus irmãos, Jenner e An- tonio Paulo, e à sra. Creuza e ao sr. Mário, tios da Cássia, que me desculparam por não comparecer aos almoços e jantares em família porque estava escrevendo sómais um pedaço do livro. Na verdade, eu sempre quis escrever um livro sobre programação e até cheguei começar alguns rascunhos, mas acabei deixando todos de lado. Até que um dia o Caio Ribeiro Pereira, que estava terminando seu livro de Node.js, me perguntou se eu não queria escrever um livro de Python e me apresentou ao Paulo Silveira da Caelum/Casa do Código. Depois disso trocamos alguns e-mails e comecei a escrever este livro de PHP e MySQL, finalmente colocando no “papel” o que pensei em fazer por muito tempo. Obrigado, Caio! E obrigado, Paulo! Agradeço também aos meus alunos da Unimonte que pacientemente aguarda- ram os quase seis meses de escrita deste livro. Não falei para vocês que eu terminaria logo? Obrigado também ao pessoal que leu alguns rascunhos e me deu ideias do que i Casa do Código Prefácio Muita gente que pensa em Web lembra logo de HTML, CSS e JavaScript. Claro, são as linguagens fundamentais dos navegadores. Mas elas só contam metade da história. Muita coisa precisa acontecer do outro lado da conexão, nos servidores. E, se você quer programar seriamente naWeb, vai precisar dominar uma linguagem de programação que rode no servidor. Nesse cenário, o PHP é a melhor escolha se você quer evoluir suas páginas es- táticas HTML para páginas dinâmicas e sistemas complexos. Há muitas opções de linguagens de programação e de bancos de dados, mas a dupla PHP e MySQL é das mais importantes no mercado Web atual, com aplicações em sites de conteúdo, co- mércio eletrônico e até sistemas grandes como Facebook. Esse livro é obrigatório para quem quer começar com PHP e MySQL. O Evaldo é um excelente autor com grande experiência, e conseguiu chegar em um livro fácil de ler e acompanhar, com uma escrita dinâmica e vibrante. Segue omodelo de livros objetivos da Casa do Código e fará você entrar nesse mercado rapidamente e com bastante conhecimento. Uma boa leitura, bons estudos e bem-vindo ao imenso e importante mundo do PHP. Sérgio Lopes — Instrutor e desenvolvedor na Caelum, autor do livro “AWebMobile” também da editora Casa do Código http://sergiolopes.org v Casa do Código Sumário 8 Edição e remoção de registros 85 8.1 Edição de tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 8.2 Remoção de tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 8.3 Evitando o problema com a atualização de página . . . . . . . . . . . 100 8.4 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 8.5 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 9 Validação de formulários 103 9.1 Validação na lista de tarefas . . . . . . . . . . . . . . . . . . . . . . . . 103 9.2 Entrada de dados usando POST . . . . . . . . . . . . . . . . . . . . . . 104 9.3 Validando o nome da tarefa . . . . . . . . . . . . . . . . . . . . . . . . 106 9.4 Adicionando o aviso de erro . . . . . . . . . . . . . . . . . . . . . . . . 110 9.5 Validando a data digitada . . . . . . . . . . . . . . . . . . . . . . . . . . 114 9.6 Expressões regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 9.7 Validando o formulário de edição de tarefas . . . . . . . . . . . . . . . 121 9.8 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 9.9 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 10 Upload de arquivos 127 10.1 Anexos para a lista de tarefas . . . . . . . . . . . . . . . . . . . . . . . . 127 10.2 Mudanças no banco de dados . . . . . . . . . . . . . . . . . . . . . . . 128 10.3 Página com os detalhes das tarefas . . . . . . . . . . . . . . . . . . . . 130 10.4 O formulário para cadastrar anexos . . . . . . . . . . . . . . . . . . . . 132 10.5 Recebendo arquivos pelo PHP . . . . . . . . . . . . . . . . . . . . . . . 134 10.6 Gravando os dados do anexo no banco dados . . . . . . . . . . . . . . 138 10.7 Exibindo os anexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 10.8 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 10.9 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 11 Lembretes de tarefas por e-mail 143 11.1 Definindo o e-mail de aviso . . . . . . . . . . . . . . . . . . . . . . . . 143 11.2 Unificando a configuração da aplicação com constantes . . . . . . . . 145 11.3 Adicionando a opção de aviso por e-mail . . . . . . . . . . . . . . . . . 147 11.4 A função enviar_email() . . . . . . . . . . . . . . . . . . . . . . . . . . 149 11.5 Escrevendo o corpo do e-mail usando um arquivo com o template . . 151 ix Sumário Casa do Código 11.6 Instalando uma biblioteca para enviar e-mails . . . . . . . . . . . . . . 154 11.7 Finalizando a função enviar_email() . . . . . . . . . . . . . . . . . . . 155 11.8 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 11.9 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 12 Hospedagem de aplicações PHP 161 12.1 Sua aplicação para o mundo! . . . . . . . . . . . . . . . . . . . . . . . . 161 12.2 Escolhendo um servidor para hospedagem . . . . . . . . . . . . . . . 162 12.3 Hospedagem com a Hostinger . . . . . . . . . . . . . . . . . . . . . . . 162 12.4 Criação da conta na Hostinger . . . . . . . . . . . . . . . . . . . . . . . 163 12.5 Configurando a aplicação para a Hostinger . . . . . . . . . . . . . . . 170 12.6 Enviando a aplicação para a Hostinger . . . . . . . . . . . . . . . . . . 170 12.7 Hospedagem no Jelastic da Locaweb . . . . . . . . . . . . . . . . . . . 173 12.8 Criação da conta no Jelastic da Locaweb . . . . . . . . . . . . . . . . . 173 12.9 Configurando a aplicação para o Jelastic . . . . . . . . . . . . . . . . . 179 12.10 Enviando a aplicação para o Jelastic . . . . . . . . . . . . . . . . . . . . 180 12.11 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 12.12 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 13 Programando com orientação a objetos 183 13.1 A classe Tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 13.2 Buscando tarefas dentro da classe . . . . . . . . . . . . . . . . . . . . . 185 13.3 Buscando apenas uma tarefa dentro da classe . . . . . . . . . . . . . . 187 13.4 Gravando e editando tarefas dentro da classe . . . . . . . . . . . . . . 189 13.5 Usando o MySQLi orientado a objetos . . . . . . . . . . . . . . . . . . 191 13.6 Avançando em orientação a objetos . . . . . . . . . . . . . . . . . . . . 195 13.7 MVC e Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 13.8 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 13.9 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 14 Proteção e ajustes 199 14.1 Protegendo-se contra SQL Injection . . . . . . . . . . . . . . . . . . . . 200 14.2 Exibindo campos com aspas . . . . . . . . . . . . . . . . . . . . . . . . 201 14.3 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 14.4 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 x Casa do Código Sumário 15 Ao infinito... E além! 203 15.1 Onde posso buscar mais informações? . . . . . . . . . . . . . . . . . . 203 xi 1.2. O navegador e a exibição de páginas web estáticas Casa do Código 1.2 O navegador e a exibição de páginas web estáti- cas Você já parou para pensar em tudo o que acontece quando você digita um endereço em seu navegador web? A história toda é mais ou menos assim: • O navegador vai até o servidor que responde no endereço solicitado e pede a página solicitada. • O servidor verifica se o endereço existe e se a página também existe em seu sistema de arquivos e então retorna o arquivo para o navegador. • Após receber o arquivo HTML, o navegador começa o trabalho de renderiza- ção, para exibir a página para o usuário. É neste momento que o navegador também requisita arquivos de estilos (css), imagens e outros arquivos neces- sários para a exibição da página. Quando se desenvolve páginas estáticas, este é basicamente todo o processo ne- cessário para que o navegador exiba a página para o usuário. Chamamos de estáticas as páginas web que não mudam seu conteúdo, mesmo em uma nova requisição ao servidor. 1.3 E como funciona uma página dinâmica? O processo para páginas dinâmicas é muito parecido com o das páginas estáticas. A diferença é que a página será processada no servidor antes de ser enviada para o usuário. Este processamento no servidor é usado para alterar dinamicamente o conteúdo de uma página, seja ele HTML, CSS, imagens ou outros formatos. Pense, por exemplo, em um site de um jornal. Em geral, este tipo de site contém algumas áreas destinadas às notícias de destaque, outras áreas para notícias gerais e ainda outras áreas para outros fins. Quando o navegador solicita a página para o servidor, ele irá montar o conteúdo antes de enviar para o navegador. Este conteúdo pode ser conseguido de algumas fontes, mas a mais comum é um banco de dados, onde, neste caso, as notícias ficam armazenadas para serem exibidas nas páginas quando necessário. 2 Casa do Código Capítulo 1. Introdução 1.4 E onde entra o PHP e oMySQL? PHP é uma ferramenta que possibilita o pré-processamento de páginas HTML. Dessa forma, PHP consegue alterar o conteúdo de uma página, antes de enviá-la para o navegador. Além disso, PHP também permite capturar entradas de dados do usuário, como formulários e outras formas de interação. Já o MySQL é o banco de dados no qual guardamos informações em estruturas no estilo de tabelas, sendo que cada linha da tabela é um novo registro. É em bancos como oMySQL que os sites de notícias, redes sociais etc., guardam suas informações para que depois sejam recuperadas e exibidas nas páginas. A dupla PHP e MySQL se conhece há muitos anos e trabalha bem em equipe. 1.5 Mas, por que escolher PHP eMySQL? Há alguns dias, ao final de uma aula na faculdade, um aluno veio até mim e per- guntou por que as empresas escolhem PHP e MySQL para desenvolver seus sites e até mesmo seus sistemas. Ele me disse que existem linguagens superiores ao PHP e bancos que são tidos como melhores que o MySQL. Responder a esta questão não é fácil, pois existem diversosmotivos para escolher esta ou aquela tecnologia. No caso da dupla PHP e MySQL, alguns motivos são: • PHP nasceu para a web e sua integração com servidores web é simples. • PHP tem uma curva de aprendizado suave, comparada a outras linguagens. • PHP e MySQL são tecnologias livres. • É fácil encontrar serviços de hospedagem que oferecem PHP e MySQL. • Serviços de hospedagem PHP e MySQL são mais baratos que serviços seme- lhantes para outras tecnologias. • MySQL é leve e rápido, mesmo para quantidades razoavelmente grandes de dados. 1.6 Oquevou precisar paraacompanhar este livro? Para desenvolver software são necessárias algumas ferramentas. Neste livro, farei uso e indicarei apenas ferramentas em software livre, mas você pode usar ferramentas 3 1.7. Sobre este livro Casa do Código que já conhece e com as quais se sinta confortável, apenas se certificando de fazer as devidas adaptações quando necessário. No geral tudo o que será necessário é um computador como ambienteWEB com PHP eMySQL, um bom editor de textos e um navegadorWEB para testar as páginas que serão criadas. Uma dica importante para quem busca aprender uma nova linguagem de pro- gramação, ou mesmo a primeira linguagem de programação, é reservar tempo para estudar e praticar bastante. Se você conseguir separar um certo tempo por dia e re- almente se dedicar à leitura e prática dos exercícios propostos, rapidamente você se sentirá mais confortável com PHP e com o ambiente WEB, o que vai lhe dar con- ceitos gerais para desenvolvimento de páginas dinâmicas até mesmo usando outras linguagens. Ou seja, um dos requisitos para o estudo será mesmo o tempo e, quanto mais tempo você conseguir dedicar aos estudos, mais conseguirá absorver novos conhe- cimentos e mais rápido conseguirá desenvolver suas aplicações. 1.7 Sobre este livro A ideia central deste livro é oferecer a oportunidade de o leitor começar a desen- volver suas primeiras páginas dinâmicas utilizando a linguagem PHP associada ao banco de dados MySQL. Este livro apresenta uma experiência de aprendizado que pode (e deve) ser aplicada não somente ao PHP, mas também a quaisquer outras tecnologias para desenvolvimento de aplicações, sejam elas web ou não. Durante os capítulos, os exemplos são construídos aos poucos e alguns erros são encorajados, além de haver algumas reescritas e melhorias em códigos que já funcionam — mas que podem sofrer por não utilizarem técnicas que simplificam a lógica e garantem maior facilidade para futuras alterações. Este livro não é um guia de referência para PHP e MySQL e, assim sendo, não apresenta listas de funções e bibliotecas disponíveis para estas tecnologias. O foco aqui é realmente um processo de aprendizado, através da construção gradual de apli- cações e assimilação dos conceitos. Estudantes de cursos relacionados a desenvolvimento de sistemas, curiosos estu- dando programação para web e hobistas podem se beneficiar grandemente do con- teúdo deste livro. Porém, desenvolvedores mais avançados que desejam apenas um guia de referência para tirar aquela dúvida sobre uma função ou outra da linguagem podem não encontrar benefícios nestas páginas. 4 Capítulo 2 O primeiro programa em PHP Chegou o momento de escrever o nosso primeiro programa em PHP! Para isso, é necessário ter o PHP e algumas outras ferramentas instaladas no nosso computador. Ainda não é hora de se preocupar com todas as ferramentas, pois precisamos realmente apenas do PHP. Mesmo assim iremos instalar um pacotão com pratica- mente tudo o que precisaremos durante o livro. Apenas não se preocupe com essas ferramentas agora, tudo bem? 2.1 Instalando o PHP Uma ótima opção para instalar o PHP é o XAMPP. Este pacote contém tudo o que é preciso para começar a programar em PHP. Para instalar, acesse o site do XAMPP e clique na opção XAMPP para Windows, veja na imagem: 2.1. Instalando o PHP Casa do Código Figura 2.1: Site do XAMPP com link para o XAMPP para Windows Ah, o site do XAMPP é este aqui: http://www.apachefriends.org/pt_br/xampp. html. Na próxima página, clique no link XAMPP logo abaixo do títuloDownload: 8 Casa do Código Capítulo 2. O primeiro programa em PHP Figura 2.2: Opção para Download do XAMPP para Windows Agora clique no link Instalador, você será direcionado para a página de download. O arquivo tem cerca de 100MB, aproveite para tomar um café enquanto baixa: 9 2.2. PHP no Linux Casa do Código Figura 2.6: Liberar o Apache no Firewall do Windows O XAMPP será instalado na pasta C:\xampp\. 2.2 PHP no Linux Se você usa Linux, use o gerenciador de pacotes da sua distribuição favorita para instalar o PHP. É bem fácil usar o apt-get no Debian e no Ubuntu ou o yum nos derivados do Fedora. Apenas procure pelos pacotes do PHP e do Apache e faça a instalação. PHP noDebian/Ubuntu Para instalar o PHP no Debian/Ubuntu, use o comando abaixo. Isso irá instalar o PHP, Apache e o MySQL e deixar tudo pronto para usar. sudo aptitute install php5 php5-mysql apache2 libapache2-mod-php5 mysql-server 12 Casa do Código Capítulo 2. O primeiro programa em PHP PHP noMacOS X Usuários doMac OS X também podem usar o XAMPP, a página para download fica em http://www.apachefriends.org/en/xampp-macosx. html Baixe o pacote DMG e siga as instruções de instalação. Após a instalação, abra seu navegador e acesse o endereço localhost. Você deverá ver uma página de boas vindas do XAMPP, ou uma página dizendo que o Apache está funcionando: Figura 2.7: Homepage do XAMPP instalado localmente O que é o localhost? Acabamos de acessar o endereço localhost através do navegador. Este é o endereço local do computador — ele corresponde sempre ao próprio computador. Após instalar o XAMPP, um servidor web também estará instalado no computador, por isso será possível acessá-lo através do na- vegador. 13 2.3. E vamos ao primeiro programa! Casa do Código 2.3 E vamos ao primeiro programa! Certo, com o XAMPP instalado, é hora de escrever o primeiro programa em PHP! Abra um editor de textos e digite o seguinte código: <?php echo "Hoje é dia " . date('d/m/Y'); Agora, salve o arquivo como C:\xampp\htdocs\programa.php e acesse através do navegador o endereço localhost/programa.php, você deverá ver uma página assim: Hoje é dia 26/05/2013 Onde salvar os arquivos no Linux e noMacOS X? Se você usa Debian ou Ubuntu, a pasta para salvar o arquivo é /var/www. Lembre-se de dar permissão para seu usuário criar arqui- vos nesta pasta. Usuários do Mac OS X que instalaram o XAMPP devem salvar os arquivos em /Applications/XAMPP/htdocs/. O que é a pasta htdocs do XAMPP? Esta pasta é a raiz do servidor Apache. É a partir dela que podemos acessar nossos arquivos dentro do Apache. Por exemplo, um arquivo chamado pagina.php dentro da pasta htdocs poderá ser acessado através do endereço localhost/pagina.php. Agora, se você criar uma pasta nova dentro de htdocs, por exemplo, a pasta site e dentro dela um arquivo pagina.php, o acesso será feito através do endereço localhost/site/pagina.php. É claro que a data exibida no seu navegador será diferente, pois ela será gerada automaticamente pelo PHP. Vamos alterar um pouco este código, para enxergarmos melhor as mudanças acontecendo. Altere o arquivo programa.php, colocando o código a seguir: 14 Casa do Código Capítulo 2. O primeiro programa em PHP Outra coisa que podemos perceber é que a instrução echo é usada para impri- mir informações para o navegador. Este arquivo também nos mostra que, assim como em outras linguagens, em PHP uma linha de instruções termina com ; (ponto e vírgula). Um último aprendizado deste arquivo é a função date(), que recebe um for- mato de data para formatar a data atual do computador. Usamos algumas opções de formatação como Y para exibir o ano com quatro dígitos e H para exibir a hora no formato 24 horas. 2.6 Desafios Ao final de cada capítulo colocarei alguns desafios como forma de praticar o que foi visto até aquele momento e até forçar um pouco mais. Dessa forma, você pode pesquisar mais sobre PHP e resolver novos problemas. Agora que já conseguimos exibir a data e a hora, tente fazer os desafios abaixo: • Na função date(), experimente mudar o Y para y. O que acontece? • Você consegue exibir a hora no formato de 12 horas, am e pm? • E se você tivesse que exibir o dia da semana? Como faria? • Exiba quantos dias faltam para o próximo sábado. Por exemplo, se hoje for quarta, então faltam 3 dias para sábado. • Exiba também o nome do mês atual. 17 Capítulo 3 Construindo um calendário com PHP Ok, nosso primeiro programa apenas exibia a data e a hora do processamento reali- zado pelo PHP. Agora vamos criar uma página que exibe um calendário. Neste capítulo, conheceremos mais sobre o PHP. Leia com atenção, faça e até refaça os exercícios. É fundamental para compreender melhor algumas partes do PHP, então fique de olho nas novidades que serão apresentadas. 3.1 Definindo nosso calendário Nossa página exibirá um calendário, usaremos tabelas HTML que serão montadas pelo PHP a cada nova requisição, dessa forma teremos sempre o calendário gerado pelo PHP, sem ter que criar a página manualmente. Como estão seus conhecimentos HTML? Hora de desenferrujar e praticar, mas usaremos PHP para escrever uma parte do nosso HTML. 3.3. Usando funções Casa do Código 3.3 Usando funções Bem, voltando ao assunto do calendário, vamos adicionar uma função ao arquivo calendario.php para desenhar uma nova linha na tabela. Uma linha deve conter sete colunas, para os sete dias da semana: <?php function linha() { echo " <tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> "; } ?> <table> ... </table> Adicionamos a função antes da tabela. Agora vamos adicionar as linhas: <table border="1"> <tr> <th>Dom</th> <th>Seg</th> <th>Ter</th> <th>Qua</th> <th>Qui</th> <th>Sex</th> <th>Sáb</th> </tr> <?php linha(); ?> <?php linha(); ?> <?php linha(); ?> 22 Casa do Código Capítulo 3. Construindo um calendário com PHP <?php linha(); ?> <?php linha(); ?> </table> Adicionamos cinco chamadas à função linha(), assim, quando acessarmos localhost/calendario.php será renderizada uma tabela parecida com esta: Figura 3.3: Calendário ainda sem os dias Agora vamos adicionar uma nova função para desenhar o calendário. Esta fun- ção será chamada de calendario() e deverá ser adicionada logo após a função linha: <?php function linha() { ... } function calendario() { $dia = 1; $semana = array(); while ($dia <= 31) { array_push($semana, $dia); if (count($semana) == 7) { linha($semana); $semana = array(); } $dia++; } 23 3.3. Usando funções Casa do Código } ?> Aqui temos bastante coisa nova. Pela primeira vez estamos usando variáveis no PHP. Repare que as variáveis sempre começam com um cifrão ( $). Esta é uma regra do PHP: elas sempre iniciam com cifrão seguido de uma letra ou um underline. Sendo assim, as variáveis $dia, $semana, $pessoa e $_nome são válidas para o PHP, mas as $1, $-nome e $!nome são inválidas. Neste trecho também estamos usando um tipo de dados do PHP chamado de array. Reparou no uso da instrução while? Viu que esta instrução é praticamente igual ao while de linguagens como C? Outra instrução bem parecida é o if, que verifica se uma condição é verdadeira. Para desenhar o calendário, iniciamos no dia primeiro e usamos o while para fazer um laço que se repetirá até o dia 31. O array $semana é usado para colocar os dias da semana e garantimos que ele não terá mais que sete dias usando o if. A função array_push() adiciona mais um valor em nosso array e dentro do if o array é reiniciado. Ah, uma nova função apresentada foi a count(). Seu funcionamento é fácil de deduzir, certo? Ela conta a quantidade de itens do nosso array $semana. Mas repare que a nossa função linha() foi chamada com um parâmetro, que é um array com os dias da semana. Então, precisamos alterar a função linha() para receber este array e exibir seus valores. Altere a função linha() para ficar como esta: <?php function linha($semana) { echo " <tr> <td>{$semana[0]}</td> <td>{$semana[1]}</td> <td>{$semana[2]}</td> <td>{$semana[3]}</td> <td>{$semana[4]}</td> <td>{$semana[5]}</td> <td>{$semana[6]}</td> </tr> 24 Casa do Código Capítulo 3. Construindo um calendário com PHP Figura 3.5: Calendário completo, mas com alguns erros Veja que o erro informado é Undefined offset: 3. Isso quer dizer que ele está tentando acessar o índice 3 no array $semana e não está encontrando. Omesmo acontece com os índices 4, 5 e 6, por isso esse monte de erros apareceu. A importância das mensagens de erro É comum que programadores novatos ignorem as mensagens de erro da linguagem. Isso é um problema, pois quando alguma falha acontece, a linguagem faz omelhor possível para indicar o que aconteceu. Quando topar com um erro no PHP, tente ler a mensagem e compreender o que houve. Em geral, ele diz a linha do erro e explica bem o problema. 3.5 Meu PHP não mostrou os erros! Pode acontecer de você não enxergar os erros gerados, pois seu PHP pode estar con- figurado para não exibir os erros. Esta é uma configuração do PHP, assim como aquela do timezone que fizemos no exemplo do início do livro. Para fazer com que o PHP exiba os erros, altere no arquivo php.ini a linha: 27 3.6. Finalizando o calendário Casa do Código display_errors = Off Para display_errors = On 3.6 Finalizando o calendário Vamos mudar um pouco o script para não gerar erros e para exibir corretamente o nosso calendário. Altere apenas a função linha() para testar se os índices existem antes de exibi-los. Para isso, vamos usar um laço for, que é bem parecido com o for de outras linguagens. Dentro do laço, vamos usar a função isset que verifica se uma variável existe ou se um índice em um array foi definido. O código deverá ficar assim: <?php function linha($semana) { echo "<tr>"; for ($i = 0; $i <= 6; $i++) { if (isset($semana[$i])) { echo "<td>{$semana[$i]}</td>"; } else { echo "<td></td>"; } } echo "</tr>"; } Agora, execute novamente o arquivo calendario.php e você terá um resul- tado bem parecido com este: 28 Casa do Código Capítulo 3. Construindo um calendário com PHP Figura 3.6: Calendário final, sem erros e com todos os dias 3.7 Resumo Neste capítulo foram introduzidas algumas características e funcionalidades inte- ressantes do PHP, como a opção de usar HTML e PHP no mesmo arquivo, e o uso de funções para centralizar blocos que podem ser repetidos no fluxo do programa. Também foram tratados os laços for e while, além do uso da condicional if e da função isset() que verifica se uma variável foi definida. 3.8 Desafios Pronto para alguns desafios? Sugiro copiar o calendário atual para fazer os testes e desafios propostos. • Faça uma página que exiba a hora e a frase “Bom dia”, “Boa tarde” ou “Boa noite”, de acordo com a hora. Use a condicional if e a função date(). • Faça com que o calendário exiba o dia atual em negrito, usando a função date(). • Exiba os domingos em vermelho e os sábados em negrito. • Faça o calendário começar em um dia que não seja um domingo. • E um calendário do ano todo? Será que é muito complexo? 29 4.2. O formulário de cadastro de tarefas Casa do Código 4.2 O formulário de cadastro de tarefas Trabalhar com web exige conhecimentos em HTML. E quando digo conhecimentos em HTML, estou dizendo realmente conhecer HTML e não ter medo de criar pági- nas usando apenas um editor de textos para escrever seu HTML. Se você já conhece um pouco (ou bastante) de web e usa editores nos quais você praticamente dese- nha a página, como o Dreamweaver e similares, eu recomendo que utilize apenas um editor de texto para reproduzir os exercícios deste livro. Assim fica mais fácil de entender o que está acontecendo e por que acontece desta ou daquela maneira. Vamos ao formulário para o cadastro das tarefas. Crie uma pasta nova chamada tarefas dentro da pasta do htdocs do XAMPP (ou onde estiver a sua instalação do Apache). Nesta pasta, crie um arquivo chamado tarefas.php. Neste arquivo vamos criar o formulário para as tarefas. Inicie o arquivo com o seguinte conteúdo básico: <html> <head> <title>Gerenciador de Tarefas</title> </head> <body> <h1>Gerenciador de Tarefas</h1> <!-- Aqui irá o restante do código --> </body> </html> Nosso projeto irá começar simples e depois adicionaremosmais funcionalidades conforme a necessidade. Por isso, vamos começar pelo mais importante, o nome da tarefa a ser realizada. Este é o código que define o nosso formulário: <form> <fieldset> <legend>Nova tarefa</legend> <label> Tarefa: <input type="text" name="nome" /> </label> <input type="submit" value="Cadastrar" /> </fieldset> </form> 32 Casa do Código Capítulo 4. Entrada de dados com formulário Não tenha medo de digitar o código HTML, lembre-se de treinar bastante, as- sim fica na sua memória muscular. Adicione o código do formulário logo após o comentário no HTML que diz que ali irá o restante do código. Agora acesse esta nova página no endereço: http://localhost/tarefas/tarefas.php Seu formulário vai ficar bem parecido com este: Figura 4.1: Formulário inicial para o cadastro de tarefas 4.3 Entrada de dados Certo, agora temos um formulário sendo exibido, mas, como será que o PHP con- segue pegar os dados que são informados nos formulários? Vamos fazer um expe- rimento: no nome da tarefa, digite Estudar PHP e clique no botão Cadastrar. O que aconteceu? Aparentemente, nada, mas o texto sumiu da caixa de texto. E ou- tra coisa muito interessante também aconteceu, o endereço do nosso script mudou! Sim, repare que agora existe uma interrogação no endereço, seguida por um texto que tem muito a nos dizer. Veja como ficou o endereço: http://localhost/tarefas/tarefas.php?nome=Estudar+PHP Dá para tirarmos algumas conclusões aqui, certo? O nome do input no for- mulário é nome e neste endereço temos um trecho nome=, ou seja, o que digitamos no campo foi enviado através do endereço, através daURL (vou chamar o endereço de URL daqui para frente). Na primeira vez que chamamos a página, seu endereço não tinha o trecho com o nome da tarefa, mas quando digitamos o nome e enviamos, este trecho passou a aparecer depois do símbolo de interrogação ( ?). Ou seja, um formulário serve para enviarmos os dados para algum lugar. 33 4.4. Pegando os dados da URL Casa do Código Entrada de dados na web Se você já programou algum software para desktop ou scripts para a linha de comando, já deve ter lidado com entrada de dados do usuário. Neste tipo de software, em geral basta parar o processamento e pedir para o usuário informar umvalor, e então seguir em frente usando o valor fornecido. Na web, as coisas são um pouco diferentes. O PHP não pode ser pa- rado para perguntar algo para o usuário, então os dados já devem existir para o PHP quando o script começar a rodar. Confuso? Na verdade é só uma maneira diferente de encarar a entrada de dados. Veja a nossa URL, por exemplo, ela tem o trecho nome=Estudar+PHP. Este trecho serve para inserir uma informação para o PHP, no caso, o nome da ta- refa. Sendo assim, quando o script tarefa.php começar a executar, ele já terá esta informação. Por isso, na web devemos sempre pensar na entrada de dados usando os formulários que irão enviar os dados para a próxima página. Por enquanto, a nossa próxima página é a mesma página, mas vere- mos como mudar isso mais adiante. Legal, já sabemos que o nome da tarefa foi enviado através da URL. Agora a questão é: Como pegar esse dado dentro do PHP? 4.4 Pegando os dados daURL PHP nasceu para a web e se dámuito bem com ela. Por isso, em PHP é super simples pegar os dados fornecidos pelo usuário através de formulários eURLs. EmPHP exis- tem algumas variáveis chamadas de super globais, isso significa que estas variáveis existem em todos os escopos de seus programas PHP. Ou seja, você pode acessá-las dentro de funções, dentro de laços, dentro de classes... Enfim, em qualquer lugar do seu código elas estarão disponíveis. No nosso caso, vamos usar a super global $_GET. Lembra dos arrays que foram usados para fazer o calendário? $_GET também é um array e o mais interessante é que o PHP pega o que está na URL e coloca em $_GET para usarmos! Vamos fazer um teste exibindo o nome digitado logo após o nosso formulário. Para isso, após 34 Casa do Código Capítulo 4. Entrada de dados com formulário </body> ... Repassando o código, foi criada uma tabela com apenas uma coluna, na qual o cabeçalho é a palavra Tarefas e as linhas serão os nomes das tarefas. Aqui existe um laço novo do PHP. Já vimos o while — agora apresento o foreach. Este laço serve para passar por todos os índices de um array, atribuindo cada índice a uma variável que escolhemos, no caso, a variável $tarefa. Uma outra novidade aqui é que não foram usadas as chaves para criar o bloco do foreach, assim como foram usadas chaves para o bloco do while. Na verdade, o foreach também pode ser usado com as chaves, sem problemas, mas esta forma, usando dois pontos para abrir o bloco e a palavra endforeach fica mais legível em templates HTML. Lembre-se que o nosso código com while estava apenas dentro de um grande código PHP, neste caso estamos colocando pequenos pedaços de PHP dentro do HTML. Sendo assim, fica mais legível fazer o uso desta sintaxe. Como exemplo, veja como fica o mesmo bloco usando as chaves: <?php foreach ($lista_tarefas as $tarefa) { ?> <tr> <td><?php echo $tarefa; ?> </td> </tr> <?php } ?> Não parece ter muita diferença em um trecho pequeno desses, mas perceba que <?php } ?> é uma linha bem genérica, que pode estar fechando um if, um while, um foreach oumesmo uma função e outros blocos PHP, enquanto <?php endforeach; ?> é mais expressivo. Por isso, recomendo usar esta forma. Alias, você pode experimentar outros blocos comesta sintaxe, comoo if e endif, while e endwhile e for e endfor. Mas prefira esta sintaxe para os templates HTML, deixando a sintaxe de chaves para os arquivos e blocos que contenham apenas PHP. Bem, voltando ao assunto da lista de tarefas, ao enviar um nome de tarefa, a sua página deverá ficar assim: 37 4.4. Pegando os dados da URL Casa do Código Figura 4.3: Lista de tarefas com uma tarefa Como estamos deixando tudo na mesma página, fica fácil adicionar uma nova tarefa, então vamos adicionar uma nova tarefa usando o formulário que está antes da tabela, no endereço http://localhost/tarefas/tarefas.php. Aqui eu digitei Estudar HTML e usei o botão cadastrar e o resultado foi este: Figura 4.4: Lista de tarefas com uma tarefa Apenas a tarefa nova é listada! Onde está a tarefa antiga? Por que a primeira tarefa sumiu? PHP trabalha principalmente com web e neste caso o que acontece a cada nova requisição que fazemos, seja pedindo uma página, seja en- viando dados, é que o PHP interpreta tudo de novo e devolve apenas HTML para o navegador. Ou seja, ele não lembra do que aconteceu na última requisição feita! A cada nova requisição o PHP processa tudo de novo e não guarda as variáveis para outros acessos. Isso é um problema para a nossa aplicação, já que precisamos 38 Casa do Código Capítulo 4. Entrada de dados com formulário manter a lista das nossas tarefas. Mas calma, nem tudo está perdido! O PHP tem um recurso que nos auxiliará a solucionar isso. 4.5 Sessões no PHP O recurso que nos auxiliará a manter os dados entre as requisições são as sessões. Uma sessão serve para mantermos uma variável especial que irá existir em todas as nossas requisições. Lembra da super global $_GET? As sessões são tão fáceis de usar quanto a $_GET, basta usar a super global $_SESSION. A grande diferença é que usamos a $_GETmais para ler informações e usaremos a $_SESSION para escrever e ler informações. O uso da $_SESSION exige só um esforço adicional, que é chamar a função session_start() no começo do nosso programa. Para isso, vamos adicionar a função antes da abertura do HTML: <?php session_start(); ?> <html> ... Depois disso, precisamos alterar o uso da lista $lista_tarefas para pegar os dados de $_SESSION, caso esses dados existam. Vamos mudar o if que veri- fica se existem dados em $_GET e vamos adicionar um novo if após a criação do array $lista_tarefas para preenchê-lo com os dados da $_SESSION, quando necessário: <?php ... if (isset($_GET['nome'])) { $_SESSION['lista_tarefas'][] = $_GET['nome']; } $lista_tarefas = array(); if (isset($_SESSION['lista_tarefas'])) { $lista_tarefas = $_SESSION['lista_tarefas']; } ... ?> Agora, ao cadastrar algumas tarefas, o PHP irá manter os dados entre as requi- sições! Veja como a sua lista deve ficar: 39 4.7. Desafios Casa do Código Continue usando as sessões para manter os dados. • Crie uma cópia do projeto até agora (pois vamos continuar nos próximos ca- pítulos) e altere para usar a super global $_COOKIE em vez de usar as sessões. Para adicionar um Cookie use a função setcookie() que recebe o nome do cookie e um texto com seu valor. Para pegar um cookie já definido use a superglobal $_COOKIE. • Depois de alterar a aplicação para usar cookies no lugar de sessões, tente abrir os cookies nas opções do navegador e veja se seus dados aparecem lá. 42 Capítulo 5 Tratamento de diferentes campos de formulários No capítulo anterior, construímos a base para a nossa lista de tarefas. Agora vamos adicionar mais informações e funcionalidades ao projeto. Antes de começar a adicionarmais informações e funcionalidade podemos parar para analisar um pouco nosso cenário atual e então decidir se podemos continuar com ele como está ou se podemos fazer algo para melhorar. Esta pode ser uma etapa importante no desenvolvimento de uma aplicação, pois pode tornar o trabalho à frente mais simples ou mais complicado. Às vezes é melhor alterar a base da aplicação para poder evoluir de forma mais eficiente do que insistir em um código não muito bom. Não se preocupe se não conseguir fazer isso logo no começo, pois a experiência também ajuda bastante neste tipo de decisão. 5.1. Organizando o código em arquivos separados Casa do Código 5.1 Organizando o código em arquivos separados O que temos até o momento é uma lista de tarefas que tem apenas o nome da ta- refa e só permite adicionar novas tarefas. Tudo isso foi feito em apenas um arquivo que contém um pouco de HTML e um pouco de PHP. Podemos continuar com esta estrutura, mas com o tempo o arquivo vai crescer e pode ficar complicado de ler e entender um arquivo muito grande e dividido emmais de uma linguagem. Por isso, aqui entra uma decisão importante, vamos separar nossa aplicação em dois arqui- vos, um deles fará o processamento de entrada de dados e manipulação da sessão e o outro irá exibir o formulário de cadastro de tarefas e a lista das tarefas cadastradas. Não adicionaremos código novo, vamos apenas separar o código atual em dois arquivos — um arquivo será o tarefas.php com este conteúdo: <?php session_start(); if (isset($_GET['nome'])) { $_SESSION['lista_tarefas'][] = $_GET['nome']; } if (isset($_SESSION['lista_tarefas'])) { $lista_tarefas = $_SESSION['lista_tarefas']; } else { $lista_tarefas = array(); } include "template.php"; Perceba que apenas juntamos os trechos de PHP que antes estavam separados em apenas um arquivo que contém somente código PHP. Outro detalhe importante neste arquivo é o uso da instrução include, que serve para incluir o conteúdo de outro arquivo no fluxo atual. O legal do include é que ele adiciona o outro arquivo e todas as variáveis e funções do arquivo atual continuamvalendo no arquivo incluído, por isso podemos, neste caso, incluir um arquivo com apenas o template do formulário de cadastro de tarefas e a lista de tarefas e ainda podemos continuar usando a variável $lista_tarefas que foi definida no arquivo tarefas.php e que contém um array com as tarefas cadastradas. O arquivo com o template deve se chamar template.php pois este é o arquivo que estamos incluindo usando o include no arquivo tarefas.php. Veja como fica o arquivo template.php: 44 Casa do Código Capítulo 5. Tratamento de diferentes campos de formulários Baixa <input type="radio" name="prioridade" value="media" /> Média <input type="radio" name="prioridade" value="alta" /> Alta </label> </fieldset> <label> Tarefa concluída: <input type="checkbox" name="concluida" value="sim" /> </label> <input type="submit" value="Cadastrar" /> ... Se você usar o CSS dos exemplos, seu formulário deverá ficar parecido com este: Figura 5.1: Formulário completo para o cadastro de tarefas 47 5.2. Adicionando mais informações às tarefas Casa do Código O legal é que só precisamos alterar o arquivo template.php, enquanto o tarefas.php continuou o mesmo. O sistema continua funcionando e apenas ig- nora os dados adicionais enviados. Agora vamos alterar tambémo tarefas.php para pegar as novas informações. Vamos usar o campo com o nome da tarefa como a base para saber se devemos cadastrar uma nova tarefa, já que o nome da tarefa é a única informação essencial para nós. Para isso, vamos alterar aquele if logo após o session_start() e também seu conteúdo. É claro que ele vai ficar maior, pois agora são vários campos que pre- cisamos pegar do formulário enviado: <?php session_start(); if (isset($_GET['nome']) && $_GET['nome'] != '') { $tarefa = array(); $tarefa['nome'] = $_GET['nome']; if (isset($_GET['descricao'])) { $tarefa['descricao'] = $_GET['descricao']; } else { $tarefa['descricao'] = ''; } if (isset($_GET['prazo'])) { $tarefa['prazo'] = $_GET['prazo']; } else { $tarefa['prazo'] = ''; } $tarefa['prioridade'] = $_GET['prioridade']; if (isset($_GET['concluida'])) { $tarefa['concluida'] = $_GET['concluida']; } else { $tarefa['concluida'] = ''; } 48 Casa do Código Capítulo 5. Tratamento de diferentes campos de formulários $_SESSION['lista_tarefas'][] = $tarefa; } ... Repare que usamos sempre a função isset()para saber se os índices de $_GET existem. Isso é necessário pois o navegador não envia os campos em branco, nem os campos desmarcados. Agora é só alterar a tabela para exibir todos os dados: <table> <tr> <th>Tarefa</th> <th>Descricao</th> <th>Prazo</th> <th>Prioridade</th> <th>Concluída</th> </tr> <?php foreach ($lista_tarefas as $tarefa) : ?> <tr> <td><?php echo $tarefa['nome']; ?> </td> <td><?php echo $tarefa['descricao']; ?> </td> <td><?php echo $tarefa['prazo']; ?> </td> <td><?php echo $tarefa['prioridade']; ?> </td> <td><?php echo $tarefa['concluida']; ?> </td> </tr> <?php endforeach; ?> </table> Acesse o formulário e cadastre algumas tarefas. Veja como ficou a minha página com duas tarefas cadastradas: 49 Capítulo 6 Acessando e usando um banco de dados Nos últimos capítulos construímos uma lista de tarefas que funciona muito bem quando usamos apenas um navegador e mantemos a sessão sempre aberta. Para a nossa aplicação este não é o cenário ideal, por isso é necessário guardar nossos dados em um local mais adequado, de onde vamos conseguir recuperá-los sempre que ne- cessário, mesmo estando em outro navegador ou fechando o navegador e abrindo-o novamente. É para resolver este tipo de problema que entra o banco de dados e, no nosso caso, o famoso MySQL. Como nossa aplicação já tem uma estrutura bacana e já funciona bem usando as sessões, o que precisamos fazer é trocar o uso das sessões pelo uso do banco de dados. Por isso, vamos começar por criar o banco de dados, definindo quais dados queremos guardar e faremos com que o PHP se conecte ao banco para poder inserir e recuperar esses dados. 6.1. O banco de dados MySQL Casa do Código A manipulação do banco de dados é feita com a utilização de outra linguagem, a SQL, que nos permite executar comandos para inserir, pesquisar e remover dados, fazer relatórios etc. Neste livro veremos apenas um básico sobre a SQL, focandomais nos comandos necessários para o desenvolvimento dos projetos. Se você ainda não tem familiaridade com SQL, recomendo que também invista um tempo estudando esta linguagem, pois você poderá usar SQL para trabalhar com diversos bancos de dados além do MySQL, integrando com várias outras linguagens de programação além do PHP. 6.1 O banco de dadosMySQL MySQL é um software livre para banco de dados. Isso significa que você pode usar o MySQL em seus projetos e ainda pode contribuir com o desenvolvimento do próprio MySQL, se assim desejar ou necessitar. O MySQL é bastante usado em aplicações web por sua versatilidade e por ser suportado em diversas plataformas e diferentes linguagens. Por padrão, o MySQL não tem uma interface gráfica para administração e uti- lização, mas é possível encontrar diversas ferramentas que fazem este tipo de traba- lho, sendo que uma das mais conhecidas é o MySQL Workbench. Não usaremos o MySQLWorkbench, mas você pode pesquisar mais sobre este software e usá-lo para administrar seus bancos MySQL. 6.2 Instalando oMySQL Como já fizemos a instalação do XAMPP, oMySQL veio junto. Então, só precisamos usar o Painel no XAMPP para iniciar o serviço. Fique sempre de olho para ver se não é necessário liberar o serviço do MySQL no firewall. MySQL no Linux Para quem usa Linux, mais especificamente os derivados do Debian e do Ubuntu, basta instalar o MySQL com o seguinte comando: sudo apt-get install mysql-server Usuários de Mac OS X que instalaram o XAMPP poderão iniciar o MySQL usando o painel do XAMPP. 54 Casa do Código Capítulo 6. Acessando e usando um banco de dados Figura 6.3: Página inicial do PHPMyAdmin 6.4 Criando o banco de dados Vamos criar um novo banco de dados. Se você escolheu o idioma português na pá- gina de login, selecione a opção Bancos de dados. Na próxima página digite o nome do banco de dados, que será tarefas, na caixa de entradaCriar bancode da- dos. Na opção Colação, ou Collation, selecione a opção utf8_general_ci. Figura 6.4: Formulário para criar um novo banco de dados no MySQL Agora, basta clicar no botão Criar e o novo banco deve aparecer no menu à esquerda: 57 6.5. Criando a tabela Casa do Código Figura 6.5: Veja o banco ‘tarefas’ na lista dos bancos Clicando no nome, seremos informados de que o banco ainda não possui tabelas. 6.5 Criando a tabela Nosso projeto é um gerenciador de tarefas, então vamos precisar apenas de uma tabela com os campos necessários para guardar os dados que já temos nos arrays de tarefas dentro da $_SESSION. Nossa tabela deverá ficar assim: 58 Casa do Código Capítulo 6. Acessando e usando um banco de dados Figura 6.6: Modelagem da tabela tarefas Repare que a tabela é muito parecida com os arrays que armazenam as tarefas, as diferenças são pequenas, como o campo id e os campos nome, que foi definido com até 20 caracteres, e prioridade que é um número inteiro. O campo id será uma identificação única das nossas tarefas e será um número crescente. Dessa forma teremos a tarefa 1, 2, 3 e assim por diante, sem nunca repetir o número. Isso é importante para identificarmos as tarefas e não misturarmos quando precisarmos fazer referência a uma tarefa. Imagine que usássemos o campo nome para isso, fatalmente teríamos duas tarefas com o mesmo nome, e isso atrapalharia na hora de saber qual é qual. O campo nome agora tem um limite de até 20 caracteres. Isso é algo comum em bancos de dados. Já que não precisamos de nomes muito grandes para as tarefas, 20 caracteres devem ser suficientes. O campo prioridade é um número com apenas um algarismo. Vamos usar desta forma pois ficamais simples guardar no banco as prioridades 1, 2 e 3, em vez de baixa, média e alta. Isso também é bastante comum em bancos de dados, pois reduz o espaço utilizado e fica fácil de controlar na aplicação. Existem duas maneiras de criar a tabela, a primeira é executando diretamente o código SQL a segunda é usando a interface do PHPMyAdmin. Vou mostrar a primeira opção pois exige menos passos e, acredite, é mais simples depois que se aprende um pouco de SQL. Usando o PHPMyAdmin e estando com o banco tarefas selecionado, clique na aba SQL e você verá uma página com um campo para digitar comandos SQL. A página é parecida com esta: 59 6.7. Filtrando os resultados do SELECT Casa do Código SELECT nome, prioridade FROM tarefas Agora o resultado será com apenas os campos nome e prioridade. Adicionemais algumas tarefas na tabela, usando o comando INSERT que vimos há pouco. Eu cadastrei quatro tarefas. O meu SELECT, com os campos nome, descricao e prioridade trouxe este resultado: Figura 6.9: Resultado do SELECT com mais linhas Uma curiosidade interessante é que SQL não te obriga a escrever os comandos da linguagem, como SELECT, INSERT etc., usando caixa alta, mas é interessante manter este padrão pois simplifica a leitura. Veja que nos nossos códigos SQL até aqui existem comandos comoo FROM e o VALUES, que eu não necessariamente disse para que servem, mas como eles estão em caixa alta, você conseguiu ler os comandos e deduzir o que é da linguagem e o que são nossos dados. Então, mantenha seu SQL com as palavras da linguagem em caixa alta, vai facilitar para você e para outras pessoas lerem seu código e entender o que ele faz. 6.7 Filtrando os resultados do SELECT Usando o SELECT podemos filtrar os resultados da busca, por exemplo, se quiser- mos exibir as tarefas com a prioridade 1, faremos o SQL assim: SELECT nome, descricao, prioridade FROM tarefas WHERE prioridade = 1 O resultado deve ser algo similar a isso: Figura 6.10: Resultado do SELECT filtrando com a prioridade 1 62 Casa do Código Capítulo 6. Acessando e usando um banco de dados Também podemos filtrar por um texto que esteja dentro de outro texto, para isso usamos a instrução LIKE do SQL: SELECT nome, descricao, prioridade FROM tarefas WHERE nome LIKE '%php%' O LIKE aceita o uso daqueles sinais de porcentagem. Eles servem para dizer algo como: Procure por qualquer coisa, seguido de php, seguido de qualquer coisa Então, se a nossa pesquisa fosse assim: SELECT nome, descricao, prioridade FROM tarefas WHERE nome LIKE 'php' Ela não teria resultados. Consegue entender o motivo? Se pensar um pouco fica simples. Neste caso, ele pesquisa resultados nos quais o campo nome seja igual a php, sem textos antes ou depois. Também podemos usar a porcentagem apenas antes ou apenas depois de um texto. Nopróximo capítulo vamos fazer a conexão da nossa aplicaçãoPHP comobanco MySQL. 6.8 Resumo Neste capítulo usamos a linguagem SQL para manipular dados em um banco de da- dosMySQL.OMySQL pode ser instalado à parte, ou junto como pacote doXAMPP. Usamos também o PHPMyAdmin como ferramenta para acessar o banco através do navegador. Paramanipular o banco de dados usamos a instrução CREATE TABLE para criar uma tabela, INSERT INTO para cadastrar dados em uma tabela, SELECT para bus- car os dados da tabela e também filtramos os resultados do SELECT usando WHERE e LIKE. 6.9 Desafios Hora de alguns desafios, dessa vez voltados para bancos de dados e para a linguagem SQL: • Façamais testes como SELECT, o WHERE e o LIKEusandoo banco tarefas. 63 6.9. Desafios Casa do Código • Crie um banco chamado contatos para guardar os dados dos contatos do desafio iniciado nos desafios anteriores. Qual tabela será necessária para este banco? Quais campos serão necessários para cadastrar os dados que já estão sendo capturados pelo formulário? Não se esqueça de deixar um campo id para guardar a chave que identificará um contato como único, assim como foi feito para as tarefas. • Crie um banco chamado estacionamento para cadastrar os veículos esta- cionados. Neste banco crie uma tabela chamada veiculos com os campos id, placa, marca, modelo, hora_entrada e hora_saida. Decida os tipos de dados que devem ser usados para cada campo. Cadastre alguns veículos e tente fazer pesquisas, como buscar todos os veículos de umamarca. 64 Casa do Código Capítulo 7. Integrando PHP comMySQL Após a adição do usuário, teremos um usuário chamado sistematarefa com a senha sistema. Estes são os valores que informaremos ao PHP. Agora vamos criar um novo arquivo para fazer a conexão com o banco. Ele será gravado na mesma pasta dos arquivos da lista de tarefa, ou seja a pasta tarefas, e seu nome será banco.php: <?php $bdServidor = '127.0.0.1'; $bdUsuario = 'sistematarefa'; $bdSenha = 'sistema'; $bdBanco = 'tarefas'; $conexao = mysqli_connect($bdServidor, $bdUsuario, $bdSenha, $bdBanco); if (mysqli_connect_errno($conexao)) { echo "Problemas para conectar no banco. Verifique os dados!"; die(); } No arquivo, estamos criando quatro variáveis que guardam o endereço do servi- dorMySQL (que é a nossa máquina), o nome de usuário, a senha de acesso e o nome do banco que queremos acessar. É legal manter estes dados em variáveis, pois se for necessário alterar, alteramos apenas a criação da variável, sem ter que procurar onde ela está sendo usada. Repare que no código do arquivo banco.php existem apenas duas funções que não usamos até agora. A função mysqli_connect() recebe os dados de conexão com o banco e abre a conexão. Esta conexão é guardada na variável $conexao e vamos precisar desta variável sempre que formos interagir com o banco. A outra função é a mysqli_connect_errno() que pega uma conexão e verifica se houve erros de conexão. Neste caso, a função está dentro de um if, para verificar se houve erros ou não. Ah, tem mais uma função nova ali, a função die(), que faz o que o nome diz: ela mata o programa ali mesmo, sem ler o código que existe mais para frente. 67 7.3. Buscando dados no banco Casa do Código Sempre ouvi falar de mysql_connect() Talvez você já tenha visto algum texto sobre PHP e MySQL em que a função de conexão era a mysql_connect(). Esta função existe, assim como várias outras funções que começam com mysql_, mas elas serão removidas do PHP em breve. Por isso, o ideal é usar sempre a nova eme- lhorada versão da biblioteca MySQL do PHP, a MySQLi. No geral, basta adicionar a letra i nos nomes de função MySQL e um parâmetro aqui ou ali, que tudo funciona bem, mas existem algumas diferenças entre as bibliotecas. Então, a dica é: sempre use a versão nova da biblioteca MySQL para PHP. Sempre. Vamos fazer uma pequena experiência com a conexão ao banco. Acesse o ar- quivo banco.php diretamente pelo navegador, no endereço: http://localhost/tarefas/ banco.php. Você deverá ver apenas uma página em branco, o que é bom, significa que a conexão funcionou. Agora, experimente mudar o campo de senha da conexão para uma senha incorreta e acesse o arquivo novamente. Você verá a fraseProblemas para conectar no banco. Verifique os dados!. Ou seja, nosso código de conexão está funcional e também exibe erros caso não consiga conectar. O errodeconexãoaparece sempre,mesmocomosdados corretos Você poderá passar pelo problema do erro de conexão de vez em quando. Caso isso aconteça, verifique se o servidor do MySQL está ativo no painel de controle do XAMPP, ou em outra ferramenta que você use para gerenciar o MySQL. Uma outra forma de verificar se o banco está funcionando normalmente é acessando o PHPMyAdmin. Se ele também não conseguir conectar, o banco poderá estar mesmo desligado. 7.3 Buscando dados no banco A próxima alteração que faremos em nosso programa é fazer com que ele busque as tarefas cadastradas no banco de dados e nãomais na sessão. Para isso, abra o arquivo tarefas.php e ache o trecho que verifica se a sessão existe para colocar na lista de tarefas, ou cria uma lista vazia, caso a sessão não exista. O trecho é este: 68 Casa do Código Capítulo 7. Integrando PHP comMySQL <?php ... if (isset($_SESSION['lista_tarefas'])) { $lista_tarefas = $_SESSION['lista_tarefas']; } else { $lista_tarefas = array(); } ... Este trecho será eliminado! No lugar dele, ficará apenas uma nova linha que chama uma função que retornará as tarefas cadastradas no banco: <?php ... $lista_tarefas = buscar_tarefas($conexao); É claro que a função buscar_tarefas() ainda não existe, por isso iremos criá-la dentro do arquivo banco.php. Então, abriremos novamente o arquivo banco.php e no final dele vamos colocar a nova função. Mas antes de escrevê-la, precisamos planejar um pouco o seu funcionamento. A função buscar_tarefas() deverá usar uma conexão com o banco para executar comandos SQL que busquem a lista de tarefas. Após buscar as tarefas, ela deverá criar um array com os dados das tarefas e então deverá retornar esses dados. Certo, planejando assim fica mais simples alcançar nosso objetivo. Como já te- mos uma variável coma conexão comoMySQL, poderemos usá-la. Vamos ao código da função: <?php ... function buscar_tarefas($conexao) { $sqlBusca = 'SELECT * FROM tarefas'; $resultado = mysqli_query($conexao, $sqlBusca); $tarefas = array(); 69 7.4. Cadastrando as tarefas no banco Casa do Código 7.4 Cadastrando as tarefas no banco Bem, agora que já estamos buscando as tarefas no banco, é chegada a hora de cadas- trarmosmais tarefas usando o nosso formulário. Será que aqui também será possível fazer pequenas alterações para termos os dados sendo enviados para o banco, no lu- gar de usar sessões? Analisando o código no arquivo tarefas.php, conseguimos ver que a linha responsável por colocar a tarefa na sessão é esta: <?php ... $_SESSION['lista_tarefas'][] = $tarefa; ... Essa linha coloca na sessão a variável $tarefa, que é um array com os dados da tarefa. Este array é exatamente o que precisamos para enviar nossas tarefas para o banco de dados! Assim como fizemos com o trecho que buscava as tarefas na sessão, vamos trocar esta linha por uma chamada a uma nova função que irá gravar os dados no banco. Troque a linha que acabamos de ver por esta: <?php ... gravar_tarefa($conexão, $tarefa); ... A função gravar_tarefa() receberá a conexão que já temos, na variável $conexao, e também a nossa tarefa, que está no array $tarefa. Mas a fun- ção gravar_tarefa() não existe, então precisamos adicioná-la. Faremos isso no arquivo banco.php, pois ele está com o restante do código responsável pela comunicação com o banco MySQL. No final do arquivo iremos adicionar a função gravar_tarefa(): <?php ... function gravar_tarefa($conexao, $tarefa) { $sqlGravar = " 72 Casa do Código Capítulo 7. Integrando PHP comMySQL INSERT INTO tarefas (nome, descricao, prioridade) VALUES ( '{$tarefa['nome']}', '{$tarefa['descricao']}', {$tarefa['prioridade']} ) "; mysqli_query($conexao, $sqlGravar); } Veja que este código faz o que fizemos lá no PHPMyAdmin, a diferença é que ele coloca as variáveis do PHP para preencher o código SQL. Não se esqueça de colocar as variáveis PHP dentro das chaves quando estiver colocando o conteúdo das variá- veis dentro de outras strings. Uma string é uma sequência de caracteres, ou seja, as nossas variáveis com textos são variáveis com strings. Não deixe de reparar que abrimos a string $sqlGravar na linha onde ela é declarada e a fechamos na linha depois do código SQL. Nesta função também fizemos o uso da função mysqli_query(), pois ela é bem versátil, servindo para buscar dados e também para gravar dados. Na verdade a função mysqli_query() serve para executar código SQL, então ela devolve da- dos quando fizermos, por exemplo, um SELECT, ou apenas insere dados quando executados um INSERT. Bem, a aplicação já está quase ok para funcionar usando o banco. Mas ainda é ne- cessária uma alteração! O nosso formulário tem o campo para a definir a prioridade da tarefa e este campo está com os valores baixa,media e alta, mas a tabela tarefas no banco de dados não está preparada para estes valores, pois decidimos usar núme- ros para definir as prioridades. Sendo assim, altere o formulário para que os valores das prioridades fiquem como 1, 2 e 3, respectivamente, lembrando que o formulário está no arquivo template.php: ... <legend>Prioridade:</legend> <label> <input type="radio" name="prioridade" value="1" checked /> Baixa <input type="radio" name="prioridade" value="2" /> Média 73 7.4. Cadastrando as tarefas no banco Casa do Código <input type="radio" name="prioridade" value="3" /> Alta </label> ... Muito bem, agora acesse a página em http://localhost/tarefas/tarefas.php e tente cadastrar uma tarefa. Eu cadastrei uma nova e a minha lista ficou assim: Figura 7.3: Cadastrando uma nova tarefa através do formulário Agora, precisamos exibir corretamente as prioridades na lista de tarefas, pois 1, 2 e 3 devem ser usados apenas no banco e a aplicação deve exibir sempre como baixa, média e alta. A linha que precisamos alterar é a que exibe a prioridade no arquivo template.php: ... <td><?php echo $tarefa['prioridade']; ?> </td> ... Adicionar alguns ifs podem resolver o nosso problema, mas vão deixar nosso template mais difícil de ser lido. Veja como fica se adicionarmos a logica necessária para exibir os nomes das prioridades diretamente no template: <td><?php if ($tarefa['prioridade'] == 1) { echo 'Baixa'; } if ($tarefa['prioridade'] == 2) { echo 'Média'; } if ($tarefa['prioridade'] == 3) { echo 'Alta'; } ?> </td> Não está assim tão ruim, mas veja como esta outra maneira fica bemmais legível e fácil de entender: 74 Casa do Código Capítulo 7. Integrando PHP comMySQL 7.5 Cadastrando o prazo das atividades Até o momento, estamos gravando no banco apenas o nome, a descrição e a priori- dade das tarefas. Vamos agora incluir o prazo. Este é um campo que vai dar um pouco mais de trabalho, pois no Brasil nós usamos a data no formato DIA/MÊS/ANO, mas para o MySQL o formato da data é ANO-MÊS-DIA. Por isso vamos precisar de dois tradutores: um para pegar a data que digitarmos e traduzir para o formato do MySQL e outro para pegar a data do MySQL e traduzir para exibir na lista de tarefas. Em programação sempre existem diversasmaneiras de se resolver um problema. Neste caso não é diferente, pois podemos transformar as datas usando diversas téc- nicas diferentes. A técnica que faremos pode não ser a melhor ou a mais elegante, mas vai resolver o nosso problema e ficará bem simples de entender. Vamos analisar melhor o problema. Nos dois formatos de data temos osmesmos valores, mas em posições diferentes e usando separadores diferentes. Então, o que precisamos fazer é arrumar uma forma de separar os valores e reconstruir a string colocando cada valor em sua posição usando os separadores esperados, que podem ser barras ou traços. Vamos começar pela tradução da data digitada no formulário, no formato DIA/MÊS/ANO para o formato doMySQL. A estratégia aqui será separar os valores para montar a string com o novo formato. Para isso, vamos usar uma função bem interessante do PHP, a explode(), que divide uma string empartes, de acordo com algum separador informado. O retorno da função explode() é um array com as partes da string, veja um exemplo: <?php $texto_original = "Frodo;Sam;Merry;Pippin"; $hobbits = explode(";", $texto_original); foreach ($hobbits as $hobbit) { echo $hobbit . "<br />"; } A variável $texto_original contém os nomes dos quatro hobbits separados por ponto e vírgula. A função explode() recebe dois parâmetros, sendo que o primeiro é o separador que desejamos e o segundo é o texto que desejamos separar. O resultado é um array no qual cada item é um dos pedaços após a separação. 77 7.5. Cadastrando o prazo das atividades Casa do Código No caso da tradução do prazo para as nossas tarefas, vamos criar uma função chamada traduz_data_para_banco() no arquivo ajudantes.php. Esta fun- ção irá separar os valores de dia, mês e ano e irá retornar uma string com o formato correto para o MySQL. Veja como ela fica: <?php function traduz_data_para_banco($data) { if ($data == "") { return ""; } $dados = explode("/", $data); $data_mysql = "{$dados[2]}-{$dados[1]}-{$dados[0]}"; return $data_mysql; } ... Quando separamos a string da data, temos um array em que o índice zero é o dia, o índice 1 é o mês e o índice 2 é o ano. Basta construir uma nova string com os dados nas posições corretas e separando com o traço, assim temos o formato esperado pelo MySQL. Outro detalhe é que, antes de tentar traduzir a data, verificamos se ela está vazia, já que é um campo opcional. Caso esteja vazia, retornamos uma string vazia, assim o MySQL irá gravar uma data também vazia. Agora precisamos alterar o trecho onde montamos o array com os dados envia- dos para usar a nova função, lá no arquivo tarefas.php: <?php ... if (isset($_GET['prazo'])) { $tarefa['prazo'] = traduz_data_para_banco($_GET['prazo']); } else { $tarefa['prazo'] = ''; } 78 Casa do Código Capítulo 7. Integrando PHP comMySQL ... Certo, já temos a função e também já estamos traduzindo o prazo que for di- gitado no formulário. Só falta alterar a função gravar_tarefa() no arquivo banco.php para também gravar o prazo. Para isso é necessário mudar a criação do código SQL. Uma nota importante é que a data precisa ser formatada como uma string para o MySQL, ou seja, ela precisa estar entre aspas. Veja como deverá ficar o código: <?php ... function gravar_tarefa($conexao, $tarefa) { $sqlGravar = " INSERT INTO tarefas (nome, descricao, prioridade, prazo) VALUES ( '{$tarefa['nome']}', '{$tarefa['descricao']}', {$tarefa['prioridade']}, '{$tarefa['prazo']}' ) "; mysqli_query($conexao, $sqlGravar); } ... Pronto, todas as pontas ligadas. Experimente cadastrar uma tarefa comumprazo e veja como fica. A minha lista ficou assim: 79 7.6. Marcando uma tarefa como concluída Casa do Código Agora, é necessário alterar a função gravar_tarefa() para gerar o código SQL incluindo o campo concluida. Vale lembrar que a função gravar_tarefa() está no arquivo banco.php: <?php ... function gravar_tarefa($conexao, $tarefa) { $sqlGravar = " INSERT INTO tarefas (nome, descricao, prioridade, prazo, concluida) VALUES ( '{$tarefa['nome']}', '{$tarefa['descricao']}', {$tarefa['prioridade']}, '{$tarefa['prazo']}', {$tarefa['concluida']} ) "; } ... Repare que o campo foi adicionadona lista de campos e o valor na lista de valores. Como o campo é um número, não precisamos usar aspas desta vez. Cadastre uma atividade e veja o resultado: Figura 7.6: Mostrando a tarefa como concluída, mas mostra ‘1’ no lugar de ‘Sim’ Bem, ainda não está bom para o usuário, pois agora ele vai exibir o número 1 para tarefas concluídas e o número 0 para atividades não concluídas. 82 Casa do Código Capítulo 7. Integrando PHP comMySQL Vamos adicionar mais uma função para traduzir conteúdos do banco para apresentação. No arquivo ajudantes.php criaremos a função traduz_concluida(), que retorna Sim ou Não de acordo com o campo de tarefa concluída no banco: <?php ... function traduz_concluida($concluida) { if ($concluida == 1) { return 'Sim'; } return 'Não'; } Precisamos alterar o arquivo template.php para usar a nova função para exi- bir o status de conclusão das tarefas: ... <td><?php echo traduz_concluida($tarefa['concluida']); ?> </td> ... Atualize a página, ou cadastre uma nova tarefa e você verá a lista com as palavras Sim e Não na coluna Concluída: Figura 7.7: Lista exibindo o status de conclusão como Sim e Não Neste momento, temos uma lista de tarefas funcional, mas ainda não podemos editar as tarefas e teremos problema se digitarmos datas incorretas, nomes muito grandes ou se atualizarmos a página assim que adicionarmos uma tarefa. No pró- ximo capítulo, vamos lidar com alguns destes problemas e vamos praticamente con- cluir nossa aplicação de gestão de tarefas. 83 7.7. Resumo Casa do Código 7.7 Resumo Neste capítulo alteramos a nossa aplicação para trabalhar com o banco de dados no lugar das sessões. Experimente, neste momento, fechar o seu navegador e abri-lo novamente, ou então acesse a lista de tarefas em um navegador diferente. Perceba que as atividades estão lá! Ou seja, não dependemos mais do uso das sessões para que nossa aplicação guarde os dados. Este capítulo também reforçou o conceito da separação de responsabilidades em diferentes arquivos e tambémmostrou o conceito dos arquivos com funções ajudan- tes, que também são conhecidos no mundo da programação como helpers. Também fizemos a tradução de datas no formato usado no Brasil para o formato esperado pelo MySQL e vice-versa. 7.8 Desafios Hora de treinar fazendo mais alguns desafios: • Continue a lista de contatos dos desafios anteriores, mas agora passando a guardar os dados em um banco de dados. Utilize todos os conceitos vistos até aqui, como a separação em arquivos, o uso de ajudantes e o uso das funções mysqli_ do PHP para lidar com o MySQL. • Crie a aplicação para trabalhar com o banco de dados estacionamento, criado nos desafios do capítulo anterior. Mais uma vez, utilize todos os conceitos que vimos até aqui. 84
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved