Escolar Documentos
Profissional Documentos
Cultura Documentos
PHP e Postgress
PHP e Postgress
6
6 6 6 6
6 7
7 7 7 8 8 8 8 8 8 9 9 9
Campo de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Campo de texto com mscara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . radio button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . submit button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . reset button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.10 textarea
4 Sintaxe bsica
4.1 4.2 4.3 4.4 4.5 Delimitador de cdigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Separador de instrues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
9 10 10 10 11
5 Tipos
5.1 5.2 5.3 5.4 Inteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nmeros em ponto utuante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
11 11 12 12
6 Operadores
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 Operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operadores de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
13 13 13 14 14 14 14 15
7 Estruturas de controle
7.1 7.2 7.3 7.4 7.5 7.6 7.7 Blocos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
15 17 18 18 19 19 20
do..while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 Funes
8.1 8.2 8.3 Denindo funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Valor de retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
21 21 21
Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 Variveis e Constantes
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 Declarao de uma varivel O modicador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
23 23 24 24 25 25 25 25 26 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static
Variveis variveis
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10 Utilizando cookies
10.1 O que so? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Gravando cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.3 Lendo cookies gravados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
26 26 27
27 28 29 30
30
30
30 30 30
31
31 31 32 32 32 33 33 33
16.4 Selecionando linhas especcas com a clusula Where . . . . . . . . . . . . . . . . . . . . . 16.5 Removendo dados com Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.6 Modicando dados com Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.7 Ordenando dados com Sort by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.8 Destruindo tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17 Tipos de Dados
17.1 Tipos Numricos 17.1.1 Tipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
34 34 35 35 35 35 36 36 36 37 37 38
Serial
17.1.2 Tipo Monetrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.2 Tipos caracter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3 Tipo data/hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3.1 Entrada de Data/hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3.2 Hora sem Fuso Horrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.3.3 Hora com Fuso Horrio 17.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
interval
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
39 39 40 40 40 40 41 41
19 Unindo Tabelas
19.1 Tabelas e referncias colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.2 Tabelas Agrupadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.3 Criando tabelas agrupadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.4 Realizando agrupamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
42 42 44 45 46 47 47
20 Numerando linhas
20.1 Nmeros de Identicao de Objetos (OIDs) . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2 Limitaes dos Nmeros de Identicao de Objetos . . . . . . . . . . . . . . . . . . . . .
49
49 50 50 50 50 51 51 52 52
20.2.1 Numerao no sequencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2.2 No modicvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.2.3 No feito o back up por padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.3 Sequncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.4 Criando Sequncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20.5 Usando Sequncias para numerar linhas 20.6 Tipo Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21 Performance
21.1 ndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 Indces nicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
54 54
22 Controlando Resultados
22.1 Limites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
56
23 Administrao de Tabelas
23.1 Tabelas Temporrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23.2 Alteraes de Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57 57
24 Chaves e constantes
24.1 Not Null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.2 Unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.3 Chave Primria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24.4 Chave Estrangeira, REFERENCES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
59 59 59 60
62
62 63 63 64 64
Introduo
Estes so scripts executados no lado cliente, ou seja, no browser. Esse tipo de script no tem contato
cookies .
PHP tambm tem como uma caracterstica muito importante o suporte a um grande nmero de banco de dados, como dBase, Interbase, mSQL, mySQL, Oracle, Sybase, PostgreSQL e vrios outros. Construir uma pgina baseada em um banco de dados torna-se uma tarefa extremamente simples com PHP. Alm disso, PHP tem suporte a outros servios atravs de protocolos como IMAP, SNMP, NNTP, POP3 e, logicamente, HTTP. Ainda possvel abrir
sockets
e o retorno deles para o usurio. Na programao para a web no diferente. Para que o interpretador PHP possa processar os dados, temos primeiro que passa-los pra o computador onde ele est instalado. Dentre os mtodos implementados pelo HTTP, os dois mais usados por programadores PHP para o envio de dados ao servidor so os mtodos GET e POST. O mtodo GET envia informaes atravs da URL (Uniform Resource Locator). Existem pelo menos duas desvantagens em se utilizar esse mtodo. A primeira que a quantidade de dados limitada em 1024 caracteres, o que pode no ser suciente para determinadas aplicaes, a segunda que os dados enviados aparecem no endereo do arquivo PHP e so visveis para o usurio, o que no recomendado para aplicaes que utilizam dados sigilosos, como senhas por exemplo.
Formulrios HTML
Como todos os componentes em um documento html, um formulrio denido por tags. A tag
</form>
colocar vrios formulrios em um mesmo documento html. Abaixo esto algumas opes da tag
form .
name: o nome que identica o formulrio no documento HTML; action: caminho do script que receber os dados do formulrio; method: mtodo de envio dos dados (get ou post); enctype: formato em que os dados sero enviados;
Um exemplo tpico de denio de um formulrio :
<input> ,
que alm disso dene outras caractersticas importantes como tipo e tamanho
<input> .
parmetros prprios, mas todos possuem pelo menos dois parmetros em comum: de elemento, e
type ,
name ,
value - o valor pr-denido do elemento, que aparecer quando a pgina for carregada; size - o tamanho do elemento na tela, em caracteres; maxlength - o tamanho mximo
texto contido no elemento, em caracteres.
do
3.5 checkbox
<input type="checkbox" name="" value="" checked>
Utilizado para campos de mltipla escolha, onde o usurio pode marcar mais de uma opo.
value
- o valor que ser enviado ao servidor quando o formulrio for submetido, no caso do
checked
3.9 button
<input type="button" name="" value="">
Utilizado para ativar funes de scripts client-side (JavaScript, por exemplo).
3.10 textarea
<textarea cols="" rows="" name="" wrap="">texto</textarea>
Exibe na tela uma caixa de texto, com o tamanho denido pelos parmetros cols e rows.
cols
caracteres;
rows
faz com que o texto quebre somente na tela, sendo enviado para o servidor o texto da maneira como foi digitado; o valor hard envia o texto ao servidor com todas as quebras que aparecem na tela; o valor o faz com que o texto no quebre na tela nem quando enviado ao servidor.
3.11 select
<select name="" size="" multiple> <option value="">text</option> </select>
Se o valor size tiver o valor 1 e no houver o parmetro multiple, exibe na tela uma combo box. Caso contrrio, exibe uma select list.
multiple - se presente, permite selecionar mais de uma linha, atravs das teclas Control ou Shift; option - cada item do tipo option acrescenta uma linha ao select; value - valor a ser enviado ao servidor se aquele elemento for selecionado. Default: o texto do item; text - valor a ser exibido para aquele item. Se
- nmero de linhas exibidas. Default: 1; posiciona entre as tags
size
<option>
</option> .
3.12 le
<input type="file" name="" size="">
Exibe na tela um campo de texto e um boto, que ao clicado abre uma janela para localizar um arquivo no disco. Para utilizar este tipo de componente, o formulrio dever utilizar o mtodo POST e ter o parmetro enctype com o valor multipart/form-data .
10
Sintaxe bsica
O cdigo PHP inserido diretamente no documento HTML e diferenciado a partir de tags especiais
<?php //tag que indica o incio do script corpo do script ?> //tag que indica o fim do script <script language=''php''> //tag que indica o incio do script corpo do script </script> //tag que indica o fim do script <? //tag que indica o incio do script corpo do script ?> //tag que indica o fim do script <% //tag que indica o incio do script corpo do script %> //tag que indica o fim do script
Entre esses quatro, os delimitadores de cdigo mais utilizados entre programadores PHP o terceiro tipo, que uma abreviao do primeiro. Para utiliz-lo, necessrio habilitar a opo
short-tags
na
congurao do PHP, da mesma maneira, para usar o quarto tipo temos que habilit-lo no arquivo de congurao
php.ini .
4.3 Variveis
As variveis em PHP iniciam com o caracter $ seguido de uma string que identica a varivel. Essa string deve comear com uma letra ou o caracter _. O nome da varivel caso sensitivo, ou seja, a varivel $var diferente da varivel $Var.
11
4.4 Comentrios
Basicamente existem dois tipos de comentrios em PHP:
Comentrios de uma linha: Marca como comentrio at o nal da linha ou at o nal do bloco de instrues PHP. Pode ser delimitado pelo caracter # ou por duas barras //.
Comentrios de mais de uma linha: Tem como delimitadores os caracteres /* para o incio do bloco e */ para o nal do comentrio.
{echo}
{print} .
12
Tipos
PHP suporta os seguintes tipo:
O tipo da varivel usualmente no escolhida pelo programador. Isso decidido em tempo de execuo pelo PHP dependendo do contexto no qual ela usada. possvel forar uma varivel a ser convertida para um certo tipo atravs do funo settype nela.
typecasting , ou usando a
5.1 Inteiros
Inteiros podem ser especicados usando qualquer umas das sintaxes abaixo:
$a $a $a $a
= = = =
# # # #
decimal decimal negativo na base octal (equivalente ao 83 decimal) na base hexadecimal (equivalente ao 18 decimal)
O tamanho de um inteiro depende da plataforma. Para uma plataforma de 32 bits o mximo valor inteiro de 2 bilhes.
5.3 Strings
Strings podem ser especicadas usando um dos conjuntos de delimitadores: a) utilizando aspas simples (') - desta maneira, o valor da varivel ser exatamente o texto contido entre as aspas (com exceo de
e ')
b) utilizando aspas duplas () - desta maneira, quaquer varivel ou caracter de escape ser expandido antes de ser atribudo.
13
<? $teste = "III Sinec"; $teste2 = 'Apostila do $teste de PHP e PostgreSQL\n'; echo "$teste2"; ?> // A sada desse script ser: ``Apostila do $teste de PHP e PostgreSQL\n''. <? $teste = "III Sinec"; $teste2 = "Apostila do $teste de PHP e PostgreSQL\n"; echo "$teste2"; ?> // A sada desse script ser: ``Apostila do III Sinec de PHP e PostgreSQL''.
A tabela abaixo lista os caracteres de escape:
Sintaxe Signicado
\n \r \t \\ \$ \' \
Nova linha Retorno (semelhante a Tabulao horizontal A prpria barra ( \) O simbolo $ Aspas simples Aspas duplas Tabela 1: Caracteres de escape
\n)
5.4 Arrays
Em PHP existem arrays associativos e escalares. Ambos funcionam como tabelas de disperso, onde os ndices so as chaves de acesso aos dados. Por exemplo:
<? $cor = array(1 => "vermelho", 2 => "verde", 3 => "azul", "teste" => 1); ?>
14
Operadores
Tais operadores devem ser usados com operandos numricos. Se forem de outro tipo, sero convertidos
exemplo:
15
^ ~
Tabela 6: Operadores lgicos Existem dois operadores para e e para ou porque eles tem diferentes posies na ordem de precedncia.
16
(expresso1)?(expresso2):(expresso3)
O interpretador PHP checa se a primeira expresso verdadeira. Se for, a expresso retorna o valor da expresso2, seno, retorna o valor da expresso3.
valor da varivel antes de increment-la ou decrement-la. Quando utilizados depois, retornam o valor da varivel j incrementado ou decrementado.
<? $a = $b = 10; // ambas recebem 0 valor 10. $c = $a++; // $c recebe 10 e $a passa a ter 11 $d = ++$b; // $d recebe 11, valor de $b j incrementado ?>
17
Estruturas de controle
As estruturas de controle que veremos a seguir so comuns para as linguagens de computao impe-
rativas, bastando, portanto, descrever a sintaxe de cada uma delas, resumindo o funcionamento.
7.1 Blocos
Um bloco consiste de vrios comandos agrupados com o objetivo de relacion-los com determinada estrutura de controle ou funo. Em estruturas de controle como
e em declaraes
de funes blocos podem ser utilizdos para permitir que um comando faa parte do contexto desejado. Blocos em PHP sao delimitados pelos caracteres { e }. Por exemplo:
if
7.2 If
O mais simples e de grande importncia para muitas linguagens o
if,
condio e executa o comando indicado se o resultado for verdadeiro (diferente de zero). Ele possui duas sintaxes:
18
if
else
complemnta o if (se necessrio). Seus comandos so executados caso a expresso avaliada pelo
if
if
usado com
else :
elseif
uma combinao de
Ele estende um
if ($a > $b) print "a } elseif ($a print "a } else { print "a }
19
7.3 While
O loop
while
loop while :
while
while
/* exemplo 1 */ $i = 1; while ($i <= 10) { print $i++; /* o valor de $i deve ser impresso antes de ser incrementado */ } /* exemplo 2 */ $i = 1; while ($i <= 10): print $i; $i++; endwhile;
7.4 do..while
O lao
do..while
while
while
do..while
do..while .
Que a seguinte:
20
7.5 for
O
for
for
so:
for (inicializao; condio; incremento) comando; for (inicializao; condio; incremento): comando1; comando2; . . . comando3; endfor;
Onde:
inicializao :
variveis.
comando que ser executado antes do incio do lao. Usado para inicializar as
condio :
executados.
expresso avaliada a cada iterao, que dene se os comandos que esto dentro Enquanto a expresso for verdadeira os comandos sero
incremento :
as variveis.
7.6 break
O comando um
break
do, for
Ao encontrar
break
break
$i = 0; while (++$i) { switch ($i) { case 5: echo "At 5<br>\n"; break 1; /* ou apenas break, sai apenas do switch. */
21
case 10: echo "At 10<br>\n"; break 2; /* sai do switch e do while. */ default: break; } }
7.7 continue
O
continue
tambm usado dentro de laos. Ele serve para indicar ao interpretador PHP para ignorar
break ,
continue
tambm aceita um argumento numrico opcional que serve para indicar quantos nveis de encapsulamento ele deveria ignorar. Por exemplo:
while (list ($key, $value) = each ($arr)) { if (!($key % 2)) { // pular valores pares continue; } fazer_algo_com_o_valor_mpar($value); } $i = 0; while ($i++ < 5) { echo "Fora<br>\n"; while (1) { echo "Fronteira<br>\n"; while (1) { echo "Dentro<br>\n"; continue 3; } echo "Isso nunca ser impresso.<br>\n"; } echo "Nem isso.<br>\n"; }
7.8 switch
O comando
switch
if
na mesma expresso.
Em muitas ocasies o programador pode querer comparar a mesma varivel (ou expresso) com muitos diferentes valores, e executar um diferente pedao de cdigo dependendo de qual valor a varivel corresponde.
22
Os seguintes exemplos mostram duas maneiras de se escrever a mesma coisa. Uma usando uma srie de
if's e
a outra usando o
switch .
switch ($i) { case 0: print "i equals 0"; break; case 1: print "i equals 1"; break; case 2: print "i equals 2"; break; }
Nesse caso o linha a linha os
break cases
switch
testa
testada, passa a executar todos os comandos seguintes, mesmo os que fazem parte de outros testes.
23
Funes
A sintaxe bsica para denir uma funo :
8.3 Argumentos
Opcionalmente, pode-se passar dados de entrada para as funes. Tais dados so chamados argumentos. Quando so usados, so declarados logo aps o nome da funo, e tronam-se variveis pertencentes ao escopo local da funo. Assim como o tipo de retorno da funo, os tipos dos argumentos no devem ser especicados.
24
Existem duas maneiras de se passar valores por referncia: pode-se indicar na declarao da funo, ou na chamada da mesma. Quando se indica a passagem por referncia na declarao da funo, tal
passagem de argumentos sempre ser por referncia. Em ambos os casos se utiliza o caracter & para indicar que a passagem ser por referncia.
function incrementa(&$num1, $num2) { $num1++; $num2++; } $a = $b = 5; incrementa($a, $b); /* neste caso $a vale 6 e $b continua a valer 5 no trmino da execuo da incrementa($a, &$b); /* aqui, as dus variveis tero seus valores alterados */
default
em caso de nada ser passado no lugar do argumento. Quando um parmetro declarado desta maneira, a passagem do mesmo na chamada da funo torna-se opcional. Por exemplo:
function imprime($texto = ``III Sinec'') { echo ``$texto''; } imprime(); // imprime ``III Sinec'' imprime(``123 testando''); // imprime ``123 testando''
Contexto
O contexto o conjunto de variveis e seus respectivos valores num determinado ponto do programa. Na chamada de uma funo, ao iniciar a execuo do bloco que contm a implementao da mesma criado um novo contexto, contendo as variveis declaradas dentro do bloco, ou seja, todas as variveis utilizadas dentro daquele bloco sero eliminadas ao trmino da execuo da funo.
Escopo
O escopo de uma varivel em PHP dene a poro do programa onde ela pode ser utilizada. Na
maioria dos casos todas as variveis tm escopo global. Entretanto, em funes denidas pelo usurio um escopo local criado. Uma varivel de escopo global no pode ser utilizada no interior de uma funo sem que haja uma declarao. Por exemplo:
$texto = ``III Sinec''; function imprime() { global $texto; echo ``$texto''; } imprime();
Uma outra maneira de acessar variveis de escopo global dentro de uma funo utilizando um array pr-denido pelo PHP cujo nome $GLOBALS. O ndice para a varivel referida o prprio nome da varivel, sem o caracter $. O exemplo abaixo produz um resultado semelhante ao anterior.
26
Variveis e Constantes
Como a vericao de tipos em PHP dinmica, as variveis no precisam ser declaradas. Uma
static
a varivel $a ter o seu valor impresso e ser incrementada. Veja o exemplo abaixo:
static
static .
27
plo: se o script est localizado em http://localhost/teste.php pode-se cham-lo com a url `http://localhost/teste.ph Neste caso o PHP criar automaticamente uma varivel com o nome $texto contendo a string IIISinec. Este formato conhecido como
urlencode .
mente nesse formato, e o PHP trata esses dados como variveis comuns, sem precisar de um tratamento especial por parte do programador. O formato
urlencode
no alfa-numricos (com exeo de _) pelo caracter % seguido do cdigo ASCII em hexadecimal.
<input type=''checkbox'' name=''teste[]'' value=''valor1''>Opo 1 <input type=''checkbox'' name=''teste[]'' value=''valor2''>Opo 2 <input type=''checkbox'' name=''teste[]'' value=''valor3''>Opo 3
Ao submeter o formulrio, o script que recebe os valores criar uma varivel chama $teste contendo os valores num array, com ndices a partir do zero.
phpinfo() .
isset
e a funo
A funo
o seguinte prottipo:
28
true
se a varivel estiver setada (mesmo com uma string vazia ou o valor zero), e
false
empty
varivel no contiver um valor ou possuir valor zero ou uma string vazia. Caso
phpinfo() .
define
usada para denir o valor de uma constante, que uma vez setada, no poder
mais ser alterado. Uma constante pode apenas conter um valor escalar, no podendo guardar arrays ou objetos. A assinatura da funo
define
a seguinte:
true
29
10
Utilizando cookies
Cookies so variveis gravadas no cliente (browser) por um determinado site. Somente o site que
informaes sejam fornecidas pelo usurio apenas uma vez. Exemplos de utilizao de cookies so sites que informam a quantidades de vezes que voc j visitou, ou alguma informao fornecida numa visita anterior. Existem cookies persistentes e cookies de sesso. Os persistentes so aqueles gravados em arquivo, e que permanecem aps o browser ser fechado, e possuem data e hora de expirao. Os cookies de sesso no so armazenados em disco e permanecem ativos apenas enquanto a sesso do browser no for encerrada. Por denio exostem algumas limitaes para o uso de cookies, listadas a seguir:
300 cookies no total; 4 kilobytes por cookie; 20 cookies por servidor ou domnio.
int setcookie(string nome, string valor, int exp, string path, string domnio, int secure);
Onde o nome o nome da varivel, o valor o contedo da varivel, exp opcional e indica a data de expirao no formato Unix. Se no for denida o cookie ser de sesso; path o path do script que gravou o cookie; o domnio o domnio responsvel pelo cookie; e secure se tiver valor 1 indica que o cookie s pode ser transferido por uma conexo segura (https). Um cookie no pode ser recuperado na mesma pgina que a gravou, a menos que ela seja recarregada pelo browser. Cookies s podem ser gravados antes do envio de qualquer informao para o cliente. Portanto todas as chamadas a funo setcookie devem ser feitas antes do envio de qualquer header ou texto.
$HTTP_COOKIE_VARS[] ,
tendo como ndice a string do nome do cookie, e numa varivel cujo nome o mesmo do cookie, precedido pelo smbolo $. Por exemplo:
Um cookie foi gravado numa pgina anterior pelo seguinte comando: setcookie(``teste'', ``III Sinec''); Pode ser lida das seguintes formas:
30
$HTTP_COOKIE_VARS[teste]; ou $teste;
31
11
A Histria do PostgreSQL
Tudo comeou com o desenvolvimento do Ingres, ancestral do
PostgreSQL ,
na Universidade da Cali-
frnia de Berkeley, entre os anos de 1977 a 1985. Aps isso, o cdigo do Ingres foi aumentado pela
Ingres
Corporation ,
o qual produziu um dos principais servidores de banco de dados relacionais que tiveram
sucesso comercialmente. Tambm em Berkeley, Michael Stonebraker liderou uma equipe que desenvolveu um servidor de banco de dados relacional chamado Informix ) herdou o cdigo
Postgres , entre os anos de 1986 a 1994. A Illustra( Postgres e desenvolveu-o em um produto comercial.
Dois estudantes de graduao, Jolly Chen e Andrew Yu, adicionaram mais outras caractersticas, de forma que interpretasse SQL no Postgres. O projeto resultante foi chamado de 1994 a 1995. Aps a sada dos desenvolvedores de Berkeley, o projeto continuou com a incluso de novos desenvolvedores at o lanamento de uma nova verso, no nal de 1996 com o nome de
PostgreSQL .
32
12
Com um software comercial, uma companhia contrata programadores, desenvolve um produto, e vende aos usurios. Com a internet, entretanto, novas possibilidades existem. Software open source no tem companhia. Em vez, programadores capazes com interesses e algum tempo livre se unem via internet e trocam idias. Algum escreve um programa e coloca o mesmo em um lugar que todos possam ver. Outros programadores olham e fazem as mudanas necessrias para melhorar o software. Quando o programa se encontra em fase funcional, os desenvolvedores lanam o programa a outros usurios da internet. Usurios acham erros e caractersticas que no existem e enviam background aos desenvolvedores, os quais, por sua vez, fazem as mudanas necessrias. Para um ciclo que parece no ser funcional, ele possui algumas vantagens sobre o modo antigo de desenvolvimento. - Uma estrutura de empresa no requerida, dessa forma no existe overhead (sobrecarga) e no existem restries econmicas. - O desenvolvimento de programas no ca limitado aos programadores da empresa, usando a capacidade e a experincia de um largo nmero de programadores. - O retorno do usurio facilitado, permitindo os testes de programa por um nmero grande de usurios em pouco tempo. - O encarecimento do programa pode ser distribudo rapidamente aos usurios.
33
13
Stored Procedures
Uma stored procedure , em suma, um programa com comandos SQL, que armazenado em um banco
de dados lgico.
PostgreSQL . A stored procedure composta por comandos SQL, variveis e comandos de uxo
34
14
Trigger
So blocos de comandos em SQL que so automaticamente executados quando um comando INSERT,
DELETE ou UPDATE executado em uma tabela. A principal aplicao de um trigger a criao de consistncias e restries de acesso ao banco de dados, como por exemplo, rotinas de segurana. Em vez de deixar o controle da aplicao para a prpria tabela, por meio de triggers o banco passa a executar esses controles, tornando muito mais seguro o manuseio do banco de dados.
14.1 Aplicaes
- Criar o contedo de uma coluna derivada de outras colunas; - Criar mecanismos de validao que envolvam pesquisas em mltiplas tabelas; - Criar logs para registrar a utilizao de uma tabela; - Atualizar outras tabelas em funo da incluso ou alterao da tabela atual;
15
\ \ \ \ \ \
h > help para comandos SQL; q > para sair; g > terminar uma query, equivalente; ? > mostra todos os comandos do prompt PSQL; p > mostra o buer; r > reseta o buer;
35
16
Os dados em um banco de dados relacional so guardados em estruturas chamadas tabelas, que podem ser relacionar entre si, surgindo em razo disso o termo banco de dados relacional, derivado de uma linguagem matemtica baseada em conjuntos.
php=> CREATE TABLE noticia ( php(> id php(> noticia php(> datains php(> chamada php(> foto php(> link php(> datapub php(> );
serial, varchar(800) NOT NULL, date, varchar(300) NOT NULL, varchar(300), varchar(300), date
Como visto aqui, e na maioria dos comandos SQL, um pouco de conhecimento da lngua inglesa necessrio para entender o que o comando faz. O resto da requisio tem um formato especco que reconhecido pelo servidor de banco de dados. Espaamento e capitalizao so funcionais.
O comando CREATE TABLE segue um formato especco: primeiro, as duas palavras CREATE TABLE; depois o nome da tabela; aps isso um parntese de abertura; uma lista de nomes de colunas e seus respectivos tipos; seguido por um parntese de fechamento.
O comando
\d
permite enxergar informao sobre uma tabela ou sobre todas as tabelas existentes no
INSERT INTO noticia (noticia, datains,chamada,foto,link,datapub) values ( 'A bezerra morreu na br 101',
36
capitalizao so opcionais, exceto dentro de aspas simples, onde o texto considerado literalmente. Para colunas numricas, no necessrio o uso de aspas simples.
, onde o
asterisco foi substiudo apenas pelo campo requerido. Se mais de um for necessrio, deve-se usar vrgulas para separar os mesmos.
Esse comando deleta o registro da tabela notcia que contenha em seu id o nmero 32;
todos os registros
para
'/sinec/index.html' .
Deve-se tomar cuidado com esse comando para, por um descudo de esquecer de
colocar a clusula WHERE, atualizar todos os registros quando se queria atualizar apenas parte deles.
Se quiser, pode-se usar aps o ORDER BY condio, o argumento DESC que inverte a ordem de como foi disposta a sada.
SELECT * FROM noticia where foto like 'j%' ORDER BY chamada DESC;
Esse comando seleciona todos os campos da tabela noticia, reavendo apenas os registros que tenham foto comecando com j, ordenando a sada pelo campo chamada por ordem alfabtica inversa.
38
17
Tipos de Dados
Postgres
apresenta imensa variedade de tipos de dados disponveis para o usurio, estes tipos esto
listados na tabela 17. O usurio pode livremente criar novos tipos com o comando
CREATE TYPE .
Nome do tipo
bigint bit bit varying( n ) boolean character( n ) character varying( n ) date double precision integer interval money numeric( p, s ) smallint real serial time[sem fuso horrio] time with time zone timestamp[com fuso horrio]
Apelidos
int8 varbit( n ) bool char( n ) varchar( n ) oat8 int,int4 decimal( p, s ) int2 oat4
Descrio
inteiro de oito byts bit string bit string de tamanho varivel booleano lgico(true/false) string de caracteres bit string de tamanho varivel data(year, month, day) nmero de ponto utuante,preciso maior inteiro de quatro bytes uso geral de time stamp monetrio estilo americano nmero exato com preciso varivel inteiro de dois bytes nmero de ponto utuante inteiro de quatro bytes autoincremental time of day hora do dia, sem fuso horrio data e hora
bytes ,
serial
um tipo especial do
Postgres
CREATE SEQUENCE tabela_coluna_seq; CREATE TABLE tabela (coluna integer DEFAULT nextval('tabela_coluna_seq')); CREATE UNIQUE INDEX tabela_coluna_key on tabela(coluna);
O tipo
serial
A sua
39
caracter
tambm
text .
Nome do Tipo Armazenamento
(4+n) bytes (4+n) bytes (4+n) bytes
Compatibilidade
SQL SQL Mais exvel
timestamp :
Intervalos de tempo
timestamp timestamp com fuso horrio interval date time time with time zone
Armazenamento
8 bytes 8 bytes 12 bytes 4 bytes 4 bytes 4 bytes
Incio
Fim
Resoluo
datetime
timespan ,
que so euivalentes
timestamp
interval ,
Postgres .
O comando
SET DateStyle
e o comando
to 'US' ou SET DateStyle to 'NonEuropean' especica o estilo da data como ms dia ano SET DateStyle to 'European' especica o estilo da data para dia ms ano.
Nota:A entrada de data e/ou hora precisa ser feita com estas entre aspas simples.
type 'value'
como o seguinte:
40
time
ou
time .
time
17.3.4 interval
O tipo
interval
syntax .
Exemplo
1/8/2001 8/1/2001
Descrio
Abril Agosto Dezembro Fevereiro Janeiro Julho Junho Maro Novembro Outubro Setembro
Ms
Abreviao
Apr Aug Dec Feb Jan Jul Jun Mar Nov Oct Sep, Sept
Dia
Sun Mon Tue, Tues Wed, Weds Thu, Thur, Thurs Fri Sat
Abreviao
Exemplo
ISO-8601 ISO-8601 ISO-8601 ISO-8601 O mesmo que 04:05 O mesmo que 16:05; entrada de horas devem ser menores que 12 o mesmo que 00:00:00 o mesmo que 00:00:00 o mesmo que 00:00:00
Descrio
41
Quantity Unit [Quantity Unit...] [Direction] @ Quantity Unit [Direction] Quantity qualquer nmero inteiroe Unit second, minute, hour, day, week, month, year, dacade, century, millenium ou suas abreviaes ou o plural dessas unidades. Direction pode ser ago ou vazio.
Onde:
DateStyle .
??.
Usando o comando
SET
O valor
default
o formato ISO.
time
date
interval
week
ou
century
Exemplo
Descrio
ISO-8601 ISO-8601 ISO-8601 ISO-8601
Constante
current epoch innity -innity invalid now today tomorrow yesterday
Hora corrente da transao(obsoleto) 1970-01-01 00:00:00+00 (hora zero do sistema Unix) Maior que qualquer hora vlida Menor que qualquer hora vlida Entrada ilegal Hora corrente da transao Meia-noite de hoje meia-noite de amanh meia-noite de ontem
Descrio
Especicao de estilo
'ISO' 'SQL' 'Postgres' 'German'
Descrio
1997-12-17 07:37:16-08 12/17/1997 07:37:16 1997 PST Wed Dec 17 07:37:16 1997 PST 17.12.1997 07:37:16.00 PST
Exemplo
42
Postgres
true
boolean .
O tipo
boolean
vlidos:
(verdadeiro) ou
false
(falso).
TRUE
FALSE
43
18
uma string cercada por aspas simples, geraria um parser error. O mtodo correto para incluir esse tipo de dado seria o uso de duas aspas simples juntas como em da contrabarra para incluir esse dado
'Lecas''s' .
'Leca\'s' .
NULL
um
valor especial que valido em qualquer coluna. Usa-se quando uma entrada vlida para um campo no conhecida ou no aplicvel.
Os testes lores
IS NULL
IS NOT NULL
NULL . NULL .
Abaixo, colocaremos um exemplo que ilustra bem a confuso que pode existir com o uso de valores
INSERT INTO noticia (noticia,datains,chamada,link,foto,datapub) values ( 'Felipe viajou para o Marrocos e acabou comprando um Dromedrio', '08/11/2001', 'O dromedrio de Felipe', NULL, NULL, '10/11/2001' );
Neste exemplo, tanto o campo fazendo uma consulta do tipo:
LINK
como o campo
FOTO
NULL ,
NULL
NULL
so diferentes.
44
CREATE TABLE ultima ( id serial, noticia varchar(800) DEFAULT 'Seminrio de Informtica e Engenharia de Computao', hora time, chamada varchar(300) DEFAULT 'SINEC', link varchar(300), data date );
Quando for includo um registro sem notcia e sem chamada, o valor default acima descrito ser colocado nos campos noticia e chamada.
18.4 Comentrios
Os comentrios podem ser usados em qualquer lugar no prompt psql. Dois estilos de comentrio so possveis. A presena de dois traos () marca todo o texto da linha como um comentrio. O estilo da programao C++ tambm aceito, onde o comentrio comea com /* e s termina com o */.
PostgreSQL .
45
Comparador
menor que menor ou igual igual maior ou igual maior que diferente
Operador
< <= = >= > <> ou !=
LIKE
procedural, ele permite controle condicional sobre dados retornados de uma query. A clusula WHERE usa comparao para controlar a seleo de registros. O comando CASE permite comparaes na sada de uma coluna. Aqui foi criado uma tabela de administradores para demonstrar um exemplo do comando CASE.
php=> CREATE TABLE administrador ( php(> id serial, php(> nome varchar(300), php(> identidade varchar(15), php(> idade integer php(> );
46
19
Unindo Tabelas
Nesta seo, mostraremos como armazenar dados em mais de uma tabela. Assim como o armazena-
mento, a seleo de dados em vrias tabelas so fundamentais para bancos de dados relacionais. Primeiro examinaremos tabelas e referncias colunas, que so importantes em consultas que usam mais de uma tabela. Depois, mostraremos quais so as vantagens de dividir os dados em mltiplas tabelas.
Aqui, faremos a construo das tabelas que sero responsveis pelo controle da enquete.
query
de colunas podem ser tornar confusas ou mesmo ambguas, quando, por exemplo existe mais de uma tabela usada na query com nomes de colunas iguais. Para evitar essa confuso, existe o que chamamos de nome completamente qualicado da coluna, onde o nome da mesma antecido pelo nome da tabela a qual faz parte seguida por um ponto. Por exemplo, a coluna com
noticia
da tabela
noticia
seria referenciado
noticia.noticia .
Outro modo de referenciar o nome da coluna de uma tabela atravs da criao de um apelido para a tabela. Vide exemplo.
uso do nome completamente especicado, j que no existem dvidas sobre a origem das colunas, pois s existe uma tabela sendo consultada.
Se tivermos menos respostas, a tabela car subutilizada, ocupando espao desnecessrio. Se quisermos em algum dia aumentar o nmero de respostas, ser invivel, j que todo o banco de dados foi criado para receber sempre trs respostas. Umas de regras de criao de um bom banco de dados, que no existam campos com o mesmo signicado dentro de uma tabela. Nesse exemplo, temos os campos voto* e resposta* que se repetem por trs vezes na tabela. Considerando isso, a tabela enquete caria como na tabela 21 na pgina 43.
47
Tabela Enquete
Tipos Serial char(300) date char(100) int char(100) int char(100) int
Tabela 20: Tabela errada de enquete Tabela Enquete Campos id enquete data Tabela 21: Tabela enquete Tipos serial char(300) date
Aps os campos voto* e resposta* terem sido retirados, a tabela obedece as leis de criao de um bom banco de dados. A pergunta que ca : Onde caro as respostas dessa pergunta ? Logicamente, em uma outra tabela ! Essa tabela ter o nome resposta e ser criado de acordo com a tabela 22 na pgina 43. Tabela Resposta Campos id resposta contador idpergunta Tabela 22: Tabela resposta Tipos serial char(300) integer integer
Resumindo, as vantages do uso de mltiplas tabelas incluem as seguintes: - A modicao de dados torna-se mais fcil; - Os dados so armazenados em um nico espao; - Economia no armazenamento de dados; - Procura de dados mais fcil A nica condio para que dados duplicados no se movam para outra tabela ocorre quando as seguintes condies esto presentes: - O tempo para a realizao do agrupamento proibitivo; - A procura de dados desnecessria;
todas
48
- A duplicao de dados exige pouco espao no armazenamento; - muito pouco provvel que os dados mudem.
php=> CREATE TABLE enquete ( php(> id serial, php(> enquete char(300), php(> data date php(> ); NOTICE: CREATE TABLE will create implicit sequence 'enquete_id_seq' for SERIAL column 'enquete.id' NOTICE: CREATE TABLE/UNIQUE will create implicit index 'enquete_id_key' for table 'enquete' CREATE php=> CREATE TABLE resposta ( php(> id serial, php(> resposta char(200), php(> contador integer, php(> id_resposta integer php(> ); NOTICE: CREATE TABLE will create implicit sequence 'resposta_id_seq' for SERIAL column 'resposta.id' NOTICE: CREATE TABLE/UNIQUE will create implicit index 'resposta_id_key' for table 'resposta' CREATE
Como j explanado anteriormente, o tipo serial ser explicado mais a frente. Essas duas tabelas tem uma relao de um pra n, pois uma enquete pode ter vrias respostas mas uma resposta de apenas uma enquete. Agora, adicionaremos uma pergunta e colocaremos duas respostas.
php-> ('Quando ser que a greve acabar','07/11/2001'); INSERT 19013 1 php=> INSERT INTO resposta (resposta,contador,id_enquete) VALUES php-> ('No natal',0,1); INSERT 19073 1 php=> INSERT INTO resposta (resposta,contador,id_enquete) VALUES php-> ('Quando Paulo Renato morrer',0,1); INSERT 19074 1 php=> INSERT INTO resposta (resposta,contador,id_enquete) VALUES php-> ('Quando a universidade acabar',0,1); INSERT 19075 1
Neste exemplo, o id_enquete na tabela 1 pois a primeira resposta recebe esse nmero com o uso do serial.
php=> SELECT id,id_enquete FROM resposta WHERE resposta='No natal'; id | id_enquete ----+-----------1 | 1 (1 row) php=> SELECT enquete FROM enquete WHERE id=1; enquete --------------------------------Quando ser que a greve acabar (1 row)
Na primeira consulta, achamos qual o nmero da enquete a qual pertence a resposta 'No Natal' (o campo id_enquete). O id_enquete foi 1. O campo id_enquete tem o mesmo dado do campo id na tabela enquete. Achado esse valor, consultamos em uma segunda query, qual era a enquete que tinha o id igual a 1. Ns chamamos essas consultas de agrupamento manual, devido ao fato do usurio ter tomado o resultado da primeira query e ter colocado o resultado na clusula WHERE na segunda query. J esta query mostra quais so os elementos necessrios para realizar o agrupamento direto.
50
php=> SELECT enquete FROM resposta, enquete php-> WHERE resposta.id_enquete=enquete.id AND resposta='No natal'; enquete --------------------------------Quando ser que a greve acabar (1 row)
- As duas tabelas envolvidas no agrupamento so especicadas na clusula FROM; - As duas colunas necessrias para realizar o agrupamento esto especicadas na clusula WHERE; - A resposta testada na clusula WHERE; - A pergunta retornada pela query SELECT. Internamente, o banco de dados realiza as seguintes tarefas: - resposta='No natal': Encontra o registro que contm essa resposta; - resposta.id_enquete=enquete.id: Do registro encontrado, pegue o campo id_enquete. Encontre na tabela enquete o registro que possua esse nmero; - enquete: Retorna o nome da enquete procurada. Ou seja, o banco de dados realiza as mesmas operaes antes realizadas por ns manualmente, s que bem mais rpido. Constate que na maioria dos campos utilizados na ltima consulta, o nome foi
completamente qualicado para evitar ambiguidades como seria se tivssemos colocados s o campo id sem especicar a tabela, j que nas duas tabelas, existe o campo com o mesmo nome (id). A ordem em que aparece as tabelas ou as condies de consulta no so relevantes.
sim
51
- O cdigo de duas letras fcil para os usurios digitarem e de fcil memorizao; - Os cdigos dos estados so nicos; - Cdigos de estados no mudam; - Agrupamento usando chave com 2 caracteres no so muito mais lentos que agrupamento numrico; - A diferena de armazenamento no muito maior para guardar dois caracteres em vez de nmeros. Essencialmente, duas escolhas para chaves de agrupamento existem: nmeros de indenticao ou pequenos cdigos numricos.Nenhuma regra universal dita quando voc dever escolher cdigos alfanumricos ou nmeros de identicao. Os estados do Brasil so claramente um exemplo em que melhor o uso de cdigos de caracteres, por que s 27 existem. Os cdigos resultantes so pequenos, nicos, e
bem conhecidos pela maioria dos usurios. Geralmente melhor usar cdigos a nmeros de identicao quando o campo exige poucos registros.
outer join .
php=> SELECT resposta FROM enquete,resposta WHERE enquete.id=1; resposta ---------------------------------No natal Quando Paulo Renato morrer Quando a universidade acabar (3 rows)
Para a enquete com o cdigo igual a 1, houve o retorno de 3 linhas, indicando claramente o agrupamento um para muitos.
chave primria
A resposta.id_enquete chamada de
chave estrangeira
52
Esta seo lidou com tcnica a tcnica de criar uma disposio organizada usando mltiplas tabelas. Para adquirir esta habilidade necessrio prtica. Sempre espere mudar o seu banco de dados vrias vezes para a criao de um banco de dados organizado e denitivo. Uma boa disposio pode fazer seu trabalho car mais fcil. A m disposio pode tornar seu trabalho em consultas um inferno. Ao comear a criar suas tabelas para uma necessidade real, voc ser capaz de identicar os bancos de dados bem planejados. No tenha preguia ou medo de recomear seu banco de dados do zero, pois um duro
trabalho, mas quando feito apropriadamente, as consultas tornam-se mais fceis de serem realizadas.
53
20
Numerando linhas
Nmeros nicos e cdigos pequenos alfanumricos permitem referncias linhas especcas em uma
tabela. Elas foram bem discutidas na seo 19.5. Por exemplo, a tabela enquete tinha um campo chamado id que identicava unicamente um registro na tabela. A tabela resposta tinha um campo com o mesmo nome responsvel pela mesma funo. Enquanto caracteres de cdigos devem ser inseridos pelo usurio, a numerao de linhas de uma tabela pode ser geradas automaticamente usando-se dois mtodos. Esta seo descreve como usar esses dois mtodos.
INSERT ,
como em
nmero de linhas inseridas. Normalmente, os OIDs s aparecem aps cada comando um comando que no o
INSERT .
INSERT , ele ser mostrado. Apesar de nenhuma coluna OID ter sido mencionada no comando CREATE TABLE , toda tabela PostgreSQL inclui uma coluna invisvel chamada OID. Essa coluna s mostrada caso seja especicamente acessada. Qualquer query do tipo SELECT * FROM "alguma tabela" no mostrar a coluna OID. Entretanto, algo como SELECT OID,* FROM "alguma tabela" mostrar o
campo. O OID pode ser usado como chave primria ou chave estrangeira em agrupamentos (
joins ).
1 cria um banco de dados template1 usado por todos os outros banco de dados
54
php=> SELECT OID,* FROM enquete; oid | id | enquete | data -------+----+---------+-----------19013 | 1 | Quando ser que a greve acabar | 2001-07-11 (1 row)
Caso queiramos usar uma tabela que contenha chave estrangeira do tipo OID, temos que na sua criao, em vez de usar o tipo integer ou mesmo char, usar o tipo OID como no exemplo abaixo.
php=> CREATE TABLE teste php(> id php(> nome php(> chave php(> ); CREATE
Uma coluna do tipo OID semelhante a uma coluna do tipo integer, mas denindo-a como um tipo OID documenta que a coluna receber valores OID. No confunda uma coluna com o tipo OID com a coluna chamada OID. Toda linha tem uma coluna chamada OID, a qual normalmente invisvel. Uma linha pode ter zero, uma ou mais colunas com o tipo OID. Uma coluna do tipo OID no automaticamente atribuda valor especial a ela. Somente a coluna OID atribuda um valor especial.
INSERT
em outros banco de dados em outras tabelas incrementariam o contador de objetos. Se o OID no est visvel aos usurios isso no um problema. A numerao no sequencial no interfere o processamento de query's. Entretanto, se os usurios podem ver esses nmeros, parece estranho os grandes buracos entre esses nmeros.
20.2.2 No modicvel
Um OID atribudo para cada linha no comando gerado pelo sistema.
INSERT . UPDATE
55
20.3 Sequncias
PostgreSQL
como um oferece outro mtodo de numerao de linhas sequncias. Sequncias so contadores nomeados criados por usurios. Aps sua criao, uma sequncia pode ser atribuda para uma tabela
DEFAULT
para a coluna. Usando sequncias, nmeros nicos podem ser automaticamente gerados
durante o comando
INSERT .
A vantagem das sequncias que elas evitam os buracos como no caso dos OIDs . Sequncias so ideais para o uso de um nmero de identicao visvel pelo usurio. Se uma resposta criada hoje e outra
amanh, as duas linhas tero nmeros sequenciais porque nenhuma outra tabela reparte o contador .
CREATE SEQUENCE .
Funo
Ao
Retorna o prximo valor da sequncia e atualiza o contador Retorna o valor corrente da sequncia Muda o valor do contador para o especicado no segundo argumento
Abaixo, alguns exemplos na criao de sequncias e do uso das funes acima descritas.
php=> CREATE SEQUENCE ph_teste; CREATE php=> SELECT nextval('ph_teste'); nextval --------1 (1 row) php=> SELECT currval('ph_teste'); currval --------1 (1 row) php=> SELECT setval('ph_teste','20'); setval -------20 (1 row)
2 Os buracos podem ocorrer quando uma transao abortada 3 Tabelas diferentes podem usar o mesmo contador
56
nextval()
INSERT ,
nextval() .
php=> CREATE SEQUENCE aluno_id; CREATE php=> CREATE TABLE aluno ( php(> id INTEGER php(> nome CHAR(300), php(> tel CHAR(15) php(> ); CREATE
DEFAULT nextval('aluno_id'),
php=> INSERT INTO aluno VALUES (nextval('aluno_id'),'Osama','666666'); INSERT 19182 1 php=> INSERT INTO aluno (nome,tel) VALUES ('Saddam','666'); INSERT 19183 1
Como podemos ver, o primeiro comando cria a sequncia chamada cria a tabela aluno, e dene
aluno_id.
O segundo comando
nextval('aluno_id')
comandos mostram como deve ser realizada a insero de dois modos diferentes mas, corretos.
e um valor
nextval('nomedatabela_nomedocampos_seq')
No se preocupe com os avisos que na criao da tabela com o tipo serial iro ocorrer. O primeiro indica que o banco de dados est criando implicitamente a sequncia para a coluna do tipo serial, e o segundo aviso indicando que um ndice est sendo criado, assunto que ser dado
php=> CREATE TABLE professor ( php(> id serial, php(> nome char(300), php(> tel char(15) php(> ); NOTICE: CREATE TABLE will create implicit sequence 'professor_id_seq' for SERIAL column 'professor.id'
57
NOTICE: CREATE TABLE/UNIQUE will create implicit index 'professor_id_key' for table 'professor' CREATE
Algumas pessoas imaginam porque OIDs e sequncias so necessrias. Por que um usurio do banco de dados no pode encontrar o maior nmero em uso, adicionar um, e usar o resultado para numerar a prxima linha a ser adicionada ? Realmente, OIDs e sequncias so preferidas devidos a vrios fatos:
Primeiramente, usualmente um processo demorado procurar todos os nmeros que esto sendo usados correntemente para encontrar o prximo nmero possvel. Referir-se a um contador localizado
separadamente mais rpido. Segundo, se um usurio achar o nmero mais alto, e um outro usurio est procurando pelo nmero mais alto ao mesmo tempo, os dois usurios podem achar o mesmo nmero. claro, neste exemplo, o nmero deixaria de ser nico. Tal problema de concorrncia no ocorre com OIDs e sequncias. Terceiro, mais convel usar um nmero dado pelo bando de dados do que um nmero baseado em uma consulta manual.
58
21
Performance
Quando acessando uma tabela,
21.1 ndices
PostgreSQL
normalmente l do comeo para o nal da tabela, procurando por registros relevantes. Com um ndice, possvel achar rapidamente valores especcos no ndice, podendo assim ir diretamente para os registros procurados. Desse modo, ndices permitem uma procura rpida de linhas especcas em uma tabela. Por exemplo, considere a query
. Sem um ndice,
PostgreSQL deve
procurar em toda a tabela procurando por linhas que tenham 145 no campo 145. Com um ndice em id, o banco de dados pode ir direto para as linhas onde o id 145. Para tabelas grandes, pode-se levar minutos para checar cada linha. Usando um ndice, encontrar a linha desejada leva apenas segundos.
PostgreSQL
devem criar ndices em colunas muito utilizadas em clusulas WHERE. Para criar um ndice, usa-se o comando
desperdcio de espao de disco. Tambm, a performance na verdade pode diminuir caso existam muitos ndices, por que qualquer mudana de registros necessria uma atualizao em cada ndice.
mando anterior na criao de um ndice simples a incluso de mais uma coluna entre os parentses. Esse tipo de ndice indicado quando indexamos as linhas de uma tabela, mas mesmo assim, temos muitas linhas com o mesmo valor da primeira linha indexada. Nesse caso, comea a ser feito a indexao pela segunda coluna do ndice.
ndices podem ser teis tambm em agrupamentos. quando usado clusulas ORDER BY.
59
UNIQUE logo aps a palavra CREATE. s vezes, ndices nicos so criados apenas para evitar valores duplicados, no por questes de performance.
60
22
Controlando Resultados
Quando uma query
SELECT
executado, e o resultado enviado de volta ao psql para ser mostrado. um controle sobre quais linhas so retornadas.
PostgreSQL
22.1 Limites
As clusulas retornadas.
LIMIT
OFFSET
do comando
SELECT
php=> SELECT * FROM aluno ORDER BY id LIMIT 2; id | nome | tel ----+------+----------------1 | Osama | 666666 2 | Saddam | 666 (2 rows) php=> SELECT * FROM aluno ORDER BY id LIMIT 2 OFFSET 1; id | nome | tel ----+--------+---2 | Saddam | 666 (1 row)
Constate que na segunda consulta apenas uma linha foi retornada. Isso ocorreu devido a existncia de apenas dois registros. Portanto, quando a sada da consulta foi deslocadas usando
OFFSET ,
mesmo com o
LIMIT
LIMIT
61
23
Administrao de Tabelas
Essa seo mostra como criar tabelas temporrias e como realizar a alterao de tabelas ou de colunas.
bela temporria. Na sada do programa psql, a tabela temporria destruda. Quando for reiniciado o programa psql, vericamos que no existe mais tal tabela.
As tabelas temporrias so visveis apenas para a sesso onde foi criada, elas permanecem invisveis para os outros usurios. De fato, vrios usurios podem criar tabelas temporrias com o mesmo nome, e cada usurio ver apenas a tabela criada por ele.
CREATE TEMPORARY TABLE temptest (col INTEGER) INSERT INTO temptest VALUES (1) SELECT col FROM temptest retorna 1
Usurio1
CREATE TEMPORARY TABLE temptest (col INTEGER) INSERT INTO temptest VALUES (2) SELECT col FROM temptest retorna 2
Usurio 2
Seu uso ideal para armazenar dados intermedirios usado pela sesso. Por exemplo, suponha que necessrio realizar vrias consultas para uma query complexa. Uma estratgia eciente realizar a
SELECT * INTO TEMPORARY telfonern FROM aluno WHERE tel like '84%'
Esse comando criou uma tabela temporria com dados 'herdados' da tabela aluno contendo os registros que tenham 84 no comeo do nmero do telefone.
62
ALTER TABLE .
php=> CREATE TABLE altertest (col INTEGER); CREATE php=> ALTER TABLE altertest RENAME TO alterdemo; ALTER php=> ALTER TABLE alterdemo RENAME COLUMN col to democo; ALTER php=> ALTER TABLE alterdemo ADD COLUMN col2 INTEGER; ALTER
63
24
Chaves e constantes
Essa seo cobrir a ltima parte a ser vista no curso. Referncias e chaves so os tpicos mais
importantes para a criao de um banco de dados relacional, evitando assim a criao de um bando de dados sem utilidade.
NOT NULL
deve ser colocada aps o tipo da coluna. Aps isso, qualquer insero que tente colocar um valor nulo na coluna descrita, falhar, gerando um erro de execuo. Uma boa sada para evitar esse tipo de erro colocar um valor padro para a coluna, podendo ser assim a denio.
php=> CREATE TABLE notenull ( php(> id INTEGER NOT NULL DEFAULT 32); CREATE
24.2 Unique
A clusula
UNIQUE
pela criao de um ndice nico na coluna. O exemplo abaixo ilustra o uso da clusula.
php=> CREATE TABLE unico (numero INTEGER UNIQUE); NOTICE: CREATE TABLE/UNIQUE will create implicit index 'unico_numero_key' for table 'unico' CREATE
php=> CREATE TABLE chaveprimaria (col INTEGER PRIMARY KEY); NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'chaveprimaria_pkey' for table 'chaveprimaria' CREATE php=> \d chaveprimaria Table "chaveprimaria" Attribute | Type | Modifier -----------+---------+---------col | integer | not null Index: chaveprimaria_pkey
64
Note que um ndice criado automaticamente, e a coluna denida como sendo no nula. Se uma chave primria tiver mais de uma coluna, a clsula deve ser denida em uma linha separada para formar a chave.
php=> CREATE TABLE chaveprimaria ( php(> chave1 INTEGER, php(> chave2 INTEGER, php(> PRIMARY KEY(chave1,chave2) php(> ); NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'chaveprimaria_pkey' for table 'chaveprimaria' CREATE
Uma tabela no pode ter mais que uma chave primria. quando usamos relaes (chaves estrangeiras). Chaves primrias tm um valor especial
php=> CREATE TABLE enquetef ( php(> id SERIAL PRIMARY KEY, php(> enquete CHAR(300), php(> data DATE php(> ); NOTICE: CREATE TABLE will create implicit sequence 'enquetef_id_seq' for SERIAL column 'enquetef.id' NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'enquetef_pkey' for table 'enquetef' CREATE
O comando acima cria a tabela enquetef, sendo a chave primria o campo com o tipo serial.
php=> CREATE TABLE respostaf ( php(> id SERIAL PRIMARY KEY, php(> resposta CHAR(200), php(> contador INTEGER, php(> id_enquete INTEGER REFERENCES enquetef php(> ); NOTICE: CREATE TABLE will create implicit sequence 'respostaf_id_seq' for SERIAL column 'respostaf.id'
65
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'respostaf_pkey' for table 'respostaf' NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s) CREATE
O comando acima cria a tabela respostaf, criando a chave estrangeira referenciando-se a tabela enquetef. Observe que a sintaxe de criao simples mas o conceito envolvido complexo. Esperamos com essa apostila clarear algumas dvidas sobre o SQL em si e o prprio
PostgreSQL .
66
25
PostgreSQL
a funo
pg_connect .
Vrios parmetros so necessrios e alguns so opcionais. A seguir temos vrias possibilidade do uso da funo. int int int int pg_connect pg_connect pg_connect pg_connect (string host, string port, string dbname) (string host, string port, string options, string dbname) (string host, string port, string options, string tty, string dbname) (string conn_string)
Indica qual mquina deseja-se conectar; Indica a porta utilizada na conexo; Indica o nome do banco de dados a ser aberta a conexo;
dbname options
Indica qual terminal a conexo deve ser realizada; Dene vrios outros argumentos tal como usurio e senha.
<?php $open = pg_Connect ("dbname=php"); //abre conexo com o banco de dados chamado "php" $open2 = pg_Connect ("host=arrobinha port=5460 dbname=php"); //abre conexo com o banco de dados chamado php na mquina arrobinha pela porta "5460" $open3 = pg_Connect ("host=newarrobinha port=5460 dbname=php user=sinec password=Ceni$"); //abre conexo com o banco de dados chamado php, na mquina newarrobinha, pela porta "5460" , com usurio e senha determinados ?>
A funo
pg_connect
Os argumentos devem ser passados usando-se aspas duplas. Se uma segunda chamada feita pelo
pg_connect
ser aberta, mas em vez disso, ser retornado apenas o ndice da conexo j aberta anteriormente.
67
pg_exec .
a conexo, a varivel que guarda o ndice da conexo e uma string, que no caso a query a ser executada. int pg_exec (int connection, string query)
pg_exec
connection query
pg_exec .
<?php $open=pg_connect("user=sinec,dbname=php,host=localhost") or die("Impossvel abrir conexo"); $consulta="select chamada,noticia from noticia"; $exec=pg_exec($open,$consulta) or die("Impossvel executar consulta"); ?>
Usamos primeiramente a funo meamos o seu ndice com a varivel
abrir uma conexo com o banco de dados, e nousamos uma varivel para guardar toda a string
da consulta, prtica indicada para facilitar o entendimento no uso das funes, no sendo preciso digitar todo o comando SQL dentro da funo responsvel pela execuo da query, a funo
pg_exec ,
que recebe
apenas duas variveis, a primeira sendo o identicador da abertura da conexo e a segunda sendo a prpria query a ser executada. Retorna como resultado um ndice se a query for executada, e falso se a conexo falhar ou o ndice da conexo no for vlido. Detalhes sobre erros podem ser recuperados usando a funo se a conexo for vlida. O valor de retorno da funo
pg_ErrorMessage()
pg_exec
PostgreSQL .
pg_result
tem como
entrada a execuo de uma query, a linha desejada e a coluna. Seu cabealho denido na tabela 27. mixed pg_result (int result_id, int row_number, mixed eldname)
pg_result
68
pg_result()
pg_exec() .
O nmero da linha e o
fieldname
Nmeros de linha
comeam do zero. Ao invs de usar o nome do campo, pode-se usar um nmero como ndice, comeando do zero.
echo
ou
que tem
como propsito imprimir dados no documento HTML. Para melhor compreenso, veja o exemplo abaixo:
$coneccao = pg_connect("user=sinec dbname=php host=arrobinha"); $SQL = "SELECT * FROM noticia"; $resultado_geral = pg_exec($coneccao, $SQL); $id1 = pg_result($resultado_geral, 0, '"id"'); /* a varivel $id1 receber o id da notcia da primeira linha da consulta */ echo "$id1"; /* esta linha de cdigo faz com que seja impresso no documento HTML o contedo da varivel $id1 */
PostgreSQL
pg_close .
Ela recebe como argumento um ndice de uma conexo vlida e retorna uma
varivel booleana. Retorna falso caso o ndice no seja vlido ou verdadeiro caso a conexo seja fechada.
bool
pg_close
5
so auto-
Nota:
pg_close
maticamente fechadas no trmino da execuo do script. no fecha conexes persistentes geradas pela funo
pg_pconnect .
Referncias
[1] Barreto, Maurcio Vivas de Souza, [2] Pgina ocial do PHP,
2000.
PHP Manual,
[3] Castagnetto Jesus, Rawat Harish, Schumann, Scollo Chris, Veliath Deepak,
gramming ,
2001.
2000.
70