Curso de PHP e MySQL
Ministrantes:
Flávio S. Gonzaga bim@inf.ufsc.br Guilherme Birckan birckan@inf.ufsc.br
Distribuição do curso
Módulo 1:
Banco de Dados MySQL
Módulo 2:
Módulo 1
MySQL
Introdução
! SQL: Linguagem de Banco de Dados (Oracle, MySQL, mSQL, Unix dbm, Sybase, etc)
! MySQL: Servidor de Banco de Dados multi-usuário, multi-thread. Principais vantagens: Velocidade
Robustez
Origem
!Empresa desenvolvedora: T.c.X. DataKonsultAB
!A equipe tem usado o MySQL
desde 1996 em um ambiente com mais de 40 Banco de Dados con-tendo 10.000 tabelas, somando aproximadamente 100Gbytes de Dados.
Características
! Manipula um número ilimitado de usuários simultâneos
! Alta velocidade de execução ! Permite 16 índices por tabelas
! Trabalha com diferentes plataformas: Unix, Windows, etc
! Sistema de privilégios flexível, simples, eficiente e seguro, que permite
Características
! Disponibiliza diversos tipos de dados: INT(inteiros sinalizados e não
sina-lizados de 1,2,3,4,8 bytes), FLOAT,
DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP,
YEAR, SET, ENUM
! Suporte completo a operadores e
funções nas cláusulas SELECT e WHERE ! Suporte às cláusulas GROUP BY e
ORDER BY e à funções de grupo
Características
! Tabelas de disco sob a forma Árvore-B
rápidas com compressão de índices
! Disponibiliza registros de tamanhos
fixos e variados
! Manipula grandes Bancos de Dados, na
ordem de 50.000.000 registros
! Escrita em C e C++. Testada com
diferentes compiladores
! Possui sistema de alocação de memória
Características
! DELETE, INSERT, REPLACE e UPDATE devolvem o número de linhas afetadas pelo comando
! Nomes de funções não entram em conflito com nomes de tabelas ou colunas
! O servidor pode emitir mensagens de erros em diversas linguagens
! Clientes podem conectar ao servidor
MySQL utilizando conexões TCP/IP, Unix sockets ou sob o Windows NT
Estrutura
!A estrutura que mantém os blocos (ou registros) de informações é a
TABELA
!Estes registros são constituídos
por objetos menores chamados de tipos de dados
!Hierarquia : Banco de Dados >
Tipos de Dados
!CHAR(M): Strings de tamanho fixo entre 1 e 255 caracteres
!VARCHAR(M): Strings de tamanho flexível entre 1 e 255 caracteres
!INT(M) [Unsigned]: números inteiros entre –2147483648 e 2147483647. A opção Unsigned usa o intervalo 0 e
4294967295(inteiros não sinalizados) !FLOAT[(M,D)]: números decimais
Tipos de Dados
!DATE: informação relativa a datas. Padrão: YYYY-MM-DD
!TEXT/BLOB: String entre 255 e
65535 caracteres. Diferença: TEXT é insensível ao caso, e BLOB não
!SET: conjunto de valores de strings !ENUM: conjunto de valores
Opções especiais
!Primary key: usada para diferen-ciar um registro do outro. Cada registro desta forma não pode ter a mesma chave primária
!Auto_increment: a coluna é
automa-ticamente incrementada quando se insere um registro
!NOT NULL: não permite a inserção de valores nulos
O sistema de privilégios
!Determinar as permissões de um determinado usuário em um
determinado HOST para
determinadas tabelas
!Permissões: inserir, atualizar,
excluir informações de uma tabela; criar, modificar tabelas, etc.
O ambiente MySQL
!Para entrar no ambiente: SHELL> mysql –u user –p Enter: password: ****** !Prompt do ambiente:
mysql> !Para sair:
Comandos
!Mostrar Base de Dados existentes: mysql> show databases;
!Criar uma Base de Dados: mysql> create database
DATABASE;
!Usar uma Base de Dados existente: mysql> use Nome;
Comandos
! Criar uma tabela:
mysql> create table ALUNO (
ID int auto_increment primary key, Nome varchar(40),
Email varchar(30), DataNasc date,
Matricula char(9) );
Comandos
!Mostrar tabelas:
mysql> show tables;
!Mostrar descrição de uma tabela: mysql> desc TABELA;
!Alterar campos de uma tabela:
mysql> alter table TABELA drop Campo; mysql> alter table TABELA
Comandos
!Inserir registros em uma tabela:
mysql> insert into TABELA values( NULL, ‘valor_string’, valor_numero ); !Pesquisa de Dados:
mysql> select * from TABELA;
mysql> select Campo1 from TABELA where Campo1 < 10;
mysql> select Campo1, Campo2 ... CampoN from TABELA;
Comandos
!Apagar registros de uma tabela:
mysql> delete from TABELA where Campo=‘valor’;
!Atualizar registros de uma tabela: mysql> update TABELA set
Campo=‘valor’ where Campo2=‘valor’;
!Apagar uma tabela:
Comandos
! Apagar uma database:
mysql> drop database DATABASE;
! Adicionando um usuário e seus privilégios: mysql> grant all privilegies on
DATABASE.TABELA to user@host identified by ‘senha’;
! Sair do Mysql: mysql> quit;
Exercício
• Crie uma tabela com no mínimo cinco campos e três tipos de dados diferentes. (Sugestão: varchar, int, date). Esta tabela deve possuir uma chave primária.
• Faça consultas de inserção, alteração e remoção de dados sobre esta tabela.
Módulo 2
PHP
Introdução
! Linguagem de SCRIPT do lado do servidor, embutida no HTML, portanto a instalação é feita no servidor WEB
! Para UNIX é FREE, assim como o MySQL
! O código é encapsulado em TAGS (<?PHP ...
?>) dentro do próprio arquivo HTML,
mudando apenas a extensão do arquivo para
.php3 ou .php
! Diferente de JavaScript, o código fonte não é mostrado.
Um breve histórico
! Concebido por Rasmus Lerdof
! Primeira versão utilizada em 1995 e
conhecida como Personal Home Page Tools ! Estima-se no final de 1996: 15000 sites
Metade de 1997: 50000 sites
! O analisador foi reescrito por Zeev Suraski e Andi Gutmans formando a base do PHP
Principais Características
!include, require
!Tratamento automático de variáveis de formulários
!Suporte a orientação a objetos !Fácil interação com banco de
dados
!Manipulação de cookies !Upload de arquivos
Um pequeno exemplo
!O script a seguir mostra a data atual: <html><body>
<?php /* Início da TAG do PHP */ $hoje = date(“Y-m-d”);
print “<br>Hoje é dia: $hoje”; ?>
Comentários
!Todo programa deve conter comentá-rios para futuras consultas:
// ou # comentário da linha /* ... */ comentário em bloco Exemplo:
$base = 2 # Atribuindo o valor da base $altura = 10 // o mesmo para a altura /* Pronto, acabamos de atribuir os
Variáveis
!Não é necessário declarar !Basta usar o $ antes dela !Não tipada
Operadores
!Aritméticos: + - * / % !Atribuição: =
!Concatenação de string: .
!Lógicos: and, or, ||, &&, !, xor !Comparação: ==, !=, <, >, <=, >= !Incremento: $v++, ++$v
Operações matemáticas
!Segue o padrão das demais linguagens ( + , - , * , / , %, sin() , cos() ...)
Conjunto completo de operações:
http://br.php.net/manual/ref.math.php
!Exemplo:
$valorbruto = 10;
$desconto = 10 * $valorbruto / 100;
Operações com strings
!Concatenação: “.”
!Número de caracteres: strlen(“string”) !Substring: substr(“string”,2,3) -> rin
Segundo parâmetro: início da string Terceiro parâmetro: tamanho
!Converte os primeiros caracteres em maiúsculas: ucwords(“string”)
Operações com strings
!Verificar se um caracter (ou substring) está contido em uma string:
strpos(“string”,”substring/caracter”) if strpos($email,”@”) {
echo “Email parece correto.\n”; }
!Outras funções relacionadas:
Estruturas de Controle
if ( condição ) { ... } elseif { ... } else { ... } Switch ($var) { case “a”: ...; break; default: ...; break; }Estruturas de repetição
while ( condição ) { ... } do { [break / continue] ... } while (condição);for ( $i=0; $i<=$size; $i++) { ... } foreach($elemento in $lista ) { ... }
Exercício
!Faça um script que conte o
número de vogais existentes em uma frase
Solução
<?PHP $palavra = strtoupper($p); $cont=0; for ($i=0;$i<strlen($palavra );$i++) { switch ($palavra[$i]) { case "A": case "E": case "I": case "O": case "U": $cont++; break; } }print "Total de vogais da palavra $p:
$cont"; ?>
Arrays
Simples: $gostosas[0] = “Tiazinha”; $gostosas[1] = “Feiticeira”; $lista2[“a”] = “elemento”; if ( in_array(“Feiticeira”, $gostosas ) ) { ... }Arrays
Multidimencionais: $a[1][2] = 33123;
$conta[“sala”][3][“mesa”][8] = “Professor”; Funções:
$comidas = array(“arroz” , “feijão”, “bife”); array_pop( $comidas, “batata frita” );
array_push( $comidas ); sort($comidas);
Variáveis de variáveis
$a = “hello”;
$$a = “world”; # $hello = “world”
echo “$a $a{$a}”; # saída: “hello world” $checkbox42 = “banana”;
$i = 42;
$nome = “checkbox”.$i;
Exercício
Você tem uma variável $total que
contém o total de variáveis do tipo $checkbox1 ... $checkboxn
Coloque todas elas em um array e depois imprima todos em ordem inversa.
Solução
for ($i=1; $i <= $total; $i++) { $temp = “checkbox” . $i;
$lista[$i] = ${$temp}; }
for ($i=$total; $i >= 1; $i--) { echo $i . “: $lista[$i] <br>”; }
Funções
!Precisam ser declaradas
!Parâmetros por valor ou referência !Quantidade variável de parâmetros !Valor default para parâmetros
!Não pode ser redefinida
function fatorial( $inteiro ) { ...
Suporte a OO
Class Pessoa { var $nome; var $idade; function incrementeIdade() { $this->idade++; } }Suporte a OO
class Pessoa { var $nome; var $idade = 0; function incrementeIdade() { $this->idade++; } function setNome($nNome){ $this->nome = $nNome; } }class Aluno extends Pessoa { var $matricula;
function Aluno($m) { $this->matricula = $m; }
}
$joao = new Aluno(“972”); $joao->setNome(“João”); $joao->incrementeIdade();
Exercício
• Crie uma Classe com no mínimo 5 atributos, 4 funções (pelo menos uma retorne um valor) e um
Acesso a Banco de Dados
!Suporte nativo a: ADABAS, ORACLE, SYBASE, SQL SERVER, DBASE,
INFORMIX, mSQL, MySQL, POSTGRESQL, ODBC
!MySQL: servidor de banco de dados que utilizaremos
!Acesso: criar banco de dados, fazer conexão, selecionar database, fazer
Funções para uso do
MySQL
mysql_connect( $host, $user, $passwd ) mysql_select_db($dbname);
mysql_query(“insert into Aluno values(“Antonio”, 35)”)
$res = mysql_query(“select * from Aluno”) while ( $linha = mysql_fetch_array($res) ) {
echo $linha[´Nome´] . “<br>”; }
Exercício
• Faça um script para inserir um
registro e, em seguida, mostrar os dados da tabela alunos.
+---+---+ | Field | Type | +---+---+ | id | int(11) | | matricula | varchar(5) | | senha | varchar(32) | | nome | varchar(250) | | fone | varchar(20) | | data_inscricao | datetime | +---+---+
Sugestão
mysql_connect(“localhost”,”aluno”,”aluno”) OR DIE ("Erro ao conectar!");
mysql_select_db(“CursoPHP”); $senha = “minhaSenhaFácil”;
$res = mysql_query( "insert into alunos values (null, “345”, ‘$senha’, “Juli”, “2251932”, sysdate() );
$result = mysql_query( "select * from alunos“ ); $num=mysql_numrows( $result );
$i=0;
while ($i<$num) {
$matr = mysql_result( $result, $i, ”matricula”); $nome = mysql_result( $result, $i, ”nome”); ...
print ”Matrícula: $matr<br>Nome: $nome<br>...<hr>"; $i++;
HTTP & FTP
• header ("Location: http://www.php.net");
• setcookie (nome [, valor [, int expire [, path [, domain [, secure]]]]])
• $conn = ftp_connect(“ftp.matrix.com.br”); $log = ftp_login($conn, “login”, “pass”); ftp_put($con, “arq_remoto”, “arq_local”, FTP_ASCII/FTP_BINARY);
Exercício
• Faça um script que armazene um
cookie com o valor do IP do usuário e em seguida envie um arquivo qualquer por FTP. Se o cookie estiver setado
apenas redirecione o usuário para a página da INF.
Sugestão
<?php
if (isset($ip)) {
header( "Location: http://www.inf.ufsc.br“ ); }else{
setcookie ("ip" , $REMOTE_ADDR);
$conn = ftp_connect("devel.matrix.com.br"); $log = ftp_login($conn, "php", "php");
ftp_put($conn, "arq_remoto", "teste_ftp",FTP_ASCII); ftp_quit($conn);
print "O arquivo foi enviado com sucesso."; }
Controle de Sessão
• Preservar dados em acessos subseqüentes
• Registrar variáveis de sessão • session_start();
• session_register(”USER"); • session_destroy();
Exercício
• Faça um script para autenticar um usuário da tabela alunos. Crie um formulário de login e verifique a senha do usuário, se conferir crie uma variável de sessão com o número da
matrícula do usuário.
• Sugestão: um arquivo para o formulário de login, outro para checar usuário e um último com a página protegida.
Sugestão
<?php // Arquivo: verifica.phpsession_start();
mysql_connect(“localhost”,”aluno”,”aluno”) OR DIE ("Erro ao conectar!"); mysql_select_db(“CursoPHP");
$res = mysql_query("select * from alunos where matricula='$matr' and senha='$senha'"); $num = mysql_numrows($res); if ($num==0) { header("Location: form.php"); } else { $SESSION_MATR = mysql_result($res,0,"matricula"); session_register("SESSION_MATR"); header("Location: passou.php"); } ?>
Sugestão (cont.)
<?php // passou.php session_start(); session_register("SESSION_MATR"); function test_login() { global $SESSION_MATR; if (!isset($SESSION_MATR)) { header("Location: form.php"); } } test_login();print "hello world!"; ?>
Tratamento de arquivos
int fopen($filename, “mode”, [$dir] ) int fclose($fp)
“mode” pode ser: !r / r+
!w / w+ !a / a+
Tratamento de arquivos
fgets($fp, $tamanho) filesize( $filename )
fread ($fp, filesize ($filename)) feof(int fp)
Exemplo:
$nome = "/tmp/teste.txt"; $fp = fopen ($nome, "r");
$contents = fread ($fd, filesize ($nome)); fclose ($fp);
Tratamento de arquivos
$fp = fopen(“/tmp/teste.txt”, “a”); fwrite($fp, “bla bla bla \n”);
fclose($fp); $fp = fopen ("/tmp/teste.txt", "r"); while ( !feof($fp) ) { $buffer = fgets($fp, 4096); echo “$buffer <br>”; } fclose ($fp);
Exercício
Fazer um contador de acesso de uma página utilizando arquivos.