r1 - 10 Nov 2009 - 15:49:06 - LuizHenriqueKowalskiVocê está aqui: TWiki >  Web GrupoWeb  > Licoes > MaterialPHPCompleto
, create new tag

Trilha A - Introdução ao PHP

Lição A1 - World Wide Web e a linguagem PHP

1.1 - Introdução

Com o passar do tempo, as mudanças na World Wide Web são cada vez maiores. Já se foi a época em que a internet era tratada como uma grande enciclopédia usada apenas para a obtenção de informações, na qual a linguagem HTML (Hyper Text Markup Language) era o suficiente para prover as estruturas dos sites.

Hoje em dia, as home pages têm visuais e conteúdos muito mais dinâmicos, totalmente voltados para a interação com o usuário da rede. Queremos sites com interfaces amigáveis, conteúdos interessantes e significativos, fácil uso, funcionalidades corretas e que possam, de certa forma, realizar nossos propósitos.

O desenvolvedor Web tem inúmeras opções para a realização de seus projetos, mas deve-se ter a consciência de que com o passar dos tempos, tanto hardwares quanto softwares passarão por modificações, portanto, tais projetos devem de certa forma manterem-se constantemente funcionais. É aí que entram os softwares de fonte aberta, que de certa forma são as melhores garantias para um desenvolvedor que deseja que os seus projetos funcionem hoje e amanhã em diversas máquinas diferentes.

1.2 - O que é o PHP?

O PHP, (Personal Home Pages) Hypertext Preprocessor, é uma linguagem de elaboração de scripts usada unicamente para o processamento de páginas da web. Podemos dizer que assim você poderá transformar seu site em um aplicativo Web com conteúdo e informações dinâmicas, contrastando com as inúmeras coleções de páginas estáticas com informações limitadas que não podem ser atualizadas frequentemente. Sites que têm como objetivo trabalhar frequentemente com o processamento de dados e informações, devem ser desenvolvidos como aplicativos Web.

PHP é uma linguagem embutida no HTML e que reside na máquina em que o servidor web está rodando. Isto significa que, o usuário através do browser faz a chamada de uma página PHP, o servidor web a processa e, depois, envia as informações de volta para o navegador do usuário. O PHP roda no Server Side (ler Anexo A - Conceitos Utilizados).

O código PHP pode rodar junto com páginas HTML de forma a unir o melhor de dois mundos: pode-se ter uma página HTML que em certas partes do seu código utiliza o PHP para processar e manipular certas informações, ou pode-se ainda, ter uma página PHP produzindo um página HTML pura com seu processamento normal. No decorrer deste texto, teremos exemplos das duas formas de implementação.

Vamos entender um pouco melhor como o PHP funciona: quando o navegador tenta carregar uma página com código PHP, podendo ser um script PHP ou um documento HTML com PHP embutido, o servidor web irá processar tal código (leia Anexo A - Conceitos Utilizados para maiores informações) e executá-lo. Assim, o código executado substitui o código fonte original da página e o servidor web, envia a página de volta para o navegador.

1.3 - Origem da linguagem PHP

Em 1994 surgiu o PHP (na época, apenas Personal Home Page), um pacote de ferramentas feito, a partir da linguagem Perl, por Rasmus Lerdorf. Em vista do interesse que seu pacote de ferramentas estava tendo em meados de 1995, Lerdorf desenvolveu um sistema de processamento de scripts com uma ferramenta para analisar formulários HTML: FI, Form Interpreter, surgiu aí o PHP/FI ou PHP2.

Com a maior utilização destas ferramentas para a realização de tarefas mais complicadas, mais pessoas se uniram a Lerdorf para o desenvolvimento do projeto. Assim surgiu o PHP3, que contava com um sistema de processamento de scripts mais aprimorado, maior funcionalidade para o código e uma sintaxe também aprimorada. A sintaxe da linguagem PHP é de certa forma semelhante às sintaxes de linguagens como C, C++ e Java, significando que desenvolvedores com conhecimentos destas linguagens terão ainda mais facilidade para aprender as estruturas básicas da linguagem PHP.

Em 2000 surgiu o PHP4, que se baseia no sistema de processamento de scripts Zend, desenvolvido do zero para poder ser facilmente incorporado em aplicativos diferentes. O PHP4 já utiliza conceitos de linguagem orientada à objetos, que foram aprimorados com o lançamento do PHP5, em 2003.

1.4 - Características do PHP

  • Código-fonte aberto
  • Interpretador
  • Suporte à inúmeros bancos de dados
  • Independente de plataforma
  • Simples

1.4.1 - Código-fonte aberto

Em posse do código-fonte, qualquer modificação pode ser feita (desde que não violem os direitos autorais da linguagem, é claro). Se o desenvolvedor quer que algum novo recurso seja adicionado ou um certo bug seja corrigido, ele mesmo pode fazer tais modificações. Esta modificação pode ser bastante atrativa aos olhos de outros desenvolvedores, o que ajuda ainda mais no desenvolvimento da linguagem.

Com o código-fonte aberto, o PHP também pode ser adquirido de diversas formas, podendo ser gratuito ou com um certo valor comercial, dependendo apenas de onde o usuário irá adquiri-lo. Este é um grande atrativo dos softwares livres.

1.4.2 - Interpretador

PHP não é um compilador, e sim um interpretador. Isso significa que ele analisa o script e produz as ações necessárias para cumprir as instruções do mesmo. Assim sendo, nenhum arquivo binário é gerado. Tal interpretação e execução é realizada no próprio servidor web, que deve estar configurado para "compreender" a linguagem (o que geralmente é implementado através de módulos).

1.4.3 - Suporte a inúmeros bancos de dados

Uma forma de dinamizar uma Home Page é a utilização de um banco de dados para guardar valores dinâmicos, deixando a cargo do PHP o trabalho de manipular esses dados. Como PHP tem código-fonte aberto, inúmeros bancos de dados são suportados, com nenhuma ou pouquíssimas modificações no código. Para fins didáticos, em nosso estudo utilizaremos o banco de dados MySQL.

1.4.4 - Independente de plataforma

O fato da linguagem ser interpretada permite que um script seja executado em qualquer plataforma para a qual exista um interpretador. O código-fonte aberto mais uma vez colabora nesse processo, pois qualquer pessoa poderá portar o interpretador para uma determinada plataforma, isto é, modificar o código para que se adapte ao sistema operacional hospedeiro.

1.4.5 - Simples

Uma das características mais marcantes da linguagem é sua simplicidade. Com PHP, ações como conectar-se à um banco de dados, que geralmente são um pouco trabalhosas, tornam-se muito mais fáceis. Isso acaba sendo um fator decisivo na escolha da ferramenta, em detrimento a linguagens como Perl, ASP, Cold Fusion etc.

Além disso, o PHP foi desenhado para trabalhar na Web, o que lhe garante muito mais integração com a mesma.

1.5 - Sites úteis

1.6 - Resumo do Capítulo

  • A WWW modifica-se constantemente, exigindo sites cada vez mais dinâmicos, que dêem ao usuário o que ele quer, da forma que ele quer.
  • A linguagem PHP é embutida no código HTML e é responsável pela lógica e manipulação de dados em páginas dinâmicas.
  • PHP é Server Side.
  • PHP é uma linguagem interpretada, que possuiu o código-fonte aberto, e que tem suporte para inúmeros bancos de dados. Além disso, é independente de plataforma e possui uma sintaxe relativamente simples.
    • O PHP roda junto com um servidor web e, possivelmente, com um banco de dados.

1.7 - Direitos autorais e licença

Lição A2 - PHP básico

2.1 - Introdução

Nesta lição veremos os aspectos práticos da linguagem PHP, levando em consideração as informações essenciais sobre sintaxe e funções, focando principalmente os tópicos: variáveis, constantes, operadores aritméticos e operadores comparativos.

Para desenvolver e testar seus códigos, você precisará ter o interpretador do PHP instalado em sua máquina, e um servidor Web configurado. Leia esta lição, e então passe para o Anexo B, que trata da instalação e configuração do software necessário.

2.2 - Básico

Como já foi comentado, você pode ter um script PHP que gera código HTML, ou um documento HTML com código PHP embutido. Em ambas as maneiras, o código PHP é delimitado por marcadores especiais, listados na tabela abaixo:

<?php ou <? Marcas inicias do código PHP
?> Marca final do código PHP


hand Lembre-se:
  • Os caracteres de escape ASP: <% (início) e %> (fim) também podem ser utilizados, desde que o PHP seja configurado para tal propósito.

A linguagem PHP também possibilita que o desenvolvedor utilize comentários em seu código, melhorando a legibilidade do mesmo. Os comentários são feitos utilizando-se as seguintes convenções:

# Iniciar uma única linha de comentário
// Iniciar uma única linha de comentário
/* Iniciar comentário que terá mais de uma linha
*/ Terminar comentários iniciados com /*

Vamos agora escrever nosso primeiro script PHP. O código pode ser escrito em qualquer editor de texto, e precisa ser salvo com a extensão .php.

script1.php

<?php
# Este é um comentário. O browser não irá mostrá-lo
echo "Meu primeiro script PHP! <br>";
echo "<hr>";
# A função echo imprime informações na tela
?>

Agora vamos entender o código acima:

  • Note que o código é cercado por delimitações já apresentadas, isso significa que quando o servidor HTTP encontra a primeira delimitação (<?php), ele começa a processar o código ali contido como um script PHP até que ele encontre o seu término (?>).
  • Duas linhas de comentários foram incluídas, o browser não irá mostrá-las.
  • Uma nova instrução é apresentada: echo - ela produz uma saída para o navegador. No primeiro caso imprime uma string na tela e há uma quebra de linha devido a tag HTML <br> e, no segundo caso, imprime uma linha na tela através de outra tag HTML <hr>.
  • Note que todas as instruções terminam em ';'.


hand Lembre-se:
  • Todas as instruções em PHP devem terminar com ';', caso contrário ocorrerá um erro na execução do código.
  • Alguns programadores usam a função sinônima print ao invés da função echo, a diferença é que a função print retorna um valor caso seja possível ou não imprimir a mensagem, sendo os valores "1" quando for possível e "0" caso contrário, enquanto a função echo não retorna nem um valor. A função echo pode ser usada de duas maneiras:

echo "Sistemas Abertos!";
echo ("Sistemas Abertos!");

2.3 - Direitos autorais e licença

Lição A3 - Variáveis e Tipos de Dados

3.1 - Variáveis

Como na maioria das linguagens de programação, com PHP podemos armazenar dados em variáveis, e a partir de então, acessá-los utilizando os nomes de suas respectivas variáveis. Você pode atribuir valores às variáveis antes de precisar delas em seu script. Veja exemplos desta atribuição:

$nome = "Rafael";
$empresa = "Sistemas Abertos";

Note que o sinal de igualdade '=' é o responsável pela atribuição dos textos (sempre entre aspas) nas variáveis em questão. Você pode exibir os valores das variáveis através da função echo, e também exibir seus valores junto à outras frases:

<?php
echo $nome;
//Exibe apenas o conteúdo da variável $nome, no caso: "Rafael"
echo "Meu nome é $nome !";
//Imprime na tela a frase "Meu nome é Rafael !"
echo "Meu nome é $nome e trabalho na $empresa !";
#Imprime na tela "Meu nome é Rafael e trabalho na Sistemas Abertos !"
?>

Todos os nomes de variáveis devem ser precedidos por um cifrão '$' e seguirem uma série de simples regras: qualquer palavra pode ser o nome de uma variável, desde que não comece com um número ou um caractere especial como < $ & ^ ", sendo permitido apenas o sublinhado (_). Também não são permitidos espaços, e o comprimento máximo deve ser de 32 caracteres. Veja alguns exemplos válidos e outros inválidos:

$3nome Não é válido
$_empresa É válido
$meu nome Não é válido
$meu_nome É válido


hand Lembre-se:
  • As variáveis não precisam ser declaradas em PHP.
  • Os nomes das variáveis são case-sensitive, ou seja, fazem diferenciação entre letras maiúsculas e minúsculas, portanto: $nome é diferente de $Nome, $Empresa é diferente de $EmPrEsA
  • Procure sempre usar nomes de variáveis que tenham significados próximos aos valores nelas armazenados, isto ajuda no entendimento do seu script.

A atribuição de valores às variáveis também pode ser feita no mesmo momento em que imprimir a variável na tela. Veja:

<?php
$nome = "Rafael";
echo $nome = "Akira";
// A variável $nome terá seu valor alterado e o valor mostrado será: Akira
?>

3.2 - Tipos de dados e constantes

Em PHP existem os diferentes tipos de dados:

  • Inteiros - números inteiros
  • Pontos flutuantes - números decimais
  • Literais - caracteres ou uma cadeia de caracteres (srting)
  • Arrays - falaremos sobre este tipo mais tarde
  • Objetos - são utilizados na programação orientada a objetos, o que é um tópico do curso de PHP avançado
  • Booleanos - são os valores "true" (verdadeiro) e "false" (falso)

Para retornar o tipo do dado, usamos a função gettype , observe:

<?php
$nome = "Rafael";
echo (gettype($nome));
#Imprimirá na tela "string"
?>

3.2.1 - Concatenação

Concatenação é a união de informações. No nosso caso, a usaremos para a união de variáveis. Para isto devemos usar o operador de concatenação representado pelo '.'. Vejamos o exemplo abaixo:

Tem-se duas variáveis:

$primeironome = "Rafael";
$sobrenome = "Berquó";

Agora as uniremos:

$nome = $primeironome.$sobrenome;

A expressão abaixo imprime RafaelBerquó :

echo $nome;

Vamos agora escrever e entender um outro script para fixarmos as características da concatenação em PHP:

script2.php

<html>
<body>
<center>
<h1>Bem-vindos!</h1>
<hr>

<?php
$primeironome = "Rafael";
$sobrenome = "Berquó";
$nome = $primeironome . " " . $sobrenome;
# une as variáveis com um espaço entre elas
$empresa = "Sistemas Abertos";
echo "Olá! Meu nome é $nome!";
echo "Trabalho na empresa" . " " . $empresa . "<br>";
/* une a cadeia de caracteres a um espaço, à variável
e a uma quebra de linha. */
?>

</center>
</body>
</html>


hand Lembre-se:
  • Este script foi iniciado com marcas HTML, mas isso não quer dizer que ele seja um HTML puro. Nomeando-o como .php, o servidor web saberá como executar o código PHP, deixando as marcas HTML para o navegador interpretar.

3.2.2 - Constantes

Em PHP também é possível utilizar constantes, ou seja, valores que permanecerão sem alterações durante todo o código. Para atribuir uma constante será necessário utilizar a função define, sua sintaxe é:

define (nome da constante, "valor da constante");

Exemplos:

define ("PI", 3.14);
echo " O valor de PI é: " . PI;


hand Lembre-se:
  • Não se esqueça de utilizar a ',' (vírgula) para separar o nome da constante e seu valor.
  • É aconselhado definir constantes utilizando letras maiúsculas, afim de facilitar a compreensão do código.
  • Nunca utilize o $ antes de constantes, elas não são variáveis.
  • Constantes podem ser definidas em qualquer parte do código, sendo que devem ser definidas antes de utilizadas, logicamente.
  • Utilize o operador de concatenação na hora de utilizar a constante, pois ao utilizar o nome da constante dentro de chaves de um comando echo, o interpretador PHP pode interpretá-lo com um pedaço de texto.

3.3 - Direitos autorais e licença

Lição A4 - Operadores

4.1 - Operadores Aritméticos

Já vimos que para atribuir valores à variáveis devemos usar o operador '=', agora iremos conhecer os operadores para a realização de operações aritméticas:

Operador Nome Resultado
+ Adição A soma duas variáveis
- Subtração A diferença entre duas variáveis
* Multiplicação O produto de duas variáveis
/ Divisão O quociente da divisão de duas variáveis
% Módulo O resto da divisão de duas variáveis

Exemplo de como utilizar os operadores:

script3.php

<?php
echo "Quanto é : 2 + 2?";
echo (2 + 2);
/*imprime na tela o resultado da operação, os
parênteses não são necessários */
$preço = "15";
$frete = "2.5";
echo "Quanto fica o preço total já com frete?";
$valortotal = $preço + $frete;
echo "O valor é: $valortotal";
?>

4.1.1 - Combinação de operadores

São operadores utilizados para agilizar a escrita do código:

Operador Exemplo Significado
+= $a += 5 $a = $a + 5
-= $a -= 5 $a = $a - 5
*= $a *= 5 $a = $a * 5
/= $a /= 5 $a = $a / 5
%= $a %= 5 $a = $a % 5

4.1.2 - Incremento e decremento

Em PHP também é possível a utilização de operadores para incremento e decremento. Sua estrutura é muito parecida com a utilizada em linguagens como C/C++ e Java.

Exemplo O que faz Significado
++$a pré-incremento $a = $a + 1
$a++ pós-incremento $a = $a + 1
--$a pré-decremento $a = $a - 1
$a-- pós-decremento $a = $a - 1

A diferença entre o pré e o pós-incremento é que no pré-incremento o valor da variável é incrementado antes de qualquer outra operação, e no pós-incremento as operações são realizadas e só após a avaliação da expressão é que a variável tem seu valor alterado. O trecho abaixo ilustra a diferença entre pré e pós:

// Como funciona o pré-incremento:

$a = 5;
$b = ++$a * 7;
echo "\$a vale $a e \$b vale $b.";

// Você verá como saída a mensagem: $a vale 6 e $b vale 42.
// Note que $b recebeu o valor de 6 * 7, ou seja, 
// $a já havia sido incrementado antes da expressão ser avaliada.
// Esse trecho poderia ser reescrito como:

$a = 5;
$a = $a + 1;
$b = $a * 7;
echo "\$a vale $a e \$b vale $b.";

// Agora veja o que ocorre no pós-incremento:

$a = 5;
$b = $a++ * 7;
echo "\$a vale $a e \$b vale $b.";

// Você verá como saída a mensagem: $a vale 6 e $b vale 35.
// Note que $b recebeu o valor de 5 * 7, ou seja, $a ainda não havia sido incrementado. 
// Mas após a avaliação da expressão, $a tem seu valor alterado.
// Esse trecho poderia ser reescrito como:

$a = 5;
$b = $a * 7;
$a = $a + 1;
echo "\$a vale $a e \$b vale $b.";

Para o decremento, o funcionamento é o mesmo. O que diferencia é que decrementar significa diminuir (em uma unidade, no caso da programação), e incrementar significa aumentar (em uma unidade, no caso da programação).

4.2 - Operadores de comparação

Os operadores de comparação são mais utilizados junto à instruções condicionais. Em PHP os operadores de comparação verificam se:

Operador Nome Significado Exemplo
== Igual Se $a for igual a $b ($a == $b)
!= Diferente Se $a é diferente de $b ($a != $b)
<> Diferente Se $a é diferente de $b ($a <> $b)
=== Idêntico Se $a for igual a $b e forem do mesmo tipo ($a === $b)
!== Não idêntico Se $a não for igual a $b ou forem de tipos diferentes ($a !== $b)
< Menor que Se $a é menor que $b ($a < $b)
> Maior que Se $a é maior que $b ($a > $b)
<= Menor ou igual Se $a é menor ou igual a $b ($a <= $b)
>= Maior ou igual Se $a é maior ou igual a $b ($a >= $b)

4.3 - Operadores Lógicos

Os operadores de comparação apenas nos dão o resultado de uma simples comparação. Se quiséssemos fazer comparações compostas, como por exemplo: $a deve ser igual a $c e $b deve ser diferente de 7. Para isso usamos os operadores lógicos:

Operador Exemplo Significado
&&, and ($a == 15 && $b == 1) $a é igual a 15 e $b é igual a 1
||, or ($a == 15 || $b == 1) $a é igual a 15 ou $b é igual a 1
xor ($a xor $b) $a ou $b são verdadeiros, mas não ambos
! !($a == $b) $a NÃO é igual a $b

No nosso exemplo, poderíamos construir a expressão da seguinte forma:

($a == $b) && ($c != 7)

ou então

($a == $b) && ($c <> 7)


hand Lembre-se:
  • Use sempre parênteses para determinar qual será a precedência dos operadores usados

4.4 - Direitos autorais e licença

Lição A5 - Sequências de Escape

5.1 - Sequências de Escape

A linguagem PHP permite usar sequências de caracteres de controle para caracteres especiais. Para isso usa-se o caractere de escape "\". Veja a tabela:

Sequência de controle Nome
\b backspace (volta um espaço)
\t tab (tabulação)
\n quebra de linha
\r carriage return (retorno de carro)
\" aspas (duplas)
\' apóstrofe (aspas simples)
\\ barra invertida (barra)

Estas sequências são utilizadas entre aspas duplas em uma string.

Por exemplo:

echo "Olá \n Mundo! \n\t Tudo \"bem\" por aqui?";

// Isso gerará Olá em uma linha, Mundo! na linha de baixo, e
// Tudo "bem" por aqui? na terceira linha, com duas tabulações antes, e "bem" entre aspas duplas.

Note que quebras de linha e tabulações não são renderizadas no HTML, mas no código fonte da página elas estão presentes. Para que quebras de linha sejam visualizadas em um documento HTML, você deve imprimir a tag específica para isso ("<br>". Não há uma tag que gere tabulação).

5.2 - Direitos autorais e licença

Lição A6 - Exercícios da Trilha A

1 - Qual das seguintes afirmações não está correta?

  • a - O PHP é uma linguagem server side, ou seja, sua execução é feita na máquina servidor.
  • b - Assim como o PHP, o Javascript é uma linguagem de script que é executada na máquina servidor.
  • c - O PHP é uma linguagem que permite tornar as páginas web mais dinâmicas.
  • d - PHP torna possível a interação de uma página com bancos de dados, permitindo gerar conteúdo através de dados do banco.
  • e - PHP significa, recursivamente, "PHP (Personal Home Pages) Hypertext Preprocessor".

2 - Qual das seguintes alternativas não cria um comentário válido para o PHP?

  • a - // comentário de linha
  • b - /* comentário de bloco */
  • c - <!-- comentário PHP -->
  • d - # comentário de linha
  • e - # # mais um comentário

3 - Das alternativas a seguir, qual é a única que possui um nome de variável inválido?

  • a - $numeroDePessoas
  • b - $contador1
  • c - $numero_da_casa
  • d - $numeroDo_RG
  • e - $5elemento_do_conjunto

4 - Qual das opções abaixo não produz a string "Ola Mundo" na tela?

  • a - echo "Ola Mundo";
  • b - echo "Ola " . "Mundo";
  • c - $var = "Ola Mundo"; echo $var;
  • d - $var = "Ola "; $var2 = "Mundo"; echo $var . $var2;
  • e - echo "Ola"; echo "$mundo;

5 - Qual das seguintes declarações cria uma constante chamada EULER com o valor 2.71728?

  • a - const $EULER == 2.71728;
  • b - $EULER = 2.71728;
  • c - define(EULER, 2.71728);
  • d - define(2.71728, "EULER");
  • e - define const EULER == "2.71728";

6 - Qual o resultado da seguinte operação aritmética?

32 + 32 * 2 - 45 / 5 * 3

  • a - 33
  • b - 69
  • c - 101
  • d - 23
  • e - 128

7 - Qual das seguintes expressões lógicas resulta em false?

  • a - (8 >= 6 + 2 || 23 - 7 == 2)
  • b - (23 - 3 == 200 || 12 + 12 = 24 || 10 - 7 > 0)
  • c - (34 - 35) * 7 > -6
  • d - true && false || true
  • e - false || false || 7 > 2

8 - Qual das seguintes expressões produz na tela a string "Ola\Mundo", com as aspas e a barra?

  • a - echo "Ola\Mundo";
  • b - echo "Ola" . "\" . "Mundo";
  • c - echo "Ola\" . "Mundo";
  • d - echo "Ola\\Mundo";
  • e - echo "\"Ola\\Mundo\"";

9 - Qual o resultado do seguinte trecho de código:

$var = "Meu nome é ";
$var .= "João!";
$var2 = $var . " E o seu?";
echo $var;

  • a - Produz na tela a string "Meu nome é João! E o seu?"
  • b - Produz na tela a string "Meu nome é João!"
  • c - Produz na tela a string "João!"
  • d - Produz na tela a string "E o seu?"
  • e - Não produz saída alguma

10 - Avalie as seguintes afirmações como verdadeiras ou falsas:

  • I - PHP é uma linguagem interpretada.
  • II - PHP é uma linguagem de código aberto.
  • III - PHP possibilita acesso a apenas um banco de dados: o MySQL.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - V
  • e - I - F, II - F, III - F

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha B - Estruturas de Decisão e Repetição PHP

Lição B1 - Estruturas de Decisão

1.1 - Introdução

O uso de instruções de condição e repetição é obrigatório para que um script seja capaz de realizar escolhas. Esse é um fator muito importante para uma página web dinâmica. Aprenderemos nesta lição as instruções de condição da linguagem PHP e suas estruturas de repetição (loop).

1.2 - Instruções de Condição

Em PHP pode-se utilizar as instruções if, if else, elseif e switch. Vejamos cada uma delas.

1.3 - Instrução if

A estrutura if é utilizada para o controle de fluxo, desviando ou executando ações de acordo com uma condição. Veja sua sintaxe:

       if (condição)
          ação a ser realizada;

Vejamos um exemplo:

<?php
$cor = "azul";
if ($cor == "azul")
   echo "A cor escolhida é azul <br>";

$numero = 1;
if ($numero < 10) {
   $numero += 10;
   echo "O valor do número é = $numero";
}
?>


hand Lembre-se:
  • O uso das chaves é obrigatório quando realiza-se mais de uma ação, podendo as mesmas não serem utilizadas quando for realizada apenas uma ação.

1.4 - Instrução if else

Esta estrutura complementa o comando if, pois adiciona uma outra alternativa caso a condição não seja atendida. Sua sintaxe:

       if (condição)
         ação a ser realizada caso a condição seja atendida;
       else
         ação a ser realizada caso a condição não seja atendida;

Vejamos um exemplo:

<?php
$nome = "Rafael";
if ($nome == "Rafael") { 
        echo "Seu nome é Rafael";
} else { 
        echo "Você não se chama Rafael!";
}
?>

1.5 - Instrução Elseif

Esta instrução é um simples aninhamento de instruções if após um else, permitindo montar estruturas bastante complexas de decisão. Veja sua sintaxe:

       if (condição1)
         ação a ser realizada caso condição1 seja atendida;
       elseif (condição2)
         ação a ser realizada caso condição1 não seja atendida e a condição2 seja atendida;
       else
         ação a ser realizada caso condição1 e condição2 não sejam atendidas;

Vejamos um exemplo:

<?php
$nome = "Rafael";
if ($nome == "Rafael") {
        echo "Seu nome é Rafael";
} elseif ($nome =="Akira") {
        echo "Seu nome é Akira";
} else {
        echo "Você não se chama Rafael e nem Akira!";
}
?>

1.6 - Instrução Switch

Esta instrução testa múltiplas condições, evitando uso de repetitivos comandos if else. Sua sintaxe:

       switch (condição) {
           case resultado1:
               ação(ões) a ser(em) realizada(s) caso o valor da condição seja resultado1;
               break;

           case resultado2:
               ação(ões) a ser(em) realizada(s) caso o valor da condição seja resultado2;
               break;
                .
                .
                .

           default:
               ação(ões) a ser(em) realizada(s) caso o valor da condição não seja nenhum valor acima;
        }

Vejamos um exemplo:

<?php
$nome = "Rafael";

switch ($nome){
     case "Rafael":
        echo "Seu nome é Rafael";
        break;
     case "Akira":
        echo "Seu nome é Akira";
        break;
     case "João":
        echo "Seu nome é João";
        break;
     default:
        echo "Seu nome não está cadastrado!";
}
?>


handLembre-se:
  • Nunca se esqueça de iniciar e terminar a instrução switch com chaves.
  • É muito importante não se esquecer de colocar o ":" (dois-pontos) no final de cada resultado ou após o "default:"
  • O comando "break;" evita que o processo continue através do resto da instrução switch, sem ele as comparações continuarão acontecendo inclusive ao "default:"
  • O resultado "default:" apenas será acessado se nenhum outro resultado for atendido. Ele não necessita do comando "break".

1.7 - Direitos autorais e licença

Lição B2 - Estruturas de Repetição

2.1 - Loops

Os loops, mais conhecidos como laços, são formas convencionais de programação que evitam que o programador fique repetindo inúmeras vezes, em seu código, um mesmo comando para realizar uma única ou inúmeras tarefas. O loop não para até que uma certa condição seja alcançada. As estruturas que constroem um loop são chamadas de estruturas de repetição.

2.2 - While

Este loop poderá ser utilizado quando quisermos executar algum bloco de comandos baseado na avaliação de uma determinada expressão lógica, ou seja, enquanto a expressão continuar sendo verdadeira, o laço continuará a ser executado. Sua sintaxe:

   
       while (condição) {
          comandos;
       }

Dentro do bloco de comandos, deve-se implementar algum comando que possa modificar ou não a condição imposta no comando while com o objetivo de que o loop em algum momento chegue ao fim. Vejamos um exemplo:

<?php
$contador = 0; // Inicialização do contador
while($contador <=10) { 
        echo "O valor atual da variável 'contador' é " . $contador;
        $contador++; // Incremento do contador
        //Quando $contador chegar a 11, o laço será encerrado
}
?>

2.3 - Do While

A estrutura "do while" é praticamente igual ao while, sendo que o bloco de comandos é executado ao menos uma vez antes da condição ser testada. Sua sintaxe:

       do {
          comandos;
       } while (condição);

Vejamos um exemplo:

<?php
$contador = 0;
do {
        echo "O valor atual da variável 'contador' é " . $contador;
        $contador++;
        //Este comando será executado uma vez mesmo que a //condição em while seja falsa
        
} while ($contador <=10);
?>

2.4 - For

O for tem a mesma função do while, mas sua sintaxe é mais direta. Isso significa que podemos obter um laço com relativamente menos código do que com o while.

       for(inicialização; condição; incremento ou decremento) {
           comandos;
       }

O exemplo abaixo é o mesmo construído quando falamos do while. Desta vez, utilizamos o for:

<?php
for ($contador = 0; $contador <=10; $contador++;) { 
        echo "O valor atual da variável 'contador' é: " .$contador;
}
?>


handLembre-se:
•A não especificação dos campos do for acarreta em um loop infinito, o que pode não ser aconselhável em seu projeto. Exemplo: for (;;)

•O comando "break" pode ser utilizado dentro de um laço para que o mesmo seja interrompido e encerrado. Isto significa que no momento em que ele for interpretado, o laço é abortado imediatamente.

•Há também o comando "continue", que interrompe o laço, mas não o aborta, forçando um novo teste da condição de parada.


2.5 - Direitos autorais e licença

Lição B3 - Exercícios da Trilha B

1 - Qual das seguintes afirmações está incorreta?

  • a - PHP oferece diversas estruturas para realizar a seleção do fluxo de execução.
  • b - A estrutura de seleção mais simples é criada com a instrução if.
  • c - A instrução elseif permite que diversos testes sejam feitos.
  • d - Em PHP não existe a estrutura de escolha switch, presente no Javascript.
  • e - Com PHP, é possível montar estruturas de decisão complexas, como no Javascript.

2 - O que o trecho de código a seguir produz como saída?

$var = 5;
$var2 = 6;
if ($var + 2 > $var2){
   echo "Oi!";
}
else {
   echo "Tchau!";
}
echo " Finalizando script...";

  • a - Produz a string "Finalizando script...".
  • b - Produz a string "Oi!".
  • c - Produz a string "Tchau!".
  • d - Produz a string "Tchau! Finalizando script...".
  • e - Produz a string "Oi! Finalizando script...".

3 - Julgue as seguintes proposições como verdadeiras ou falsas:

  • I - Um bloco associado à instrução elseif é executado sempre.
  • II - Um bloco associado à instrução elseif é executado somente quando a condição for verdadeira.
  • III - elseif pode aparecer mesmo que nenhum bloco if tenha sido criado.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

4 - Qual das seguintes afirmações está incorreta?

  • a - O bloco if só é executado se a condição imposta for verdadeira.
  • b - Não é possível utilizar um segundo bloco if sem que o primeiro possua um else.
  • c - O bloco associado a um if só é executado uma única vez, ou seja, if não implementa repetição.
  • d - A condição de um if é uma expressão lógica, que resulta em verdadeiro ou falso.
  • e - Na construção de um bloco if, o else não é obrigatório.

5 - Qual das seguintes afirmações está incorreta?

  • a - Uma instrução switch permite que uma escolha seja feita de acordo com o valor de uma variável.
  • b - A instrução case é usada para fazer a comparação da variável com um determinado valor.
  • c - A instrução break é usada para forçar a interrupção das escolhas.
  • d - A instrução default é executada caso nenhuma das comparações case seja verdadeira.
  • e - O número máximo de case é 255, devido a limitações do interpretador PHP.

6 - Julgue as seguintes proposições como verdadeiras ou falsas:

  • I - O PHP possui três estruturas de repetição: while, do while e for.
  • II - As estruturas de repetição while, do while e for, definem um bloco, que será executado nenhuma, uma ou diversas vezes.
  • III - Não é possível aninhar as estruturas de repetição, ou seja, colocá-las uma dentro da outra.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

7 - Qual das afirmações a seguir está correta?

  • a - A estrutura while repete um bloco de código enquanto a condição de parada for verdadeira.
  • b - A estrutura for não é indicada, pois não permite especificar exatamente quantas vezes uma repetição será feita.
  • c - A estrutura do while é contrária a while, ou seja, executa até o momento em que determinada condição for verdadeira.
  • d - A estrutura while repete um bloco de código enquanto a condição de parada for falsa.
  • e - Não é possível reescrever um bloco for usando apenas bloco(s) while.

8 - Qual a saída do seguinte código?

$i = 5;
$saida = "Contagem regressiva! <br />";
while($i > 0){
   $saida .= "Faltam $i segundos... <br />";
}
echo $saida;

  • a - A saída será a string "Faltam 5 segundos!".
  • b - Esse código produz como saída a string "Contagem regressiva! Faltam 5 segundos!".
  • c - Esse código não produz saída alguma, pois há um erro de lógica na construção do laço: o loop nunca termina.
  • d - Esse código gera uma contagem regressiva no estilo "Faltam n segundos", onde n varia de 5 até 1.
  • e - A saída será a string "Contagem regressiva!".

9 - Qual das alternativas ilustra um laço for com a mesma característica do while mostrado abaixo:

$i = 1;
while ($i <= 10) {
...
$i = $i + 2;
}

  • a - for ($i = 0; $i < 10; $i++) { ... }
  • b - for ($i = 1; $i <= 10; $i++) { ... }
  • c - for ($i = 1; $i < 10; $i = $i + 2) { ... }
  • d - for ($i = 1; $i <= 10; $i++) { ... $i = $i + 2;}
  • e - for ($i = 1; $i <= 10; $i = $i + 2) { ... }

10 - Dentre as alternativas abaixo, qual explica a diferença entre as estruturas do while e while?

  • a - do while realiza a repetição enquanto a condição de parada for falsa, o contrário do while
  • b - do while realiza a repetição enquanto a condição de parada for verdadeira, o contrário do while
  • c - do while realiza a repetição até que a condição de parada for falsa, o contrário do while
  • d - a estrutura do while não precisa realizar incremento de variável (que é feito automaticamente)
  • e - do while será executado ao menos uma vez, já que faz o teste da condição ao fim do bloco, o contrário do while

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha C - Arrays e Funções

Lição C1 - Arrays

1.1 - Introdução

Podemos pensar em arrays como uma variável que guarda inúmeras outras variáveis (elementos), sendo cada uma identificada por um índice que serve para localizar cada elemento dentro do array. Lembre-se que tais índices podem ser vetoriais ou associativos, o que veremos mais adiante. Graças às funções já implementadas em php você pode usar um array para implementar uma lista, um hashtable, um dicionário, uma pilha, uma fila e outras estruturas de dados.

1.2 - Criação e inicialização de Arrays

Para a criação de um array, utilizamos a função array . Podemos inicializá-lo imediatamente ou deixar esta tarefa para mais tarde. Vejamos o exemplo a seguir:

firstarray.php

<?php 

$cores = array(); 
//inicializa um array vazio

$nomes = array("Rafael", "Akira"); 
//inicializa um array com dois elementos

echo $nomes[0]; 
// exibe na tela o elemento de índice 0 do array "nomes", no caso: "Rafael"

$cores[] = "Vermelho";
//adiciona um elemento no array "cores"
?>


handLembre-se:
  • Os índices de arrays em PHP iniciam-se em 0. Assim, se um array tem 10 elementos, o índice do primeiro será 0 e do último será 9

1.3 - Tipos de índices e formas de percorrer um array

Como já dito, um índice é o identificador da variável dentro de um array. Até agora utilizamos índices vetoriais, ou seja, o índice é baseado em números inteiros que começam do 0, assim um array com 10 elementos terá índices variando de 0 a 9. Podemos percorrer um array utilizando o laço "for", veja no exemplo:

looparray2.php

<?php

// Um array com 10 elementos
$meuArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// Criamos um "for" para percorrer cada posição deste array
for( $i = 0; $i <= 9; $i++) 
echo "O valor do elemento na posição $i é $meuArray[$i]. <br />";

?>


handLembre-se:
Para arrays com tamanho desconhecido utilizamos as funções: count($nome_do_array) e sizeof($nome_do_array). Ambas retornam o número de elementos do array.

Em PHP há um tipo de loop especial para percorrer arrays, o foreach. Veja:

looparray2.php

<?php 
$linguagens = array("C++", "Java", "Perl", "Delphi", "PHP");
foreach ($linguagens as $valor) {
        echo "Linguagem: $valor <br />";
}
?>

Conheceremos agora os índices associativos. Tais índices não são números, e sim strings. Vejamos exemplos:

indiceassociativo.php

<?php 
$lista = array("nome1" => "Rafael", "nome2" => "Akira", "nome3" => "Renata", "nome4" => "Sílvia");
echo $lista["nome1"]; 
// imprime "Rafael"
echo $lista["nome4"];
// imprime "Sílvia"
echo $lista[0];
// imprime "Rafael"
echo $lista[3];
// imprime "Sílvia"
?>

Utilizando este tipo de índice, temos a criação de dois conceitos: "chave"(key) e "valor"(value). Dizemos que a "chave" é o índice associativo e "valor" é a variável para a qual tal índice é associado. Em nosso exemplo anterior, cada "chave" (por exemplo: "nome1") é associada ao seu respectivo "valor" (por exemplo: "Rafael") através do operador "=>".

Pode-se utilizar loops para percorrer arrays com índices associativos normalmente, mas existe uma maneira nova e prática que atribui cada elemento do array a uma variável $value. Este loop while é ligeiramente diferente do antes apresentado, mas também é de fácil entendimento. Veja o exemplo abaixo:

looparray2.php

<?php 
$lista = array("nome1" => "Rafael", "nome2" => "Akira");

while (list($key, $value) = each ($lista)) { 
        echo "$key: $value <br>";
}

?>


handLembre-se:
  • Esta nova forma de usar o loop while também pode ser utilizada em arrays de índices vetoriais. O que muda é que $key armazenará o índice numérico da posição do vetor:

while (list($key ,$value) = each ($nome_do_array) ) { 
        echo "$key: $value <br>";
}

1.4 - Funções para a manipulação de arrays

A linguagem PHP traz uma gama de funções para a manipulação de arrays. A documentação completa pode ser encontrada no site http://www.php.net, com suas respectivas explicações e exemplos. Agora iremos apresentar apenas algumas destas funções:

  • is_array($nome_do_array) - retorna "true" ou "false", dependendo se a variável é ou não um array, respectivamente.
  • in_array("valor", $nome_do_array) - retorna "true" ou "false" dependendo se o "valor" está ou não dentro do array em questão, respectivamente.
  • asort($nome_do_array) - ordena o array de acordo com seus valores mantendo sua associação com as chaves.
  • ksort($nome_do_array) - igual asort(), mas ordena o array de acordo com suas chaves.
  • sort($nome_do_array) - ordena o array de acordo com seus valores, mas não mantém suas relações com suas respectivas chaves.
  • array_merge($array1, $array2,...) - une os arrays que se encontrarem entre parênteses.
  • array_pop($array) - Retira e retorna o último elemento do $array.
  • array_push($array, $var1, ...) - Trata array como uma pilha, e adiciona as variáveis passadas como argumentos no final do array.
  • array_shift($array) - Retira e retorna o primeiro elemento do $array.
  • array_reverse($array) - Retorna um novo array com os elementos do $array (passado por parâmetro) com a ordem invertida.

Outras funções importantes são para a manipulação de strings, algumas deles são:

  • explode($termo, $string) - "Explode" uma string com vários elementos de um array, que será separada pelo $termo;
  • implode($termo, $array) ou join() - Une os elementos de um $array em uma única string unidos pelo $termo. A função join() é exatamente igual à implode().


handLembre-se:
  • As funções foram mostradas de forma simplificada, para uma abordagem mais detalhada de cada função acesse: www.php.net;
  • Existem várias outras funções que trabalham com array. Mostramos aqui apenas as mais usadas;
  • A função print_r() não é exclusiva para array, porém é muito útil para mostrar todo o conteúdo de um array de maneira rápida:
    • print_r($var) - Esta função imprime uma variável de maneira detalhada. Ela imprime todos os elementos de um array de modo bastante legível. O resultado desta função deve estar entre as tags <pre> e <pre>.

1.5 - Direitos autorais e licença

Lição C2 - Funções em PHP

2.1 - Introdução

Função nada mais é que um bloco de código que somente é executado quando for solicitado. As funções funcionam como uma caixa preta onde inúmeras linhas de código podem ser guardadas. Ela representa uma forma simplificada de executarmos um mesmo trecho de código em diversos pontos do mesmo script.

2.2 - Definição

Observe a sintaxe básica de uma função:

       function nome_da_função(parâmetro1, parâmetro2,...)  {
              Bloco de Comandos;
              return valor;
       }

Qualquer código PHP válido pode estar contido no interior de uma função. Em PHP não é necessário declarar qual será o valor de retorno da função, mas deve-se ficar atento para que os parâmetros utilizados sejam dos tipos necessários para que não ocorra nenhum erro dentro do bloco de comandos.

As funções podem ou não terem parâmetros sendo passados para as mesmas, assim como também podem ou não retornar um valor. Funções que não retornam valores são normalmente chamadas de procedimentos.


handLembre-se:
  • Uma função ou procedimento pode ser chamada antes de ser declarada, mas isto não é aconselhável, pois pode atrapalhar o entendimento do código

2.3 - Procedimentos sem passagem de parâmetros

São funções que não retornam valores e não recebem parâmetros, observe:

procedimento1.php

<?php
//declaração do procedimento EscreveMsg
function EscreveMsg() {
        echo "Você aprendendo a utilizar funções em PHP!"
}
//agora iremos chamar o procedimento
EscreveMsg();
//imprime na tela "Você aprendendo a utilizar funções em PHP!"
?>

2.4 - Procedimentos com passagem de parâmetros

São funções que não retornam valores e recebem parâmetros para sua execução, observe:

procedimento2.php

<?php
//declaração do procedimento EscreveMsg2
function EscreveMsg2($msg) {
        echo $msg;
}
//agora iremos chamar o procedimento
EscreveMsg2("Curso PHP Total!");
//imprime na tela "Curso PHP Total!"
?>

2.5 - Funções sem passagem de parâmetros

São funções que retornam valores e não recebem parâmetros, observe:

funcao1.php

<?php
//declaração da função DoisAoQuadrado()
function DoisAoQuadrado() {
        return (2 * 2);
}
//agora iremos chamar a função
$resultado = DoisAoQuadrado();
echo "Dois ao quadrado é: $resultado";
//imprime na tela "Dois ao quadrado é: 4"
?>

2.6 - Funções com passagem de parâmetros

São funções que retornam valores e recebem parâmetros para sua execução, observe:

funcao2.php

<?php
//declaração da função Quadrado
function Quadrado($numero) {
        return ($numero * $numero);
}
//agora iremos chamar a função recebendo o valor 2
$Resultado = Quadrado(2);
echo "O quadrado de $numero é: $Resultado";
//imprime na tela "O quadrado de 2 é: 4"
?>

2.7 - Passagem de parâmetros por referência

A passagem de parâmetros mostrados até agora são chamadas de "passagem por valor", o que significa que se o valor da variável for alterada dentro do bloco de comandos da função, seu valor fora dela não terá sido alterado. Por exemplo:

<?php
function Adiciona2($numero) {
        echo $numero += 2;
}

$a = 3;
Adiciona2($a);
//imprime 5 na tela, mas $a continua valendo 3
?>

As funções trabalham com cópias das variáveis que lhe são passadas como parâmetros para preservar seus valores iniciais. Se a passagem de valor fosse feita por referência, a variável $a teria 5 como valor. Para realizar uma passagem por referência pode-se utilizar duas maneiras. Em ambas utiliza-se o caractere "&", veja:

<?php
function Adiciona2(&$numero1, $numero2) {
        $numero1 += 5;
        $numero2 += 5;
}

$a = $b = $c = $d = 1;

echo " <br> Valor de 'a' e 'b' antes da chamada da função: <br> a = $a <br> b = $b";

Adiciona2($a, $b); 
echo " <br> Valor de 'a' e 'b' depois da chamada da função: <br> a = $a <br> b = $b";
//só $a terá seu valor alterado

echo " <br> Valor de 'c' e 'd' antes da chamada da função: <br> c = $c <br> d = $d";

Adiciona2($c, &$d); 
echo " <br> Valor de 'c' e 'd' depois da chamada da função: <br> c = $c <br> d = $d";
//Ambas as variáveis terão seus valores alterados
?>

2.8 - Arquivos de Inclusão

Com o tempo, você poderá ter criado inúmeras funções que poderão ser reutilizadas em novos scripts. Para que você não seja obrigado a declarar todas estas funções novamente em seu novo script, basta usar a função: require ("funcoes.php"), sendo que, no script funcoes.php devem estar declaradas as funções que você utilizará. A função require() faz com que todo o conteúdo do arquivo solicitado seja "incluído" no script atual, sendo que você pode colocar outros tipo de códigos além de apenas funções.


handLembre-se:
  • O script funcoes.php utilizado junto ao require é um nome fictício, ficando a critério do programador nomear seu script de funções;
  • Se o script de funções não se encontrar no mesmo diretório que nossos scripts normais, deve-se especificar a localização completa do script. Por exemplo: require ("/home/httpd/html/php/funcoes.php");
  • A função include("$file"); também faz a inclusão do arquivo no script atual, a diferença é que esta emite apenas um aviso de erro quando ocorrer uma falha na chamada da função (por exemplo, um nome de arquivo passado errado) enquanto a função require(), quando encontra uma falha, para a execução do script.

2.9 - Direitos autorais e licença

Lição C3 - Exercícios da Trilha C

1 - Qual das seguintes linhas cria um array associativo com a string "nome", relacionada ao valor "João", e a string "idade", relacionada ao valor "15 anos"?

  • a - $meu_array = array ("nome", "João", "idade", "15 anos");
  • b - $meu_array = {"nome", "João", "idade", "15 anos"};
  • c - $meu_array[] = "nome"; $meu_array[] = "João"; $meu_array[] = "idade"; $meu_array[] = "15 anos";
  • d - $meu_array = new array ("nome", "João", "idade", "15 anos");
  • e - $meu_array = array ("nome" => "João", "idade" => "15 anos");

2 - Qual a saída produzida pelo seguinte código:

$var = array("Ola", "Mundo", 1, 2, 3, 4);
echo $var[$var[2]];

  • a - O número 2
  • b - A string "Ola"
  • c - O número 1
  • d - A string "Mundo"
  • e - O número 4

3 - Qual a saída produzida pelo seguinte código:

$var = array("Hoje", "é", "terça", "feira");
asort($var);
echo $var[3];

  • a - A string "é"
  • b - A string "terça"
  • c - A string "feira"
  • d - A string "Hoje"
  • e - A string "Undefined"

4 - Qual das alternativas a seguir descreve corretamente o que faz a função ksort()?

  • a - Esta função embaralha o array, misturando seus elementos aleatoriamente.
  • b - Esta função ordena os elementos do array de forma alfabética.
  • c - Esta função ordena os elementos do array de forma alfabética, em ordem inversa (do 'z' para o 'a').
  • d - Esta função inverte um array qualquer.
  • e - Esta função ordena um array pela sua chave associativa, mantendo as associações.

5 - Avalie as afirmações abaixo como verdadeiras ou falsas:

  • I - A função array_merge() une os diversos arrays passados como parâmetro, retornando o resultado.
  • II - A função is_array() verifica se uma determinada variável passada como parâmetro é um array.
  • III - A função in_array() verifica se determinado valor está em um array, retornando true ou false.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

6 - O que o código a seguir gera como saída?

function dobro($i){
   return 2 * $i;
}
echo dobro(10) + dobro(5) * dobro(7);

  • a - "420"
  • b - "115"
  • c - "201014"
  • d - "160"
  • e - "110"

7 - Qual dos códigos abaixo cria corretamente uma função sem valor de retorno e sem passagem de parâmetro que escreve na tela a mensagem "PHP 5!"?

  • a - function funcao() { return "PHP 5!"}; echo funcao();
  • b - function funcao($e){ echo "PHP 5!" };
  • c - echo "PHP 5!"; function funcao { echo};
  • d - function funcao() { echo "PHP 5!"; return false };
  • e - function funcao() { echo "PHP 5!"; }

8 - Qual das funções a seguir calcula corretamente o quadrado de um número passado como parâmetro e retorna o dobro do valor calculado?

  • a - function dobro () { return $i * $i * 2; }
  • b - function dobro () { return quadrado($i) * 2; }
  • c - function dobro ($i) { return $i * 2; }
  • d - function dobro ($i) { return ($i * $i) * 2; }
  • e - function dobro ($i) { echo $i * $i * 2; }

9 - Suponha que exista um arquivo chamado "util.php" no qual está definida a função fatorial(), que calcula o fatorial de um inteiro positivo qualquer e retorna esse valor. Qual das alternativas abaixo contém o código necessário para escrever na tela o valor do fatorial do número 10?

  • a - echo fatorial(10);
  • b - echo util.php.fatorial(10);
  • c - $i = fatorial(10); echo $i;
  • d - require("util.php"); fatorial(10);
  • e - require("util.php"); echo fatorial(10);

10 - Qual é a saída gerada pelo seguinte trecho de código?


function quadrado(&$a){
   $a = $a * $a;
   echo "Valor calculado: ";
}

$var = 4;
quadrado($var);
echo $var;

  • a - A string "Valor calculado: 4";
  • b - A string "Valor calculado: 16";
  • c - A string "Valor calculado: ";
  • d - A string "4";
  • e - A string "16";

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha D - Manipulação de Arquivos

Lição D1 - Abertura e fechamento de arquivos

1.1 - Introdução

A manipulação de arquivos é uma ferramenta muito importante da linguagem PHP, pois às vezes não temos à nossa disposição um banco de dados, ou então queremos apenas guardar informações em arquivos temporários e logo após, sermos capazes de lê-los e editá-los através do nosso próprio script PHP.

1.2 - Abrindo e fechando arquivos

Sempre que trabalhamos com arquivos devemos realizar no mínimo duas operações: sua abertura e seu fechamento. Para abrir um arquivo, utilizamos a função fopen(), e para fechar, fclose(). Vejamos cada um deles:

1.2.1 - Fopen e Fclose

Como dito, função Fopen é utilizada para abrir um arquivo. Vejamos sua sintaxe:

fopen(filename, mode);

  • filename: Deve ser o nome do arquivo caso este esteja no mesmo diretório do script ou no caminho até o arquivo.
  • mode: Especifica o modo de abertura, ou seja, se o arquivo deve ser aberto para leitura, escrita, etc. Vejamos tais modos:

Modo Descrição
r abre o arquivo para leitura e posiciona o ponteiro no início do arquivo - o arquivo deve existir
r+ abre o arquivo para leitura/escrita, posiciona o ponteiro no início do arquivo - se o arquivo não existir, um novo será criado
w abre o arquivo no modo somente escrita - se o arquivo já existir, será sobrescrito, senão, será criado um novo
w+ abre o arquivo para escrita/leitura - se o arquivo já existir, será sobrescrito, senão, será criado um novo
a abre o arquivo para anexar dados, posiciona o ponteiro no final do arquivo - se o arquivo não existir, será criado um novo
a+ abre o arquivo para anexo/leitura, posiciona o ponteiro no final do arquivo - se o arquivo não existir, será criado um novo
b abre o arquivo como um binário

A função fopen() retornará um ponteiro para o arquivo na posição que você escolheu (início ou fim), portanto temos que atribuir o valor de retorno a uma variável para manipular o arquivo. Caso a função fopen() falhe ao tentar abrir o arquivo, ela retornará FALSE. Utilizaremos o ponteiro retornado pela função para fechar o acesso ao arquivo com fclose(), veja o exemplo:

verifabertura.php

<?php
$arq_aberto = fopen("/tmp/arq.txt","w");
/* $arq_aberto será FALSE se o arquivo não abrir ou um ponteiro
para arquivo caso o arquivo seja aberto com sucesso*/

if (!$arq_aberto) {
        // A função die() imprime uma mensagem e finaliza a execução do script
        die ("Arquivo não foi aberto!");
        /* E equivalente a:
        echo ("Arquivo não foi aberto!);
        exit;
        */
}

// Realiza as operações com o arquivo
. . .

// Fecha o arquivo
fclose($arq_aberto);


?>


hand Lembre-se:
  • O operador "!" no exemplo acima, é usado para testar se $arq_aberto contém um valor positivo (true) ou o valor 0 (false)
  • Caso o arquivo não seja aberto, junto com a impressão de erro, também será impresso o erro interno da linguagem PHP. Para contornar isto utiliza-se o símbolo "@" antes do início da instrução condicional ou antes da chamada de fopen:
   if (@!$arq_aberto = fopen("/tmp/arq.txt","w"))
    ou
   if (!$arq_aberto = @fopen("/tmp/arq.txt","w"))
  • Uma maneira prática de personalizar a mensagem de erro:
      // você pode usar a função print() ou die()
      $arquivo = @fopen("/tmp/arq.txt","w") or print ("Erro ao tentar abrir o arquivo \"/tmp/arq.txt\"");
      // Tente utilizar echo() para imprimir a mensagem... por que ocorre o erro?

1.3 - Gravação em um arquivo

Para a gravação de dados em um arquivo pode-se utilizar uma das funções:

  • fwrite()
  • fputs()

Ambas funcionam da mesma maneira. Veja o exemplo:

gravacao.php

<?php

$linha = "Linha adicional!";

//verifica se o arquivo foi aberto corretamente
$arq_aberto = @fopen("/tmp/arq.txt","w") or die ("Arquivo não foi aberto!");

//vamos agora inserir linhas
fputs($arq_aberto, "Primeira linha do meu arquivo\n");
fwrite($arq_aberto, "Segunda linha do meu arquivo\n");
fwrite($arq_aberto, $linha);

//não devemos nos esquecer de fechar o arquivo
fclose($arq_aberto);

?>

1.4 - Leitura de um arquivo

Várias funções podem ser utilizadas para ler as informações de um arquivo, sendo as mais comuns a fread() e a fgets().

1.4.1 - fread() e fgets()

Estas funções permitem ler strings gravadas em um arquivo com uma pequena diferença entre elas. Veja suas sintaxe:
fread( $ponteiro , $qt ), sendo $ponteiro o ponteiro para um arquivo e $qt a quantidade de bytes - 1 que será lida.
fgets( $ponteiro , $qt ), sendo $ponteiro o ponteiro para um arquivo e _$qt_(opcional) a quantidade de bytes - 1 que será lida.

Veja o exemplo:

leitura1.php

<?php

$arq_aberto = fopen("/tmp/arq.txt","r");

$text = fgets($arq_aberto, 255);
// Lê 254 bytes do arquivo, ou até o final da linha.
// Se o segundo parâmetro for omitido, uma linha inteira é lida.

$text2 = fread($arq_aberto, 255); 
// Lê 254 bytes do arquivo
// O segundo parâmetro é obrigatório e informa quantos bytes devem ser lidos

echo $text;
echo $text2;
fclose($arq_aberto);

?>

Obs:

  • A função fread() para de ler um arquivo se o número de bytes informados for alcançado, se o fim do arquivo for encontrado ou se forem lidos 8192 bytes.
  • Você pode ler todo o conteúdo de um arquivo utlizando a função fread() da seguinte forma:
      $conteudo = fread($arq_aberto, filesize ("/tmp/arq.txt"));

1.4.2 - fgetc()

Permite ler caractere por caractere de um arquivo. Veja o exemplo:

leitura2.php

<?php

$arq_aberto = fopen("/tmp/arq.txt","r");
do {
        $char = fgetc($arq_open);
} while($char);
/* coloca cada caractere do arquivo em $char, 
até o final do conteúdo do arquivo */

fclose($arq_aberto);

?>

O exemplo anterior apenas lê o arquivo. Não utilizamos o caractere lido. Você poderia colocar todos os caracteres em um array, concatenar-los em uma string, ou exibi-los na tela, dependendo da sua necessidade.

1.4.3 - file()

Esta função lê um arquivo completo, e armazena cada linha do arquivo como um elemento de um array. Depois de ler todo o conteúdo do arquivo, a file() o fecha automaticamente, não sendo necessária uma chamada à fclose(). Veja o exemplo:

leitura3.php

<?php
$linhas = file("/tmp/arq.txt");
//$linhas receberá cada linha do arquivo como um elemento do array
echo "Primeira linha: " .$linhas[0];
echo "Segunda linha: " .$linhas[1];
?>

Note também que não foi necessária uma chamada à fopen(), e nem a especificação de um modo de abertura.

1.5 - Bloquear arquivos

As vezes é necessário limitar o acesso a um arquivo, para que o mesmo não seja corrompido se for acessado por muitos usuários ao mesmo tempo. Para isto, podemos bloquear o acesso à arquivos utilizando a função flock(). Seu formato básico é:

flock("ponteiro", operação);

São aceitas 3 operações:

Operação Nome Descrição
LOCK_SH Compartilhado usuários podem ler, mas ninguém pode gravar
LOCK_EX Exclusivo nenhum outro usuário pode ler ou gravar até o arquivo ser liberado
LOCK_UN Liberado libera qualquer operação antes definida

Vejamos o exemplo:

bloqueio.php

<?php

$arq_aberto = fopen("/tmp/arq2.txt", "w");
flock($arq_aberto, LOCK_EX);
//bloqueia o arquivo logo após a sua abertura

fputs($arq_aberto, "Estou escrevendo no arquivo!");
//o arquivo está bloqueado para outros usuários

flock($arq_aberto, LOCK_UN);
//libera o acesso ao arquivo

// Caso você não libere o arquivo com o uso do LOCK_UN, ao utilizar o fclose o arquivo será liberado.
fclose($arq_aberto);

?>


hand Lembre-se:
  • Quando um segundo script tenta acessar o arquivo que esta bloqueado, ele ficará esperando o outro script liberar o acesso ao arquivo.

1.6 - Acessar arquivos com loops e função feof()

Novamente utilizamos os loops para nos poupar de algum trabalho manual. Dessa vez, queremos evitar acessar linha por linha de um arquivo. Vejamos uma nova função, que verifica se chegamos ao final de um arquivo: feof(). Ela é importante para controlar o laço que fará a leitura do arquivo. Vejamos um exemplo de seu uso:

looparquivo.php

<?php

if (!$arq_aberto = fopen("/tmp/arq3.txt","r")) {
        echo "Arquivo não foi aberto!";
        exit;
} else  {
        while (!feof ($arq_aberto)) {
                $linha = fgets($arq_aberto, 255);
                echo "$linha <br>";
        }
        fclose($arq_aberto);
}

?> 

1.7 - Direitos autorais e licença

Lição D2 - Funções do PHP para manipulação de arquivos

2.1 - Funções diversas para a manipulação de arquivos

Apresentaremos agora algumas funções que trabalham com arquivos e diretórios. Todas estas funções podem ser encontradas no site http://www.php.net, com explicação detalhada e exemplificada.

2.1.1 - rewind()

Esta função redefine a posição corrente para o início do arquivo, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: rewind( $ponteiro );

2.1.2 - fseek()

Esta função move o cursor para uma posição específica no arquivo, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: fseek($arq_aberto, offset); sendo offset o número de bits desde o início do arquivo até a posição desejada.

2.1.3 - copy()

É a função utilizada para copiar arquivos de um local (origem) para outro (destino), retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: copy("/root/file.txt", "/temp/file.txt"); - copia o arquivo file.txt de "/root/" para "/temp".

2.1.4 - unlink()

Esta é a função utilizada para excluir um arquivo criado, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: unlink ("/temp/file.txt");

2.1.5 - rename()

Altera o nome de um arquivo, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: rename("oldfile.txt", "newfile.txt");

2.1.6 - file_exists()

Como diz o próprio nome, esta função verifica se o arquivo realmente existe, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: file_exists("newfile.txt");

2.1.7 - filesize()

Esta função retorna em bytes o tamanho do arquivo especificado e FALSE no caso de falha na tentativa de obter o tamanho.
Exemplo: filesize("newfile.txt");

2.1.8 - filetype()

Esta função retorna uma string com o tipo do arquivo especificado caso tenha sucesso, tendo como possíveis valores fifo, char, dir, block, link, file e unknown; e retorna FALSE no caso de falha.
Exemplo: filetype("newfile.txt");

2.1.9 - is_dir()

Verifica se o arquivo em questão é um diretório, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: is_dir("file.txt");

2.1.10 - is_executable()

Verifica se o arquivo em questão é um executável, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: is_executable("file.txt");

2.1.11 - is_readable()

Verifica se no arquivo é permitida a leitura, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: is_readable("file.txt");

2.1.12 - is_writeable()

Verifica se no arquivo é permitida a escrita, retornando TRUE caso tenha sucesso e FALSE no caso de falha.
Exemplo: is_writeable("file.txt");

2.2 - Diretórios

O PHP também nos oferece várias funções para a manipulação de diretórios. Vejamos algumas:

2.2.1 - chdir()

Esta função transforma o diretório especificado no diretório corrente, ou seja, o atual.
Exemplo: chdir("/temp"); Para saber qual o diretório corrente use a função getcwd();

2.2.2 - opendir()

Função usada para abrir o diretório, retornando um número inteiro que podemos chamar de "manipulador de diretório".
Exemplo: $dirmanip = opendir("/temp");

2.2.3 - readdir()

É uma função utilizada para ler o conteúdo do diretório. Ela usa como parâmetro o "manipulador de diretório", apresentado anteriormente. Esta função retorna o nome dos arquivos e diretórios contidos na pasta do manipulador passado por parâmetro na ordem informada pelo o sistema de arquivos. Em caso de falha o valor retornado será FALSE.
Exemplo: $file = readdir($dirmanip);


handLembre-se:
  • Esta função retorna o nome do arquivo lido, logo ela poderá retornar valores como "0" ou que são tratados em condições como "false". Logo, quando for utilizar o retorno desta função em uma condição use os operadores "idêntico" ( ===) ou "não idêntico" ( !== )

2.2.4 - closedir()

Função usada para fechar o diretório utilizando como parâmetro o "manipulador de diretório".
Exemplo: closedir("/temp");

2.2.5 - mkdir()

Função usada para criar um novo diretório. Sua sintaxe é: mkdir( $caminho, $modo, $recursivo ), sendo o segundo e terceiro parâmetros opcionais. O $modo especifica as permissões de acesso para um diretório UNIX, sendo ignorado no Windows, e o $recursivo é um valor booleano usado quando se deseja criar várias pastas, sendo o valor padrão FALSE.

Exemplos: mkdir("/temp/new", 0700); mkdir("/temp/estou/criandos/varias/pastas", 0777, true);

2.2.6 - rmdir()

Simplesmente remove o diretório.
Exemplos: rmdir("/temp/new");

2.3 - Direitos autorais e licença

Lição D3 - Exemplo prático do uso de arquivos

3.1 - Exemplo Prático - Contador de Acessos

Para uma melhor utilização e entendimento das funções manipuladoras de arquivos, tentem estruturar um script para controlar os acessos à uma página de internet utilizando arquivos. Abaixo mostraremos um modelo que pode ser tomado como exemplo:

contador.php

<?php

//vamos criar uma função que conte os acessos
function contador() { 
        # Esta variavel conterá o caminho completo na árvore de diretórios e o nome do arquivo que será criado 
        $arq_cont = "/var/www/contador.txt";
        
        # verifica se o arquivo que irá conter o nº de acessos existe.
        if (file_exists($arq_cont)) {
                $arq_aberto = fopen($arq_cont, "r+") or die "Não foi possível abrir o arquivo $arq_cont!";
                # apenas um usuário poderá acessar o arquivo por vez.
                flock($arq_aberto, LOCK_EX);
                
                # Lê os primeiros 3 dígitos do arquivo. Aqui você pode colocar mais dígitos se quiser.
                $contador = fgets($arq_aberto, 3);
                $contador++;
                
                # Após a leitura de 3 bytes do arquivo o ponteiro está agora apontando para
                # o quarto byte, portanto temos que voltá-lo para o começo do arquivo para reescrever o valor
                rewind($arq_aberto);
                fputs($arq_aberto, $contador);
                
                # libera o acesso ao arquivo
                flock($arq_aberto, LOCK_UN);
                fclose($arq_aberto);
                
                echo $contador;
                
        } else {
                # Aqui criamos o arquivo com o valor 1 armazenado nele
                $arq_aberto = fopen($arq_cont, "w") or die "Não foi possível criar o arquivo $arq_cont para escrita!";
                
                $contador = "1";
                flock($arq_aberto, LOCK_EX);
                fputs($arq_aberto, $contador);
                
                # Ao fechar o arquivo o acesso a ele é liberado automaticamente
                fclose($arq_aberto);
                echo $contador;
        }
        
}

contador();
?>

Agora seria necessário apenas utilizar a função contador onde você bem quiser na sua página web lembrando de utilizar a função: require ("contador.php");.

3.2 - Direitos autorais e licença

Lição D4 - Exercícios da Trilha D

1 - Qual das linhas a seguir abre um arquivo chamado nomes.txt no modo somente leitura?

  • a - file_open("readonly", "nomes.txt");
  • b - fopen("nomes.txt", "readonly");
  • c - fopen("r", "nomes.txt");
  • d - file_open("r", "nomes.txt");
  • e - fopen("nomes.txt", "r");

2 - Avalie as seguintes afirmativas como verdadeiras ou falsas:

  • I - A função fopen não retorna valor algum.
  • II - A função fopen retorna um ponteiro para o arquivo.
  • III - Só existem dois modos de abertura: "r" e "w", leitura e escrita, respectivamente.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

3 - Qual das seguintes alternativas contém o código necessário para fechar um arquivo aberto com o trecho abaixo:

$arq = fopen("texto.txt", "r");

  • a - file_close();
  • b - fclose();
  • c - file_close("texto.txt");
  • d - fclose("texto.txt");
  • e - fclose($arq);

4 - O que o código a seguir faz?

$arq = fopen("nomes.txt", "w");
fputs($arq, "João\nMarcelo\nJoana\nMarcela");
fclose($arq);

  • a - Abre um arquivo no modo de leitura e tenta gravar dados nele, o que gera um erro.
  • b - Abre um arquivo no mode de escrita, e busca por ocorrências de nomes especificados entre "\n".
  • c - Abre um arquivo no modo de leitura e busca, no conteúdo, por ocorrências de nomes especificados entre "\n", e o fecha.
  • d - Abre um arquivo para leitura e escreve na tela a string "João\nMarcelo\nJoana\nMarcela".
  • e - Abre um arquivo para escrita e escreve no arquivo a string "João\nMarcelo\nJoana\nMarcela", fechando-o em seguida.

5 - Qual das seguintes linhas abre um arquivo chamado "filmes.txt" somente para leitura e lê a primeira linha do mesmo, exibindo-o na tela?

  • a - fopen("filmes.txt", "r"); $linha = fgets("filmes.txt"); echo $linha;
  • b - $arq = fopen("r", "filmes.txt"); echo fgets("filmes.txt");
  • c - $arq = fopen("filmes.txt", "r"); $linha = fgets($arq); echo $linha;
  • d - echo fgets("filmes.txt");
  • e - echo fgets(fopen("filmes.txt"));

6 - Qual das seguintes funções lê apenas um caractere de um arquivo aberto da forma a seguir?

$arq = fopen("texto.txt", "r");

  • a - get_a_char();
  • b - get_a_char($arq);
  • c - fgetchar($arq);
  • d - getc();
  • e - fgetc($arq);

7 - Qual das alternativas a seguir possui o código necessário para bloquear um arquivo de modo que todos possam apenas lê-lo?

  • a - lock_file($referencia_do_arquivo);
  • b - share_file($referencia_do_arquivo);
  • c - flock($referencia_do_arquivo);
  • d - flock($referencia_do_arquivo, LOCK_UN);
  • e - flock($referencia_do_arquivo, LOCK_SH);

8 - Analise, nas alternativas a seguir, a descrição de cada função e identifique qual delas está incorreta.

  • a - mkdir() cria um novo diretório.
  • b - rmdir() apaga um diretório especificado.
  • c - chdir() altera o diretório corrente, permitindo a navegação entre diretórios.
  • d - opendir() faz o mesmo que mkdir(), mas obriga a especificação do código de permissão do diretório.
  • e - closedir() fecha um diretório, e é usada após uma leitura de diretório, por exemplo.

9 - Com qual função podemos apagar um arquivo existente no diretório corrente?

  • a - delete()
  • b - exclude()
  • c - unlink()
  • d - remove()
  • e - trash()

10 - Analise, nas alternativas a seguir, a descrição de cada função e identifique qual delas está incorreta.

  • a - filetype() retorna uma string informando qual é o tipo do arquivo cuja referência foi passada como parâmetro.
  • b - is_dir() testa se o arquivo cuja referência foi passada como parâmetro é um diretório.
  • c - rename() renomeia um arquivo especificado.
  • d - size() retorna o tamanho do arquivo, passado como parâmetro, em bytes
  • e - is_executable() testa se o arquivo é executável.

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha E - Strings e Expressões Regulares

Lição E1 - Manipulação de Strings

1.1 - Introdução

Com certeza você irá precisar tratar strings em seus scripts. A linguagem PHP fornece inúmeras funções para isso, assim como grande parte das linguagens de script. Nesta lição iremos aprender algumas destas funções. Veremos também o que são e como são utilizadas as expressões regulares.

1.2 - Manipulação de Strings

Ao programar em PHP, um dos tratamentos mais frequentes é o dos valores de entrada. O PHP oferece diversas funções que podem nos ajudar a processar uma cadeia de caracteres ou retornar mensagens de confirmação ou de erro ao usuário.

Todos os recursos oferecidos tornam o PHP uma linguagem muito interessante para manipular arquivos e textos grandes. Algumas das funções mais utilizadas são as seguintes:

1.2.1 - substr()

Retorna uma parte de uma cadeia de caractere. Utilizamos essa função fornecendo dois ou três argumentos: o primeiro argumento (uma string) é a cadeia original a ser analisada; o segundo argumento (um número inteiro) é a posição a partir da qual a string será capturada; e o terceiro argumento (outro inteiro, que é opcional) determina o tamanho da cadeia que será retornada. Caso o terceiro parâmetro não seja informado, será retornada a substring até o final da cadeia original.

substr (string, início);

substr (string, início, tamanho);


Temos a seguinte string: "Sistemas Abertos". Queremos retornar apenas "Abertos".

<?php
     $nome = "SistemasAbertos";
     echo substr($nome, 8);
?>

O resultado deste código no navegador é:

Abertos


Temos a seguinte string: "Sistemas Abertos". Queremos retornar apenas "Sistemas".

<?php
     $nome="SistemasAbertos";
     echo substr($nome, 0, 8);
?>

O resultado deste código no navegador é:

Sistemas

Se utilizarmos um número negativo como parâmetro, a contagem será feita do final para o início da string original.
O código abaixo retorna uma string de 6 caracteres começando com o sétimo caracter de trás para frente da string original.

<?php
     $nome="SistemasAbertos";
     echo substr($nome, -7, 6);
?>

Resultado no navegador:

Aberto

O código abaixo retorna uma string com início na sétima posição de trás para frente até a penúltima posição.

<?php
     $nome="SistemasAbertos";
     echo substr($nome, -7, -1 );
?>

Resultado no navegador:

Aberto


handLembre-se:
  • Ao utilizar a função substr() e não informar o terceiro argumento, a substring retornada será aquela compreendida entre a posição inicial informada e o fim da cadeia de caracteres original.

1.2.2 - strlen()

Retorna um número inteiro que informa o comprimento da cadeia, ou seja, a quantidade de caracteres da string. Essa função possui apenas um argumento que é a própria string.

strlen (string);

<?php
     $curso="Expressões Regulares";
     echo "A variável \$curso possui " . strlen($curso) . " caracteres<br />";
     echo "Sistemas Abertos possui " . strlen("Sistemas Abertos") . " caracteres";
?>

O resultado do código acima é:

A variável $curso possui 20 caracteres
Sistemas Abertos possui 16 caracteres

1.2.3 - trim()

Esta função retira os espaços em branco no início e no final de uma cadeia de caracteres. Ela não exclui os espaços em branco no meio da cadeia. O argumento passado é a própria cadeia.

trim(string);

<?php
     $linguagem="   Hypertext Preprocessor   ";
     $linguagem_limpa=trim($linguagem);
     echo "início:" . $linguagem . "fim.<br />";
     echo "início" . $linguagem_limpa . "fim.";
?>

O resultado do código acima é:

início: Hypertext Preprocessor fim.
inícioHypertext Preprocessorfim.

Para limpar os caracteres brancos apenas do início da string , usamos a função ltrim() .
Para limpar apenas os caracteres brancos do final da string usamos a função chop() ou rtrim().

1.2.4 - ucfirst()

Retorna uma string com o primeiro caractere em maiúsculo. O argumento da função é a cadeia a ser alterada.

ucfirst(string);

<?php
     $name = "daniella balbino";
     echo ucfirst($name);
?>
O resultado deste código é:

O nome é Daniella balbino

1.2.5 - ucwords()

Utilizada em strings que possuem mais de uma palavra, retorna os primeiros caracteres de cada palavra em maiúsculo.

ucwords(string);

<?php
     $name = "daniella balbino";
     $name = ucwords($name);
     echo "A função ucwords retorna " . $name;
?>

O resultado do código é: A função ucwords retorna Daniella Balbino

1.2.6 - strpos() e strrpos()

strpos() é utilizada para fazer pesquisa de uma palavra dentro de uma cadeia. A função retorna a posição da primeira ocorrência da combinação de caracteres referentes a palavra recebida como argumento. O primeiro argumento é a cadeia de caracteres onde será efetuada a pesquisa, e o segundo argumento é a palavra (sequência de caracteres) que será pesquisada na cadeia.

Já a strrpos() retorna a posição da última ocorrência da palavra pesquisada.

<?php
     $mensagem="Daniella não conseguiu passar no teste, 
     ela não atingiu a nota mínima";
     echo strpos($mensagem, "não"); //retorna a posição do primeiro "não" 
     echo strrpos($mensagem, "não"); //retorna a posição do último "não"
?>

1.2.7 - str_replace()

Utilizada para fazer a substituição de uma sequência de caracteres (palavra). Esta função recebe três argumentos: palavra procurada, palavra que será escrita no lugar da procurada e a cadeia principal, onde as trocas ocorrerão.

str_replace(palavra procurada, nova palavra, cadeia principal);

Para transformar a cadeia de caracteres "Daniella foi reprovada no teste" para "Daniella foi aprovada no teste", utilizamos a função str_replace():

<?php
     $resultado="Daniella foi reprovada no teste";
     $resultado=str_replace("reprovada","aprovada",$resultado);
     echo $resultado;
?>

O resultado do código acima no navegador é:

Daniella foi aprovada no teste

1.2.8 - chr()

Recebe como argumento um número inteiro, e retorna o caracter correspondente a este número, usando como referência a tabela ASCII.

chr(número que representa um código ASCII);

<?php
     echo chr(34);
     echo chr(64);
     echo chr(34);
?>
O resultado será: "@"

(aspas, arroba, aspas)

1.2.9 - strcmp()

Compara duas cadeias de caracteres, e retorna 0 se as duas strings forem exatamente iguais (a comparação é case sensitive, ou seja, "Abacate" é diferente de "ABACATE"), retorna um inteiro < 0 se a primeira string for maior que a segunda e retorna um inteiro > 0 se a segunda string for maior que a primeira.

<?php
     $senha="123456";
     $acesso="123456";
     $resultado=(strcmp ($senha, $acesso));
     if ($resultado==0)
          echo "Senha correta";
     else
          echo "Senha inválida";
?>
O resultado desse código no navegador é:

Senha correta

1.2.10 - strcasecmp()

Compara duas cadeias de caracteres da mesma forma que a função strcmp(), mas não é case sensitive.

strcasecmp(string1,string2);

<?php
     $nome1="Carlos José";
     $nome2="carlos José";
     $resultado= strcasecmp ($nome1, $nome2);
     if ($resultado==0)
          echo "Os nomes são iguais";
     else
          echo "Os nomes não são iguais";
?>

O resultado no navegador é:

Os nomes são iguais

1.2.11 - ereg()

Utilizada para procurar em uma cadeia de caracteres uma certa combinação de padrão (expressão regular).
Verifica se a $cadeia possui alguma ocorrência da expressão regular definida em expressão, de modo case sensitive. Essa função retorna verdadeiro se a variável estiver nos padrões da expressão e falso se a variável não estiver nos padrões.

ereg(expressão, $cadeia,);

<?php
     $cadeia="Para manipular strings em cadeia de caracteres é preciso estudar muito";
     $expressao="estudar";
     if(ereg($expressao,$cadeia))
          echo "Foi encontrado ocorrência da expressão na cadeia";
     else
          echo "Não foi encontrado ocorrência da expressão na cadeia";
?>     

O resultado no navegador é:

Foi encontrado ocorrência da expressão na cadeia

1.2.12 - ereg_replace()

Essa função busca na $string recebida, no terceiro argumento, ocorrências da $expressão determinada no primeiro argumento. Se existe ocorrência, é feita uma substituição pela string ($substituicao) recebida no segundo argumento. Se não houver ocorrência da $expressao na $string, o resultado será a $variável inalterada.

ereg_replace ($expressao, $substituicao, $string)

<?php
     $cadeia="Para manipular string em cadeia de caracteres é preciso estudar muito";
     $expressão="muito";
     $nova_expressão="bastante";
     echo ereg_replace($expressao, $nova_expressão, $cadeia);
?>

O resultado dessa execução de código no navegador é:

Para manipular strings em cadeia de caracteres é preciso estudar bastante

1.2.13 - split()

Transforma uma string em um array, baseado em uma expressão que será utilizada para dividir a string.

split($expressao, $string);

<?php
     $linguagens = "PHP - C - C++ - Java - Ruby - Phyton";
     $exp = " - ";
     $vetor=split($exp, $linguagens);
     foreach ($vetor as $elemento)
          echo $elemnto."<br>";
?>

O resultado desse código no navegador é:

PHP
C
C++
Java
Ruby
Phyton

1.3 - Direitos autorais e licença

Lição E2 - PHP e Expressões Regulares

2.1 - Expressões Regulares

Agora que sabemos as principais funções de manipulação de strings, vamos aprender o que são expressões regulares. Através de expressões regulares, criamos padrões de strings, que podem ser utilizados em buscas e substituições. Este padrão determina os caracteres utilizados na formação de uma string e o número de ocorrências destes caracteres.

A expressão regular é um método formal de se especificar um padrão de texto, ou seja, é uma composição de símbolos e caracteres com funções especiais que, agrupados entre si e com caracteres literais, formam uma sequência (expressão). Essa expressão é interpretada com uma regra, que indicará sucesso se uma entrada de dados qualquer combinar com essa regra, ou seja, obedecer exatamente a todas as suas condições.

As expressões são formadas por símbolos e caracteres literais chamados metacaracteres, que possuem funções especiais.

2.1.1 - Metacaracteres do tipo Representante: . [ ] [^ ]

Representam caracteres dentro de uma regra. Especificamente:

. ponto - representa qualquer caractere: um número, uma letra, caracteres especiais (@, %, &, *, e outros). Podemos utilizar o ponto em um texto para procurar palavras, da seguinte forma:

  • express.o encontra expressão, expressao, expressAo, ...
  • .epresentante encontra Representante, representante, ...
  • pont. encontra ponto, ponta, ...
  • 16.30 encontra 16:30, 16 30, 16.30, ...
  • <..> encontra <br>, <tr>, <td>, <th>, ...

[ ] lista - é utilizada para limitar os metacaracteres que serão permitidos na expressão, ou seja, só é possível utilizar os metacaracteres especificados na lista. Veja os seguintes exemplos:

  • ling[uü]iça encontra linguiça, lingüiça
  • [Bb]rasil encontra Brasil, brasil
  • 16[:. ]30 encontra 16:30, 16.30, 16 30

Dentro da lista todos os caracteres são normais, exceto o traço (-). Portanto, o ponto é apenas um ponto e não um metacaractere.

A lista contém todos os caracteres permitidos em uma posição. Uma lista que determina que em uma posição exista apenas números é a seguinte: [0123456789]. Mas imagine como seria uma lista para representar as letras do alfabeto! Seria um tanto tedioso e extenso escrever tal lista.

Usamos o conceito de intervalo para determinar os intervalos existentes. Podemos determinar os intervalos da seguinte forma:

  • [0-9] representa os números de 0 a 9
  • [a-z] representa as letras minúsculas de a a z
  • [A-Z] representa as letras maiúsculas de A a Z
  • [a-zA-z] representa as letras maiúsculas e minúsculas de A a Z

Para representar o traço(-) literal em uma lista, é necessário colocá-lo no final da lista. Temos também o colchete literal: o colchete de abertura [ pode ser posto em qualquer lugar da lista, pois ela já está aberta (e não existe o conceito de lista dentro de outra lista); já o colchete de fechamento ] deve ser posto no começo da lista, ou seja, deve ser o primeiro item, para não ser confundido com o colchete que termina a lista.

  • [][-] representa os caracteres literais dos seguintes símbolos: ], [ e -

[^ ] lista negada é utilizada para representar os caracteres literais que não fazem parte da posição. As regras que são aplicadas na lista normal são válidas à lista negada. A diferença é que na lista negada são especificados os elementos que não devem existir. O primeiro caractere da lista negada é um acento circunflexo e é ele que indica que a lista será desse tipo.

A lista negada é útil quando sabemos o que não pode existir em determinada posição. Por exemplo: de acordo com a regra de boa escrita, após algum caractere de pontuação devemos colocar um espaço em branco, que separará o sinal de pontuação do resto do texto. Para procurar por qualquer ocorrência de texto fora desse padrão, utilizamos a seguinte expressão: [:;,.!?][^ ].

2.1.2 - Metacaracteres tipo Quantificadores ? * + { }

São utilizados para indicar o número de repetições permitidas para a entidade imediatamente anterior, ou seja, a quantidade de vezes que a entidade anterior pode aparecer. As entidades podem ser um caractere ou um metacaractere.

? opcional é um quantificador utilizado quando se tem dúvidas da ocorrência da entidade anterior. Este símbolo procura pelo caractere ou metacaractere, imediatamente anterior, nenhuma ou apenas uma vez.

  • Programas? encontra Programa, Programas
  • aula [1-5]? encontra aula, aula 1, aula 2, aula 3, aula 4, aula 5
  • brincadeira[s!]? encontra brincadeira, brincadeiras, brincadeira!

* asterisco - usado para nenhuma, uma ou infinitas aparições da entidade anterior. Em outras palavras, o asterisco indica que a entidade anterior pode aparecer em qualquer quantidade.

  • [ar]*a encontra a, ara, arara, ararara, ra, raaa, rrrra, ...
  • Humm*! encontra Hum!, Humm!, Hummm!, Hummmmm!, ...

Verificamos até agora a existência de dois metacaracteres extremamente abrangentes: o ponto (qualquer caracter) e o asterisco (em qualquer quantidade). Se juntarmos os dois (.*) teremos de encontrar qualquer caractere em qualquer quantidade.

+ mais - é um quantificador utilizado para exigir a ocorrência da entidade anterior pelo menos uma vez, podendo haver inúmeras repetições. É muito parecido com o asterisco. A diferença é que o mais exige ao menos uma ocorrência.

  • [ar]+a encontra aa, ra, rraa, rra, ...
  • Humm+! encontra Humm!, Hummm!, ...

{n,m} chaves - as chaves representam a solução para uma quantificação mais controlada, nas quais podemos especificar exatamente quantas repetições se quer da entidade anterior. {n,m} significa de n até m ocorrências. Temos também a sintaxe {n} usada para especificar exatamente o número de repetições.

  • {1,5} procura de 1 a 5 ocorrências
  • {5,} procura pelo menos 5 (5 ou mais)
  • {0,5} procura nenhuma ou até 5 ocorrências
  • {5} procura exatamente 5
  • {0,1} procura zero ou 1 ocorrências (igual ao opcional, ?)
  • {0,} procura zero ou mais ocorrências (igual ao *)
  • {1,} procura uma ou mais ocorrências (igual ao +)

2.1.3 - Metacaracteres tipo Âncoras ^$ \b

Os metacaracteres tipo âncora são utilizados para marcar uma posição específica na linha. Eles não podem ser quantificados, e por isso os metacaracteres quantificadores (+ * { } ) não exercem influência sobre eles.

^ circunflexo - este metacaractere marca o começo de uma linha. Ele só tem esta função se estiver no início da expressão regular.

handLembre-se:

  • O circunflexo como primeiro elemento de uma lista é o marcador da lista negada. Fora de uma lista ele é a âncora que determina como a linha deve ser iniciada.

  • ^[*#] - com esta expressão, procuramos linhas que começam com * ou #. Combinações com essa âncora são muito utilizadas para procurar palavras no começo da linha.

$ cifrão - o cifrão marca o fim de uma linha e só é válido no final de uma expressão regular.

  • [0-9]$ - busca por linhas que terminem com um número.

\b borda - utilizada para marcar uma borda de palavra, ou seja, onde ela começa e/ou termina. Veja como se comportam as expressões regulares abaixo, utilizando a borda:

  • dia encontra dia, diafragma, radial, melodia, bom-dia! (dia em qualquer parte da palavra)
  • \bdia encontra dia, diafragma, bom-dia! (dia no início de uma palavra)
  • dia\b encontra dia, melodia, bom-dia! (dia no final de uma palavra)
  • \bdia\b encontra dia, bom-dia! (dia isolado)

Portanto, a borda força um começo ou término de palavra. Palavra aqui é um conceito que engloba apenas[A-Za-z0-9_], ou seja, letras, números e sublinhado. Por isso, "\bdia\b" também combina com "bom-dia!", pois o traço e a exclamação não são parte de uma palavra.

2.1.4 - Outros Metacaracteres \c | ( )

Chamamos de outros os metacaracteres representados aqui porque eles não possuem uma função específica e não se relacionam entre si. Mas isto não quer dizer que eles sejam inferiores.

\ escape é utilizado para transformar um metacaractere em caractere literal, ou seja, fazer com que eles não se comportem de acordo com suas funções, mas sim como o próprio caractere. Seria a mesma coisa que colocar este metacaractere em uma lista, pois de acordo com o conceito de lista, todos os caracteres possuem valor literal (exceto o traço).

  • \* é o caractere literal * (mesmo que [*] )
  • \^ é o caractere literal ^ (mesmo que [^] )
  • \? é o caractere literal ? (mesmo que [?] )

Um exemplo de expressão para representar o número de CPF:

  • [0-9]{3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}

| ou - quando em uma posição específica da expressão podemos combinar mais de uma alternativa, utilizamos o ou para determinar as combinações possíveis. Por exemplo:

  • boa-tarde | boa-noite

Lemos essa expressão regular da seguinte forma: "boa-tarde ou boa-noite". A lista se comporta de maneira semelhante ao ou, mas funciona para apenas um caractere. Então:

  • [bcdgp]ata encontra bata, cata, data, gata, pata

(...) grupo - responsável por juntar vários sujeitos em um mesmo local. Dentro de um grupo podemos ter um ou mais caracteres e metacaracteres, e inclusive outros grupos. Assim como em uma expressão matemática os parênteses definem um grupo, o seu conteúdo pode ser visto como um bloco na expressão.

Os metacaracteres quantificadores tem seu poder ampliado pelo grupo, pois ele lhes dá mais abrangência. Veja alguns exemplos:

  • (ai)+ encontra ai, aiai, aiaiai, aiaiaiai, ...
  • (10)+ encontra 10, 1010, 101010, 10101010, ...

Nesses exemplos, combinamos várias repetições da palavra (ou sequência) especificada dentro do grupo.

Podemos também criar subgrupos. Por exemplo, vamos procurar o nome de um supermercado em uma listagem e não sabemos se este é um mercado, um supermercado ou um hipermercado. Para isto, utilizaremos a seguinte expressão:

  • ((su|hi)per)?mercado

Note o uso do ou e dos grupos e subgrupos. Poderíamos ter construído a expressão de uma forma distinta:

  • (super|hiper)?mercado

Veja que agora não foram necessários subgrupos.

\1, \2, \3 ... \9 retrovisor - chamamos de retrovisor por que é possível buscar um trecho já definido, muito útil para casar trechos repetidos em uma mesma linha. Ele é representado pelo escape \ seguido dos números de 1 a 9 (podemos ter no máximo 9 retrovisores na expressão). Os números indicam o grupo que está sendo referenciado. Por exemplo, vamos procurar literalmente por :

  • (bom)\1, que encontra bombom
  • (quero)-\1, que encontra quero-quero

Então o retrovisor \1 é uma referência a combinação especificada no primeiro grupo, \2 é uma referência ao segundo grupo, e assim sucessivamente, até o 9.

2.2 - Direitos autorais e licença

Lição E3 - Exercícios da Trilha E

1 - Avalie as seguintes proposições como verdadeiras ou falsas:

  • I - O PHP possui muitas funções para manipulação de strings.
  • II - A função substr retorna uma substring da string original.
  • III - A função strlen retorna o número de caracteres de uma string.

A ordem correta das avaliações é:

  • a - I - V; II - V; III - F
  • b - I - F; II - F; III - F
  • c - I - V; II - V; III - V
  • d - I - F; II - V; III - V
  • e - I - V; II - F; III - V

2 - Qual o resultado na tela do seguinte trecho de código?

$str = "O PHP possui recursos avançados para manipulação de strings";

echo substr($str, 2, 3);

  • a - A string "O PHP possui".
  • b - A string "possui".
  • c - A string "strings".
  • d - A string "manipulação".
  • e - A string "PHP".

3 - Qual o resultado na tela da execução do seguinte trecho de código?

$str = "O PHP possui recursos avançados para manipulação de strings";

echo strlen($str);

  • a - O número 12.
  • b - O número 20.
  • c - O número 33.
  • d - O número 59.
  • e - Não há resultado de execução.

4 - O que a função trim faz?

  • a - Ela quebra uma string, criando um array com os caracteres da string.
  • b - Com a função trim, criptografamos uma string para transmiti-la através da URL.
  • c - A trim retorna a string original com todas as iniciais das palavras em maiúscula.
  • d - A trim retorna a string original com a inicial da primeira palavra em maiúscula.
  • e - A trim remove os espaços em branco no início e no final da string.

5 - O que a str_replace faz?

  • a - Troca uma string completa por outra, em uma variável.
  • b - Acrescenta uma string ao início de outra.
  • c - Acrescenta uma string ao final de outra.
  • d - Substitui, em uma string, um trecho buscado por outro especificado.
  • e - Substitui um caractere por outro em uma string.

6 - O que contém a variável $var após a execução do trecho de código à seguir?

$str = "PHP é uma linguagem interpretada";
$var = split(" ", $str);

  • a - A string "PHP".
  • b - A string "PHP\s é\s uma\s linguagem\s interpretada".
  • c - A string "PHP é uma linguagem interpretada".
  • d - Um vetor de seis posições, sendo o primeiro elemento do array um espaço e os demais as palavras da string $str.
  • e - Um vetor de cinco posições com cada palavra da string $str.

7 - O que a expressão regular a seguir encontra?

PHP[3-6]?

  • a - Apenas as strings "PHP3" e "PHP6".
  • b - Apenas a string "PHP-3".
  • c - Apenas a string "PHP" com algum número entre 3 e 6 no final.
  • d - A string "PHP", e também "PHP" com algum número entre 3 e 6 no final.
  • e - Apenas a string "PHP".

8 - Qual a função do caractere + em uma expressão regular?

  • a - Este caractere é usado para "somar", ou seja, juntar duas expressões em uma só.
  • b - Este caractere informa que a entidade anterior precisa existir pelo menos duas vezes.
  • c - Este caractere informa que a entidade anterior existe ao menos uma vez, ou mais de uma.
  • d - Este caractere informa que a entidade anterior é opcional.
  • e - Este caractere é reconhecido simplesmente como a string "+".

9 - Através de qual símbolo podemos fazer uma quantificação controlada (pedir para que exista um determinado número de ocorrências) de uma entidade em uma expressão regular?

  • a - (), usando assim: (5), ou (2,5)
  • b - +, usando o número de vezes desejado: ++ para duas ocorrências, +++++ para 5, etc
  • c - * , usando o número de vezes desejado: ** para duas ocorrências, **** para 4, etc
  • d - ., usando o número de vezes desejado: .. para duas ocorrências, ... para 3, etc
  • e - {}, usando assim: {5}, ou {2,5}

10 - Para que serve a âncora $, em uma expressão regular?

  • a - Para representar o início de uma palavra, sendo válida no início de uma expressão regular.
  • b - Para representar o final de uma palavra, sendo válida no final de uma expressão regular.
  • c - Para representar o início de uma linha, sendo válida no início de uma expressão regular.
  • d - Para representar o final de uma linha, sendo válida no final de uma expressão regular.
  • e - Para representar o final de um arquivo, sendo válida no final de uma expressão regular.

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha F - PHP e formulários HTML

Lição F1 - Formulários HTML

1.1 - Introdução

Aqueles que quiserem continuar sua caminhada no Desenvolvimento para a Web, aprendendo linguagens de script, deverão dominar os conceitos e funcionalidades dos formulários, mecanismos essenciais para a interação entre o usuário e a página. Por meio dos formulários, a pessoa que acessa um site na internet pode enviar diversos tipos de informações (como e-mail, nome, comentários, etc) e com PHP poderão ser criados sistemas que usarão esses dados para algum fim.

1.2 - Entendendo o funcionamento dos formulários

Para criarmos um formulário usamos a tag <form>. Dentro desta tag serão inseridos todos os objetos que farão a interação com o usuário. A tag <form> possui algumas propriedades importantes que devem ser entendidas:

  • action - define qual programa ou script deverá analisar e processar os dados que serão enviados para o servidor, e quando ausente os dados são enviados para a própria página.

  • method - define o método de envio, podendo ser por POST ou GET. Se o método não for definido será adotado o método GET como padrão.

    • get - O método get transmite os dados por intermédio da URL. Sendo assim, há um limite de caracteres a serem transmitidos e existe transparência ao usuário. Se os dados fizerem alguma exigência como a solicitação de senhas, este não é um bom método. Quando o atributo method é omitido, get é admitido como padrão;

    • post - O método post transmite os dados diretamente para o script, sem que o usuário note qualquer mudança na URL. É excelente para transmitir dados confidenciais e arquivos;

  • enctype - com esta propriedade, informamos qual é o tipo de mídia ou dado que está transitando por nossos formulários. O tipo mais comum e default é o application/x-www-form-urlencoded, responsável pela transmissão de dados típicos de formulários, ou seja, os valores que os elementos estão assumindo. No caso de transmissão de arquivos, como em um upload, o enctype a ser usado é o multipart/form-data. Para dados enviados diretamente por e-mail, o valor a ser utilizado é o text/plain;

  • name - é a propriedade que define o nome de acesso ao nosso objeto em questão, o formulário.

Nos tópicos a seguir, veremos a declaração e o uso de formulários.

1.3 - Conhecendo os objetos dos formulários

Os objetos dos formulários são vários e iremos estudá-los separadamente. Eles possuirão características e funcionalidades comuns, dependendo da forma que serão utilizados. Todos devem estar declarados dentro das tags <form></form>, pois caso algum deles esteja fora dessas tags, não serão enviados ao servidor.

Vejamos agora uma lista de objetos que podemos usar:

  • text - é uma caixa de texto que limita o tamanho do texto a 255 caracteres ou de acordo com a propriedade maxlength;

Cap07_HTMLTotal1105E_html_m7c1e3375.png

  • password -campo texto destinado à inserção de senha. É igual ao objeto text, porém o texto digitado pelo usuário aparece em forma de asteriscos ou marcadores para ocultar a senha;

Cap07_HTMLTotal1105E_html_c397b0e.png
  • textarea -também permite a entrada de texto, porém de forma livre, sem um limite de caracteres pré-estabelecido;

Cap07_HTMLTotal1105E_html_66456070.png
  • hidden - armazena um determinado valor, pré-estabelecido ou não, de forma oculta ao usuário, bastante utilizando quando o formulário é composto de duas ou mais páginas;

  • checkbox -permite que o usuário decida se quer ou não aceitar uma determinada cláusula estabelecida na página, como receber e-mails de propaganda ou newsletters;

Cap07_HTMLTotal1105E_html_m157c8794.png
  • radio - os botões de rádio permitem que o usuário escolha apenas uma entre várias alternativas exibidas na página. Temos, por exemplo, o campo "sexo" em um cadastro qualquer;

Cap07_HTMLTotal1105E_html_m52c447dd.png
  • select -exibe para o usuário uma lista de opções, das quais ele só poderá escolher uma. É conhecido em algumas linguagens de programação como ComboBox;

Cap07_HTMLTotal1105E_html_441d101.png
  • select multiple - objeto select que permite escolhas múltiplas. É feito declarando-se um objeto select com a cláusula multiple. O usuário usa as teclas CTRL e SHIFT para selecionar mais de uma opção;

Cap07_HTMLTotal1105E_html_m24c6975e.png
  • image - possui as mesmas funcionalidades de um botão. A diferença é que uma imagem é especificada para atuar como botão;

Cap07_HTMLTotal1105E_html_m642622c5.png
  • file - exibe um campo de texto e um botão que, ao ser clicado, abre uma janela para mostrar a árvore de diretórios do sistema do usuário. É útil para fazer um sistema de upload de arquivos;

Cap07_HTMLTotal1105E_html_74fe2adb.gif
  • submit - este é um botão com uma função pré-definida: ao ser clicado, ele envia para o script especificado na propriedade action do
    , todos os dados do formulário ao qual pertence;

Cap07_HTMLTotal1105E_html_m25222b6e.png
  • reset - este também é um botão com uma tarefa pré-definida: limpar os valores de todos os objetos incluídos no formulário;

Cap07_HTMLTotal1105E_html_m2824e569.png
  • button - este é um botão genérico. Não possui funções pré-definidas e pode ser programado através de JavaScript, por exemplo.

Cap07_HTMLTotal1105E_html_49c4aee7.png

1.4 - Criando um formulário

Para se criar um formulário, basta inserir no documento a tag <form> e suas respectivas propriedades. Vamos iniciar aqui uma declaração que será aproveitada até o final da lição, em todos os exemplos. Vamos trabalhar com tabelas também, para organizar nosso conteúdo e treinar um pouco mais.

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        </form>
</BODY>
</HTML>

Utilizaremos a propriedade enctype com valor "_multipart/form-data_" apenas para fins didáticos, já que não faremos nenhum envio de formulário e não definiremos nenhum valor para action). Neste exemplo, ainda não existe nenhum objeto listado anteriormente, mas apenas uma declaração vazia de formulário.

1.5 - Utilizando os campos do formulário

Até o fim dessa lição, teremos criado um formulário para cadastro de currículos. Não será provida nenhuma funcionalidade. Teremos apenas os campos dispostos pelo documento, já que o HTML produz apenas páginas estáticas, que não podem interagir com o usuário.

Vamos, então, inserir algumas caixas de texto para obter os dados do usuário, como nome e endereço.

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        <tr>
        <td align="right">Nome:</td>
        <td>
        <input type="text" name="nome" size="40"
        maxlength="50" />
        </td>
        </tr>
        <tr>
        <td align="right">Endere&ccedil;o:</td>
        <td>
        <input type="text" name="ende" size="40"
        maxlength="100" />
        </td>
        </tr>               
        </table>
        </form>
</BODY>
</HTML>

Vejamos como é feita a declaração e quais são as propriedades das caixas de texto. As caixas de texto são tags <input> com tipo text:

<input type="text" name="nome" size="40" maxlength="50" / >
  • type - define o tipo do objeto input. Neste caso, uma caixa de texto (text);

  • name - define o nome pelo qual outras linguagens acessarão o valor deste objeto;

  • size - define um tamanho para o objeto, ou seja, largura do objeto;

  • maxlength - estabelece a quantidade máxima de caracteres a ser aceita no objeto.Vamos alterar o exemplo de modo que o usuário possa inserir uma senha de acesso ao currículo. Para isso, usaremos um campo de password, que também é um objeto input mas com o tipo "password". Veja a declaração:

<input type="password" name="senha" size="15" maxlength="6" / >

Agora observe o código:

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        <tr>
        <td align="right">Nome:</td>
        <td>
        <input type="text" name="nome" size="40" maxlength="50" />
        </td>
        </tr>
        <tr>
        <td align="right">Endere&ccedil;o:</td>
        <td>
        <input type="text" name="ende" size="40" maxlength="100" />
        </td>
        </tr>
        <tr>
        <td align="right">Senha:</td>
        <td>
        <input type="password" name="senha" size="15" maxlength="6" />
        </td>
        </tr>               
        </table>
        </form>
</BODY>
</HTML>

As propriedades de password são as mesmas de text. Todos esses objetos têm, ainda, uma propriedade que contém o valor do objeto ("value"). Não é comum usá-la nas caixas de texto, pois se espera que o próprio usuário insira o texto. Em alguns casos, ela pode ser útil, como por exemplo, para induzir a entrada de um determinado formato, como datas: dd/mm/aaaa.

Observe o resultado parcial do nosso código:

1.6 - Inserindo caixas de seleção e botões de rádio

Vamos inserir agora um checkbox, que é um objeto input do tipo "checkbox". No nosso exemplo, perguntaremos ao usuário se ele deseja que seus dados sejam públicos.

<input type="checkbox" name="publicar" value="sim" checked="checked" / >

Procure o final da última linha e acrescente o novo código:

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        .
        .
        .
        <tr>
        <td align="right">&nbsp;</td>
        <td>
        <input type="checkbox" name="publicar" value="sim" checked="checked" />
        Quero que meu curr&iacute;culo seja p&uacute;blico.
        </td>
        </tr>                  
        </table>
        </form>
</BODY>
</HTML>

Propriedades do objeto checkbox:

  • type - o tipo do objeto será "checkbox";

  • name - define o nome pelo qual outras linguagens poderão acessar o checkbox;

  • value - define o valor que será enviado caso o usuário marque a checkbox. Se esta propriedade for omitida, por padrão é enviado o value "on", se a caixa estiver selecionada;

  • checked - informa que o checkbox é exibido já marcado. Se quiser que ele inicie desmarcado, basta não informar esta propriedade.

Usaremos agora os botões "radio" para solicitar o sexo do usuário. Sua sintaxe de declaração é a seguinte:

<input type="radio" name="sexo" value="Masculino" / >

Veja o código:

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        .
        .
        .
        <tr>
        <td align="right">Sexo:</td>
        <td>
        <input type="radio" name="sexo" value="Masculino" />Masculino<br />
        <input type="radio" name="sexo" value="Feminino" />Feminino
        </td>
        </tr>                  
        </table>
        </form>
</BODY>
</HTML>

Vejamos as propriedades deste objeto:

  • type - o tipo deste input é "radio";

  • name - é nome pelo qual este objeto será acessado por outras linguagens de programação. No caso de objetos radio, todos aqueles que pertencerem a um mesmo grupo de informação deverão ter o mesmo nome. Do contrário, mais de uma opção poderá ser selecionada. Não é o que queremos. Sexo só poderá ser Masculino ou Feminino, nunca os dois;

  • value -valor que será enviado de acordo com a seleção do usuário;

  • checked - permite definir se uma determinada opção já iniciará com valor

  • * checkado*- ou não. Se esta cláusula for declarada, deverá ser feita diretamente na opção preterida. Se não existir em nenhuma das opções, o campo ficará em branco para o usuário escolher.

1.7 - Inserindo listas e menus

Um currículo deve informar o grau de escolaridade do usuário, sendo que esta é uma pergunta que possui apenas uma resposta. Vamos inserir esta funcionalidade em nossa página, e para isso, um objeto que pode nos auxiliar é o select. Observe o código:

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        .
        .
        .
        <tr>
        <td align="right">Escolaridade:</td>
        <td>
        <select name="escolaridade">
        <option value="sup">Superior</option>
        <option value="2">2º Grau</option>
        <option value="1">1º Grau</option>
        </select>
        </td>
        </tr>                  
        </table>
        </form>
</BODY>
</HTML>

Vamos entender a declaração deste objeto. Cada opção do usuário deverá estar dentro das tags <select></select>. Para definir uma opção, usamos a tag <option>. O que estiver entre <option> e </option> será o texto visualizado pelo usuário. Observe as propriedades deste objeto:

  • name - é o nome pelo qual o objeto select será acessado por outras linguagens de programação;

  • value -como temos várias opções para o usuário, é conveniente que cada uma delas tenha um valor diferente. O valor definido pelo value da opção selecionada pelo usuário será, no momento da submissão, associado ao nome dado à lista.

No currículo de nosso usuário, queremos listar as tecnologias que ele domina. Como podem ser várias, precisamos de um objeto que possa permitir a seleção de uma ou mais opções. Este objeto é o mesmo select visto no exemplo anterior, mas agora com uma cláusula multiple, que habilitará este objeto para a possibilidade de uma seleção múltipla, com auxílio das teclas shift e ctrl.

Observe o código:

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        .
        .
        .
        <tr>
        <td align="right">Tecnologia:</td>
        <td>
        <select multiple name="tecnologias" size="3">
        <option value="php">PHP</option>
        <option value="html">HTML</option>
        <option value="js">JavaScript</option>
        <option value="java">Java</option>
        </select>
        </td>
        </tr>                  
        </table>
        </form>
</BODY>
</HTML>

Perceba que a declaração é exatamente igual ao objeto select, exceto pela cláusula multiple. Vejamos quais propriedades este objeto possui:

  • name - nome pelo qual outras linguagens de programação poderão acessar este objeto;

  • size - define quantas opções serão mostradas ao usuário sem criar barras de rolagem no objeto. Caso o número de opções seja superior ao informado, uma barra de rolagem é automaticamente inserida;

  • value -são os valores transmitidos após a submissão. Este objeto será interpretado como um array no script que irá processar este formulário.

  • multiple - cláusula que torna possível a seleção de mais de uma opção.

A sua página agora deve estar parecida com esta:

1.8 - Adicionando áreas de texto

Uma área de texto é um campo texto de várias linhas. Geralmente, é utilizado para o usuário digitar um texto longo: um comentário, uma observação ou qualquer tipo de texto livre.

Veja o exemplo do seguinte trecho de código:

<tr>
<td colspan="2">
Observa&ccedil;&otilde;es:<br />
<textarea name="obs" cols="50" rows="10">
Digite aqui suas observa&ccedil;&otilde;es...
</textarea>
</td>
</tr>

O trecho de código acima produz a seguinte área de texto:

Captura_da_tela.png

O atributo 'cols' define o número de caracteres por linha que será mostrado e o 'rows' define a quantidade de linhas da área de texto.

Note que o objeto textarea possui uma tag de abertura <textarea> e outra de fechamento </textarea> e que, dentro das mesmas, você pode inserir um texto opcional, que será o texto inicial do formulário. No nosso caso, foi mostrado "Digite aqui suas observações...".

1.9 - Adicionando botões de formulário

Nosso formulário precisa ter um botão para que o usuário possa enviar (submeter) os dados e, caso queira, outro para limpá-los totalmente. Vamos começar com o botão de submissão, que é um objeto input do tipo submit, e é o responsável pelo envio dos dados para o script ou programa de processamento. Observe a sintaxe:

<input type="submit" name="enviar" value="Enviar" / >

Veja como ficará no exemplo:

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        .
        .
        .
        <tr>
        <td align="center" colspan="2">
        <input type="submit" name="enviar" value="Enviar" />
        </td>
        </tr>               
        </table>
        </form>
</BODY>
</HTML>

Vamos entender as propriedades do botão submit:

  • type - é o tipo deste input: "submit";

  • name - nome pelo qual este objeto será acessado por outras linguagens de programação;

  • value - é o texto que será exibido no botão para informar ao usuário qual a função do mesmo.

Aproveitaremos o código acima para adicionar um botão que tem a tarefa de limpar todos os campos que estão declarados dentro das tags <form></form>.

Digite <input type="reset" name="limpar" value="Limpar"> na mesma célula do botão submit. Seu código deve ser parecido com este (exceto pelo fato de termos omitido o restante já feito):

<HTML>
        <HEAD>
                <TITLE>Trabalhando com formulários!!!</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <center>Curr&iacute;culo ON-Line</center><br /><br />
        <form action="" method="get" enctype="multipart/form-data">
        <table width="50%" align="center" border="0">
        .
        .
        .
        <tr>
        <td align="center" colspan="2">
        <input type="submit" name="enviar" value="Enviar" />
        &nbsp;
        <input type="reset" name="limpar" value="Limpar" />
        </td>
        </tr>               
        </table>
        </form>
</BODY>
</HTML>

Nosso formulário, até agora, está assim:

As propriedades para o botão reset são as mesmas do botão submit. Apenas o tipo de input é diferente: como a função deste botão é limpar o conteúdo dos campos do formulário, seu tipo é "reset".

Não vamos inserir um input do tipo button porque não teríamos funcionalidade para ele, uma vez que não possuímos conhecimento para acrescentar-lhe alguma funcionalidade. Suas propriedades também são idênticas aos botões submit e reset, e seu tipo será "button". Veja a sintaxe de declaração:

<input type="button" name="processar" value="Processar" / >

1.10 - Inserindo um objeto image

O objeto image pode ser encarado como uma interface mais amigável de um botão. Este objeto tem como função padrão a mesma de um botão submit, ou seja, ao ser clicado, enviará os dados conforme a propriedade action do formulário. Como já utilizamos botões no exemplo acima, vamos entender apenas a sintaxe de declaração e as propriedades deste objeto:

<input type="image" src="enviar.gif" name="enviar" border="0" / >

  • type -este é um input do tipo "image";

  • src - define o nome e o caminho da imagem a ser utilizada como botão;

  • name -nome de acesso para outras linguagens;

  • border - define se o botão terá borda ou não;

  • width - como o objeto em questão é uma imagem, podemos manipular seu comprimento através desta propriedade;

  • height -o valor estabelecido por essa propriedade definirá a altura do objeto.

1.11 - Adicionando o objeto file

Com este objeto, podemos oferecer ao usuário a opção de selecionar um arquivo de seu computador e enviá-lo para o servidor, desde que haja um programa ou script de processamento para este formulário.

Como ainda não aprendemos a processar os valores recebidos do usuário, trabalharemos apenas com a declaração e as propriedades deste objeto. Se você quiser, adicione o código abaixo ao exemplo que construímos.

<tr>
<td colspan="2"><input type="file" name="arquivo" /></td>
</tr>

  • type - este é um input do tipo "file";

  • name - permite que o programa ou script que irá receber este arquivo saiba qual objeto está acessando;

  • value -define o endereço, na máquina do usuário, do arquivo a ser enviado.

Nesta lição, vimos que o formulário é a principal forma de interação entre o usuário e nossas páginas. O exemplo que construímos não é funcional, mas permitiu que entendêssemos como funcionam os objetos de formulário mais importantes. Todas essas informações serão essenciais para o caso de você se interessar em aprender alguma linguagem de programação voltada para a Web.

1.12 - Direitos autorais e licença

Lição F2 - Processamento de formulários

2.1 - Introdução

No capítulo anterior mostramos como criar formulários HTML. Agora iremos fazer o processamento dos mesmos e realizar algumas tarefas e aplicações que também podem ser executadas, como por exemplo, a validação de formulários.

2.2 - Primeiro Processamento

Veremos agora um exemplo básico de processamento de formulários. Faremos um simples formulário com algumas informações e um script php para processá-las. Vejamos o código HTML e o código do script PHP:

form.html

<HTML>
        <HEAD>
                <TITLE>Processamento</TITLE>
        </HEAD>
        <BODY bgcolor="#FFFFCC">
        <b>Entre com suas informações</b><br /><br />
        <form action="proc.php" method="get">
        Nome Completo:<br /><input type = "text" name = "nomecompleto" /> <br />
        Endereço Completo:<br /><textarea name = "endereco" rows = "3" cols = "40">
        </textarea> <br />
        Área de Atuação:<br /><select name = "atuacao">
        <option>Desenvolvimento Geral
        <option>Desenvolvimento Web 
        <option>Redes Windows 
        <option>Redes Linux
        </select> <br />
        Horário de Trabalho:<br /> 
        Matutino <input type = "radio" name = "horario" value = "Matutino" />
        Vespertino <input type = "radio" name = "horario" value = "Vespertino" />
        Noturno <input type = "radio" name = "horario" value = "Noturno" />
        <br /><br />
        <input type = "submit" value  = "Enviar Dados!" /> &nbsp;
        <input type = "reset" value  = "Limpar" />
        </form>
</BODY>
</HTML>

Agora veremos o script proc.php que é o responsável pelo processamento das informações obtidas com o formulário anterior. Os dados enviados são encontrados nos arrays associativos $_GET e $_POST e basta utilizar o nome do campo no formulário para acessar o seu valor. Veja o exemplo:

proc.php

<HTML>
<BODY> 
<?php
echo "Seja bem-vindo " . $_GET['nomecompleto'] . "!<br />";
echo "Seu endereço completo é " . $_GET['endereco'] . "!<br />";
echo "Você atua na área de " . $_GET['atuacao'] . "! <br />";
echo "Você trabalha no período " . $_GET['horario'] . "! <br />";
?>
<br />
<a href = "form.html"> Voltar para o formulário!</a>
</body>
</html>

O processamento de qualquer formulário não é muito parecido com o realizado no exemplo acima. Veremos mais alguns exemplos que podem ilustrar situações diferentes.

Observe o campo "área de atuação" do formulário acima. Imagine que o profissional atue em mais de uma área. Assim, o formulário deve aceitar seleções múltiplas. Tal implementação pode ser feita com uma simples mudança no form.html. Veja:

             Área de Atuação:<br /><select multiple name = "atuacao" >

Esta modificação cria a variável "atuacao" como um array, que poderá ser preenchido quando o usuário selecionar as opções desejadas (o usuário deve segurar a tecla ctrl para fazer as seleções).

A exibição do campo é muito simples. Utilizamos um laço para varrer o array. Veja a modificação necessária no script proc.php:

            $atuacao = $_GET['atuacao'];
            if (sizeof($atuacao) > "1") { 
                        echo "Você atua na(s) área(s) de: <br />";
                        foreach($atuacao as $valor) {
                              echo "$valor <br />";
                        }
               } else {
                        echo "Nenhuma área de atuação foi selecionada!";
            }

Note que no código acima a instrução if verifica se a variável $atuacao foi inicializada com algum valor, ou seja, se o usuário selecionou algum campo de atuação. Isto é uma técnica de validação de formulários que veremos a seguir.

2.3 - Validação de Formulários

Existem inúmeros critérios para a validação de formulários, totalmente dependentes da finalidade para qual o mesmo foi implementado. Poderíamos validar se um certo campo foi preenchido, se um certo nome tem tamanho muito pequeno, se o valor para um campo numérico é válido, enfim, as opções são inúmeras. Quanto mais completo o processamento do seu formulário, mais eficiente ele será e também mais seguro.

No exemplo anterior, chegamos a fazer uma pequena validação para vermos se o campo atuação continha algum item selecionado ou não. Veremos agora mais alguns exemplos de validação:

valid_form.php

<HTML>
<BODY> 
<?php
//variável para indicar se houve algum campo não preenchido
$erro = false;

//verifica se o campo nome completo foi preenchido
if ($nomecompleto == ""){
        $erro = true;
        echo "Você deve entrar com o seu nome completo!<br />";
} else {
        echo "Seja bem-vindo $nomecompleto!<br />";
}

//verifica se o campo endereço foi preenchido
$tamanhoendereco = strlen($endereco);
if ($tamanhoendereco == 0){ 
        echo "Você não entrou com seu endereço!<br />";
} else {
        echo "Seu endereço completo é $endereco!<br />";
}

//verifica se a área de atuação foi escolhida
if (sizeof($atuacao) >= "1"){ 
        echo "Você atua na(s) área(s) de: <br />";
        foreach($atuacao as $valor){
                echo "$valor<br />";
        }
} else { $erro = true;
        echo "Nenhuma área de atuação foi selecionada!<br />"
}

//verifica se o horário de trabalho foi selecionado
if (empty($horario)) { 
        $erro = true;
        echo "Você não selecionou seu horário de trabalho!<br />";
} else {
        echo "Você trabalha no período $horario!<br />";
}

/* caso tenha ocorrido algum erro de preenchimento, uma mensagem será escrita na tela */
if ($erro){ 
        echo "Alguns campos não foram preenchidos, preencha novamente o <a href=\"form.html\">formulário</a>!";
}

?>
</body>
</html>

Agora, faça o teste dos possíveis erros. Note que qualquer campo não preenchido é capturado pelo trecho de validação.


handLembre-se:
  • Os métodos utilizados para verificar certas informações provindas de um formulário não precisam ser os mesmos dos utilizados aqui, ficando a critério do programador como implementá-los.
  • Se certas validações forem muito parecidas procure utilizar operadores lógicos como || e && no teste da condição. Isto pode diminuir em muito o seu trabalho.
  • Para verificações mais complexas, como saber se um e-mail é válido ou se uma senha é muito fraca, usa-se expressões regulares para validar os campos.

Muito cuidado ao implementar validações para verificar se a informação passada é um número ou não, pois quando um formulário é enviado para processamento, a cadeia de consulta (POST ou GET) é transformada em uma string. Portando, quando você tenta comparar números, o que você está fazendo é comparar strings.

Para evitar problemas use a função is_numeric, pois ela apenas verifica se o conteúdo da variável nela indicada é um número, independente de seu tipo. Veja o exemplo:

valid_num.php

<?php
$idade = $_GET['idade'];
if (is_numeric($idade)){
        echo "$idade é um número!";
} else {
        echo "$idade não é um número!";
}
?>

Veremos até o final dessa lição algumas aplicações que poderão tornar seus formulários um pouco mais eficientes.

2.4 - Cabeçalhos HTTP

Quando um documento HTML é carregado, o servidor envia algumas informações sobre o documento carregado, informações estas que são chamadas "linhas de cabeçalho HTTP" ou "conteúdo de cabeçalhos HTTP". Normalmente enviamos cabeçalhos para realizar redirecionamentos de páginas e outras aplicações.

Devemos lembrar que nenhuma outra informação deve ser passada para o navegador antes de usar um cabeçalho, ou seja, o cabeçalho sempre deve ir primeiro que qualquer outra saída para o navegador. Caso isto não seja feito, uma mensagem de erro será gerada.

2.5 - Redirecionamento de páginas

Este é um dos recursos muito utilizados no desenvolvimento web: redirecionamento forçado. Nele, o usuário não interage para que haja o redirecionamento. Tudo é feito pelo navegador, através do cabeçalho HTTP. O formato para utilizar o cabeçalho HTTP é o que se segue:

header ("Location: página destino");

Lembrando que a "página destino" deve conter um texto URL completo, como por exemplo: http://www.sistemasabertos.com.br

Podemos utilizar a estrutura mostrada para realizar um redirecionamento mais amigável. Para isso, veja o exemplo a seguir:

redir.php

<?php
if(isset($_POST['link']))
header("Location:".$_POST['link']);
?>
<title>Codigos php</title>

<HTML>
<HEAD>
<TITLE>Redirecionamento</TITLE>
</HEAD>
<BODY>
<form action="" method="post">
Selecione a url desejada:<br />
<select name = "link">
<option selected value = "http://www.yahoo.com.br">Yahoo
<option value = "http://www.google.com.br">Google 
<option value = "http://www.cade.com.br">Cadê 
<option value = "http://www.sistemasabertos.com.br">Sistemas Abertos
</select>
<br /><br />
<input type = "submit" value  = "Ir agora!" />
</form>
</BODY>
</HTML>


handLembre-se:
  • Agora utilizamos um formulário que redireciona o resultado do formulário para si mesmo. Neste exemplo deixamos o valor da action vazio, mas também podemos usar a variável $PHP_SELF entre aspas, no campo "action" do formulário da seguinte maneira:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">


2.6 - Trabalhando com datas

Saber trabalhar com datas é muito importante em qualquer linguagem de programação. O PHP fornece inúmeros tipos de formatação de datas que facilitam a manipulação de dados de formulários e também de banco de dados, veremos nesta sessão as funções date e checkdate. Para intuito de estudo, procure no manual do PHP(http://www.php.net), as funções time e mktime.

2.6.1 - date()

Sintaxe:

date(string formato, int[data e hora em timestamp]);

Vejamos as formatações possíveis do primeiro parâmetro:

Formato Definição Exemplo
A prefixo "AM" ou "PM" "PM"
j dia no formato numérico "1" a "31"
d dia no formato numérico "01" a "31"
S número do dia com th ou nd "22nd"
D 3 letras do dia textual "fri"
l dia em formato texto Friday
F mês textual "january"
M mês textual com 3 letras "Jan"
m mês no formato "01" a "12" "01"
n mês no formato "1" a "12" "4"
Y ano com 4 dígitos 2005
y ano com 2 dígitos 05
t número de dias do mês (28-31) "29"
w número do dia da semana (0 = domingo a 6 = sábado) "3"
g hora no formato "1" a "12" "9"
G hora no formato de "0" a "23" "9"
h hora no formato "00" a "12" "09"
H hora no formato de "00" a "23" "19"
i minutos de "0" a "59" "53"
s segundos de "00" a "59" "17"

Com esses dados, você poderá facilmente mostrar a data e hora atual da seguinte forma:

<?php
echo date("d-m-Y h:i");
?>

O exemplo acima mostra a data e a hora atual. Lembre-se que utilizando a função date, você pode tanto mostrar a data e a hora juntos quanto apenas a data, ou apenas a hora, tudo irá depender dos caracteres que você passar como parâmetro).

2.6.2 - checkdate()

Sintaxe:

checkdate(int mês, int dia, int ano);

Como o próprio nome já diz, esta função serve para verificar se uma data específica é válida ou não. Ela retorna true se a data for válida, e false se não for.

<?php

if(checkdate(12, 11, 2005)) {
        echo "Data válida!";
} else {
        echo "Data Inválida!";
}
//irá imprimir "Data válida!"

$dia = 34;
$mes = 12;
$ano = 1900;
if(checkdate($dia,$mes,$ano)) {
        echo "Data válida!";
} else {
        echo "Data Inválida!";
}
//irá imprimir data inválida, pois não existe o dia 34
?>

2.7 - Direitos autorais e licença

Lição F3 - Envio de informações

3.1 - Introdução

Com nosso estudo sobre formulários, vimos que podemos passar através deles uma certa quantidade de informações. Mas e se essa quantidade de informação fosse muito grande? É exatamente sobre isso que iremos falar neste capítulo, como enviar uma grande quantidade de informações provindas de um formulário e também carregar arquivos para o servidor de web. Veremos ainda como enviar e-mails com seu script.

3.2 - Correio Eletrônico

Vamos enviar uma correspondência através de um script PHP, utilizando a função mail(). Lembrando que para que tal função funcione corretamente, você deverá configurar o PHP de modo a aceitar o envio de e-mails. Leia o "Anexo A - Conceitos Utilizados" para obter mais informações.

A estrutura geral da função mail() é:

mail(para, assunto, conteúdo); 
Onde "para" deve ser o e-mail destino da mensagem, "assunto" é o título do e-mail e "conteúdo" é a mensagem em si. Vejamos um simples exemplo para um maior entendimento:

<?php
mail(alguem@dominio.com.br, "Primeiro E-mail", "Este é o primeiro e-mail que envio através de um scrip PHP");
?>

Dependendo do tamanho do e-mail, utilizar o método apresentado no e-mail anterior não seria muito prático. Você pode atribuir os valores à variáveis e passá-las como parâmetro:

<?php
$para = "alguem@dominio.com.br";
$assunto = "Novo e-mail!"
$conteudo = "Estou testando novamente esta função que aprendi!";
mail($para, $assunto, $conteudo);
?>


hand Lembre-se:
  • Também é possível enviar o e-mail para mais de um destinatário. Para isso, separe os e-mails utilizando a vírgula. Exemplo:
$para = "eu@domain.com, voce@domain.com";

3.3 - Feedback

É muito comum hoje em dia encontrarmos em sites uma página de Contato, onde podemos enviar mensagens para o próprio administrador do site. Estes são os chamados formulários de feedback. Vejamos um exemplo.

Faremos primeiramente um formulário para que o usuário deixe seu nome, e-mail e mensagem. Veja:

contato.html

<HTML>
        <BODY>
                <center>
                        <h1>Entre em contato conosco!</h1>
                        <h2><form action="mail.php" method="post">
                        nome: <input name = "nome" type="text" /> <br />
                        e-mail: <input name = "email" type="text" /> <br />
                        assunto: <input name = "assunto" type="text" /> <br />
                        mensagem: 
                        <br />
                        <textarea name = "msg" cols = 25 rows = 6></textarea> 
                        <br />
                        <input type = "submit" value = "Enviar Comentário!" /> &nbsp;
                        <input type = "reset" value="Limpar Tudo!" /> &nbsp;
                        </form>
                        </h2>
                </center>
        </BODY>
</HTML>

Vamos agora implementar o script de processamento do formulário:

mail.php

<?php
//e-mail do administrador do site
$para = "admim@dominio.com.br"

//info do usuário
$remetente = "from: " . $_POST['nome'] . "<" . $_POST['email'] . ">";

//note o 4º parâmetro da função mail()
if (mail($para, $_POST['assunto'], $_POST['msg'], $remetente)){
        echo "E-mail enviado com sucesso!";
} else {
        echo "E-mail não enviado!";
}
?>

O 4º parâmetro da função mail() é adicional e normalmente utilizado para guardar mais informações sobre o usuário que enviou a mensagem, podendo ser muito útil caso queiramos futuramente guardar tais informações em um banco de dados.

Note também que a função mail() retorna um valor lógico, podendo ser utilizado em uma instrução de condição para validar o sucesso ou a falha do envio.

3.4 - Upload de Arquivos

No capítulo sobre Formulários HTML falamos sobre este assunto, mas só agora iremos implementá-lo. Se estivéssemos em um site interno de uma empresa, a habilidade de carregar arquivos para o servidor de web facilitaria em muito a nossa vida.

Para ser capaz de fazer o upload de um arquivo através de um formulário, deve-se usar o método POST, e definir o tipo de encodificação como "multipart/form-data". Veja o exemplo:

<method = "post" enctype = "multipart/form-data">

Lembremos agora como criar um campo no formulário para realizar o upload:

<input type ="file" name = "fileupload" / >

Utilizando esta tag, será necessário o usuário escrever o endereço completo do arquivo na caixa de texto que aparecerá, ou então clicar no botão que será criado no navegador que mostrará o visualizador de sistemas de arquivo padrão do sistema. Com o arquivo selecionado, precisamos de um script para processá-lo.

Vejamos um formulário para o upload de arquivos:

upload.html

<HTML>
        <BODY>
                <center>
                        <h1>Fazendo o upload de arquivos!</h1>
                        <h2><form action="uploadproc.php" method="post" enctype = "multipart/form-data">
                        Entre com o nome do arquivo: <br />
                        <input type = file  name = "arquivo" />
                        <br /><br />
                        <input type = "submit" value = "Mandar arquivo!" /> &nbsp;
                        <input type = "reset" value="Limpar!" /> &nbsp;
                        </form>
                        </h2>
                </center>
        </BODY>
</HTML>

Após um arquivo ser transmitido, ele pode ser acessado no array $_FILE, através do nome que definimos para o campo do formulário anterior. A linguagem PHP também cria algumas variáveis ao fazer um carregamento de arquivo, variáveis estas que podem ser úteis de diversas maneiras, como por exemplo, no controle do tamanho máximo exigido para que um arquivo possa ser carregado. Veja o quadro:

Variável Definição
$FILE['arquivo']['name'] Nome e caminho do arquivo carregado
$FILE['arquivo']['size'] O tamanho, em bytes, do arquivo
$FILE['arquivo']['type'] O tipo do arquivo, informado pelo navegador
$FILE['arquivo']['tmp_name'] O nome temporário do arquivo, como foi guardado no servidor.
$FILE['arquivo']['error'] Retorna o código do erro, caso ocorra


handLembre-se:
  • Note no quadro acima que utilizamos a variável "arquivo", pois, foi assim que a chamamos no formulário. Você pode escolher um nome que lhe seja conveniente.

Veremos agora o script de processamento do formulário:

uploadproc.php

<?php
$uploaddir = "/arquivos/";

print "<pre>";
if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploaddir . $_FILES['arquivo']['name'])) {
        echo "O arquivo foi enviado com sucesso!\nDados do arquivo enviado:\n";
        print_r($_FILES);
} else {
        echo "Erro ao enviar o arquivo!\nDados do arquivo enviado:\n";
        print_r($_FILES);
}
print "</pre>";
?>
Voltar para o formulário de <a href = "upload.html">upload</a>!


hand Lembre-se:
  • Repare que depois do arquivo carregado, nós o movemos para um diretório específico, através da função move_uploaded_file. Se isso não for feito, o arquivo será perdido.
  • A função move_uploaded_file retorna FALSE quando não for possível mover o arquivo para o diretório desejado, que pode ocorrer quando o caminho para o diretório não existir, quando o diretório estiver protegido contra gravação ou quando já existir um arquivo com o mesmo nome no diretório.

3.5 - Direitos autorais e licença

Lição F4 - Exercícios da Trilha F

1 - Avalie as seguintes afirmativas como verdadeiras ou falsas:

  • I - O método GET envia todos os dados de um formulário pela URL.
  • II - O método POST envia dados de maneira invisível ao usuário, através de cabeçalhos especiais.
  • III - O GET criptografa automaticamente os campos password de formulários.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

2 - Qual das seguintes variáveis PHP faz referência ao script em questão, e é usada para definir o campo action quando queremos mandar os dados para o próprio script?

  • a - $this
  • b - $me
  • c - $SELF
  • d - $My_self
  • e - $PHP_SELF

3 - Se a opção register_globals não estiver ativada, como podemos acessar as variáveis enviadas via GET em um script PHP?

  • a - Através do array $get_data, que é predefinido.
  • b - Através do array associativo $_GET, que existe por padrão.
  • c - Através da string $URI_request, que contém uma string representando a URL do documento.
  • d - Através do próprio nome das variáveis, definidas na criação do formulário HTML.
  • e - Através da variável $_GLOBAL_DATA, que já existe por padrão.

4 - O que o seguinte trecho de código faz?

$email = "fulano@email.com";
$sobre = "Aluguel de automóvel";
$msg = "Gostaria de mais informações sobre o aluguel de um VW Santana. Há disponibilidade?";

mail($para, $sobre, $msg);

  • a - Envia um e-mail para a conta padrão de e-mail definida nas configurações do PHP.
  • b - Envia um e-mail para a conta do administrador do sistema, com a mensagem especificada.
  • c - Não executa ação nenhuma, pois mail() recebe apenas dois parâmetros.
  • d - Envia um e-mail para o endereço que está em $email, com o assunto $sobre e a mensagem $msg.
    • e - Envia um e-mail para o endereço que está em $email. A mensagem será $sobre e o assunto $msg, pois os parâmetros estão invertidos.

5 - Avalie as seguintes proposições como verdadeiras ou falsas:

  • I - Não é possível fazer upload de arquivos sem usar códigos escritos em linguagem C.
  • II - O arquivo enviado existe temporariamente na variável $_FILES, junto com diversos dados (como tamanho e tipo do arquivo).
  • III - Há uma limitação para o tamanho de arquivos enviados. A partir de 64 MB, deve-se usar FTP e não HTTP.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

6 - Suponha que o seguinte link tenha sido clicado:

http://meusite.com/scripts/livros.php?titulo=OSenhorDosAneis&secao=Ficcao

Suponha também que o script livros.php possui o seguinte código:

<?php

echo "Você escolheu o livro " . $_GET["titulo"] . " da seção " . $_GET["secao"];

?>

O que será impresso na tela do usuário quando o script terminar de executar?

  • a - A string "Você escolheu o livro da seção"
  • b - A string "Você escolheu o livro da seção Ficcao"
  • c - A string "Você escolheu o livro OSenhorDosAneis da seção"
  • d - A string "Você escolheu o livro OSenhorDosAneis da seção Ficcao"
  • e - Nada será impresso

7 - O que o código a seguir produz na tela?

<html>

<body>

<form name="f1" method="get" action="pages.php">
<input type="text" value="Digite aqui o que deseja buscar..." name="termobusca" />
<input type="submit" value="Buscar!" />
</form>

</body>
</html>

  • a - Produz um link para o script pages.php.
  • b - Produz apenas um campo de texto dentro de um formulário.
  • c - Produz um formulário com um campo de texto e um botão buscar que envia (submete) os dados do formulário.
  • d - Não produz saída válida, já que é necessário o uso de tags <?php ?>.
  • e - Produz uma mensagem de erro informando a ausência das tags <?php ?>.

8 - Qual das alternativas a seguir tem o código necessário para especificar um formulário com o nome "form1", para envio de dados via "post" e para o script "recebedados.php", que está um nível acima do nível do formulário na estrutura de diretórios de um site?

  • a - <form value="form1" action="recebedados.php"> </form>
  • b - <form value="form1" method="post" action="recebedados.php"> </form>
  • c - <form name="form1" action="recebedados.php"> </form>
  • d - <form name="form1" method="post" action="recebedados.php"> </form>
  • e - <form name="form1" method="post" action="../recebedados.php"> </form>

9 - Avalie as seguintes proposições como verdadeiras ou falsas:

  • I - Para o envio de senhas o método GET é mais seguro, pois existe criptografia automática dos dados.
  • II - Para enviar dados privados como senhas é importante utilizar o método POST, pois assim os dados não são visualizados.
  • III - A forma de acesso aos dados é praticamente a mesma nos dois métodos: através de arrays globais $_GET e $_POST.

A ordem correta das avaliações é:

  • a - I - V, II - V, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - V
  • e - I - F, II - F, III - F

10 - Qual das seguintes afirmativas está incorreta?

  • a - A função is_numeric é útil para testar se uma variável armazena um valor numérico.
  • b - A função empty testa se uma variável está vazia, sem conteúdo.
  • c - A função isset testa se uma variável está definida, se ela existe.
  • d - A função time obtém o tempo atual em segundos, contado desde as zero horas do dia 01-01-1970.
  • e - A única maneira de se obter a data atual é trabalhar algebricamente sobre o valor de segundos retornado por time.

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha G - Sessões e Cookies

Lição F1 - Sessões e Cookies

1.1 - Introdução

As sessões têm uma grande importância: elas permitem manter dados compartilhados entre páginas web, durante o período em que o navegador estiver "conectado" no website. Ao iniciar uma sessão, é designado para cada usuário um (ID) identificador único de sessão (SID - Session ID). Esse identificador é registrado no lado do usuário e será mantido até o momento de finalizar a sessão, solicitando uma finalização da sessão ou fechando o navegador.

O suporte a sessões permite registrar um número qualquer de variáveis que deverão ser preservadas entre as requisições, ou seja, quando uma sessão é criada podemos registrar quantas variáveis desejarmos. Enquanto a sessão existir, essas variáveis estarão disponíveis para as páginas do site em que o navegador estiver "conectado".

1.2 - Como utilizar sessões?

Os passos de utilização de sessão são muito simples. Primeiramente cria-se uma sessão. Em seguida é enviado o ID para o usuário. Esse ID será utilizado para manter a sessão aberta em todas as páginas do site até o usuário efetuar o "logout" (saída) da sessão, onde esta será destruída.

1.3 - Esquema de Sessão

  • Primeira página: Início da Sessão, envio do ID para o usuário. Quando um visitante acessa o site ele recebe um ID (identificador) único, que é a chave para o controle de sua sessão. Esse ID é armazenado em um cookie ou enviado via URL.

  • Páginas visitadas no site: Envio do ID para o servidor, para retornar a sessão aberta;

  • Última página: Fim da Sessão, a sessão é destruída e todas as suas informações (variáveis de sessão) são apagadas.

1.4 - Funções relacionadas a sessão

session_start() utilizado para iniciar dados de sessão. Esta função cria uma sessão ou mantém uma sessão aberta. Para isso é necessário utilizá-la em todos os scripts do site. A inicialização de uma sessão com essa função deve ser feita antes de qualquer saída HTML.

Essa função é usada para iniciar um identificador de sessão, caso ainda não exista. Quando o navegador acessa o site, o ambiente PHP irá verificar se um ID de sessão já foi criado para aquele acesso. Se não existir um ID de sessão, um novo será criado.

session_destroy() Destrói todos os dados registrados para uma sessão (todos os dados associados com a sessão corrente). Ela não elimina nenhuma das variáveis globais associadas à sessão, e nem o cookie de sessão.

session_id() Obtém e/ou define o id da sessão atual, ou seja, retorna o id de sessão para a sessão atual.

session_unset() Libera todas as variáveis de sessão atualmente registradas.

1.5 - Passando o ID de Sessão

Há dois métodos para programar um id de sessão:

  • Cookies;
  • Parâmetro URL.

Os Módulos de sessão suportam ambos os métodos. Cookies são mais eficientes, mas se eles não estiverem autorizados (os usuários não são obrigados a aceitá-los), não é possível utilizá-los. O segundo método inclui o ID de sessão diretamente na URL, ou seja, o PHP permite anexar o ID a URL manualmente, ou então modificar as configurações do PHP, para que ele faça isso automaticamente.

1.6 - Identificador de sessão

<?php
session_start();
echo"O seu ID de sessão é: ". session_id();
?>

Executando este script no navegador teríamos algo parecido:

O seu ID de sessão é: e7b440cc28c0ba27fed874d505781489

No exemplo id_sessao.php inicializamos uma sessão e em seguida mostramos o ID de sessão no navegador.

1.7 - Variáveis de sessão

As variáveis de sessão ficarão armazenadas no array $_SESSION[], e para acessá-las é necessário utilizar a função session_start(). Veja alguns exemplos:

criar_variaveis_sessao.php

<html>
<?php
session_start();
$_SESSION['nome'] = "Maria";
$_SESSION['sobrenome'] = "Silva";
echo "Os dados serão gravados na sessão de id: " . session_id();
?>
<br /><br />
<a href="visualizar_variaveis_sessao.php">Visualizar variáveis de sessão</a>
</html>

visualizar_variaveis_sessao.php

<html>
<?php
session_start();
echo "O conteúdo das variáveis de sessão nome e sobrenome são respectivamente: "
. $_SESSION['nome'] . " e " . $_SESSION['sobrenome'];
echo "<br /><br />ID = " . $PHPSESSID;
?>
<br /><br />
<a href="criar_variaveis_sessao.php">Início</a>
</html>

O script criar_variaveis_sessao.php cria uma sessão com duas variáveis ($_SESSION['nome'], $_SESSION['sobrenome']), com os valores "Maria" e "Silva", respectivamente.

O script visualizar_variaveis_sessao.php imprime no navegador o conteúdo das variáveis $nome e $sobrenome, além do id da sessão armazenado na variável $PHPSESID.


handLembre-se:
  • Para ter acesso ao id da sessão você poderá usar a função session_id() ou a variável $PHPSESID.
  • A primeira vez que é definida a sessão não é possível verificar o valor variáveis armazenadas em $_SESSION[]. Elas só estarão disponíveis após a atualização da página. Veja o exemplo:

            <?php
            /* A primeira vez que você acessar este script nada será mostrado na tela.
             * Porém, ao recarregar a página será mostrado o nome "Maria" que estará armazenado em $_SESSION['nome']
             * Pois no primeiro acesso a variável foi inicializada.
             */
            session_start();

            echo $_SESSION['nome'];
            $_SESSION['nome'] = "Maria";

            ?>

1.8 - Compartilhando dados entre páginas

Quando utilizado session_start() para iniciar uma sessão, o PHP cria um cookie automaticamente. O cookie será único e as informações serão armazenadas no cliente e no servidor. A sessão terminará quando o navegador fechar ou utilizarmos a função session_destroy(). O arquivo no servidor é preenchido quando são registradas as variáveis de sessão. Ao criar scripts que necessitam de dados e estados da sessão é necessário primeiramente chamar a função session_start() para recuperar estes dados. A função session_start() deve ser chamada no início do script, antes que ocorra qualquer output HTML ou PHP.
Nos exemplos a seguir iremos passar o valor de algumas variáveis entre diferentes páginas utilizando a variável $_SESSION[];

sess1.php

<?php
header("Content-type: text/html; charset=utf-8");

session_start();
$_SESSION['matricula'] = session_id();
?>

<html>
<H2>Novo empregado</h2>
<form method=get action="sess2.php"><b>Empregado:</b><br />
<input type="text" name="nome" /><br /><b>Departamento:</b><br />
<select name="departamento">
<option>Financeiro
<option>Contabilidade
<option>Administração
</select>
<br /><b>País</b><br />
<select name="pais">
<option selected>Brasil
<option>Argentina
<option>Espanha
</select>
<br /><br />
<input type="submit" value="Proxima página" />
</form>
</html>

Este script inicializa uma sessão com a função session_start(), em seguida cria nossa primeira variável de sessão chamada "matricula" com o valor do id da sessão aberta. Os valores do formulário serão passados para o próximo script. Veja como iremos guardar esses dados para usá-los nas páginas seguintes:

sess2.php

<?php
header("Content-type: text/html; charset=utf-8");

session_start();
$_SESSION['nome'] = $_GET['nome'];
$_SESSION['departamento'] = $_GET['departamento'];
$_SESSION['pais'] = $_GET['pais'];
?>

<html>
<H2>Novo empregado</H2>
<form method="get" action="sess3.php" >
<b>Endereço do empregado</b><br />
<input type="text" name="endereco" /><br /><br />
<b>Telefone</b><br />
<input type="text" name="telefone" /><br />
<input type="submit" value="Proxima página" />
</form>
</html>

Neste script utilizamos a função session_start() para recuperar os dados da sessão aberta em sess1.php. No script a seguir iremos mostrar todas as variáveis que criamos durante sessão, veja:

sess3.php

<?php
header("Content-type: text/html; charset=utf-8");

session_start();
$_SESSION['endereco'] = $_GET['endereco'];
$_SESSION['telefone'] = $_GET['telefone'];

echo "
<h2>Detalhes do empregado</h2>
<pre>
Nome:    " . $_SESSION['nome'] . "<br />
Departamento:    " . $_SESSION['departamento'] . "<br />
Pa&iacute;s:    " . $_SESSION['pais'] . "<br />
Endere&ccedil;o:    " . $_SESSION['endereco'] . "<br />
Telefone:    " . $_SESSION['telefone'] . "<br />
Matr&iacute;cula:    " . $_SESSION['matricula'] . "<br /></pre>";

session_destroy();
?>


handLembre-se:
  • No final do terceiro script foi usada a função session_destroy(), mas como ela destruiu todos os dados da sessão perdemos as variáveis que havíamos armazenado. Atualize a página para ver o que acontece.

1.9 - Autenticação de usuários

As sessões são muito úteis para prover a segurança de sua aplicação web, por meio da autenticação de usuários. Veja a seguir alguns aspectos relacionados à autenticação:

  • Cria-se uma sessão quando o usuário entra no site;
  • O usuário autentica-se com o seu login e password;
  • Essa informação é verificada e, se for um login correto, registra-se uma variável de sessão com o ID do usuário autenticado;
  • Os scripts que necessitam que o usuário esteja autenticado apenas verificam se existe um ID de usuário na variável de sessão. Se existir o ID na sessão, o usuário já está autenticado se não, o usuário ainda não está autenticado.
  • Para efetuar o logout da autenticação utiliza-se simplesmente uma chamada à "session_destroy", que destrói a sessão e toda a informação nela contida, deixando de existir um ID de usuário na sessão.
  • Da próxima vez que o usuário carregar uma nova página do site, lhe é atribuída uma nova sessão, e caso necessite, o usuário pode voltar a autenticar-se normalmente.

Este seria um código utilizado para efetuar login:

login.php

<form action="validar.php" method="post">
Nome: <input type="text" name="nome" /><br />
Senha: <input type="password" name="senha" />
<input type="submit" value="enviar" />
</form>

A validação seria baseada na verificação da senha por meio de um banco de dados de usuários. No exemplo abaixo, criamos uma função chamada 'valida_senha' para simular a validação por meio de um banco de dados.

validar.php

<?php

$nome = $_POST['nome'];
$senha = $_POST['senha'];

function valida_senha($nome, $senha) {
        if ( $nome == "akira" && $senha == '123456') {
                return true;
        } elseif  ($nome == 'paulo' && $senha == 'paulo') {
                return true;
        } elseif ($nome == 'admin' && $senha == 'admin') {
                return true;
        } else {
                return false;
        }
}

if (! valida_senha($nome, $senha))
die("Senha errada - <a href='login.php'>login</a>");

session_start();
$_SESSION['nome'] = $nome;
echo "<script>alert('seja bem vindo');</script>";
echo "<script>document.location='cadastro.php'</script>";

?>

A página cadastro.php poderia ser sua página de cadastros, onde é necessário observar se o usuário já efetuou login ou não, verificando o valor associado a 'nome' da variável de sessão 'SESSION'.

cadastro.php

<?php
header("Content-type: text/html; charset=utf-8");
session_start();
$nome = $_SESSION['nome'];
if ($nome == '') {
        die("Efetue <a href='login.php'>login</a>.");
}
?>

<h1>Cadastro de Clientes</h1>
Usuário: <?php echo $nome; ?> - <a href='sair.php'>sair</a><br />
<form>
Nome: <input type="text" name="nome" /><br />
Telefone: <input type="text" name="telefone" /><br />
CPF: <input type="text" name="cpf" /><br />
Endereço: <input type="text" name="endereco" /><br />
</form>

Quando o usuário sair, o sistema deverá fechar a sessão por meio da função session_destroy:

sair.php

<?php
session_start();
session_destroy();
echo "<script>document.location='login.php'</script>";
?>


handLembre-se:
  • Ao criar um sistema maior com várias páginas, ao invés de ficar escrevendo em todas as páginas o código de verificação, você pode utilizar a função require() chamando um script que contenha o código de verificação.

1.10 - Utilizando cookies

Utilizamos cookies para salvar de forma mais simples os estados de sessão na internet. Os cookies são pequenos arquivos de texto, que contêm informações que podem ser passadas de um formulário para outro. Eles são gravados no HD do cliente (a não ser que este tenha configurado o navegador para não aceitar cookies).

Um arquivo de cookie não pode ter mais que 4KB (geralmente os cookies utilizam apenas 1KB). Quando um cookie é emitido, não é possível lê-lo até que o cliente faça uma atualização da página ou carregue outra página. Só é possível enviar um cookie antes do script realizar alguma saída de conteúdo (PHP, HTML).

Quando um servidor web envia um cookie para um cliente, apenas este servidor poderá ler o cookie gravado no cliente. Isto oferece uma segurança maior para as informações que são enviadas e recebidas entre cliente e servidor.

Para criar um cookie que termine quando a conexão atual do navegador, basta deixar o tempo de expiração em branco.

Para definir um cookie no lado do cliente utilizamos a função setcookie.

setcookie(nome do cookie, valor, tempo de expiração, caminho)

Componentes do cookie:

  • Nome do cookie - é o nome atribuído ao cookie criado;
  • Valor - é o conteúdo do cookie;
  • Tempo de expiração - é o período de tempo que o cookie é válido. Quando essa opção não está definida, o cookie expira no final da sessão. A unidade de tempo utilizada é a de segundos, porém a contagem se inicia desde a era linux (01/01/1970), então antes de definir o tempo de vida de um cookie você deve utilizar a função time(), como no exemplo: setcookie("cookie_1_minuto", "conteudo...", time() + 60);
  • Caminho - Para que diretório o cookie é válido no servidor;

O sistema do exemplo a seguir mostrará como trabalhar com cookies:

entrar.php

<html>
<body>
<center><b>SISTEMAS ABERTOS<br />Login para entrar no Site</b><br /><br /></center>
<center>Digite a Senha</center>
<form method="post" action="acessar.php">
<table border=2 align=center>
<tr><td>Senha:</td></tr>
<tr><td><input type="Password" name="password" /></td></tr>
</table>
<center><input type="submit" value="Login" /></center>
</form>
</body>
</html>

No script entrar.php criamos um campo input do tipo password para receber a senha de acesso. Neste caso utilizaremos a senha "teste". Este formulário está utilizando o método POST, pois queremos esconder da URL o que o usuário está enviando quando o formulário é submetido. Assim que o usuário clicar em "Login" os dados do formulário serão enviados para o script acessar.php.

acessar.php

<?php
if ($_POST['password'] == "teste"){
        setcookie("cookie_access", $_POST['password']);
        echo "Acesso permitido para visitar o <a href=\"pag.php\">Site</a>";
}else{
        echo "Senha Errada <a href=\"entrar.php\">Tentar Novamente</a>";
}
?>

O script acessar.php verifica se a senha é igual a "teste", se for, será definido um cookie com o nome "cookie_access" e com o valor da senha. Ao chamar a função setcookie("cookie_access", $password); não fornecemos data de expiração. Dessa forma esse cookie terminará quando o navegador fechar. Se a senha digitada no script anterior não for igual a "teste", será aberto um link para que o usuário volte à página de login (entrar.php).

pag.php

<?php
if(empty($_COOKIE['cookie_access'])){
        echo "Para visualizar esta página é necessário fazer o <a href=\"entrar.php\" >Login</a>";
}else{
        if($_COOKIE['cookie_access'] != "teste"){
                echo "Conteúdo do cookie incorreto, faça o <a href=\"entrar.php\" >Login</a> novamente.";
        }else {
                echo "<h3><center>Página a ser visualizada</center><h3><br /><br />
                <a href=\"pag2.php\">Próxima página<br /><br /></a>
                <a href=\"logout.php\">Logout</a>";
        }
}
?>

pag2.php

<?php
if(empty($_COOKIE['cookie_access'])){
        echo "Para visualizar esta página é necessário fazer o <a href=\"entrar.php\">Login</a>";
}else{
        if($_COOKIE['cookie_access'] != "teste"){
                echo "Erro de login";
        }else {
                echo "<h3><center>Segunda Página</center><h3><br /><br />
                <a href=\"pag.php\">Voltar</a><br /><br />
                <a href=\"logout.php\">Logout</a>";
        }
}
?>

Os scripts pag.php e pag2.php estão apenas simulando o conteúdo das páginas visitadas no site. O código que aparece no início dos scripts é necessário para proteger os sites visitados, ou seja, é esse trecho que testa se o usuário efetuou login. Caso ocorra do usuário tentar acessar essas páginas diretamente, será feita uma checagem: se existe o cookie e se a senha está correta, então, o usuário terá permissão para continuar visitando as páginas do site. Caso contrário, será apresentado ao usuário um link para a página de login (entrar.php).

logout.php

<?php
setcookie("cookie_access");
?>
<br /><br />
<center>
Logout realizado com sucesso. Clique <a href="pag.php">AQUI</a> 
para voltar a página principal.
</center>

Para finalizarmos a sessão, temos o script logout.php. O processo é extremamente simples e envolve uma nova chamada à instrução setcookie() apenas com o nome do cookie que desejamos limpar, pois ao chamar a função_setcookie()_ sem o segundo parâmetro estaremos criando um cookie sem conteúdo. O link para essa página, o qual chamaremos de logout.php, deverá estar presente em pontos-chaves do site. Após limpar os cookies criados, redirecionamos o browser para outra página do site (neste caso pag.php).


handLembre-se:
  • Ao escrever algo importante em um cookie, como uma senha, é extremamente recomendado que este dado seja encriptado.

1.11 - Direitos autorais e licença

Lição F2 - Exercícios da Trilha G

1 - Das funções a seguir, qual não existe?

  • a - session_start()
  • b - new_session()
  • c - session_id()
  • d - session_unset()
  • e - session_destroy()

2 - Para que serve a função session_id?

  • a - Serve para definir, através de seu parâmetro, o número identificador de uma seção.
  • b - Serve para retornar o identificador (nome) das variáveis de sessão definidas.
  • c - Serve para retornar o identificador da sessão atual, uma string contendo caracteres alfanuméricos.
  • d - Serve para retornar o identificador do processo criado para atender as requisições de um usuário específico.
  • e - Essa função não existe na linguagem PHP

3 - Qual das seguintes funções é obrigatória caso precisemos ler uma determinada variável de sessão?

  • a - new_session()
  • b - access_session()
  • c - get_session()
  • d - start_session()
  • e - session()

4 - Como é feito o acesso à variáveis de sessão?

  • a - Através da função get_session, que retorna um array associativo contendo todas as variáveis definidas.
  • b - Através da função access_session(), que retorna um array associativo contendo todas as variáveis definidas.
  • c - Através do array global $session.
  • d - Através do array global $SESSION.
  • e - Através do array global $_SESSION.

  1. - Para que serve a função session_unset?

  • a - Serve para destruir a sessão atual.
  • b - Serve para liberar todas as variáveis de sessão atuais, mas não destrói a sessão.
  • c - Serve para testar se uma variável de sessão foi excluída.
  • d - Serve para remover a variável de sessão cujo nome foi passado como parâmetro.
  • e - Essa função não existe na linguagem PHP.

6 - Avalie as seguintes afirmativas como verdadeiras ou falsas:

  • I - A função session_destroy é chamada para destruir uma sessão.
  • II - A função session_start só é chamada uma única vez: quando as variáveis são definidas.
  • III - Uma sessão é encerrada caso o usuário feche a janela do navegador.

A ordem correta das avaliações é:

  • a - I - V, II - F, III - V
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

7 - O que é um cookie HTTP?

  • a - É um arquivo escrito em alguma linguagem de programação (PHP, por exemplo), que permite obter informações sobre a máquina do usuário.
  • b - É uma página/documento HTML que simplesmente redireciona o usuário para um outro endereço.
  • c - É uma página escrita exclusivamente em PHP (sem HTML) que faz conexões com banco de dados e leitura de arquivos.
  • d - É um arquivo de texto enviado para o navegador do cliente contendo alguma informação útil (o nome do usuário, por exemplo).
  • e - n.d.a.

8 - Qual das seguintes alternativas possui o código necessário para criar um cookie com o nome "usuario", com o valor "João" e com a duração de duas horas?

  • a - $ck = create_cookie(); $ck .= "usuario"; $ck .= "João"; $ck .= "2";
  • b - cookie("usuario", "João", 2);
  • c - setcookie("usuario", "João", 2);
  • d - setcookie("usuario", "João", 2 * 60 * 60);
  • e - cookie("usuario", "João", 2 * 60 * 60);

9 - Avalie as seguintes afirmativas como verdadeiras ou falsas:

  • I - O atributo validade da função setcookie é opcional.
  • II - Não existe limite para a quantidade de dados em um cookie.
  • III - É possível ler o conteúdo do cookie logo que ele é definido.

A ordem correta das avaliações é:

  • a - I - V, II - F, III - F
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

10 - Avalie as seguintes afirmativas como verdadeiras ou falsas:

  • I - Para remover um cookie, chama-se a função setcookie com o nome da variável como parâmetro: setcookie("nomeDaVariavel").
  • II - Para acessar o conteúdo, utiliza-se o array global $_COOKIE: $_COOKIE["nomeDaVariavel"].
  • III - Um cookie é sempre acessível em qualquer script, não importando o diretório.

A ordem correta das avaliações é:

  • a - I - V, II - F, III - F
  • b - I - V, II - V, III - F
  • c - I - F, II - F, III - V
  • d - I - F, II - V, III - F
  • e - I - F, II - F, III - F

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha H - PHP e Banco de Dados

Lição H1 - Introdução ao MySQL?

1.1 - Introdução

Neste capítulo é dado uma introdução ao banco de dados MySQL, com ênfase ao aspecto da linguagem SQL. Para quem deseja aprofundar mais sobre SQL, este capítulo não será suficiente. Para aqueles que já sabem SQL, este capítulo será uma revisão e uma introdução das particularidades do banco de dados MySQL. Grande parte deste capítulo faz parte da tradução do tutorial do MySQL encontrado em sua documentação oficial.

1.2 - Por que o MySQL?

  • O MySQL é um banco de dados cliente-servidor gratuito;
  • É simples, tem alto desempenho, é disponível para várias plataformas e é robusto.

1.3 - O que é MySQL?

MySQL é um servidor de banco de dados SQL multi-usuário, com suporte às múltiplas linhas de execução [multi-threaded]. SQL é a linguagem de banco de dados mais popular no mundo. MySQL é uma implementação cliente/servidor que consiste em servidor [server daemon] mysql de vários programas clientes e bibliotecas.

SQL é a linguagem padronizada que torna fácil armazenar, atualizar e acessar informação. Por exemplo, você pode usar SQL para recuperar informação de produtos e armazenar informação de clientes para um site Internet. MySQL é também suficientemente veloz e flexível para armazenar dados históricos e figuras.

Os principais objetivos do MySQL são: velocidade, robustez e facilidade de uso.

1.4 - Básico

'mysql' (algumas vezes é referenciado como "monitor") é um programa interativo que permite conectar-se a um servidor MySQL, executar consultas e ver os resultados. O 'mysql' também pode ser usado em modo de execução em lote [batch mode]: você armazena suas consultas em um arquivo, então orienta o'mysql' a executar os conteúdos do arquivo. Ambas as maneiras de usar o 'mysql' são cobertas aqui.

Para ver uma lista de opções fornecidas pelo 'mysql', invoque-o com a opção de comando '--help'

     > mysql --help 

1.5 - Conectando e desconectando do servidor

Para conectar ao servidor, você precisará fornecer um nome de usuário do próprio Linux e uma senha. Se o servidor está funcionando em uma máquina diferente da que você está efetuando logon, também será necessário especificar o nome de máquina. Por exemplo:

     > mysql -u root -p
     Enter password: ********

Os caracteres `********' representam sua senha; Digite-a quando o 'mysql' mostrar o prompt 'Enter password'.

Se der tudo certo, você deverá ver informações introdutórias seguidas do prompt 'mysql>'.

     shell> mysql -u root
     Enter password: ********
     Welcome to the MySQL monitor.  Commands end with ; or \g.
     Your MySQL connection id is 459 to server version: 3.22.20a-log
     
     Type 'help' for help.
     
     mysql>

O prompt significa que o 'mysql' está pronto para você entrar com os comandos.

Depois de ter conectado com sucesso, você pode desconectar a qualquer momento, digitando 'QUIT' no prompt 'mysql>':

     mysql> QUIT
     Bye

Você também pode desconectar acionando as teclas CTRL+D.

1.6 - Executando consultas

Tenha a certeza que você está conectado ao servidor, como foi discutido na seção anterior.

Aqui é mostrado um comando simples que solicita ao servidor sua versão e a data atual.

     mysql> SELECT VERSION(), CURRENT_DATE;
     +--------------+--------------+
     | version()    | CURRENT_DATE |
     +--------------+--------------+
     | 3.22.20a-log | 1999-03-19   |
     +--------------+--------------+
     1 row in set (0.01 sec)
     mysql>

Esta consulta ilustra vários pontos sobre o 'mysql':

  • Um comando normalmente consiste de uma sentença SQL seguida por um ponto-e-vírgula.
  • Quando você executa um comando, o 'mysql' o envia ao servidor para execução e mostra os resultados, e em seguida imprime outro 'mysql>' para indicar que está pronto para outro comando.
  • O 'mysql' mostra a saída de consultas em forma de tabela (linhas e colunas). A primeira linha contém os rótulos para as colunas, e as linhas seguintes são os resultados da consulta.

As palavras-chave podem ser colocadas sem diferenciação de maiúsculas/minúsculas, desta forma, as consultas a seguir são equivalentes:

     mysql> SELECT VERSION(), CURRENT_DATE;
     mysql> select version(), current_date;
     mysql> SeLeCt vErSiOn(), current_DATE;

É permitido entrar com múltiplas sentenças em uma única linha. Simplesmente finalize cada sentença com um ponto-e-vírgula:

     mysql> SELECT VERSION(); SELECT NOW();
     +--------------+
     | version()    |
     +--------------+
     | 3.22.20a-log |
     +--------------+
     
     +---------------------+
     | NOW()               |
     +---------------------+
     | 1999-03-19 00:15:33 |
     +---------------------+

Existe uma forma bastante livre para digitar sentenças. É permitido pular linhas entre sentenças:

     mysql> SELECT
         -> USER()
         -> ,
         -> CURRENT_DATE;

     +--------------------+--------------+
     | USER()             | CURRENT_DATE |
     +--------------------+--------------+
     | joesmith@localhost | 1999-03-18   |
     +--------------------+--------------+

Se você decidir que não quer executar um comando que já está sendo digitado, cancele-o digitando '\c':

     mysql> SELECT
         -> USER()
         -> \c
     mysql>

Lembre-se que para finalizar um comando, usa-se o ponto-e-vírgula.

     mysql> SELECT USER()
         -> ;
     +--------------------+
     | USER()             |
     +--------------------+
     | joesmith@localhost |
     +--------------------+

1.7 - Criando e usando um banco de dados

Agora que você já sabe entrar com comandos, estamos no momento certo de acessar um banco de dados.

Suponha que você deseje criar um banco de dados de contatos de clientes. Esta seção mostra como recuperar dados de tabelas e também:

  • Como criar um banco de dados;
  • Como criar uma tabela;
  • Como carregar dados para a tabela;
  • Como recuperar dados da tabela de várias formas;
  • Como utilizar tabelas múltiplas.

O banco de dados de clientes será simples (deliberadamente), mas não será difícil imaginar situações de mundo real no qual um tipo de banco de dados similar poderá ser usado.

Use a sentença 'SHOW' para checar quais bancos de dados existem atualmente no servidor:

     mysql> SHOW DATABASES;
     +----------+
     | Database |
     +----------+
     | mysql    |
     | test     |
     +----------+

O banco de dados 'mysql' é necessário porque descreve os privilégios de acesso dos usuários. O banco de dados 'test' é geralmente fornecido como um espaço de trabalho para os usuários fazerem testes.

Tente acessar o banco de dados teste:

     mysql> USE test
     Database changed

O banco de dados test permite que todos que tenham acesso a ele criem e removam as suas tabelas. Portanto, é recomendável utilizar um banco de dados separado para cada aplicação. Desta maneira, você (ou o administrador do banco de dados) poderá configurar o acesso de uma maneira mais apropriada.

1.7.1 - Criando e selecionando um banco de dados

Para criar um banco de dados:

     mysql> CREATE DATABASE contatos;

Sob sistemas Unix, nomes de banco de dados são sensíveis à caixa (diferente das palavras-chave SQL). Portanto, você deve sempre referenciar seu banco de dados como 'contatos', não como 'Contatos', 'CONTATOS' ou qualquer outra variante. Isto também é aplicável para nomes de tabelas.

Para conectar no banco de dados:

     mysql> USE contatos
     Database changed

1.7.2 - Criando uma tabela

Neste ponto o banco de dados está vazio, como é mostrado no comando 'SHOW TABLES':

     mysql> SHOW TABLES;
     Empty set (0.00 sec)

A parte complexa é decidir como será a estrutura de seu banco de dados: quais tabelas serão necessárias, e quais colunas terão cada uma. Este trabalho é um trabalho de análise de banco de dados, que foge do escopo deste curso. Suponhamos que este trabalho já foi realizado, e tenhamos a seguinte estrutura:

Tabelas do sistema de contatos de clientes

Pessoa

Nome da coluna Tipo Nulo? Descrição
cpf char(11) não Cpf da pessoa
Nome char(40) não Nome completo da pessoa
telefone1 char(15) sim Telefone residencial
telefone2 char(15) sim Telefone comercial
email char(30) sim Email da pessoa
data_nascimento Date sim Data de nascimento
Endereco char(50) sim Endereço residencial
bairro int unsigned1 sim Código do Bairro residencial
cidade int unsigned sim Código da Cidade residencial
uf char(2) sim Unidade de Federação da residência
cep char(8) sim CEP da residência

Bairro

Nome da coluna Tipo Nulo? Descrição
cod_bairro int unsigned não Identificador do bairro
descricao char(40) não Descrição do bairro

Cidade

Nome da coluna Tipo Nulo? Descrição
cod_cidade int unsigned não Identificador da cidade
descricao char(40) não Descrição da cidade

Empresa

Nome da coluna Tipo Nulo? Descrição
cgc char(20) não Cgc/cnpj
nome_fantasia char(40) não Nome fantasia
razao_social char(40) sim Razão social
responsavel char(20) sim Cpf do responsável pela empresa
site_internet char(50) sim Site Internet
email char(30) sim Email do contato com a empresa
telefone char(15) sim Telefone de contato
fax char(15) sim Fax
endereco char(50) sim Endereço
bairro int unsigned sim Código do Bairro
cidade int unsigned sim Código da Cidade
uf char(2) sim Unidade de Federação
cep char(8) sim CEP

Contato

Nome da coluna Tipo Nulo? Descrição
num_contato int unsigned não Identifica o contato (valor sequencial)
tipo_cliente char(1) não p=pessoa; e=empresa
cpf char(20) sim Cpf (caso seja pessoa)
cgc char(20) sim Cgc (caso seja empresa)
data date não Data de contato com o cliente
observacao text sim Observações, informações sobre o contato com o cliente

Através desta base de dados, além de você ter o cadastro de clientes, também terá um cadastro de empresas, que poderá utilizar em uma mala direta. Note que com o uso de tabelas para cidade e bairro, você poderá utilizar informações para classificar a área de maior concentração geográfica de seus clientes. Através da tabela de contatos você poderá cadastrar os contatos realizados com cada cliente, possuindo um histórico dos contatos realizados.

Você pode forçar que determinada coluna não aceite valores nulos, através da cláusula NOT NULL.

Use um comando 'CREATE TABLE' para especificar o layout de cada tabela:

CREATE TABLE PESSOA (
   cpf char(11) not null,
   nome char(40),
   telefone1 char(15),
   telefone2 char(15),
   email char(30),
   data_nascimento date,
   endereco char(50),
   bairro int unsigned,
   cidade int unsigned,
   uf char(2),
   cep char(8)
);

Agora que você criou uma tabela o 'SHOW TABLES' deve produzir a saída:

     mysql> SHOW TABLES;
     +--------------------+
     | Tables in contatos |
     +--------------------+
     | PESSOA             |
     +--------------------+  

Para verificar se sua tabela foi criada da maneira que você esperava, use o comando 'DESCRIBE':

     mysql> DESCRIBE PESSOA;
     +-----------------+----------+------+-----+---------+-------+
     | Field           | Type     | Null | Key | Default | Extra |
     +-----------------+----------+------+-----+---------+-------+
     | cpf             | char(20) |      |     |         |       |
     | nome            | char(40) | YES  |     | NULL    |       |
     | telefone1       | char(15) | YES  |     | NULL    |       |
     | telefone2       | char(15) | YES  |     | NULL    |       |
     | email           | char(30) | YES  |     | NULL    |       |
     | data_nascimento | date     | YES  |     | NULL    |       |
     | endereco        | char(50) | YES  |     | NULL    |       |
     | bairro          | int(11)  | YES  |     | NULL    |       |
     | uf              | char(2)  | YES  |     | NULL    |       |
     | cep             | char(8)  | YES  |     | NULL    |       |
     +-----------------+----------+------+-----+---------+-------+   

Por enquanto, iremos apenas criar a tabela EMPRESA:

CREATE TABLE EMPRESA (
   cgc char(20) not null,
   nome_fantasia char(40) not null,
   razao_social char(40),
   responsavel char(11),
   site_internet char(50),
   email char(30),
   telefone char(15),
   fax char(15),
   endereco char(50),
   bairro int unsigned,
   cidade int unsigned,
   uf char(2),
   cep char(8)
);

1.7.3 - Carregando dados para uma tabela

Depois de criar suas tabelas, você precisará preenchê-las. Os comandos 'LOAD DATA' e o 'INSERT' são úteis para isto.

Suponha que seus registros possam ser descritos como mostrado abaixo: (Observe que o MySQL aceita datas no formato 'YYYY-MM-DD'; isto pode ser diferente do que você está acostumado)

Tabela Pessoa

cpf nome telefone1 telefone2 email data_nascimento endereco bairro cidade uf cep
1111 João da Silva 111-1111 111-1112 joao@uol.com.br 1984-11-11 Rua 11, no. 11 1 1 AM 11111111
2222 Maria Nunes 222-2222 222-2223 maria@bol.com.br 1971-11-22 Rua 22, no. 22 2 2 GO 22222222
3333 José Pereira 333-3333 null jose@sol.com.br 1961-03-03 Rua 33, no. 33 2 2 BA 22222222

Se você está iniciando com uma tabela vazia, uma forma fácil de populá-la é criar um arquivo texto contendo uma linha para cada pessoa, e então carregar o conteúdo do arquivo para a tabela com um único comando.

Você pode criar um arquivo texto 'pessoa.txt' contendo um registro por linha, com valores separados por tabs, e fornecendo dados na ordem da qual as colunas foram listadas no comando 'CREATE TABLE'. Para valores não aplicáveis ou não existentes (tal como segundo telefone), você pode usar valores 'NULL'. Para representar estes valores em seu arquivo texto, use '\N'. Por exemplo, o registro para José Pereira seria (onde há espaço em branco entre valores existe um caractere tab):

cpf nome telefone1 telefone2 email data_nascimento endereco bairro cidade uf cep
3333 José Pereira 333-3333 \N jose@sol.com.br 1968-03-03 Rua 33, no. 33 2 2 BA 22222222

Para carregar o arquivo texto 'pessoa.txt' na tabela 'PESSOA', use este comando:

     mysql> LOAD DATA LOCAL INFILE "pessoa.txt" INTO TABLE PESSOA;

Quando você desejar adicionar novos registros, um por vez, o comando 'INSERT' é útil. Nesta forma mais simples, você fornece valores para as colunas na ordem em que elas listadas no comando 'CREATE TABLE':

     mysql> INSERT INTO PESSOA
         -> VALUES ('4444', 'Ana Souza', '444-4444', NULL, 'ana@aol.com.br',   
         -> '1955-04-04', 'Rua 44, no. 44', 1, 1, 'GO', '44444444');

Note que os valores de string e datas são especificados como strings entre aspas. Com 'INSERT', você também pode inserir 'NULL' diretamente para representar um valor ausente. Não use '\N'.

1.7.4 - Recuperando informação de uma tabela

O comando 'SELECT' é usado para obter informação de uma tabela. A forma geral do comando é:

     SELECT o_que_selecionar
     FROM qual_tabela
     WHERE condições_de_consulta

O comando 'o_que_selecionar' indica o que você deseja ver, podendo ser uma lista de colunas ou '*' para indicar "todas as colunas". O comando 'qual_tabela' indica a tabela da qual os dados serão recuperados. A cláusula 'WHERE' é opcional, sendo que, se estiver presente, o comando 'condições_de_consulta' especifica as condições que as linhas devem satisfazer para qualificar a recuperação.

1.7.4.1 - Selecionando todos dados

A forma mais simples de da opção 'SELECT' recupera tudo em uma tabela:

mysql> SELECT * FROM PESSOA;
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| cpf       | nome          | telefone1 | telefone2 | email            | data_nascimento | endereco       | bairro | cidade | uf   | cep      |
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| 1111      | João da Silva | 111-1111  | 111-1112  | joao@uol.com.br  | 1984-11-11      | Rua 11, no. 11 |      1 |      1 | AM   | 11111111 |
| 2222      | Maria Nunes   | 222-2222  | 222-2223  | maria@bol.com.br | 1971-11-22      | Rua 22, no. 22 |      2 |      2 | GO   | 22222222 |
| 3333      | José Pereira  | 333-3333  | NULL      | jose@sol.com.br  | 1961-03-03      | Rua 33, no. 33 |      2 |      2 | BA   | 22222222 |
| 4444      | Ana Souza     | 444-4444  | NULL      | ana@aol.com.br   | 1955-04-04      | Rua 44, no. 44 |      1 |      1 | GO   | 44444444 |
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+ 

1.7.4.2 - Selecionando linhas particulares

Você pode selecionar somente linhas particulares de sua tabela. Por exemplo, se você quiser selecionar qual é a pessoa de cpf de no. 3333, você executaria uma consulta como esta:

     mysql> SELECT * FROM PESSOA WHERE CPF = "3333";
+-----------+--------------+-----------+-----------+-----------------+-----------------+----------------+--------+--------+------+----------+
| cpf       | nome         | telefone1 | telefone2 | email           | data_nascimento | endereco       | bairro | cidade | uf   | cep      |
+-----------+--------------+-----------+-----------+-----------------+-----------------+----------------+--------+--------+------+----------+
| 3333      | José Pereira | 333-3333  | NULL      | jose@sol.com.br | 1961-03-03      | Rua 33, no. 33 |      2 |      2 | BA   | 22222222 |
+-----------+--------------+-----------+-----------+-----------------+-----------------+----------------+--------+--------+------+----------+

Você pode especificar condições em qualquer coluna, não somente cpf. Por exemplo, se você desejar quais pessoas nasceram depois de 1970, utilize a coluna data_nascimento:

     mysql> SELECT * FROM PESSOA WHERE DATA_NASCIMENTO >= "1970-1-1";
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| cpf       | nome          | telefone1 | telefone2 | email            | data_nascimento | endereco       | bairro | cidade | uf   | cep      |
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| 1111      | João da Silva | 111-1111  | 111-1112  | joao@uol.com.br  | 1984-11-11      | Rua 11, no. 11 |      1 |      1 | AM   | 11111111 |
| 2222      | Maria Nunes   | 222-2222  | 222-2223  | maria@bol.com.br | 1971-11-22      | Rua 22, no. 22 |      2 |      2 | BA   | 22222222 |
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+ 

Você pode combinar condições, por exemplo, para localizar pessoas que moram em Goiás e que nasceram depois de 1970:

     mysql> SELECT * FROM PESSOA WHERE DATA_NASCIMENTO >= "1970-1-1" AND UF = "GO";
+-----------+-------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| cpf       | nome        | telefone1 | telefone2 | email            | data_nascimento | endereco       | bairro | cidade | uf   | cep      |
+-----------+-------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| 2222      | Maria Nunes | 222-2222  | 222-2223  | maria@bol.com.br | 1971-11-22      | Rua 22, no. 22 |      2 |      2 | GO   | 22222222 |
+-----------+-------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+ 

A consulta anterior usou o operador lógico AND. Há também o operador 'OR':

     mysql> SELECT * FROM PESSOA WHERE DATA_NASCIMENTO >= "1970-1-1" OR UF = "GO";

+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| cpf       | nome          | telefone1 | telefone2 | email            | data_nascimento | endereco       | bairro | cidade | uf   | cep      |
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+
| 1111      | João da Silva | 111-1111  | 111-1112  | joao@uol.com.br  | 1984-11-11      | Rua 11, no. 11 |      1 |      1 | AM   | 11111111 |
| 2222      | Maria Nunes   | 222-2222  | 222-2223  | maria@bol.com.br | 1971-11-22      | Rua 22, no. 22 |      2 |      2 | GO   | 22222222 |
| 4444      | Ana Souza     | 444-4444  | NULL      | ana@aol.com.br   | 1955-04-04      | Rua 44, no. 44 |      1 |      1 | GO   | 44444444 |
+-----------+---------------+-----------+-----------+------------------+-----------------+----------------+--------+--------+------+----------+ 

1.7.4.3 - Selecionando colunas particulares

Se você não desejar ver todas colunas de sua tabela, simplesmente forneça os nomes das colunas que você tiver interesse, separados por vírgulas. Por exemplo, se você desejar obter uma lista de nomes com seus respectivos e-mails, selecione as colunas nome e email:

     mysql> SELECT nome, email FROM PESSOA;
+---------------+------------------+
| nome          | email            |
+---------------+------------------+
| João da Silva | joao@uol.com.br  |
| Maria Nunes   | maria@bol.com.br |
| José Pereira  | jose@sol.com.br  |
| Ana Souza     | ana@aol.com.br   |
+---------------+------------------+      

Para selecionar em quais estados (unidades de federação) as pessoas se encontram, use esta consulta:

     mysql> SELECT UF FROM PESSOA;
+------+
| UF   |
+------+
| AM   |
| GO   |
| BA   |
| GO   |
+------+       

No entanto, note que a consulta simplesmente recupera o campo 'uf' de cada registro, e alguns deles aparecem mais de uma vez. Para minimizar a saída, recupere cada saída de registro unicamente adicionando a palavra-chave 'DISTINCT':

     mysql> SELECT DISTINCT UF FROM PESSOA;
+------+
| UF   |
+------+
| AM   |
| BA   |
| GO   |
+------+     

1.7.4.4 - Ordenando linhas

Você deve ter notado nos exemplos anteriores que as linhas resultantes são mostradas em uma ordem particular. No entanto, é mais fácil examinar a saída de uma consulta quando as linhas são ordenadas em uma forma significativa. Para ordenar um resultado, use uma cláusula 'ORDER BY'.

Aqui estão os aniversários das pessoas, ordenadas pela data:

     mysql> SELECT nome, data_nascimento FROM PESSOA ORDER BY data_nascimento;
+---------------+-----------------+
| nome          | data_nascimento |
+---------------+-----------------+
| Ana Souza     | 1955-04-04      |
| José Pereira  | 1961-03-03      |
| Maria Nunes   | 1971-11-22      |
| João da Silva | 1984-11-11      |
+---------------+-----------------+     

Para colocar os dados em ordem decrescente, adicione a palavra-chave 'DESC' (descendente) ao nome da coluna que você está ordenando:

     mysql> SELECT nome, data_nascimento FROM PESSOA ORDER BY data_nascimento DESC;
+---------------+-----------------+
| nome          | data_nascimento |
+---------------+-----------------+
| João da Silva | 1984-11-11      |
| Maria Nunes   | 1971-11-22      |
| José Pereira  | 1961-03-03      |
| Ana Souza     | 1955-04-04      |
+---------------+-----------------+       

1.7.4.5 - Casamento de padrões

Para encontrar nomes começando com 'J':

     mysql> SELECT cpf, nome FROM PESSOA WHERE nome LIKE "J%";
+-----------+---------------+
| cpf       | nome          |
+-----------+---------------+
| 1111      | João da Silva |
| 3333      | José Pereira  |
+-----------+---------------+  

Para encontrar nomes que terminam com 'a':

     mysql> SELECT cpf, nome FROM PESSOA WHERE nome LIKE "%a";
+-----------+---------------+
| cpf       | nome          |
+-----------+---------------+
| 1111      | João da Silva |
| 3333      | José Pereira  |
| 4444      | Ana Souza     |
+-----------+---------------+ 

1.7.4.6 - Contando linhas

Banco de dados são geralmente usados para responder a questão: "quantas vezes um determinado tipo de dados ocorrem em uma tabela?". Por exemplo, você pode querer saber quantas pessoas possuem, ou quantas pessoas existem por um determinado tipo de estado ou bairro.

Para contar o número total de pessoas:

     mysql> SELECT COUNT(*) FROM PESSOA;
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+   

Para selecionar o número de pessoas, agrupado por estado:

     mysql> SELECT UF, COUNT(*) FROM PESSOA GROUP BY UF;
+------+----------+
| UF   | COUNT(*) |
+------+----------+
| AM   |        1 |
| BA   |        1 |
| GO   |        2 |
+------+----------+       

Note o uso de 'GROUP BY' para agrupar todos registros para cada estado.

1.7.4.7 - Restrições

Suponha que você deseje evitar que uma pessoa seja cadastrada duas vezes. Isso pode ser evitado elegendo uma coluna como chave. Em termos técnicos, devemos eleger uma chave primária. A chave primária, por si, deve refletir algum dado que não se repete. Por exemplo, se elegermos a coluna "nome" como chave primária podemos estar cometendo um erro, pois podem ter pessoas homônimas (mesmo nome). Por outro lado, se escolhermos a coluna cpf será uma boa escolha, pois sabemos que nunca teremos um cpf repetido.

Por definição, uma chave primária nunca deve admitir valores nulos.

Para definir uma coluna como chave primária, você pode utilizar a cláusula PRIMARY KEY na criação da tabela:

CREATE TABLE PESSOA (
CPF CHAR(11) NOT NULL PRIMARY KEY,
...

Para definir uma coluna como chave primária, para uma tabela já existente, execute o comando ALTER TABLE com a cláusula PRIMARY KEY.

     mysql> ALTER TABLE PESSOA ADD PRIMARY KEY (CPF);

     mysql> ALTER TABLE EMPRESA ADD PRIMARY KEY (CGC);

1.7.4.8 - Cláusula auto_increment

Na tabela PESSOA, você deve ter notado que as colunas CIDADE e BAIRRO contém valores inteiros. Na verdade, estas colunas fazem referência a outros valores de outras tabelas, respectivamente às tabelas CIDADE e BAIRRO.

Execute os próximos comandos. Nesses comandos é introduzida a cláusula auto_increment, que indica que o valor será auto incrementado quando for criado uma nova linha:

     mysql> CREATE TABLE BAIRRO (
         -> cod_bairro int unsigned not null auto_increment primary key,
         -> descricao char(40) not null);

     mysql> CREATE TABLE CIDADE (
         -> cod_cidade int unsigned not null auto_increment primary key,
         -> descricao char(40) not null);

     mysql> CREATE TABLE CONTATO (
         -> num_contato int unsigned not null auto_increment primary key,
         -> tipo_cliente char(1),
         -> cpf_ou_rg char(20),
         -> cgc char(20),
         -> data date,
         -> observacao text);

Para popular as tabelas CIDADE, BAIRRO, EMPRESA e CONTATO, execute os comandos seguintes, que irão carregar valores para o banco de dados a partir dos arquivos cidade.txt, bairro.txt, empresa.txt e contato.txt, respectivamente. Caso não tenham sido criados todos os arquivos , crie-os , conforme já foi explicado , e faça o carregamento dos mesmos no banco de dados da seguinte maneira:

     mysql> LOAD DATA LOCAL INFILE "bairro.txt" INTO TABLE BAIRRO;
     mysql> LOAD DATA LOCAL INFILE "cidade.txt" INTO TABLE CIDADE;
     mysql> LOAD DATA LOCAL INFILE "empresa.txt" INTO TABLE EMPRESA;
     mysql> LOAD DATA LOCAL INFILE "contato.txt" INTO TABLE CONTATO;

Para experimentar a propriedade de auto incremento, execute:

     mysql> select num_contato, tipo_cliente, cpf, cgc, data FROM CONTATO;
+-------------+--------------+-----------+--------+------------+
| num_contato | tipo_cliente | cpf       | cgc    | data       |
+-------------+--------------+-----------+--------+------------+
|           1 | P            | 1111      | NULL   | 2000-04-21 |
|           2 | P            | 2222      | NULL   | 2000-04-21 |
|           3 | E            | NULL      | 121212 | 2000-04-21 |
|           4 | P            | 1111      | NULL   | 2000-04-22 |
+-------------+--------------+-----------+--------+------------+

   mysql> INSERT INTO CONTATO ('P', '6666', NULL, '2000-04-23', 'Precisa do programa do curso de Java Fundamentos');   

   mysql> select num_contato, tipo_cliente, cpf_ou_rg, cgc, data FROM CONTATO;
+-------------+--------------+-----------+--------+------------+
| num_contato | tipo_cliente | cpf_ou_rg | cgc    | data       |
+-------------+--------------+-----------+--------+------------+
|           1 | P            | 1111      | NULL   | 2000-04-21 |
|           2 | P            | 2222      | NULL   | 2000-04-21 |
|           3 | E            | NULL      | 121212 | 2000-04-21 |
|           4 | P            | 1111      | NULL   | 2000-04-22 |
|           5 | P            | 6666      | NULL   | 2000-04-23 |
+-------------+--------------+-----------+--------+------------+ 

Note nesse exemplo que, no comando INSERT, não foi necessário fornecer o valor da coluna num_contato. Automaticamente o banco de dados verifica o maior valor existente e insere o valor seguinte para a coluna com propriedade de auto-incremento.

1.7.5 - Usando múltiplas tabelas

É muito comum necessitarmos de informações que somente serão obtidas cruzando informações entre tabelas. Por exemplo: qual é o e-mail pessoal dos responsáveis por cada empresa? qual é o dia de aniversário dos responsáveis pela empresa? quantos contatos existem por estado (unidade de federação)? Na verdade, podemos criar inúmeras consultas, cruzando informações entre tabelas através de uma operação denominada junção (join).

Como exemplo, vamos obter o e-mail dos responsáveis pelas empresas:

     mysql> SELECT B.NOME_FANTASIA, A.NOME, A.EMAIL
         -> FROM PESSOA A, EMPRESA B
         -> WHERE A.CPF = B.RESPONSAVEL;

+---------------+---------------+------------------+
| NOME_FANTASIA | NOME          | EMAIL            |
+---------------+---------------+------------------+
| Mabel         | João da Silva | joao@uol.com.br  |
| Arisco        | Maria Nunes   | maria@bol.com.br |
+---------------+---------------+------------------+

Note:

  • São utilizadas as letras 'A' e 'B' como apelidos [alias] para as tabelas PESSOA e EMPRESA, respectivamente.
  • Você pode referenciar colunas de tabelas simplesmente indicando o "alias" da tabela, ponto finaç (.) e o nome da coluna. Por exemplo, B.NOME_FANTASIA é a coluna NOME_FANTASIA da tabela EMPRESA.
  • Todo join tem uma condição de junção especificada na parte de 'WHERE' da cláusula SELECT. Nesse caso, a condição de junção é que o responsável da empresa tenha o mesmo número de cpf da tabela de pessoas.

1.8 - Alterando linhas

Para se alterar alguma linha, é utilizado o comando update, com a seguinte sintaxe:

UPDATE 
SET =
WHERE = 

Basicamente, é necessário apenas especificar a tabela em que se quer fazer a atualização, o campo e seu novo valor e, finalmente, a condição de filtragem. Por exemplo:

mysql> select cpf, nome
    -> from pessoa;
+------+----------------+
| cpf  | nome           |
+------+----------------+
| 1111 | Joao da Silva  |
| 2222 | Maria Nunes    |
| 3333 | Jose da Silva  |
| 4444 | Ana Souza      |
+------+----------------+

mysql> update pessoa
    -> set nome="Joao da Silva Pereira"
    -> where cpf="1111";

mysql> select cpf, nome
    -> from pessoa;
+------+-----------------------+
| cpf  | nome                  |
+------+-----------------------+
| 1111 | Joao da Silva Pereira |
| 2222 | Maria Nunes           |
| 3333 | Jose Pereira          |
| 4444 | Ana Souza             |
+------+-----------------------+

1.9 - Deletando linhas

Para apagar uma linha é utilizado o comando delete com a seguinte sintaxe:

DELETE FROM 
WHERE = 

Basicamente, é necessário apenas especificar a tabela em que se quer fazer a exclusão e a condição de filtragem. Deve-se ter cuidado com esse comando, pois o simples comando DELETE sem a cláusula WHERE promove a exclusão de todas as linhas da tabela. Por exemplo:

mysql> select cpf, nome
    -> from pessoa;
+------+----------------+
| cpf  | nome           |
+------+----------------+
| 1111 | Joao da Silva  |
| 2222 | Maria Nunes    |
| 3333 | Jose da Silva  |
| 4444 | Ana Souza      |
+------+----------------+

mysql> delete from pessoa
    -> where cpf="1111";

mysql> select cpf, nome
    -> from pessoa;
+------+-----------------------+
| cpf  | nome                  |
+------+-----------------------+
| 2222 | Maria Nunes           |
| 3333 | Jose Pereira          |
| 4444 | Ana Souza             |
+------+-----------------------+

mysql> delete from pessoa;

mysql> select cpf, nome
    -> from pessoa;
Empty set (0.00 sec)

O MySQL nos informou que a tabela está vazia. Mas ela ainda existe, e ainda é possível executar inclusões e todas as operações listadas.

1.10 - Direitos autorais e licença

Lição H2 - Conectando o PHP com o MySQL?

2.1 - Introdução

Agora que você já tem uma ideia básica de comandos MySQL, podemos ver como a linguagem PHP se interage com esse banco de dados através de inúmeras funções. As funções de conexão do MySQL são chamadas de APIs (Application Programming Interfaces), mas iremos tratá-las apenas como funções para um melhor entendimento.

2.2 - Conexões MySQL

Veremos agora as funções mais comuns que são utilizadas para realizar a conexão entre PHP e MySQL. A maioria dessas funções retornam TRUE em caso de sucesso, FALSE em caso de falha, e quando o valor retornado for de outro tipo, colocaremos a descrição da respectiva função. Vejamos:

2.2.1 - mysql_connect()

Realiza uma conexão inicial para o MySQL utilizando como parâmetros: "hostname" (nome do servidor), "user" (usuário MySQL que está sendo conectado) e "password" (senha do usuário que está se conectando ao banco de dados).

mysql_connect("localhost", "administrador", "12345");

Lembrando que: "localhost" é, nesse caso, o hostname, "administrador" é o user e "12345" é o password. É possível também realizar uma conexão anônima deixando os campos user e password em branco. Exemplo:

mysql_connect("localhost", "", "");

É utilizado um "Link de Conexão" (no exemplo a seguir: $conexao) para confirmar se a conexão foi ou não realizada:

$conexao = mysql_connect("localhost", "administrador", "12345");

2.2.2 - mysql_pconnect()

Chamada de conexão persistente, age da mesma forma que a função anterior, sendo que neste caso, quando o MySQL é deixado, a conexão é mantida aberta, e quando o usuário retornar, a mesma conexão será utilizada.

Esta função deve ser usado com cuidado pois o número de conexões com o banco de dados pode ultrapassar o limite permitido.

mysql_pconnect("localhost", "administrador", "12345");

2.2.3 - mysql_close()

Simplesmente fecha uma conexão atual. Esta função utiliza um "link de conexão", aquele que referencia a conexão que precisa ser fechada, caso não seja passado esse parâmetro para a função, ela tentará fechar a última conexão criada pelo mysql_connect()

mysql_close($conexao);

2.2.4 - mysql_create_db()

Cria um novo banco de dados (database) para ser utilizado futuramente:

mysql_create_db($nomedatabase, $conexao);

O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.5 - mysql_drop_db()

Exclui um database anteriormente criado:

mysql_drop_db($nomedatabase, $conexao);

O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.6 - mysql_select_db()

Seleciona um database para ser trabalhado:

mysql_select_db($nomedatabase, $conexao);

O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.7 - mysql_query()

Envia a declaração SQL para o servidor MySQL:

mysql_query($declaracaoSQL, $conexao);

$declaracaoSQL é uma string contendo a declaração SQL como: CREATE, ALTER, DROP, DELETE, INSERT e UPDATE.

O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.8 - mysql_db_query()

Semelhante à função anterior, mas agora há um parâmetro adicional que especifica o nome de um database:

mysql_db_query($nomedatabase, $declaracaoSQL, $conexao);

$nomedatabase é uma string com o nome do banco de dados.
$declaracaoSQL é uma string contendo a declaração SQL como: CREATE, ALTER, DROP, DELETE, INSERT e UPDATE.
O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.9 - mysql_list_dbs()

Lista todas as bases de dados disponíveis no servidor.

mysql_list_dbs($conexao);

O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.10 - mysql_list_tables()

Lista todas as tabelas disponíveis dentro do database especificado.

mysql_list_tables($nomedatabase, $conexao);

$nomedatabase contém o nome de uma base de dados.
O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.11 - mysql_list_fields()

Lista todos os campos de uma tabela especificada.

mysql_list_fields($nomedatabase, $nometabela, $conexao);

$nomedatabase contém o nome do database onde a tabela se encontra.
$nometabela - nome da tabela.
O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.12 - mysql_result()

Obtém os dados retornados através das funções mysql_query(), mysql_db_query(), mysql_list_tables() ou mysql_list_dbs().

mysql_result($resultado);

$resultado é o identificador resultado que deve ser obtido da seguinte maneira (lembrando que a função poder ser mysql_query(), mysql_db_query(), mysql_list_tables() ou mysql_list_dbs()):

$resultado = mysql_query($declaracaoSQL, $conexao);

É possível escolher a linha e o campo pelos quais os resultados serão obtidos, veja:

mysql_result($resultado, $linha, $campo);

A função retornará o conteúdo da linha $linha e a coluna $campo de $resultado.

2.2.13 - mysql_num_fields()

Retorna o número de campos existentes dentro de $resultado. Veja:

mysql_num_fields($resultado);

$resultado novamente é o identificador de resultado descrito na função anterior.

mysql_num_rows($resultado);

$resultado é o identificador de resultado, provindo de uma declaração SELECT.

2.2.14 - mysql_affected_rows()

Retorna o número de linhas afetadas na última consulta SQL, que podem ser apenas declarações do tipo: INSERT, DELETE, REPLACE ou UPDATE.

mysql_affected_rows($conexao);

O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.2.15 - mysql_fetch_array()

Obtém o resultado de uma declaração SQL, e coloca cada linha obtida em um campo de um array específico. Veja:

$linhas = mysql_fetch_array($resultado, $tipo);

O array $linhas comportará todas as linhas provindas de $resultado, lembrando que:

$resultado novamente é o identificador de resultado retornado por mysql_query(), mysql_db_query(), mysql_list_tables() ou mysql_list_dbs(). $tipo é o tipo do array criado: MYSQL_ASSOC (para um array associativo), MYSQL_NUM (para um array de índices numéricos), e MYSQL_BOTH é tipo assumido se o parâmetro for omitido, que mistura ambos os tipos.

2.2.16 - mysql_insert_id()

Retorna o ID de incrementação automática gerado pelo último comando SQL INSERT, executado em uma tabela que continha uma coluna AUTO_INCREMENT.

mysql_insert_ID($conexao);

O uso de $conexao é opcional. Se omitido, será utilizada a conexão atual.

2.3 - Primeira Aplicação

Iremos agora desenvolver um script PHP para facilitar a compreensão das funções acima. O script irá imprimir na tela todos os campos ('título', 'conteúdo' e 'link') da tabela 'noticias' que se encontra dentro do database 'portal_de_noticias'. Vejamos o código:

Este arquivo irá criar o database portal_de_noticias, a tabela noticias com suas respectivas colunas, e irá inserir dados em seus campos.

portal.sql

CREATE DATABASE portal_de_noticias;
use portal_de_noticias;
CREATE TABLE noticias (titulo char(50) not null,conteudo char(200),link char(50));
INSERT INTO noticias VALUES ('Sistemas Abertos','informatica ltda','www.sistemasabertos.com.br');

Obs: para carregá-lo, conecte-se ao banco de dados e digite o seguinte comando:

mysql> source /caminho_na_árvore_de_diretórios/portal.sql

firstconection.php

<?php

//realiza a conexão com o servidor MySQL
$conexao = mysql_connect("localhost", "", "");

//verifica se a conexão foi realizada com sucesso
if (!$conexao){
        die ("Conexão ao servidor MySQL não realizada!");
}

//seleciona o database a ser trabalhado
$db = mysql_select_db("portal_de_noticias", $conexao);

//verifica se a seleção do database foi realizada com sucesso
if (!$db){
        echo "Mudança de database não realizada!";
        exit;
}

$consultasql = "SELECT * FROM noticias";

//realiza a consulta MySQL
$query = mysql_query($consultasql, $conexao);

//retorna o nº de linhas da consulta realizada
$num_linhas = mysql_num_rows($query);

if ($num_linhas == 0){
        echo "Não há nenhum dado!";
} else {
        //coloca o resultado da consulta em um array e imprime cada elemento
        while ($linha = mysql_fetch_array($query)){
                $titulo = $linha["titulo"];
                $conteudo = $linha["conteudo"];
                $link = $linha["link"];
                
                echo "<h2>$titulo</h2> <br />$conteudo <br /> <a href=$link>$link</a>";
        }
}
//fecha a conexão com o servidor MySQL
mysql_close($conexao);

?>


handLembre-se:
  • Às vezes, mensagens de erro podem ser geradas pelas funções de conexão. Para desabilitar tal ação, utilize um '@' no início de sua função. Veja:
$conexao = @mysql_connect("localhost", "", "");

2.4 - Preenchendo Menus

Este tópico irá focalizar a interação entre o usuário e o formulário. Faremos um script que imprimirá na tela todos os títulos das notícias disponíveis para que o usuário possa fazer sua escolha. Em seguida, serão impressos o título, conteúdo e link da notícia selecionada.

Para evitar repetir o mesmo código para realizar a conexão com o servidor MySQL, criaremos um arquivo que faça isso, bastando apenas inclui-lo em nossas páginas.

conection.php

<?php

header("Content-type: text/html; charset=utf-8");

$conexao = mysql_connect("localhost", "root", "");
//realiza a conexão com o servidor MySQL
if (!$conexao){
        die ("Conexão ao servidor MySQL não realizada!");
}
?>

Vejamos agora a nossa página:

selecao.php

<html>
<body>
<h3>Selecione a notícia desejada:</h3>

<?php
// incluindo nosso arquivo que realiza a conexão
include ("conection.php");

if (!mysql_select_db("portal_de_noticias")){
        die ("Mudança de base de dados não realizada!");
}

//consulta o campo 'titulo' da tabela 'noticias'
$consultasql = "SELECT titulo FROM noticias";

$query = mysql_query($consultasql);

$num_linhas = mysql_num_rows($query);

if ($num_linhas == 0){
        //caso a tabela esteja vazia
        echo "Não há nenhum dado!";
} else {
        // criando a parte inicial do nosso formulário
        echo "<form method = 'get' action = 'ver_dados.php'>";
        echo "<select name = 'opcao'>";
        
        while ($linha = mysql_fetch_array($query)){
                // título da noticia é armazenado na variável $titulo
                $titulo = $linha["titulo"];
                //imprime cada valor do campo 'titulo' para a seleção
                echo "<option value = '$titulo'>$titulo </option>";
        }
        echo "</select>";
}
echo "<br /><br />";
echo "<input type = 'submit' value = 'Enviar' />";
mysql_close($conexao);
?>
</body>
</html>

Muito cuidado na hora de implementar o código de seleção. Em nosso exemplo, nossa tabela é simples e não contém valores duplicados, ou seja, com o mesmo título. Caso isso ocorra, será necessário usar um campo específico para cada notícia, e para isso utiliza-se um ID.

Colocando cada notícia com seu próprio ID (não interessando seu título, conteúdo ou link), será possível resolver o impasse. Vejamos agora como fica o código anterior com a inclusão do campo ID:

selecaoid.php

<html>
<body>
<h3>Selecione a notícia desejada:</h3>

<?php
include ("conection.php");

if (!mysql_select_db("portal_de_noticias")){
        die ("Mudança de base de dados não realizada!");
}

//agora também selecionamos o campo id
$consultasql = "SELECT titulo, id FROM noticias";

$query = mysql_query($consultasql);

$num_linhas = mysql_num_rows($query);
if ($num_linhas == 0){
        echo "Não há nenhum dado!";
} else {
        echo "<form method = get action = 'ver_dados.php'>";
        echo "<select name = 'opcao'>";
        while ($linha = mysql_fetch_array($query)){
                $titulo = $linha["titulo"];
                $id = $linha["id"];
                
                //note que o valor de 'opcao' será um ID e não um título, como anteriormente
                echo "<option value = '$id'>$titulo </option>";
        }
        echo "</select>";
}
echo "<br /><br />";
echo "<input type = 'submit' value = 'Enviar' />";
mysql_close($conexao);
?>
</body>
</html>

Agora criaremos o script que imprimirá na tela os dados da notícia selecionada através do script selecao.php.

ver_dados.php

<html>
<body>
<table align = 'center' border = '3'>

<?php
include ("conection.php");

if (!mysql_select_db("portal_de_noticias")){
        die ("Mudança de base de dados não realizada!");
}

$consultasql = "SELECT * FROM noticias WHERE titulo = '" . $_GET['opcao'] . "'";
//selecionamos todos os dados sobre o título escolhido

$query = mysql_query($consultasql);

$num_linhas = mysql_num_rows($query);
if ($num_linhas == 0){
        echo "Não há nenhum dado!";
} else {
        //faremos uma tabela para melhor visualizar os valores obtidos
        echo "<tr>
        <th>Titulo</th>
        <th>Conteúdo</th>
        <th>Link</th>
        </tr>";
        
        while ($linha = mysql_fetch_array($query)){
                $titulo = $linha["titulo"];
                $conteudo = $linha["conteudo"];
                $link = $linha["link"];
                echo "<tr>
                <td>$titulo</td>
                <td>$conteudo</td>
                <td>$link</td>
                </tr>";
        }
}
mysql_close($conexao);
?>
</table>
<br />
<center><a href = "selecao.php">Voltar!</a></center>
</body>
</html>

Caso estivéssemos utilizando o script selecaoid.php faríamos apenas 2 modificações:

Mudança de $consultasql:

$consultasql = "SELECT * FROM noticias WHERE ID = $form";
Alteração do link de retorno:
<a href = "selecaoid.php">Voltar!</a>

2.5 - Inserindo um registro

Um site que tem a capacidade de alterar informações é sinônimo de dinamicidade. Criaremos agora um script para o usuário inserir um registro.

Primeiro criaremos um formulário para que o usuário coloque todos os seus dados pessoais. Usaremos o banco 'dados_pessoais' que contém uma tabela MySQL 'paises' com os campos 'pais' (para que o usuário selecione o país desejado), 'id' (cada um de um país) e a tabela 'dados' para armazenar os dados do usuário. Veja:

dados.sql

CREATE DATABASE dados_pessoais;
use dados_pessoais;
CREATE TABLE paises (id int auto_increment primary key, pais char(50) not null);
CREATE TABLE dados (id int auto_increment primary key, nome char(50) not null, endereco char(50) not null, cidade char(50) not null, pais int not null);
INSERT INTO paises (pais) VALUES ('Brasil'), ('U.S.A'), ('Alemanha'), ('Argentina');

forminserir.php

<center><B>Insira seus dados em sua ficha pessoal</B></center>
<?php

include ("conection.php");

if (!mysql_select_db("dados_pessoais", $conexao)){
        die ("Seleção de database não realizada!");
}
//função para verificar caracteres especiais nos campos do formulário
function decodifica($str){
        $str = urldecode($str);
        $str = stripslashes($str);
        $str = htmlspecialchars($str);
        return ($str);
}

$consultasql = "SELECT * FROM paises";

$query = mysql_query($consultasql, $conexao);

$num_linhas = mysql_num_rows($query);
if ($num_linhas == 0){
        echo "Não há nenhum dado!";
} else {
        
        echo "<form method='get' action='inserir.php'>";
        //as próximas 3 linhas serão utilizadas se o script se repetir
        $nome = decodifica($nome);
        $endereco = decodifica($endereco);
        $cidade = decodifica($cidade);
        
        //preenchimento dos campos
        echo "Nome completo: <br /> <input type='text' name='nome' value=\"" . $_GET['nome'] . "\" /><br />";
        echo "Endereço: <br /> <input type='text' name='endereco' value=\"" . $_GET['endereco'] . "\" /><br />";
        echo "Cidade: <br /> <input type='text' name='cidade' value=\"" . $_GET['cidade'] . "\" /><br />";
        echo "Selecione seu país:<br />";
        echo "<select name='pais'>";
        //exibição dos países da tabela 'paises'
        while ($linha = mysql_fetch_array($query)){
                $pais = $linha["pais"];
                $id = $linha["id"];
                
                echo "<option value=\"$id\">$pais</option>";
        }
        echo "</select>";
}

echo "<br /><br />";
echo "<input type='submit' value='Enviar dados!' />";
echo "</form>";

echo "<form method=get action='$PHP_SELF'>";
echo "<input type='submit' value='Limpar dados!' /> </form>";

mysql_close($conexao);
?>

Agora vamos explicar mais detalhadamente o script acima. Se acontecer algum erro no processo de inserção dos dados, o formulário será mostrado novamente com os dados que foram preenchidos antes do envio. Isso evita que usuários necessitem redigitar informações. Assim, decodificamos a cadeia de consulta (urldecode()), habilitamos caracteres especiais como ", % e ! (stripslashes()) e protegemos caracteres como & e > (htmlspecialchars()). Todas estas verificações foram feitas no código abaixo:

function decodifica($str){
        $str = urldecode($str);
        $str = stripslashes($str);
        $str = htmlspecialchars($str);
        return ($str);
}

Se o usuário clicar em Enviar Dados!, e alguns campos não estiverem preenchidos, o formulário será enviado de volta com as informações nos campos que ele entrou, assim como dito anteriormente. No entanto, isso representaria um problema: se o usuário decidir limpar os campos (usando o input reset), os campos que contiverem dados não serão limpados, pois estamos pegando o conteúdo passado pela url ($_GET) para preencher os campos.

Isso ocorrerá porque a cadeia de consulta ainda conterá informações do Enviar Dados! anterior, ou seja, as variáveis do formulário que haviam sido preenchidas ainda estarão preenchidas com os valores anteriores.

Foi por isso que utilizamos o seguinte código:

echo "<form method = get action = '$PHP_SELF'>";
echo "<input type = 'submit' value = 'Limpar dados!' /> </form>";

Assim, criamos o nosso próprio botão especial de reinicialização que chama a própria página forçando uma limpeza completa em qualquer cadeia de consulta.

Vejamos agora o script que irá manipular os dados de nosso formulário:

inserir.php

<?php

include ("conection.php");

if (!mysql_select_db("dados_pessoais", $conexao)){
        echo "Seleção de database não realizada!";
        exit;
}

$nome = $_GET['nome'];
$endereco = $_GET['endereco'];
$cidade = $_GET['cidade'];
$pais = $_GET['pais'];

//se o formulário voltar, protegeremos os dados já preenchidos
function protecao($str){
        $str = urlencode($str);
        $str = stripslashes($str);
        return ($str);
}

//verifica se os campos estão vazios
$erro = false;
if ($nome == ""){
        $erro = true;
        echo "Campo nome não preenchido!<br />";
}

if ($endereco == ""){
        $erro = true;
        echo "Campo endereço não preenchido!<br />";
}

if ($cidade == ""){
        $erro = true;
        echo "Campo cidade não preenchido!<br />";
}

//se os campos estiverem vazios, faremos a proteção de caracteres para o retorno ao formulário
if ($erro){
        $nome = protecao($nome);
        $endereco = protecao($endereco);
        $cidade = protecao($cidade);
        //o usuário e os dados já preenchidos são direcionados novamente ao formulário original
        echo "<br /><a href = 'forminserir.php?nome=$nome&endereco=$endereco&cidade=$cidade'>Voltar!</a>";
        exit;
}

//inserção dos novos dados, caso nenhum erro tenha ocorrido. Note as aspas entre os valores $nome, $cidade, etc. Elas são essenciais.
$consultasql = "INSERT INTO dados (nome, endereco, cidade, pais) VALUES ('$nome', '$endereco', '$cidade', '$pais')";

if (!$query = mysql_query($consultasql, $conexao)){
        echo "Erro. Dados não gravados! Aperte o botão de retorno e tente novamente!<br />";
        exit;
} else {
        echo "Tabela alterada! " .mysql_affected_rows() ." dado(s) gravado(s)!<br />";
}

echo "<br /><a href = 'forminserir.php'>Voltar!</a>";

?>

Para verificar se um campo foi preenchido ou não, atribuímos 'true' ou 'false' à variável $erro. Inicializamos a variável como 'false', e se algum campo estiver vazio, alteraremos seu valor para 'true' ("existe um erro").

Se qualquer um dos campos não estiver preenchido, a consulta será codificada antes de ser enviada de volta para o formulário. Veja o código:

if ($erro) {
        $nome = protecao($nome);
        $endereco = protecao($endereco);
        $cidade = protecao($cidade);

Primeiramente, a cadeia é codificada, depois, qualquer caractere especial é protegido e finalmente removemos qualquer proteção de caracteres como ^, & e (,). Deixamos o resto da codificação para o script forminserir.php.

Logo após a proteção dos dados, o usuário é direcionado de volta ao formulário original junto com as informações já preenchidas através de um link com valores anexados à cadeia URL. Veja:

echo "<br /><a href = 'forminserir.php?nome=$nome&endereco=$endereco&cidade=$cidade'> Voltar!</a>";
exit;
}

2.6 - Atualização de Registro

No tópico anterior aprendemos a inserir um registro. E se agora quiséssemos alterar apenas o endereço ou adicionar um sobrenome? Para isso utilizaremos o campo ID de cada registro, pois ele é a melhor maneira de identificar seus registros de forma única.

Uma maneira possível de se realizar tal atualização seria criar uma lista de nomes a serem atualizados, para que assim o usuário selecione a opção desejada. Observe o código abaixo:

form_selecao.php

<center><b>Selecione a notícia desejada:</b></center>

<?php

include ("conection.php");

if (!mysql_select_db("dados_pessoais", $conexao)){
        die ("Seleção de database não realizada!");
}

$consultasql = "SELECT nome, endereco, cidade, p.pais, d.id FROM dados as d, paises as p where d.pais = p.id ORDER BY p.pais";

$query = mysql_query($consultasql, $conexao);
$num_linhas = mysql_num_rows($query);

if ($num_linhas == 0) {
        echo "Não há nenhum dado!";
} else {
        
        echo "<table align='center' border='4'>";
        echo "<tr><th>Nome</th><th>Endereço</th><th>País</th><th>Ação</th></tr>";
        while ($linha = mysql_fetch_array($query)) {
                $nome = $linha["nome"];
                $endereco = $linha["endereco"];
                $cidade = $linha["cidade"];
                $pais = $linha["pais"];
                $id = $linha["id"];
                
                echo "<tr><td>$nome</td><td>$endereco</td><td>$pais</td>";
                echo "<td><a href='modif.php?id=$id'>Modificar</a></td></tr>";
        }
}

mysql_close($conexao);

?>
</table>

Utilizamos neste script uma busca um pouco mais complexa do que as que fizemos até agora, ela busca dados da intercessão de duas tabelas. A função do script é imprimir uma tabela com os dados contidos no banco de dados, sendo que o usuário poderá clicar em "Modificar" para realizar modificações nos dados da pessoa. O único trecho de código que pode parecer novo a seus olhos é a seguinte linha de comando:

echo "<td><a href='modif.php?id=$id'>Modificar</a></td></tr>";

Esse trecho é a implementação do link que levará ao script 'modif.php', onde as modificações serão realizadas. Note que 'id' será a variável responsável pela identificação de qual registro deve ser modificado. Vejamos o código do próximo script:

modif.php

<center><b>Realize as atualizações desejadas:</b></center>
<?php

include ("conection.php");

if (!mysql_select_db("dados_pessoais", $conexao)){
        die ("Seleção de database não realizada!");
}

$sql1 = "SELECT * FROM dados WHERE id = '" . $_GET['id'] . "'";
$sql2 = "SELECT * FROM paises";

$query = mysql_query($sql1, $conexao);
$num_linhas = mysql_num_rows($query);

if ($num_linhas == 0) {
        echo "Não há nenhum dado!";
} else {
        
        while ($linha = mysql_fetch_array($query)) {
                $nome = $linha["nome"];
                $endereco = $linha["endereco"];
                $cidade = $linha["cidade"];
                $pais = $linha["pais"];
                $id = $linha["id"];
        }
        echo "<form method =get action = 'modif_agora.php'>";
        echo "Nome<br /><input type = 'text' name = nome value = '$nome' /><br />";
        echo "Endereço<br /><input type = 'text' name = endereco value = '$endereco' /><br />";
        echo "Cidade<br /><input type = 'text' name = cidade value = '$cidade' /><br />";
        echo "País<br />";
        
        echo "<select name = 'pais'>";
        $query2 = mysql_query($sql2, $conexao);
        while ($linha = mysql_fetch_array($query2)) {
                $pais = $linha["pais"];
                $pais_id = $linha['id'];
                echo "<option value=\"$pais_id\">$pais</option>";
        }
        
        echo "</select>";
        echo "<br /><br />";
        
        echo "<input type = 'HIDDEN' name= 'id' value = '$id' />";
        echo "<input type = 'submit' value = 'Atualizar registro!' />";
}

mysql_close($conexao);

?>
</form>

Após ter realizado as devidas modificações, o usuário necessitará clicar no botão para que as atualizações sejam salvas. Para passarmos o valor de $id para o 3º script, usamos campos HIDDEN, que não são visíveis ao usuário e acessíveis nos dados vindos por GET ou POST.

modif_agora.php

<?php
include ("conection.php");

$db = mysql_select_db("dados_pessoais", $conexao);

if (!$db){
        echo "Seleção de database não realizada!";
        exit;
}

$nome = $_GET['nome'];
$endereco = $_GET['endereco'];
$cidade = $_GET['cidade'];
$pais = $_GET['pais'];
$id = $_GET['id'];

$erro = false;
if ($nome == ""){
        $erro = true;
        echo "Campo nome não preenchido!<br />";
}

if ($endereco == ""){
        $erro = true;
        echo "Campo endereço não preenchido!<br />";
}

if ($cidade == "") {
        $erro = true;
        echo "Campo cidade não preenchido!<br />";
}

if ($erro){
        echo "Todos os campos devem estar preenchidos! Preencha o formulário corretamente!";
        echo "<br /><a href = 'form_selecao.php'> Voltar!</a>";
        exit;
}

$sql = "UPDATE dados SET nome = '$nome', endereco = '$endereco', cidade = '$cidade', pais = '$pais' WHERE id = $id";

if (!mysql_query($sql)){
        echo "Erro, atualização não realizada!<br />";
        echo "<br /><a href = 'form_selecao.php'> Voltar!</a>";
        exit;
} else {
        echo "Tabela atualizada [" .mysql_affected_rows() ."] dado(s) atualizados(s)!<br />";
}

echo "<br /><a href = 'form_selecao.php'> Voltar!</a>";
mysql_close($conexao);
?>

Aqui verificamos se existe algum campo vazio no formulário e atualizamos os dados. Note que todos os campos são atualizados, e não apenas os modificados.

2.7 - Excluindo um Registro

Agora que já trabalhamos com tantos scripts, a exclusão de um registro será facilmente implementada. Para a seleção do registro a ser excluído, utilizaremos o script form_selecao.php, modificando o link de forma que fique direcionado para nosso novo script que confirmará a exclusão.

Realize a seguinte modificação em form_selecao.php:

echo "<td><a href='modif.php?id=$id'>Modificar</a> | <a href = 'apagar.php?id=$id'>Deletar</a></td></tr>";

Vamos ao script:

apagar.php

<?php

include ("conection.php");

if (!mysql_select_db("dados_pessoais", $conexao)){
        die ("Seleção de database não realizada!");
}

$id = $_GET['id'];
$sql = "SELECT nome, endereco, cidade, p.pais, d.id FROM dados as d, paises as p where d.id = $id and d.pais = p.id ORDER BY p.pais";

$query = mysql_query($sql, $conexao);
$num_linhas = mysql_num_rows($query);

if ($num_linhas == 0){
        echo "Não há nenhum dado!";
} else {
        echo "<form method=get action='apagar_agora.php'>";
        while ($linha = mysql_fetch_array($query)) {
                $nome = $linha["nome"];
                $endereco = $linha["endereco"];
                $cidade = $linha["cidade"];
                $pais = $linha["pais"];
                
                echo "Nome<br /><b>$nome</b><br /><br />";
                echo "Endereço<br /><b>$endereco</b><br /><br />";
                echo "Cidade<br /><b>$cidade</b><br /><br />";
                echo "País<br /><b>$pais</b><br /><br />";
                echo "<br /><br />";
        }
        echo "<input type='HIDDEN' name='id' value='$id' />";
        echo "<input type=submit value='Deletar Registro!' />";
        echo "</form>";
        
        echo "<a href='form_selecao.php'>Cancelar</a>";
        echo "</form>";
}

mysql_close($conexao);
?>
</form>

Nesse script, novamente passamos o ID do registro a ser deletado para o próximo script através de um campo HIDDEN. Vejamos agora o script responsável por deletar o registro no banco de dados:

apagar_agora.php

<?php

include ("conection.php");

if (!mysql_select_db("dados_pessoais", $conexao)){
        die ("Seleção de database não realizada!");
}

$id = $_GET['id'];

$sql = "DELETE FROM dados WHERE id = $id";

if (!$query = mysql_query($sql, $conexao)){
        echo "Erro, exclusão não realizada!<br />";
        echo "<br /><a href = 'form_selecao.php'> Voltar!</a>";
        exit;
} else {
        echo "Tabela atualizada! " . mysql_affected_rows() ." dado(s) excluído(s)!<br />";
}

echo "<br /><a href = 'form_selecao.php'> Voltar!</a>";
mysql_close($conexao);
?>

2.8 - Registros Duplicados

Ao inserir ou atualizar novos registros, pode ocorrer de já existir um registro com tais dados. Para verificar a existência de tal registro, pode-se utilizar a seguinte linha SQL:

SELECT * FROM dados WHERE nome = '$nome' AND endereco = '$endereco'
AND cidade = '$cidade' AND pais = '$pais'

Faça a consulta com a função mysql_query() e logo após use mysql_num_rows() para verificar quantas linhas da tabela correspondem a tais condições. Se o valor de retorno for diferente de 0, existe algum registro idêntico, e portanto não é interessante uma nova gravação. Apenas grave os dados se a função retornar 0 (não há linhas iguais).

2.9 - Direitos autorais e licença

Lição H3 - Exercícios da Trilha H

  1. - Qual das alternativas abaixo melhor define o MySQL?

  • a - MySQL é uma linguagem utilizada para fazer consultas em bancos de dados.
  • b - MySQL é um módulo do PHP utilizado para acessar bancos de dados.
  • c - MySQL é um módulo do Apache utilizado para acessar bancos de dados.
  • d - MySQL é um servidor de banco de dados, que permite a execução de consultas através da linguagem SQL.
  • e - MySQL é uma versão da linguagem SQL para uso pessoal.

2 - Avalie as seguintes proposições como verdadeiras ou falsas:

  • I - O MySQL, como grande parte dos gerenciadores de banco de dados, trabalha com o conceito de tabela para armazenar dados.
  • II - Uma tabela representa um objeto do sistema, como "usuário", "cidade", "empresa".
  • III - Em uma tabela, existem tantos campos quanto se queira, e cada um representa um atributo do objeto modelado pela tabela.

A ordem correta das avaliações é:

  • a - I - V; II - V; III - F
  • b - I - F; II - F; III - F
  • c - I - V; II - V; III - V
  • d - I - F; II - V; III - V
  • e - I - V; II - F; III - V

3 - Qual dos comandos SQL abaixo é utilizado para fazer seleção de dados no banco de dados?

  • a - SELECT
  • b - UPDATE
  • c - GET
  • d - SEARCH
  • e - INSERT

4 - Qual das alternativas abaixo possui o código necessário para buscar, dentro da tabela usuario, o nome dos usuários que têm idade superior a 60 anos?

  • a - SEARCH nome OF usuario WHERE idade > 60;
  • b - SEARCH nome FROM usuario WHERE idade > 60;
  • c - SELECT nome OF usuario WHEN idade > 60;
  • d - SELECT nome FROM usuario WHEN idade > 60;
  • e - SELECT nome FROM usuario WHERE idade > 60;

5 - Qual das alternativas abaixo possui o código necessário para atualizar um registro da tabela cidade, mudando o valor do campo cep para "77000-000" onde o nome da cidade for "Cariacica"?

  • a - INSERT INTO cidade (cep) VALUES "77000-000" WHERE nome = Cariacica;
  • b - INSERT INTO cidade.Cariacica (cep) VALUES "77000-000";
  • c - UPDATE cep OF cidade SET "74000-000" WHEN nome = "Cariacica";
  • d - UPDATE cidade SET cep="74000-000" WHERE nome="Cariacica";
  • e - INSERT cep="74000-000" WHERE nome="Cariacica" IN cidade;

6 - Qual das alternativas abaixo possui o código necessário para criar uma tabela chamada estadoBrasileiro, contendo os campos sigla (dois caracteres), nome (30 caracteres), capital (30 caracteres) e anoCriacao (inteiro)?

  • a - CREATE estadoBrasileiro WITH sigla (2), nome (30), capital (30), anoCriacao (int);
  • b - CREATE estadoBrasileiro WITH sigla (char(2)), nome (char(30)), capital (char(30)), anoCriacao (int);
  • c - CREATE TABLE estadoBrasileiro WITH sigla (2), nome (30), capital (30), anoCriacao (int);
  • d - CREATE (estadoBrasileiro WITH sigla (VARCHAR(2)), nome (VARCHAR(30)), capital (VARCHAR(30)), anoCriacao (int));
  • e - CREATE TABLE estadoBrasileiro (sigla VARCHAR(2), nome VARCHAR(30), capital VARCHAR(30), anoCriacao INT);

7 - Qual das chamadas de função a seguir é usada para criar uma conexão com o MySQL utilizando o usuário user, senha 12345, no servidor localhost?

  • a - connect("user", "12345", "localhost");
  • b - database_connect("user", "12345", "localhost");
  • c - db_connect("user", "12345", "localhost");
  • d - mysql_connect("user", "12345", "localhost");
  • e - mysql_connect("localhost", "user", "12345");

8 - Analise as alternativas a seguir. Assinale aquela na qual a função possui descrição incorreta:

  • a - O mysql_connect cria uma nova conexão com o MySQL.
  • b - O mysql_select_db seleciona qual banco de dados será usado.
  • c - O mysql_close fecha uma conexão existente.
  • d - O mysql_num_rows conta quantos registros existem na tabela cujo nome foi passado como parâmetro.
  • e - O mysql_fetch_assoc retorna os resultados de uma consulta na forma de um array associativo.

9 - Avalie as seguintes proposições como verdadeiras ou falsas:

  • I - A função mysql_affected_rows retorna o número de registros que foram afetados por uma consulta SQL anterior.
  • II - A função mysql_list_tables lista todas as tabelas do banco de dados cujo nome foi passado como parâmetro.
  • III - A função mysql_query retorna a string da última consulta SQL realizada.

A ordem correta das avaliações é:

  • a - I - V; II - V; III - F
  • b - I - F; II - F; III - F
  • c - I - V; II - V; III - V
  • d - I - F; II - V; III - V
  • e - I - V; II - F; III - V

10 - Analise, nas alternativas a seguir, aquela na qual a função possui descrição incorreta:

  • a - O mysql_fetch_array retorna o resultado de um select na forma de array.
  • b - O mysql_list_dbs lista todos os bancos de dados disponíveis no servidor.
  • c - O mysql_db_query faz uma consulta em todos os bancos, e retorna os dados daqueles bancos que contiverem a tabela consultada na query.
  • d - O mysql_drop_bd exclui um banco de dados.
  • e - O mysql_insert_id retorna o valor atual do auto-incremento de uma tabela.

10.1 - Direitos autorais e licença

  • Autor(es): Luiz H. Kowalski
  • Direito Autoral: Copyright © Sistemas Abertos
  • Licença: Esta obra está licenciada sob uma Licença Creative Commons.

Trilha I - Anexos: Intalação, Configuração e Conceitos

Anexo I1 - Conceitos utilizados

1.1 - Software Livre

Vejamos o conceito encontrado na página oficial do projeto GNU (http://www.gnu.org):

"Software Livre" é uma questão de liberdade, não de preço. Para entender o conceito, você deve pensar em "liberdade de expressão", não em "cerveja grátis".

"Software livre" se refere à liberdade dos usuários executarem, copiarem, distribuírem, estudarem, modificarem e aperfeiçoarem o software. Mais precisamente, ele se refere a quatro tipos de liberdade, para os usuários do software:

* A liberdade de executar o programa, para qualquer propósito (liberdade no. 0) * A liberdade de estudar como o programa funciona, e adaptá-lo para as suas necessidades (liberdade no. 1). O aceso ao código-fonte é um pré-requisito para essa liberdade. * A liberdade de redistribuir cópias de modo que você possa ajudar ao seu próximo (liberdade no. 2). * A liberdade de aperfeiçoar o programa, e liberar os seus aperfeiçoamentos, de modo que toda a comunidade se beneficie (liberdade no. 3). O acesso ao código-fonte é um pré-requisito para esta liberdade.

Um programa é software livre se os usuários tiverem todas essas liberdades. Portanto, você deve ser livre para redistribuir cópias, seja com ou sem modificações, seja de graça ou cobrando uma taxa pela distribuição, para qualquer um em qualquer lugar. Ser livre para fazer essas coisas significa (entre outras coisas) que você não tem que pedir permissão ou pagar por ela.

Você deve também ter a liberdade de fazer modificações e usá-las privativamente no seu trabalho ou lazer, sem nem mesmo mencionar que elas existem. Se você publicar as modificações, você não deve ser obrigado a avisar a ninguém em particular, ou de nenhum modo em especial.

A liberdade de utilizar um programa significa a liberdade para qualquer tipo de pessoa física ou jurídica utilizar o software em qualquer tipo de sistema computacional, para qualquer tipo de trabalho ou atividade, sem que seja necessário comunicar ao desenvolvedor ou a qualquer outra entidade em especial.

A liberdade de redistribuir cópias deve incluir formas binárias ou executáveis do programa, assim como o código-fonte, tanto para as versões originais quanto para as modificadas. Tudo bem se não for possível produzir uma forma binária ou executável pois algumas linguagens de programação não suportam este recurso, mas deve ser concedida a liberdade de redistribuir essas formas caso seja desenvolvido um meio de criá-las.

Para que haja a liberdade de fazer modificações e de publicar versões aperfeiçoadas, é necessário ter acesso ao código-fonte do programa. Portanto, acesso ao código-fonte é uma condição necessária ao software livre.

Para que essas liberdades sejam reais, elas precisam ser irrevogáveis desde que você não faça nada errado. Se o desenvolvedor do software tiver o poder de revogar a licença, mesmo que você não tenha dado motivo, é porque o software não é livre.

Entretanto, certos tipos de regras sobre a maneira de distribuir software livre são aceitáveis quando elas não entram em conflito com as liberdades principais. Por exemplo, copyleft (apresentado de forma bem simples) é a regra que dita que quando um programa é redistribuído, não é permitido adicionar restrições para negar à outras pessoas as liberdades principais. Essa regra não entra em conflito com as liberdades, na verdade ela as protege.

Portanto, você pode ter pago para receber cópias do software GNU, ou pode ter obtido cópias sem nenhum custo. Mas independente de como você obteve a sua cópia, você sempre terá a liberdade de copiar e modificar o software, ou mesmo vender cópias.

"Software Livre" não significa "não-comercial". Um programa livre deve estar disponível para uso comercial, desenvolvimento comercial, e distribuição comercial. O desenvolvimento comercial de software livre não é incomum; tais softwares livres comerciais são muito importantes.

Regras sobre como empacotar uma versão modificada são aceitáveis se elas não bloquearem a sua liberdade de distribuir versões modificadas. Regras como "se você tornou o programa disponível deste modo, você também tem que torná-lo disponível deste outro modo" também podem ser aceitas, da mesma forma. (Note que tal regra ainda deixa para você a escolha de tornar o programa disponível ou não.) Também é aceitável uma licença que exija que, caso você tenha distribuído uma versão modificada e um desenvolvedor anterior peça por uma cópia dele, você deva enviar uma.

No projeto GNU, nós usamos "copyleft" para proteger estas liberdades legalmente para todos. Mas também existe software livre que não é copyleft. Nós acreditamos que hajam razões importantes pelas quais é melhor usar o copyleft, mas se o seu programa é free-software mas não é copyleft, nós ainda poderemos utilizá-lo.

1.2 - Servidor Web

Um servidor web é um aplicativo responsável por fornecer ao computador do cliente (usuários de sites e páginas eletrônicas), em tempo real, os dados solicitados.

O processo se inicia com a conexão entre o computador onde está instalado o servidor e o computador do cliente. Como na web, não é possível prever a que hora se dará essa conexão, então, os servidores precisam estar disponíveis dia e noite. A partir daí é processado o pedido do cliente e, conforme as restrições de segurança e a existência da informação solicitada, o servidor devolve os dados.

Quando falamos em servidor web, estamos na verdade falando de servidores capazes de lidar com o protocolo HTTP, que é o padrão para transmissão de hipertexto. Muitos servidores trabalham, paralelamente, com outros protocolos, como HTTPS (que é o HTTP "seguro"), FTP, RPC, etc.

Além de transmitir páginas HTML, imagens e aplicativos Java, os servidores também podem executar programas e scripts, interagindo mais com o usuário, como por exemplo, interpretar scripts da linguagem PHP.

Deve-se lembrar que tais aplicativos se ligam ao servidor web através de portas de serviço, como por exemplo a porta 6667 muito utilizada por aplicativos IRC.

1.3 - Server Side

Aplicativos SERVER SIDE, ou melhor, aplicativos do 'lado do servidor', são aplicativos executados pelo próprio servidor web, que após realizar o processamento, devolve os resultados para a máquina do cliente, mais precisamente, para o browser do usuário que está acessando o web site.

Um exemplo prático é a linguagem PHP, que é executada no servidor web. Este devolve o resultado do processamento, através de código HTML, para a máquina do cliente.

1.4 - Client Side

Ao contrário de SERVER SIDE, aplicativos CLIENT SIDE são executados do lado do cliente, mais precisamente no próprio browser do usuário.

Um exemplo é o HTML e o Javascript, que são totalmente processados pelo navegador web do usuário, e não pelo servidor web.

1.5 - Interpretador CGI

CGI significa Common Gateway Interface. O sistema rodando nesse modo age da seguinte maneira: sempre que um script PHP vai ser interpretado, o servidor web gera uma nova instância (processo) do interpretador PHP, o qual interpreta o script. Isso significa que o PHP é executado em um processamento separado ao processamento do servidor web, o que pode causar uma degradação de desempenho.

1.6 - Módulo Apache

Quando o sistema PHP é compilado como módulo Apache, ele executa no mesmo espaço de endereços que o próprio processamento do servidor web e propicia, desse modo, uma melhora significativa de desempenho com relação aos interpretadores CGI tradicionais, onde os scripts são processados em instâncias separadas do interpretador.

1.7 - Configuração para utilizar a função mail():

Para que possamos iniciar a configuração do PHP para aceitar o envio de e-mails, precisamos primeiramente localizar o arquivo php.ini em nosso servidor. Independente da plataforma que está sendo utilizada, o arquivo de configuração sempre será o php.ini.

Na plataforma Windows você especificará um servidor de SMTP para que você possa enviar e-mails através de seus scripts. O servidor de SMTP não precisa estar instalado na mesma máquina que o Web server.

Então vamos à parte prática. Abra o arquivo php.ini, que provavelmente estará em C:\WINDOWS\ (ou C:\WINT). Localize dentro do arquivo o bloco idêntico ao bloco abaixo:

[mail function]
; For Win32 only.
;SMTP =
;sendmail_from =

; For Unix only.  You may supply arguments as well (default: 'sendmail -t -i').
;sendmail_path =

Observe que todas as linhas estão comentadas, ou seja, estão com um ponto e vírgula (;) no início das linhas. Para fazer a configuração para Windows você precisará deixar o seu bloco similar ao abaixo:

[mail function]
; For Win32 only.
SMTP = smtp.brturbo.com
sendmail_from =thiago_algo@brturbo.com

; For Unix only.  You may supply arguments as well (default: 'sendmail -t -i').
;sendmail_path =

Note que as duas linhas iniciadas com ';SMTP' e ';sendmail' foram substituídas por linhas iniciadas com 'SMTP' e 'sendmail', ou seja, foi retirado o comentário das linhas. Além disso foram acrescentados ao final da linha o servidor de SMTP e o e-mail padrão, smtp.brturbo.com e thiago_algo@brturbo.com , respectivamente. Você precisa especificar esses dados.

No caso de você estar utilizando o Linux (o que é altamente recomendado), é preciso especificar o caminho do aplicativo sendmail (sendmail_path). Para tanto, abra o arquivo php.ini, e retire o comentário da linha onde se encontra o 'sendmail_path'. Adicione ao final desta linha o caminho do aplicativo sendmail e pronto. Veja como fica o bloco, em um exemplo:

[mail function]
; For Win32 only.
;SMTP =
;sendmail_from =

; For Unix only.  You may supply arguments as well (default: 'sendmail -t -i').
sendmail_path = /usr/lib/postfix/

1.8 - Direitos autorais e licença

Anexo I2 - Instalação e Configuraçao do PHP

2.1 - Windows

2.1.1 - Download dos itens necessários

Para Windows, existem inúmeros pacotes que instalam e configuram automaticamente o PHP, o servidor Apache e o MySQL. Abaixo, segue uma lista de sugestões:

2.1.2 - Instalação

Ao terminar o download de algum dos pacotes acima, basta executar o instalador (duplo-clique sobre o arquivo) e seguir as instruções.

2.2 - Linux

A instalação do conjunto PHP + Apache + MySQL varia de distribuição para distribuição Linux. Existe uma versão do XAMPP para Linux, com todos os softwares necessários (e mais alguns adicionais) já incluídos. Este conjunto foi testado com sucesso nas distribuições SuSE, RedHat, Mandrake e Debian.

2.2.1 - Download dos itens necessários

2.2.2 - Instalação [1]

Após terminar o download do arquivo, pelo terminal, execute os passos a seguir:

  • Faça loguin como administrador do sistema:

su

Digite a senha de administrador. Pronto.

  • Extraia o conteúdo do pacote para o diretório /opt:

tar xvfz xampp-linux-1.7.2.tar.gz -C /opt

Esses passos instalam o XAMPP no diretório /opt/lampp.

  • Para iniciar os serviços do XAMPP, execute:

/opt/lampp/lampp start

Se tudo iniciar normalmente, você verá uma mensagem parecida com LAMPP started.

  • Para testar o funcionamento do servidor, abra um navegador e acesse:

http://localhost/

Você verá uma página de teste exibindo informações sobre o XAMPP.

2.2.3 - Instalando os programas separadamente no Debian Lenny [2]

  • Instalando o Servidor WEB Apache

O comando a seguir instala o servidor e a documentação:

# aptitude install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert

  • Instalando suporte a PHP 5 no Apache

O comando a seguir instala módulos adicionais ao apache, acionando suporte ao PHP:

# aptitude install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-json php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

Em seguida edite o arquivo dir.conf:

# nano /etc/apache2/mods-available/dir.conf

Altere a linha DirectoryIndex para:

DirectoryIndex index.html index.htm index.shtml index.cgi index.php index.php3 index.pl index.xhtml

  • Habilitando SSL

Edite o arquivo ports.conf:

# nano /etc/apache2/ports.conf

Acrescente as linhas:

Listen 80
Listen 443

  • Habilitando os módulos SSL, rewrite, suexec, include e php5

Execute os seguintes comandos:

# a2enmod ssl
# a2enmod rewrite
# a2enmod suexec
# a2enmod include
# a2enmod php5

Faça um reload na configuração do Apache com o comando

# sh /etc/init.d/apache2 force-reload

  • Instalando o Mysql

Execute a seguinte linha:

# aptitude install mysql-server mysql-client libmysqlclient15-dev

Verifique se o servidor está rodando de fato :

# netstat -tap

Se tudo estiver certo, você verá a seguinte linha entre as geradas:

tcp 0 0 *:mysql *:* LISTEN 3281/mysqld

  • Testando o LAMP

As páginas e scripts ficam armazenados no diretório /var/www. Crie um arquivo chamado index.php com o seguinte conteúdo:

<?php

phpinfo();

?>

A função phpinfo() gera uma tabela com muitas informações a respeito da instalação e configuração do servidor e do PHP. Se tudo estiver funcionando, você verá essa tabela de informações ao acessar o endereço:

http://localhost/index.php

2.2.4 - Referências

2.3 - Direitos autorais e licença

Trilha J - Projeto Prático

Lição J1 - Um pequeno projeto

Vamos criar um pequeno sistema de notícias, com cadastro e listagem.

1.1 - Funções e comandos PHP utilizados neste Projeto

  • echo - escreve na tela
  • include - inclui código de outro script php
  • mysql_connect - cria conexão com o mysql
  • mysql_select_db - seleciona banco de dados do mysql
  • mysql_query - executa consulta em banco de dados mysql
  • mysql_fetch_array - seleciona uma linha de uma consulta realizada em um banco de dados mysql

1.2 - Demonstração de Código - Banco de Dados

1.2.1 - Criação do Banco de Dados no MySQL

  • Conectando no banco de dados
mysql -u root -p 

  • Banco portal_noticias
mysql> CREATE DATABASE portal_noticias

  • Tabela Notícias
mysql> CREATE TABLE noticias ( titulo char(50), noticia text, link char(50));

1.2.2 - Populando o Banco de Dados

Façamos apenas uma inserção, para teste:

mysql> INSERT INTO noticias (titulo, noticia, link) VALUES ('NOTICIAS DO LIF', 'O Linux Install Fest esta muito bom!', 'http://www.sistemasabertos.com.br/installfest');

Vejamos se os dados foram inseridos:

mysql> SELECT * FROM noticias;

1.2.3 - Arquivo conectar.php - Conectando ao BD

Este script PHP fará a conexão com o banco de dados. Iremos incluí-lo em todas as páginas que necessitarem de comunicação com o banco de dados.

<?php

$host="localhost";  // altere esses dados, se necessário
$usuario="root";
$senha="";
$base="portal_noticias";

//Conecta ao servidor de BD
$conexao = mysql_connect($host,$usuario,$senha) or die ("Não foi possível
estabelecer a conexão com o servidor MySQL. Erro: " . mysql_error());

//Seleciona a base de dados
$db = mysql_select_db($base,$conexao) or die ("Não foi possível estabelecer
conexão com o banco de dados. Erro: " . mysql_error());
?>

1.2.4 - Arquivo index.php - Página inicial

Este arquivo será nossa página inicial. Ele contém os links necessários para acesso às funcionalidades do sistema.

<h1>Administracao do portal de noticias</h1>
<br /> <a href=visualizar.php> visualizar</a>
<br /> <a href=cadastrar.html> cadastrar </a>

1.2.5 - visualizar.php - Visualizando as notícias

Este script listará todas as notícias existentes no banco de dados. Através dele poderemos visualizar o conteúdo inserido.

<?php

include("conectar.php");

$query = mysql_query("select titulo, noticia, link from noticias");

echo "<H1>Portal de noticias</H1><hr>";
while ($linha=mysql_fetch_array($query))
{
echo $linha[0].
"<br />".$linha[1].
"<br /><A href=\"".$linha[2]."\">".$linha[2]."</a>".
"<hr>";
}
echo "<a href=index.php>voltar</a>";
mysql_close();
?>

1.2.6 - Arquivo cadastrar.html - Formulário de cadastro

Esta página estrutura o formulário utilizado para inserirmos as notícias no banco de dados.

<h1>Cadastro de noticias</h1>
<form action="cadastrar.php" method="get">
<table>
<tr>
<td>Titulo: </td>
<td><input type="text" name="titulo" size=50 /> </td>
</tr>
<tr>
<td>Texto: </td>
<td><textarea name="noticia" cols=50></textarea> </td>
</tr>
<tr>
<td>Link: </td>
<td><input type="text" name="link" size=50 /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="entrar" /><input type="reset" value="limpar" /></td>
</tr>
</table>
</form>

1.2.7 - cadastrar.php - Cadastro da notícia

Este script é o responsável por salvar os dados enviados pelo formulário de inserção no banco de dados:

<?php
include("conectar.php");

$titulo = $_GET['titulo'];
$noticia = $_GET['noticia'];
$link = $_GET['link'];

$sql = "insert into noticias (titulo, noticia, link) values ('$titulo', '$noticia', '$link')";
$result = mysql_query($sql);

if(!$result){
echo "Erro ao inserir os dados... Tente novamente.";
}
else {
echo "Cadastro efetuado com sucesso. <a href=index.php>voltar</a>";
}
mysql_close();
?>

1.2.8 - Link para o Portal de Notícias

Portal de Notícias

1.3 - Direitos autorais e licença

toggleopenExibir anexostogglecloseEsconder anexos
Anexos do tópico
I Anexo Ação Tamanho Data Quem Comentário
elsephp instrucaoif.php gerenciar 0.1 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp instrucaoelseif.php gerenciar 0.2 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp instrucaoifthenelse.php gerenciar 0.1 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp sess3.php gerenciar 0.5 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp pag.php gerenciar 0.5 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp sessao.php gerenciar 0.1 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp verificar.php gerenciar 0.4 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp sess2.php gerenciar 0.7 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp validar.php gerenciar 0.7 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp login.php gerenciar 0.2 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp criar.php gerenciar 0.4 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp cadastro.php gerenciar 0.4 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp visualizar.php gerenciar 0.4 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp sess1.php gerenciar 0.8 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp acessar.php gerenciar 0.3 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp logout.php gerenciar 0.2 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp sair.php gerenciar 0.1 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp estruturaswitch.php gerenciar 0.3 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp entrar.php gerenciar 0.4 K 10 Nov 2009 - 15:49 UnknownUser  
elsephp pag2.php gerenciar 0.5 K 10 Nov 2009 - 15:49 UnknownUser  
Editar | Anexar | Impressão | Texto Puro | Referências: Web, Global | Histórico: r1 | Mais ações de tópico
 
Powered by TWiki
This site is powered by the TWiki collaboration platform Copyright © 2003 - 2010, pelos autores colaboradores. Todo o conteúdo desta página pode ser utilizado segundo os termos da Licença Creative Commons: Atribuição, Uso não Comercial e Permanência da Licença, salvo disposição em contrário indicada de forma explícita no tópico correspondente.