Dicas PHP

16

Click here to load reader

Transcript of Dicas PHP

Page 1: Dicas PHP

Trabalhar com arquivos - Leitura Introdução

De vez em quando é necessário ler, alterar ou criar arquivos no servidor de Internet, como por exemplo, para criar contadores de

acesso, estatísticas de visitas ou guardar algumas informações para visualizações posteriores que são demoradas para serem

criadas pelo servidor, e que não seria muito bom gerá-las sempre que um visitante as quisesse ver.

O PHP fornece um conjunto de funções muito boas para isto, e com alguns cuidados, os scripts funcionarão tanto em Windows

como em Linux sem nenhuma alteração. Todas essas funções podem ser encontradas no manual do php, em "Filesystem

functions".

Abrir arquivos

A primeira função que se deve conhecer para trabalhar com arquivos é a que cria uma ligação entre o script e o arquivo

propriamente dito:

int fopen( string arquivo, string modo [, int usa_include_path] );

Esta função devolve um ponteiro para um arquivo, que é utilizado noutras funções para lidar com arquivos. O primeiro

parâmetro, arquivo, é uma string que indica o local do arquivo a ser aberto, aqui vai a primeira dica: não utilize o modo de

referência do windows, como c:\www\arquivo.txt, pois não irá funcionar num servidor linux! Evite também ler e gravar arquivos

fora do directório onde o teu site está hospedado, às vezes torna-se difícil criar um directório fora do directório do site, e, se um

dia quiseres transferir o teu site para uma outra máquina, pode acontecer que te esqueças daquele directório isolado. Vamos

supor que o site tem um subdirectório "tmp" e que tem dentro um arquivo novidades.txt. Para abrir o arquivo usamos:

<?php

$fd = fopen( "tmp/novidades.txt", "r" );

...

?>

Note que mesmo que este script seja executado em windows ele irá funcionar. Excelente! Nada melhor que programar com uma

linguagem que funciona em vários sistemas operativos sem alterações!

O segundo parâmetro informa o PHP que o arquivo deve ser aberto so para leitura, os modos possíveis podem ser:

r - so leitura, coloca o ponteiro no início do arquivo

r+ - leitura e gravação, coloca o ponteiro no início do arquivo

w - so gravação, limpa o arquivo (deixa-o com 0 bytes) e coloca o ponteiro no início do arquivo. Se o arquivo não existir, tenta

criá-lo.

w+ - leitura e gravação, limpa o arquivo (deixa-o com 0 bytes) e coloca o ponteiro no início do arquivo. Se o arquivo não existir,

tenta criá-lo

a - so gravação, coloca o ponteiro no final do arquivo. Se o arquivo não existir, tenta criá-lo.

a+ - leitura e gravação, limpa o arquivo (deixa-o com 0 bytes) e coloca o ponteiro no final do arquivo. Se o arquivo não existir,

tenta criá-lo

Existe ainda a opção "b" que pode ser utilizada com os modos (sozinha não funciona!), esta opção indica que o arquivo deve ser

tratado como binário em vez de texto, ou seja, se o programa for lidar com imagens em vez de um arquivo de texto comum. É de

vital importância no windows para ler imagens, ou caso contrário o programa não irá funcionar. Como o Linux e Unix não fazem

diferença entre um arquivo de texto e um binário, essa opção não terá nenhum efeito, portanto, se o seu programa for trabalhar

com imagens, não custa nada adicionar esta opção. (programas multiplataforma são excelentes!)

AVISO: Como no windows (95/98/CE/ME) não existe permissão de acesso a arquivos os programas funcionarão como desejado,

podemos criar arquivos, acede-los, excluí-los e muito mais. No Linux começam a surgir alguns problemas, normalmente os

arquivos e directórios de um servidor de Internet são de um utilizador e o servidor http (apache, por exemplo) corre como um

Page 2: Dicas PHP

outro utilizador, o php corre com o mesmo utilizador do servidor http, portanto se este utilizador não tiver permissão para gravar

num directório, não será possível criar os arquivos pelo php, nem alterá-los.

O terceiro parâmetro é opcional, e se seu valor for 1, o php irá procurar nos directórios informados na configuração

"include_path" do php.ini.

Se a função fopen falhar ao abrir ou ao criar o arquivo, ela retorna false. Note que se for utilizado o parâmetro "r"(somente

leitura) ou "r+" e o arquivo não existir, a função fopen não irá tentar criá-lo, simplesmente retornará um erro, e mostrará um

aviso no browser do utilizador.

Caso não seja muito bom mostrar esse tipo de erro para o utilizador (toda a gente que vir essa mensagem vai querer ler esse

arquivo directamente no browser), utilize o @ antes da função e confira o resultado:

<?php

$fd = @fopen( "tmp/novidades.txt", "r" ) or die( "ops, avise o webmaster, que está a faltar um arquivo no servidor");

...

?>

Mesmo que tenhas a certeza que este arquivo está por lá, usa este método, pois nem sempre as coisas são como esperamos.

Fechar arquivos

Depois de aberto ou criado o arquivo, é sempre bom deixar a mesa arrumada após o serviço, portanto devemos fechar o arquivo.

É muito fácil:

int fclose( int fp );

O parâmetro fp é o ponteiro de arquivo que foi retornado pela função fopen(), no nosso caso $fd. Esta função retorna true se o

arquivo foi fechado e false se não foi possível fechar o arquivo. O arquivo precisa ser fechado no mesmo script que o abriu.

O que fazer com os arquivos

Nem só de abrir e fechar arquivos vive um script php, é necessário fazer alguma coisa com eles. A "coisa" mais fácil é mostrar o

conteúdo do arquivo no browser do utilizador, para isso utilizamos a função "int fpassthru( int fp )". Então, para mostrar o

arquivo novidades.txt, que contém as últimas notícias da semana directamente para o browser do utilizador, o script fica assim:

<?php

$fd = @fopen( "tmp/novidades.txt", "r" ) or die( "ops, avise o webmaster, tem arquivo faltando no servidor");

fpassthru( $fd );

?>

A função fpassthru lê a partir da posição actual do ponteiro até ao final do arquivo e fecha o arquivo, portanto, neste caso não é

necessário utilizar a função fclose() (podes tentar, mas vai provocar um erro). Se estás a correr este script, notarás que o arquivo

novidades.txt saiu com as linhas juntas, para resolver isto coloca um <br> no final de cada linha do arquivo ou deixa o script

entre as tags <pre>. Se tentares colocar alguns scripts php dentro do arquivo novidades.txt notarás que eles serão mostrados no

browser do utilizador e não serão processados pelo php. Se quiseres adicionar um script php á página, utilza include ou require.

Se só for necessário mostrar o arquivo novidades directamente no browser sem precisar de posicionar o ponteiro, utiliza a função

readfile, que abre o arquivo, mostra e fecha o mesmo:

<?php

if( !@readfile( "tmp/novidades.txt") ) die ("ops, chame o webmaster!");

?>

Claro, existem muitas funções para ler o arquivo: (todas elas dependem do ponteiro do arquivo, e não do facto de fechar o

arquivo)

Page 3: Dicas PHP

- string fread( int fp, int tamanho )

Lê o arquivo apartir da posição actual do ponteiro no arquivo até ao tamanho em bytes ou até o final do arquivo, o que acontecer

primeiro, e devolve como uma string.

<?php

// este script faz a mesma coisa que o anterior

if( $fd = @fopen( "tmp/novidades.txt", "r" ) ) {

while( !feof( $fd ) ) {

$novidades = fread( $fd, 1024 );

print $novidades;

}

fclose($fd);

}

?>

Enquanto não chegar ao final do arquivo ( feof() ), lê até 1024 bytes do arquivo para a variável $novidades e imprime seu

conteúdo.

- string fgetc( int fp )

Lê só um caractere do arquivo. Não utilize esta função para ler mais do que um caractere de um mesmo arquivo, não é eficiente,

é mais eficiente ler o arquivo em blocos para a memória e fazer o processamento na memória, pois o acesso ao disco é

extremamente lento se comparado com o acesso à memória, e aceder ao disco para ler um só caractere para processar é um

enorme disperdício de recursos do servidor. Tenta trocar a função fread pela fgetc no script acima e usa um arquivo novidades.txt

com alguns kbytes para perceberes a idéia. Imagina 10.000 hits/hora com um script desses!

- string fgets( int fp, int tamanho )

Se precisas de ler o arquivo linha á linha, utiliza esta função. Ela lê até que 1 byte seja lido, que encontre o final de uma linha

(que é incluída no resultado), ou final do arquivo e devolve como uma string. Para ler até 10 bytes de um arquivo, utilize:

$texto = fgets( $fd, 11 );

- string fgetss( int fp, int tamanho [, string tagspermitidas] )

Idêntica à função fgets, só que as tags html e php serão ignoradas. Se for necessário deixar algumas tags passarem pela função,

utilize o parâmetro opcional tags permitidas, por exemplo, para ler um arquivo novamente, mas deixar só as tags <br>,

<b></b> e <p></p> serem exibidas, use:

$texto = fgetss( $fd, 1024, "<br><b><p>" );

Mesmo podendo selecionar quais tags que podem passar pela função, se este arquivo vier de fora, ou seja, é um arquivo que

uma pessoa manda pela internet para mostra no site, alguém pode mandar algum código javascript malicioso dentro de uma tag,

e executar comandos indevidos na máquina do visitante do seu site. Cuidado!

array file( string arquivo [, int usa_include_path ] )

Lê o arquivo inteiro e coloca cada linha do arquivo numa tabela. Esta função utiliza como parâmetro o nome do arquivo, portanto

não é necessário abrir nem fechar o arquivo para usar esta função. Vamos ao exemplo:

Supondo que o arquivo novidades.txt tem uma novidade por linha, similar a este: novidade.txt

Page 4: Dicas PHP

Nova versão do php acaba de ser lançada!

Linux eleito melhor sistema operativo do mundo!

*Encontrado mais um furo de segurança no dind.

O número de servidores linux cresce a cada dia!

Queremos mostrar cada linha do arquivo novidades com um fundo diferente, e ainda por cima as linhas que contém um * no

início devem ser exibidas em negrito

<html>

<head><title>Novidades</title></head>

<body>

<?php

$txt = @file("tmp/novidades.txt");

if(!$txt) {

print "Sem novidades por hoje, só o webmaster é que vai receber um responso";

exit;

}

// count retorna o número de índices da tabela

$tot = count($txt);

?>

<table width="500" align="center" bgcolor="white" cellpadding="1" cellspacing="0">

<?php

for($i=0;$i<$tot;$i++) {

// ct vai ler o primeiro caractere da linha

$ct=$txt[$i][0];

// Chop elimina espaços do final da string e finais de linha também

$linha = Chop($txt[$i]);

// Seleciona a cor de fundo para a linha

if( $cor == "#DCDCDC" ) $cor = "#DCDCFF";

else $cor = "#DCDCDC";

print "<tr><td bgcolor='$cor'>";

// strip_tags elimina todas as tags html e php, como fgetss

// se a linha começa com um *, le a partir do próximo caractere

// o ponto serve para concatenar as strings

if( $ct == "*" ) print "<b>".strip_tags(substr($linha,1))."</b>";

else print strip_tags($linha);

print "</td></tr>";

}

?>

</table>

</body>

</html>

Por hoje aprendemos várias funções de leitura de dados apartir de arquivos, em breve falaremos de funções de escrita.

unções para tratamento de Strings F Funções relacionadas a HTML

htmlspecialchars

string htmlspecialchars(string str);

Devolve a string fornecida, substituindo os seguintes caracteres:

Page 5: Dicas PHP

& para '&amp;'

" para '&quot;'

< para '&lt;'

> para '&gt;'

htmlentities

string htmlentities(string str);

Funciona de maneira semelhante ao comando anterior, mas de maneira mais completa, pois converte todos os caracteres da

string que possuem uma representação especial em html, como por exemplo:

º para '&ordm;'

ª para '&ordf;'

á para '&aacute;'

ç para '&ccedil;'

nl2br

string nl2br(string str);

Devolve a string fornecida substituindo todas as quebras de linha ("\n") por quebras de linhas em html ("<br>").

Exemplo:

echo nl2br("Mauricio\nVivas\n");

Imprime:

Maurício<br>Vivas<br>

get_meta_tags

array get_meta_tags(string arquivo);

Abre um arquivo html e percorre o cabeçalho em busca de "meta" tags, Devolvendo num array todos os valores encontrados.

Exemplo:

No arquivo teste.html temos:

...

<head>

<meta name="author" content="jose">

<meta name="tags" content="php3 documentation">

...

</head><!-- busca encerra aqui -->

...

a execução da função:

get_meta_tags("teste.html");

Devolve o array:

array("author"=>"jose","tags"=>"php3 documentation");

Page 6: Dicas PHP

strip_tags

string strip_tags(string str);

Devolve a string fornecida, retirando todas as tags html e/ou PHP encontradas.

Exemplo:

strip_tags('<a href="teste1.php3">testando</a><br>');

Devolve a string "testando"

urlencode

string urlencode(string str);

Devolve a string fornecida, convertida para o formato urlencode. Esta função é útil para passar variáveis para uma próxima

página.

urldecode

string urldecode(string str);

Funciona de maneira inversa a urlencode, desta vez decodificando a string fornecida do formato urlencode para texto normal.

Funções relacionadas a arrays

Implode e join

string implode(string separador, array partes);

string join(string separador, array partes);

As duas funções são idênticas. Devolvem uma string contendo todos os elementos do array fornecido separados pela string

também fornecida.

Exemplo:

$partes = array("a", "casa número", 13, "é azul");

$inteiro = join(" ",$partes);

$inteiro passa a conter a string:

"a casa número 13 é azul"

split

array split(string padrao, string str, int [limite]);

Devolve um array contendo partes da string fornecida separadas pelo padrão fornecido, podendo limitar o número de elementos

do array.

Page 7: Dicas PHP

Exemplo:

$data = "11/14/1975";

$data_array = split("/",$data);

O código acima faz com que a variável $data_array receba o valor:

array(11,14,1975);

explode

array explode(string padrao, string str);

Funciona de maneira bastante semelhante à função split, com a diferença que não é possível estabelecer um limite para o

número de elementos do array.

Comparações entre strings

similar_text

int similar_text(string str1, string str2, double [porcentagem]);

Compara as duas strings fornecidas e devolve o número de caracteres coincidentes. Opcionalmente pode ser fornecida uma

variável, passada por referência (ver tópico sobre funções), que receberá o valor percentual de igualdade entre as strings. Esta

função é case sensitive, ou seja, maiúsculas e minúsculas são tratadas como diferentes.

Exemplo:

$num = similar_text("teste", "testando",&$porc);

As variáveis passam a ter os seguintes valores:

$num == 4; $porc == 61.538461538462

strcasecmp

int strcasecmp(string str1, string str2);

Compara as duas strings e Devolve 0 (zero) se forem iguais, um valor maior que zero se str1 > str2, e um valor menor que zero

se str1 < str2. Esta função é case insensitive, ou seja, maiúsculas e minúsculas são tratadas como iguais.

strcmp

int strcasecmp(string str1, string str2);

Funciona de maneira semelhante à função strcasecmp, com a diferença que esta é case sensitive, ou seja, maiúsculas e

minúsculas são tratadas como diferentes.

strstr

string strstr(string str1, string str2);

string strchr(string str1, string str2);

Page 8: Dicas PHP

As duas funções são idênticas. Procura a primeira ocorrência de str2 em str1. Se não encontrar, Devolve uma string vazia, e se

encontrar Devolve todos os caracteres de str1 a partir desse ponto.

Exemplo:

strstr("Mauricio Vivas", "Viv"); // Devolve "Vivas"

stristr

string strstr(string str1, string str2);

Funciona de maneira semelhante à função strstr, com a diferença que esta é case insensitive, ou seja, maiúsculas e minúsculas

são tratadas como iguais.

strpos

int strpos(string str1, string str2, int [offset] );

Devolve a posição da primeira ocorrência de str2 em str1, ou zero se não houver. O parâmetro opcional offset determina a partir

de qual caracter de str1 será efetuada a busca. Mesmo utilizando o offset, o valor de retorno é referente ao início de str1.

strrpos

int strrpos(string haystack, char needle);

Devolve a posição da última ocorrência de str2 em str1, ou zero se não houver.

Funções para edição de strings

chop

string chop(string str);

Retira espaços e linhas em branco do final da string fornecida.

Exemplo:

chop(" Teste \n \n "); // Devolve " Teste"

ltrim

string ltrim(string str);

Retira espaços e linhas em branco do final da string fornecida.

Exemplo:

ltrim(" Teste \n \n "); // Devolve "Teste \n \n"

trim

string trim(string str);

Retira espaços e linhas em branco do início e do final da string fornecida.

Page 9: Dicas PHP

Exemplo:

trim(" Teste \n \n "); // Devolve "Teste"

strrev

string strrev(string str);

Devolve a string fornecida invertida.

Exemplo:

trrev("Teste"); // Devolve "etseT"

strtolower

string strtolower(string str);

Devolve a string fornecida com todas as letras minúsculas.

Exemplo:

strtolower("Teste"); // Devolve "teste"

strtoupper

string strtoupper(string str);

Devolve a string fornecida com todas as letras maiúsculas.

Exemplo:

strtolower("Teste"); // Devolve "TESTE"

ucfirst

string ucfirst(string str);

Devolve a string fornecida com o primeiro caracter convertido para letra maiúscula.

Exemplo:

ucfirst("teste de funcao"); // Devolve "Teste de funcao"

ucwords

string ucwords(string str);

Devolve a string fornecida com todas as palavras iniciadas por letras maiúsculas.

Exemplo:

ucwords("teste de funcao"); // Devolve "Teste De Funcao"

str_replace

string str_replace(string str1, string str2, string str3);

Page 10: Dicas PHP

Altera todas as ocorrências de str1 em str3 pela string str2.

Funções diversas

chr

string chr(int ascii);

Devolve o caracter correspondente ao código ASCII fornecido.

ord

int ord(string string);

Devolve o código ASCII correspontente ao caracter fornecido.

echo

echo(string arg1, string [argn]... );

Imprime os argumentos fornecidos.

print

print(string arg);

Imprime o argumento fornecido.

strlen

int strlen(string str);

Devolve o tamanho da string fornecida.

Funções para tratamento de Arrays Funções Genéricas

Array

array array(...);

É a função que cria um array a partir dos parâmetros fornecidos. É possível fornecer o índice de cada elemento. Esse índice pode

ser um valor de qualquer tipo, e não apenas de inteiro. Se o índice não for fornecido o PHP atribui um valor inteiro seqüencial, a

partir do 0 ou do último índice inteiro explicitado. Vejamos alguns exemplos:

Exemplo 1

$teste = array("um", "dois","tr"=>"tres",5=>"quatro","cinco");

Temos o seguinte mapeamento:

0 => "um" (0 é o primeiro índice, se não houver um explicito)

1 => "dois" (o inteiro seguinte)

"tr" => "tres"

Page 11: Dicas PHP

5 => "quatro" (valor explicitado)

6 => "cinco" (o inteiro seguinte ao último atribuído, e não o próximo valor, que seria 2)

Exemplo 2

$teste = array("um", 6=>"dois","tr"=>"tres",5=>"quatro","cinco");

Temos o seguinte mapeamento:

0 => "um"

6 => "dois"

"tr" => tres

5 => "quatro" (seria 7, se não fosse explicitado)

7 => "cinco" (seria 6, se não estivesse ocupado)

Em geral, não é recomendável utilizar arrays com vários tipos de índices, já que isso pode confundir o programador. No caso de

realmente haver a necessidade de utilizar esse recurso, deve-se ter bastante atenção ao manipular os índices do array.

range

array range(int minimo, int maximo);

A função range cria um array cujos elementos são os inteiros pertencentes ao intervalo fornecido, inclusive. Se o valor do

primeiro parâmetro for maior do que o do segundo, a função Devolve false (valor vazio).

shuffle

void shuffle(array &arr);

Esta função "embaralha" o array, ou seja, troca as posições dos elementos aleatoriamente e não Devolve valor algum.

sizeof

int sizeof(array arr);

Devolve um valor inteiro contendo o número de elementos de um array. Se for utilizada com uma variável cujo valor não é do

tipo array, Devolve 1. Se a variável não estiver setada ou for um array vazio, Devolve 0.

Funções de "navegação"

Toda variável do tipo array possui um ponteiro interno indicando o próximo elemento a ser acedido no caso de não ser

especificado um índice. As funções seguintes servem para modificar esse ponteiro, permitindo assim percorrer um array para

verificar seu conteúdo (chaves e elementos).

reset

mixed reset(array arr);

O ponteiro interno aponta para o primeiro elemento do array, e devolve o conteúdo desse elemento.

end

mixed end(array arr);

Page 12: Dicas PHP

O ponteiro interno aponta para o último elemento do array, e devolve o conteúdo desse elemento.

next

mixed next(array arr);

O ponteiro interno aponta para o próximo elemento do array, e devolve o conteúdo desse elemento.

Obs.: esta não é uma boa função para determinar se um elemento é o último do array, pois pode devolver false tanto no final do

array como no caso de haver um elemento vazio.

prev

mixed prev(array arr);

O ponteiro interno aponta para o elemento anterior do array, e devolve o conteúdo desse elemento. Funciona de maneira inversa

a next.

pos

mixed pos(array arr);

Devolve o conteúdo do elemento actual do array, indicado pelo ponteiro interno.

key

mixed key(array arr);

Funciona de maneira bastante semelhante a pos, mas em vez de devolver o elemento actual indicado pelo ponteiro interno do

array, devolve o seu índice.

each

array each(array arr);

Devolve um array contendo o índice e o elemento actual indicado pelo ponteiro interno do array. o valor da devolução é um array

de quatro elementos, cujos índices são 0, 1, "key" e "value". Os elementos de índices 0 e "key" armazenam o índice do valor

atual, e os elementos de índices 1 e "value" contém o valor do elemento atual indicado pelo ponteiro.

Esta função pode ser utilizada para percorrer todos os elementos de um array e determinar se já foi encontrado o último

elemento, pois no caso de haver um elemento vazio, a função não devolverá o valor false. A função each só devolve false depois

q o último elemento do array foi encontrado.

Exemplo:

função que percorre todos os elementos de um array e imprime seus índices e valores

function imprime_array($arr) {

reset($arr);

while (list($chave,$valor) = each($arr))

echo "Chave: $chave. Valor: $valor";

}

Page 13: Dicas PHP

Funções de ordenação

São funções que servem para ordenar os elementos de um array de acordo com determinados critérios. Estes critérios são:

manutenção ou não da associação entre índices e elementos; ordenação por elementos ou por índices; função de comparação

entre dois elementos.

sort

void sort(array &arr);

A função mais simples de ordenação de arrays. Ordena os elementos de um array em ordem crescente, sem manter os

relacionamentos com os índices.

rsort

void rsort(array &arr);

Funciona de maneira inversa à função sort. Ordena os elementos de um array em ordem decrescente, sem os manter os

relacionamentos com os índices.

asort

void asort(array &arr);

Tem o funcionamento bastante semelhante à função sort. Ordena os elementos de um array em ordem crescente, porém mantém

os relacionamentos com os índices.

arsort

void arsort(array &arr);

Funciona de maneira inversa à função asort. Ordena os elementos de um array em ordem decrescente e mantém os

relacionamentos dos elementos com os índices.

ksort

void ksort(array &arr);

Função de ordenação baseada nos índices. Ordena os elementos de um array de acordo com seus índices, em ordem crescente,

mantendo os relacionamentos.

usort

void usort(array &arr, function compara);

Esta é uma função que utiliza outra função como parâmetro. Ordena os elementos de um array sem manter os relacionamentos

com os índices, e utiliza para efeito de comparação uma função definida pelo utilizador, que deve comparar dois elementos do

array e devolver 0, 1 ou -1, de acordo com qualquer critério estabelecido pelo utilizador.

uasort

void uasort(array &arr, function compara);

Page 14: Dicas PHP

Esta função também utiliza outra função como parâmetro. Ordena os elementos de um array e mantém os relacionamentos com

os índices, utilizando para efeito de comparação uma função definida pelo utilizador, que deve comparar dois elementos do array

e devolver 0, 1 ou -1, de acordo com qualquer critério estabelecido pelo utilizador.

uksort

void uksort(array &arr, function compara);

Esta função ordena o array através dos índices, mantendo os relacionamentos com os elementos., e utiliza para efeito de

comparação uma função definida pelo utilizador, que deve comparar dois índices do array e devolver 0, 1 ou -1, de acordo com

qualquer critério estabelecido pelo utilizador.

Enviar um arquivo para o servidor

O PHP suporta várias funcionalidades, por isso o seu grande sucesso entre os programadores que procuram facilidade de

programação, suporta bases de dados,

corre independentemente do sistema operativo utilizado e hardware, entre outros.

Dentro das funcionalidades do PHP está o suporte para o envio de arquivos para o servidor através de um formulário HTML.

Qualquer tipo de arquivo pode ser enviado para o servidor, seja ele uma imagem, um arquivo de texto, uma base de dados, etc.,

ou melhor, seja o arquivo binário ou texto.

Para enviar um arquivo, primeiro precisamos criar um formulário para o utilizador indicar qual o arquivo que deseja enviar:

<form method=post enctype="multipart/form-data" action="teste.php">

<input type="file" name="arquivo">

<input type="submit" name="submit" value="Enviar arquivo">

</form>

ATENÇÃO: O parâmetro "enctype" é obrigatório, sem ele não é possível enviar o arquivo para o servidor!

Para o php aceitar o arquivo, alguns parâmetros devem estar configurados correctamente no php:

file_uploads = On - O PHP aceita o envio de arquivo;

upload_tmp_dir = - Qual o directório que onde o php guardará "temporariamente" o arquivo enviado.

upload_max_filesize = 2M - Tamanho máximo do arquivo aceito pelo php

Normalmente o PHP já vem configurado para aceitar o upload de arquivos, mas é sempre bom verificar a sua configuração no

php.ini para não ter mais tarde dores de cabeça.

Além do limite de tamanho do arquivo imposto pela configuração do php (que serve para todos os scripts do servidor) podemos

também limitar o tamanho utilizando uma configuração do formulário:

<input type="hidden" name="MAX_FILE_SIZE\" value="1024">

Neste caso estamos a limitar o tamanho máximo do arquivo em 1024 bytes. Mas não é recomendável confiar neste parâmetro,

pois qualquer pessoa com algum conhecimento de HTML conseguirá retirar este limite. Mais abaixo mostrarei outra solução para

isto.

Tudo bem, o utilizador selecionou o arquivo para ser enviado e pressionou o botão "Enviar arquivo", se crias-te um arquivo com o

formulário acima e um arquivo "teste.php" (pode ser o mesmo arquivo do formulário) o browser do utilizador irá enviar o arquivo

Page 15: Dicas PHP

para o servidor, e nada vai acontecer, além do php ter guardado o arquivo no directório temporário e apagado o arquivo no final

da execução do script. Então teremos que fazer mais qualquer coisa com o arquivo. Após receber o arquivo, o php guarda-o num

directório temporário, com um nome escolhido por ele, e criará várias variáveis globais com informações deste arquivo, baseadas

no nome que escolhemos para o campo, no nosso caso "arquivo":

$arquivo : nome do arquivo, com seu caminho absoluto, onde o php o guardou

$arquivo_name : nome do arquivo, absoluto, na máquina do utilizador

$arquivo_size : tamanho em bytes do arquivo

$arquivo_type : tipo "MIME" do arquivo

Com essas variáveis podemos agora fazer qualquer coisa com o arquivo. Podemos, por exemplo, verificar se o arquivo tem um

tamanho abaixo do limite maximo desejado para ser enviado (isto é muito importante, pois impossibilita que alguém envie um

arquivo tão grande que possa bloquear o servidor). Usamos o seguinte script:

<?php

if($arquivo_size > 1024) {

print "O tamanho do arquivo é maior do que o limite permitido<br>";

exit;

}

?>

Para não deixar alguns utilizadores irritados, podemos usar as duas opções juntas, o limite configurado dentro do formulário e o

limite dentro do script, assim os utilizadores normais não terão a decepção de esperar vários minutos para enviar o arquivo para

o servidor e só depois serem avisados que o arquivo era grande demais, assim o browser acusa o tamanho demasiado grande

antes de enviar o arquivo, e os utilizadores "espertinhos" terão uma decepção ao descobrir que existia outra limitação.

Precisamos agora fazer alguma coisa com o arquivo antes de terminar o script, senão o php irá apagá-lo. Temos o nome do

arquivo na váriavel "arquivo", então precisamos colocá-lo num lugar do servidor. Podemos usar a função do php "copy". A função

copy exige 2 parâmetros: fonte e destino, e retorna verdadeiro ou falso, ou seja, se copiou ou não. Atenção para quem vai usar

este método num sistema Linux, unix ou qualquer outro que tenha suporte para permissões de arquivos, pois a função "copy" irá

executar uma cópia do arquivo como o utilizador que executa o servidor, portanto, se o utilizador/grupo que executa o servidor

não tiver permissão de escrita no directório de destino, não vai ser possível copiar o arquivo para lá. Neste caso, tente gravar no

/tmp, que costuma ter permissão de escrita para todos os utilizadores, ou dê a permissão a um directório específico só para

gravar os arquivos. Supondo que o servidor tem permissão de escrita no subdirectório arquivo do directório do nosso script,

vamos gravar:

<?php

....

if(copy($arquivo,"arquivo/arquivo_do_utilizador")) {

print "O arquivo foi recebido com êxito!<br>";

} else {

print "Ocorreu um erro ao receber o arquivo!<br>";

}

?>

Pronto, agora o arquivo foi salvo como arquivo_do_utilizador no subdiretório arquivo. Note que todos os utilizadors que enviarem

o arquivo para o servidor terão os seus arquivo salvos com o mesmo nome, portanto, só um arquivo irá existir, e será o arquivo

do último utilizador que enviou o arquivo.

Fica para o leitor o exercício de criar um arquivo único para cada utilizador e que um mesmo utilizador não consiga enviar mais

do que três arquivos por login.

Em breve haverá um tutorial que explicará como fazer isto

Page 16: Dicas PHP

Até a próxima!

Varrendo Diretórios Este artigo mostra como varrer diretórios possuindo um filtro, muito útil para pesquisa em cadeias... Serve também como procura de arquivos em diretórios. O script é uma função para mais tarde podermos chamá-la a qualquer hora. Crie uma página chamada varre.php e transcreva o script abaixo:

<?php function varre($dir,$filtro="",$nivel="") { $diraberto = opendir($dir); // Abre o diretorio especificado chdir($dir); // Muda o diretorio atual p/ o especificado while($arq = readdir($diraberto)) { // Le o conteudo do arquivo if($arq == ".." || $arq == ".")continue; // Desconsidera os diretorios $arr_ext = explode(";",$filtro); foreach($arr_ext as $ext) { $extpos = (strtolower(substr($arq,strlen($arq)-strlen($ext)))) == strtolower($ext); if ($extpos == strlen($arq) and is_file($arq)) // Verifica se o arquivo é igual ao filtro echo $nivel.$arq."<br>"; // Imprimi em forma de arvore } if (is_dir($arq)) { echo $nivel.$arq."<br>"; // Imprimi em forma de arvore varre($arq,$filtro,$nivel."&nbsp;&nbsp;&nbsp;&nbsp;"); // Executa a funcao novamente se subdiretorio } } chdir(".."); // Volta um diretorio closedir($diraberto); // Fecha o diretorio atual } ?> Exemplo1 Crie a página verrendo.php e insira o código abaixo:

<?php include("varre.php"); varre("."); // Executa a funcao com o caminho especificado, no caso o diretorio do onde esta o arquivo ?> Exemplo2 Crie a página verrendo2.php e insira o código abaixo:

<?php include("varre.php"); varre(".",".txt"); // Verifica arquivos .txt ?> Exemplo3 Crie a página verrendo3.php e insira o código abaixo:

<?php include("varre.php"); varre(".",".txt;passwd"); // Verifica arquivos .txt ou com nome passwd ?> A função pode ser chamada com ou sem filtros - sem filtros será listado todo o conteúdo do diretório especificado e os seus sub-diretórios. Lembre-se que este script funciona tanto em servidores Windows como Linux.