Você está na página 1de 9

Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

Capítulo 4. Introdução ao MySQL

Índice

Breve resumo das funções SQL


Tipos de campo
Facilitando a sua vida
Alterando dados do banco de dados
Conectando-se ao servidor de banco de dados
Inserindo dados na tabela
Alterando dados já existentes
Apagando uma linha
Exibindo Dados
Trazendo os dados
Criando queries flexíveis
Na prática
No mundo real

Resumo

O MySQL é um gerenciador de banco de dados que, assim como o PHP, é gratuito e de código aberto. Ele utiliza a
linguagem de programação SQL (Structured Query Language), que é um padrão e a linguagem mais usada em
bancos de dados. Existem vários bancos de dados que suportam e seguem o padrão SQL, porém cada um deles
possui extensões proprietárias que possibilitam novas funcionalidades ao padrão. Como exemplo, podemos citar o
PostgreSQL, que também tem código aberto e é gratuito, além de funcionar igualmente bem com o PHP. Também
existe o Microsoft SQL Server, que não é gratuito, não possui código aberto e é bastante usado em corporações.

Na internet atual, praticamente todos os servidores de hospedagem suportam MySQL, exatamente pelo fato dele ser
gratuito como o PHP e os dois trabalharem muito bem em conjunto.

Esse curso não tem como objetivo ensinar MySQL e nem conceitos avançados de banco de dados. O objetivo é
ensinar PHP e como usá-lo junto do MySQL na construção de sites dinâmicos. Portanto, caso você não entenda
nada que diga respeito ao banco de dados, faça alguma pesquisa sobre os conceitos básicos desse assunto; não é
nada complicado. Apesar disso, esse capítulo explica alguns conceitos muito básicos da linguagem SQL e nada
muito além disso. Nos capítulos seguintes, exemplos mais detalhados virão sobre as funções do MySQL.

Breve resumo das funções SQL


Abaixo segue um breve resumo das funções que manipulam tabelas em SQL.

Exemplo 1.1. Criando tabelas

CREATE TABLE nome_da_tabela (


nome_do_campo tipo_do_campo,
outro_campo tipo_do_campo,
...
)

Tipos de campo

Existem vários tipos de campos nas tabelas SQL; os tipos de campos funcionam da mesma maneira como
funcionam os tipos de variáveis em linguagens de programação fortemente tipada (que não é o caso do PHP). Abaixo
segue uma lista com os tipos mais usados:

1 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

Tipo Descrição
tinyint Números inteiros de -128 a 127 (signed) ou de 0 a 255 (unsigned).
Números inteiros de -2147483648 a 2147483647 (signed) ou então de 0 a 4294967295
integer / int
(unsigned).
Números inteiros de -9223372036854775808 a 9223372036854775807 (signed) ou de 0 a
bigint
18446744073709551615 (unsigned).
bool / boolean / bit Indica falso (zero) ou verdadeiro (qualquer número diferente de zero).
Números reais de -3.402823466E+38 a -1.175494351E-38 e de 1.175494351E-38 a
float(m,d)
3.402823466E+38. m representa o tamanho do número de d representa o número de decimais.
Uma string de tamanho fixo. m representa o tamanho da coluna. Caso o dado guardado nessa
char(m) coluna seja menor que m, a diferença é preenchida com espaços vazios. Caso m não seja
declarado, o tamanho considerado é 1. O tamanho vai de 0 a 255.
Funciona da mesma maneira que o char, porém o tamanho da string não é fixo (não existe o
varchar(m)
preenchimento com espaços).
text / blob Strings com máximo de 65,535 caracteres.
tinytext / tinyblob Strings com máximo de 255 caracteres.
mediumtext /
Strings com máximo de 16,777,215 caracteres.
mediumblob
longtext / longblob Strings com máximo de 4,294,967,295 caracteres ou 4GB.
enum Guarda uma string que precisa ser igual a algum item da lista valor1, valor2,.... A lista pode ter
('valor1','valor2',...) no máximo 65,535 itens.
Datas com valor entre '1000-01-01' e '9999-12-31'. Perceba que o formato suporta é 'AAAA-
date
MM-DD'.
time Horas com valor entre '-838:59:59' e '838:59:59'. O formato é 'HH:MM:SS'.
Combinação entre date e time. O formato é 'AAAA-MM-DD HH:MM:SS'. Suporta valores entre
datetime
'1000-01-01 00:00:00' e '9999-12-31 23:59:59'.
year Guarda somente o ano de uma data, em quatro dígitos.

Exemplo 1.2. Apagando tabelas

DROP TABLE nome_da_tabela

Exemplo 1.3. Inserindo dados na tabela ( Primeiro Modo )

INSERT INTO
nome_da_tabela
SET
nome_da_coluna='dado_a_ser_inserido',
outra_coluna='outro_dado', ...

Exemplo 1.4. Inserindo dados na tabela ( Segundo Modo )

INSERT INTO
nome_da_tabela (coluna1, coluna2,...)
VALUES
(valor_da_coluna1, valor_da_coluna_2,...)

Exemplo 1.5. Alterando dados da tabela

UPDATE
nome_da_tabela
SET
coluna1='valor_da_coluna1',
coluna2='valor_da_coluna2', ...
[WHERE condição_para_alteração]

2 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

[ORDER BY coluna]
[LIMIT número_máximo]

Exemplo 1.6. Apagando dados da tabela

DELETE FROM
nome_da_tabela
[WHERE condição_para_apagamento]
[ORDER BY coluna]
[LIMIT número_máximo]

Exemplo 1.7. Selecionando dados da tabela

SELECT colunas_a_selecionar
FROM
nome_da_tabela
[WHERE condição_para_seleção]
[ORDER BY coluna]
[LIMIT número_máximo]

Facilitando a sua vida

Sabendo ou não sabendo MySQL, existem ferramentas que ajudam bastante a construção e manutenção de bancos
de dados; uma delas (a mais usada na internet) é o phpMyAdmin. Com ele você pode criar tabelas, apagar tabelas,
inserir dados e fazer muitos outras coisas sem saber muito de SQL, apenas usando formulários. Caso você use um
servidor pago, é muito provável que ele já tenha o phpMyAdmin instalado; em dúvida, contate o administrador de
rede.

Alterando dados do banco de dados


Conectando-se ao servidor de banco de dados

Antes de poder fazer qualquer coisa relacionada ao bando de dados, precisamos conecetar o script atual ao servidor
MySQL e selecionar a tabela que desejamos usar. Faremos isso através das funções mysql_connect() e
mysql_select_db().

resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]])

bool mysql_select_db ( string database_name [, resource link_identifier])

Exemplo 1.8. Conectando-se ao servidor de banco de dados

<?php
$servidor = 'localhost';
$usuario = 'jose';
$senha = 'banana';
$db = 'minhaDB';

// Criamos uma variável $conexao que contém o resource do


// mysql_connect. Teste para tratar erros.
if ($conexao = mysql_connect($servidor,$usuario,$senha)) {

// Agora selecionamos a base de dados


if (!mysql_select_db($conexao) {
echo 'Não foi possível selecionar a base de dados';
}
}
else {
echo 'Não foi possível conectar-se ao servidor de bando de dados';
}
?>

Note que no exemplo acima o servidor MySQL está no mesmo computador que o servidor web (localhost), porém
isso nem sempre acontece. Caso você esteja rodando um servidor em sua casa, esse com certeza é o caminho,

3 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

porém se você está usando algum outro servidor, contate o administrador para obter informações sobre o endereço
de seu servidor de banco de dados.

Inserindo dados na tabela

Agora que já nos conectamos ao servidor de banco de dados, resta saber como executar queries a partir do PHP. A
função mysql_query() faz isso e retorna false em caso de erro e um resource em caso de sucesso.

resource mysql_query ( string query [, resource link_identifier])

Para fazer os exemplos dessa capítulo, usaremos a seguinte tabela:

Exemplo 1.9. Tabela 'carro'

CREATE TABLE carro (


codigo integer auto_increment not null primary key,
nome varchar(20) not null,
marca varchar(20) not null,
cor varchar(10) not null,
ano year not null
)

Perceba que esse tabela usa algumas funções que ainda não foram mencionadas nos capítulos anteriores.

not null : colunas not null não podem ser deixadas vazias, quando uma nova linha é inserida.

auto_increment : quando uma coluna tem a propriedade auto_increment, ela funciona como um índice. A
cada inserção na tabela, o número dessa coluna é aumentado. As colunas auto_increment precisam ser not
null e precisam ser número inteiros (int, longint, mediumint ou tinyint). Por serem automáticos, os dados
dessa coluna não podem ser alterados.

primary key : indica que a coluna é chave primária. Ela é única e precisa ser not null.

Exemplo 1.10. Executando a query de inserção

<?php

// Primeiramente criamos uma string contendo a


// query que executaremos no MySQL
$sql = "INSERT INTO carro
SET
nome='Golf GTI',
marca='Volswagen',
cor='Preto',
ano='2002'";

// Agora é só executá-la através da função mysql_query().


// Como sempre, é bom testar o comando
if (!$resultado = mysql_query($sql))
die (mysql_error());
?>

Dica

O exemplo acima leva em conta que os comandos de conexão com o banco de dados já
foram executados.

No exemplo acima, criamos um variável $sql e colocamos a query dentro dela (string); feito isso, a única coisa que
restava fazer, era executá-la e fizemos isso através da função mysql_query(). Para tratar um possível erro, usamos as
funções die() e mysql_error(). A primeira exibe uma mensagem e pára a execução do script. Já a segunda retorna

4 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

uma string contendo a mensagem de erro da última operação MySQL executada.

string mysql_error ( [resource link_identifier])

Note que tanto na função mysql_query() quanto na função mysql_error(), poderíamos ter passado como parâmetro a
variável que contém o resource de conexão com o MySQL, ou seja, a variável $conexao. Porém, isso não foi
necessário, pois quando esse parâmetro não é passado para essas funções, elas usam a última conexão feita com
sucesso dentro do script. Se por um acaso você esteja usando mais de uma conexão em seu script, daí sim seria
preciso indicar a variável de conexão.

Dica

Aspas e apóstrofes: não se esqueça de colocar apóstrofes quando for inserir algo em uma
tabela do banco de dados. Caso você esqueça, o MySQL não saberá que aquilo é uma
string e não um nome de tabela ou um nome de coluna; conseqüentemente, a query não
funcionará.

Alterando dados já existentes

Para alterar dados já existentes em uma tabela, usaremos a função UPDATE do MySQL porém o código em PHP ficará
idêntico ao código acima (afinal, a única coisa que realmente muda é a query). Portanto, temos:

Exemplo 1.11. Executando a query de alteração

<?php
$sql = "UPDATE carro
SET
cor='Verde',
ano='2004'
WHERE
nome='Golf GTI'
AND
cor='Preto'
AND
ano='2002'
LIMIT 1";

if (!$resultado = mysql_query($sql))
die (mysql_error());
?>

A query do exemplo acima altera na tabela carro os valores cor('Verde') e ano('2004') onde o nome do carro for 'Golf
GTI', a cor for 'Preto' e o ano for '2002'. O comando LIMIT 1 serve para, caso existam mais de um Golf GTI preto e
ano 2002 na tabela, apenas um deles seja alterado. Se todos os comando após o WHERE fossem retirados, os campos
cor e ano de todas as linhas da tabela receberiam os valores 'Verde' e '2004'.

Apagando uma linha

Através da função DELETE do SQL, podemos apagar linhas de nossa tabela.

Exemplo 1.12. Executando a query de alteração

<?php
$sql = "DELETE FROM carro
WHERE
nome='Golf GTI'
AND
cor='Verde'
AND
ano='2004'

5 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

LIMIT 1";

if (!$resultado = mysql_query($sql))
die (mysql_error());
?>

Essa query apaga a linha onde o carro for Golf GTI, a cor for verde e o ano for 2004. Novamente, o LIMIT 1 existe
para apagar apenas uma das ocorrências da condição (caso existam mais que uma).

Exibindo Dados
Resumo

As queries de INSERT e UPDATE não solicitam nenhuma informação do banco de dados, elas apenas alteram a tabela.
Mas e quando quisermos pegar informações da tabela do MySQL?

Trazendo os dados

Como você já deve estar imaginando, para buscar informações do banco de dados, precisaremos escrever uma
query em SQL, que vai fazer todo o trabalho para a gente. Feita a query, precisaremos executá-la, através da função
mysql_query(), como vimos há pouco. Porém, agora não pararemos por aqui, pois essa função ainda não nos retorna
os dados, como queremos. Teremos de usar mais uma função nova, chamada mysql_fetch_array.

array mysql_fetch_array ( resource result [, int result_type])

Dica

"fetch", do inglês, significa: "buscar, trazer, extrair".

Essa função recebe uma variável contendo um resultado de um query (mysql_query) e retorna um array associativo e
numérico contendo os dados recebidos do SQL. Ela faz isso uma linha por vez, por isso será necessário usar um
while para ter acesso a todas as linhas da tabela. Veja no exemplo abaixo (ainda usando a tabela 'carro', do capítulo
anterior).

Exemplo 1.13. Retornando e tratando dados

<?php
$servidor = 'localhost';
$usuario = 'jose';
$senha = 'banana';
$db = 'minhaDB';

// Primeiramente nos conectamos ao servidor


if ($conexao = mysql_connect($servidor,$usuario,$senha)) {

// E selecionamos uma base de dados


if (!mysql_select_db($conexao) {
echo 'Não foi possível selecionar a base de dados';
}
}
else {
echo 'Não foi possível conectar-se ao servidor de bando de dados';
}

// Criamos a query. O asterisco significa todos, portanto


// a query abaixo pega todas as colunas da tabela carro
$sql = "SELECT * FROM carro";

// Executamos a query
$resultado = mysql_query($sql);

6 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

// Agora precisaremos passar todas as informações retornadas


// pelo MySQL para um array.
while ($linha = mysql_fetch_array($resultado)) {
echo 'Código: ' . $linha['codigo'] . "<br />\n";
echo 'Carro: ' . $linha['nome'] . "<br />\n";
echo 'Marca: ' . $linha['marca'] . "<br />\n";
echo 'Cor: ' . $linha['cor'] . "<br />\n";
echo 'Ano: ' . $linha['ano'] . "<br />\n";
}

?>

A cada ciclo do while($linha = mysql_fetch_array($resultado)), a variável $linha recebe os dados da linha atual do
resultado da query; quando um ciclo termina, automaticamente o apontador da linha vai para a próxima e $linha
recebe as informações dessa linha. Quando não existir mais linhas para trazer, a variável $linha não recebe
mysql_fetch_array($resultado) e o while pára.

Como foi dito acima, a função mysql_fetch_array retorna uma array associativo e númerico, portanto podemos acessar
os valores de $linha através do nome das colunas ou então do número das colunas. Um pouco confuso, mas fica
mais fácil de entender pelo exemplo abaixo, que simula o resultado do script acima.

Array
(
[cod] => 1
[0] => 1
[nome] => Golf GTI
[1] => Golf GTI
[marca] => Volkswagen
[2] => Volkswagen
[cor] => Preto
[3] => Preto
[ano] => 2002
[4] => 2002
)

Perceba que usar $linha['nome'] é exatamente a mesma coisa que usar $linha[1]; apesar do resultado ser o mesmo,
o primeiro exemplo é relativamente mais fácil, pois você não precisa ficar pensando em qual será o número da coluna
que você deseja obter o valor, basta saber o nome dessa coluna.

Outro exemplo

Caso você não entenda muito de SQL, abaixo segue alguns exemplos de queries de SELECT diferentes dos exemplo já
mostrados aqui.

Exemplo 1.14. Retornando e tratando dados

<?php

// Seleciona apenas os dados das colunas 'nome' e 'marca' da tablea 'carro'


$sql = "SELECT nome, marca FROM carro";

// Seleciona todas as colunas da tabela 'carro' onde o 'ano' é igual a '2004'


$sql = "SELECT * FROM carro WHERE ano='2004' ";

// Seleciona todas as colunas da tabela 'carro' onde o 'ano' é menor que '2000'
$sql = "SELECT * FROM carro WHERE ano < '2000' ";

// Seleciona todas as colunas da tabela 'carro' e retorna os dados em


// ordem crescente com relação a coluna 'nome'
$sql = "SELECT * FROM carro ORDER BY nome ";

// Seleciona todas as colunas da tabela 'carro' e retorna os dados em


// ordem decrescente com relação a coluna 'marca'
$sql = "SELECT * FROM carro ORDER BY marca DESC";

// Seleciona todas as colunas da tabela 'carro' onde o 'nome'


// começar com a letra 'g'. Você pode usar essa função

7 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

// para fazer pesquisas na tabela


$sql = "SELECT * FROM carro WHERE nome LIKE "g%"";

// Seleciona todas as colunas da tabela 'carro' onde o 'nome'


// tiver a letra 'g'. Você pode usar essa função para fazer
// pesquisas na tabela
$sql = "SELECT * FROM carro WHERE nome LIKE "%g%"";

?>

Criando queries flexíveis


Resumo

Se juntarmos uma query string com um sistema parecido com o que acabamos de aprender, poderemos ter queries
flexiveis, que variam de acordo com uma variável do PHP (no caso, da query string). Praticamente todo site dinâmico
atual usa esse sistema para trabalhar com resultados de uma base de dados, pois ele proporciona uma
automatização muito grande de tarefas, evitando a criação de páginas com dados repetidos.

Na prática

Na prática, o que faremos é deixar que a query que buscará os dados no MySQL variável de acordo com a query
string. Veja:

Exemplo 1.15. Query variável

<?php
// Pegamos o valor do código do carro da query string
$cod = $_GET['cod'];

$servidor = 'localhost';
$usuario = 'jose';
$senha = 'banana';
$db = 'minhaDB';

if ($conexao = mysql_connect($servidor,$usuario,$senha)) {
if (!mysql_select_db($conexao) {
echo 'Não foi possível selecionar a base de dados';
}
}
else {
echo 'Não foi possível conectar-se ao servidor de bando de dados';
}

// Essa query selecionará apenas o carro que tiver


// o código igual ao indicado pela query string
$sql = "SELECT * FROM carro WHERE cod='$cod'" . ;
$resultado = mysql_query($sql);

$linha = mysql_fetch_array($resultado);
echo 'Código: ' . $linha['codigo'] . "<br />\n";
echo 'Carro: ' . $linha['nome'] . "<br />\n";
echo 'Marca: ' . $linha['marca'] . "<br />\n";
echo 'Cor: ' . $linha['cor'] . "<br />\n";
echo 'Ano: ' . $linha['ano'] . "<br />\n";
}
?>

Note que a query SQL acima varia de acordo com o código passado pelo endereço do script. Se tivermos um
endereço nome_do_arquivo.php?cod=1 apenas os dados do carro com código 1 serão mostrados. Caso o endereço
for nome_do_arquivo.php?cod=47, apenas os dados do carro com código 47 serão mostrados. Como o campo
'codigo' da tabela 'carro' é auto_increment, nunca existirão carros com códigos iguais, por isso não precisamos usar
um while para trazer os dados.

No mundo real

8 de 9 18-04-2011 17:28
Capítulo 4. Introdução ao MySQL http://www.lsd.ic.unicamp.br/projetos/e-lane/intro...

Agora que você sabe disso, de uma olhada em alguma loja virtual da internet. Entre na descrição de algum produto e
você perceberá que o código do produto está no endereço (muito provavelmente), na query-string. Isso ocorre
exatamente porque essas lojas são construídas com o conceito acima, obviamente que com um pouco mais de
complexidade, mas com a mesma idéia.

E não são só lojas virtuais que usam esse recurso; qualquer site que tenha divisão de categorias e de itens pode (e
normalmente faz) uso desse conceito. É só prestar atenção que você percebe.

9 de 9 18-04-2011 17:28