PHP Avancado

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 165

PHP Avanado

1/165

PHP Avanado

ndice 9.1 - Arrays. . . . . . . . . 9.2 - Formulrios. . . . . . . . 9.3 - Arquivos. . . . . . . . . 9.4 - Diretrios. . . . . . . . 9.5 - Path. . . . . . . . . . 9.6 - Includes. . . . . . . . . 9.7 - Funes. . . . . . . . . 9.8 - Session. . . . . . . . . 9.9 - Cookies. . . . . . . . . 9.10 - Tratamento de Erros. . . . . 9.11 - Validao de Dados.. . . . . 9.12 - XML. . . . . . . . . 9.13 - Constantes Mgicas. . . . . 9.14 - Formatao. . . . . . . . 9.15 - Imagens e Grficos. . . . . . 9.16 - Nmeros. . . . . . . . 9.17 - Permisses de Arquivos e Diretrios. 9.18 - Strings. . . . . . . . . 9.19 - URLs. . . . . . . . . 9.21 - Criptografia. . . . . . . 9.22 E-mails.. . . . . . . . 9.23 Data e Hora. . . . . . . Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 21 32 56 61 66 67 78 83 84 95 102 107 109 112 126 130 134 142 144 153 157 178

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

2/165

9.1 - Trabalhando com Arrays em PHP


1 Trabalhando com Arrays 2 Algumas das funes 3 array_fill -- Preenche um array com valores 4 array_merge -- Funde dois ou mais arrays 5 array_pad -- Expande um array para um certo comprimento utilizando um determinado valor 6 array_pop -- Retira um elemento do final do array 7 array_push -- Adiciona um ou mais elementos no final de um array 8 array_reverse -- Retorna um array com os elementos na ordem inversa 9 array_search 10 array_shift -- Retira o primeiro elemento de um array 11 array_sum -- Calcula a soma dos elementos de um array 12 array -- Cria um array 13 arsort 14 asort 15 count -- Conta o nmero de elementos de uma varivel 16 current -- Retorna o elemento corrente em um array 17 each -- Retorna o par chave/valor corrente de um array e avana o seu cursor 18 Percorrendo um array com each() 19 end -- Faz o ponteiro interno de um array apontar para o seu ltimo elemento 20 key -- Retorna uma chave da posio atual de um array associativo 21 next -- Avana o ponteiro interno de um array 22 prev -- Retrocede o ponteiro interno de um array 23 sizeof -- Apelido de count() 24 sort -- Ordena um array pelo seu valor 25 Exemplo de array multidimensional 26 Exemplo de Array 27 Convertendo objetos para um array

Trabalhando com Arrays


Um array uma varivel, mas diferente das demais ele armazena uma coleo de valores e no somente um. E ainda por cima podem conter outras variveis e de tipos diferentes. Detalhe importante: Quando em uma funo precisarmos rtornar mais de um valor array a sada, basta retornar todos os valors em forma de array. Alm disso semelhante ao que estudamos na matemtica: linhas e colunas. Matriz 3x4 (3 linhas e 4 colunas). Um array no PHP um mapa ordenado, que relaciona valores com chaves (em linhas e colunas). Especificando um array() array([chave =>] valor, ...); Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

3/165

A chave pode ser uma string ou um inteiro. O valor pode ser qualquer coisa. Algumas das funes Essas funes abaixo permitem a interao e manipulao de arrays de vrias formas. Arrays so essenciais para armazenar, gerenciar, operar sobre um conjunto de variveis. Arrays (matrizes) simples e multidimensionais so suportados e podem ser criados pelo usurio ou por outras funes. Existem diversas funes especficas para bancos de dados, que preenchem arrays com os dados retornados em consultas, e vrios outros tipos de funes tambm retornam arrays.

array_fill -- Preenche um array com valores


array array_fill ( int start_index, int num, mixed value )
<?php $a = array_fill(5, 6, 'banana'); print_r($a); ?>

array_merge -- Funde dois ou mais arrays


array array_merge ( array array1, array array2 [, array ...] )
<?php $array1 = array(); $array2 = array(1 => "data"); $result = array_merge($array1, $array2); ?>

No esquea que as chaves numricas sero reordenadas!


Array ( [0] => data )

Se voc quer preservar os arrays e apenas concaten-los, o operador +:


<?php $array1 = array(); $array2 = array(1 => "data"); $result = $array1 + $array2; ?>

As chaves numricas sero preservadas e as associaes originais permanecem.

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

4/165

array_pad -- Expande um array para um certo comprimento utilizando um determinado valor


array array_pad ( array input, int pad_size, mixed pad_value ) Exemplo 1. Exemplo de array_pad()
<?php $input = array(12, 10, 9); $result = array_pad($input, 5, 0); // $result array(12, 10, 9, 0, 0) $result = array_pad($input, -7, -1); // $result array(-1, -1, -1, -1, 12, 10, 9) $result = array_pad($input, 2, "noop"); // No ser expandido. ?>

array_pop -- Retira um elemento do final do array


mixed array_pop ( array array )
<?php $cesta = array("laranja", "banana", "melancia", "morango"); $fruta = array_pop($cesta); print_r($cesta); ?>

array_push -- Adiciona um ou mais elementos no final de um array


int array_push ( array array, mixed var [, mixed ...] )
<?php $cesta = array("laranja", "morango"); array_push($cesta, "melancia", "batata"); print_r($cesta); ?>

array_reverse -- Retorna um array com os elementos na ordem inversa


array array_reverse ( array array [, bool preserve_keys] )
<?php $input = array("php", 4.0, array ("verde", "vermelho"));

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
$result = array_reverse($input); $result_keyed = array_reverse($input, TRUE); print_r($result_keyed); ?>

5/165

array_search
-- Procura por um valor em um array e retorna sua chave correspondente caso seja encontrado. Caso contrrio retorna FALSE. mixed array_search ( mixed procurar_este, array procurar_neste [, bool strict] )
<?php $a=array("a","b",0,"c","d"); echo "a: ".array_search("a",$a)."<br>"; echo "b: ".array_search("b",$a)."<br>"; echo "c: ".array_search("c",$a)."<br>"; echo "d: ".array_search("d",$a)."<br>"; echo "0: ".array_search("0",$a)."<br>"; echo "x: ".array_search("x",$a)."<br>"; echo "1: ".array_search("1",$a); ?> <?php if (array_search($needle, $array)!== FALSE) { //code goes here ( } ?> <?php function array_replace($search, $replace, &$array) { foreach($array as $key => $value) { if($value == $search) { $array[$key] = $replace; } } } ?> <? $Projects[0] = array(123, "Text 1"); $Projects[1] = array(456, "Text 2"); $Projects[2] = array(789, "Text 3"); $search_value = "ext 3"; foreach ($Projects as $key => $row){ foreach($row as $cell){ if (strpos($cell, $search_value) !== FALSE){ echo "<p>Project ".$key; } } } ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

6/165

array_shift -- Retira o primeiro elemento de um array


mixed array_shift ( array array )
<?php $cesta = array("laranja", "banana", "melancia", "morango"); $fruta = array_shift($cesta); print_r($cesta); ?>

array_sum -- Calcula a soma dos elementos de um array


mixed array_sum ( array arr )
<?php $a = array(2, 4, 6, 8); echo "soma(a) = ".array_sum($a)."<br>"; $b = array("a" => 1.2, "b" => 2.3, "c" => 3.4); echo "soma(b) = ".array_sum($b)."<br>"; ?>

array_unique -- Remove os valores duplicados de um array array array_unique ( array array )


<?php $input = array("a" => "verde", "vermelho", "b" => "verde", "azul", "vermelho"); $result = array_unique($input); print_r($result); ?>

Exemplo 2. array_unique() e tipos


<?php $input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input); var_dump($result); ?> <pre> <h2>array_values -- Retorna todos os valores de um array</h2> array array_values ( array input ) //Retorna os valores, as chaves no <pre> <?php $array = array("tamanho" => "G", "cor" => "dourado"); print_r(array_values ($array)); ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

7/165

array -- Cria um array


array array ( [mixed ...] ) Exemplo 1. Exemplo de array()
<?php $frutas = array ( "frutas" => array("a"=>"laranja", "b"=>"banana", "c"=>"ma"), "numeros" => array(1, 2, 3, 4, 5, 6), "buracos" => array("primeiro", 5 => "segundo", "terceiro") ) ?>

Exemplo 2. Indexao automtica com array()


<?php $array = array(1, 1, 1, 1, print_r($array); ?> 1, 8 => 1, 4 => 1, 19, 3 => 13);

arsort
-- Ordena um array em ordem descrescente dos valores mantendo a associao entre ndices e valores void arsort ( array array [, int sort_flags] )
<?php $frutas = array("d" => "limao", "a" => "laranja", "b" => "banana", "c" => "melancia"); arsort($frutas); reset($frutas); while (list($chave, $valor) = each($frutas)) { echo "$chave = $valor\n"; } ?>

asort
-- Ordena um array em ordem crescente dos valores mantendo a associao entre ndices e valores void asort ( array array [, int sort_flags] )
<?php $frutas = array("d" => "limao", "a" => "laranja", "b" => "banana", "c" => "melancia"); asort($frutas); reset($frutas);

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
while (list($chave, $valor) = each($frutas)) { echo "$chave = $valor\n"; } ?>

8/165

count -- Conta o nmero de elementos de uma varivel


int count ( mixed var [, int mode] )
<?php $a[0] = 1; $a[1] = 3; $a[2] = 5; $a[3] = 6; $result = count($a); // $result == 4 print $result."<br>"; $b[0] = 7; $b[5] = 9; $b[10] = 11; $result = count($b); // $result == 3; print $result; ?>

Exemplo 2. Uso recursivo da funo count() (PHP >= 4.2.0)


<?php $food = array( 'fruits' => array('orange', 'banana', 'apple'), 'veggie' => array('carrot', 'collard','pea')); // recursive count echo count($food,COUNT_RECURSIVE); // mostra 8 // normal count echo count($food); // mostra2 2 ?> <?php $food = array( 'fruits' => array('orange', 'banana', 'apple'), 'veggie' => array('carrot', 'collard','pea')); // recursive count echo count($food,COUNT_RECURSIVE)."<br>"; // mostra 8 // normal count echo count($food); // mostra2 2 ?>

current -- Retorna o elemento corrente em um array


mixed current ( array array )
<?php

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
$transport = array('foot', 'bike', 'car', 'plane'); $mode = current($transport); // $mode = 'foot'; echo "Atual $mode<br>"; $mode = next($transport); // $mode = 'bike'; echo "Atual $mode<br>"; $mode = current($transport); // $mode = 'bike'; echo "Atual $mode<br>"; $mode = prev($transport); // $mode = 'foot'; echo "Atual $mode<br>"; $mode = end($transport); // $mode = 'plane'; echo "Atual $mode<br>"; $mode = current($transport); // $mode = 'plane'; echo "Atual $mode<br>"; ?>

9/165

each -- Retorna o par chave/valor corrente de um array e avana o seu cursor


array each ( array array )
<?php $foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese"); $bar = each($foo); print_r($bar); ?> <?php $foo = array("Robert" => "Bob", "Seppo" => "Sepi"); $bar = each($foo); print_r($bar); ?>

Percorrendo um array com each()


<?php $fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry'); reset($fruit); while (list($key, $val) = each($fruit)) { echo "$key => $val\n"; } /* Sada: a => apple b => banana c => cranberry */ ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

10/165

end -- Faz o ponteiro interno de um array apontar para o seu ltimo elemento
mixed end ( array array )
<?php $frutas = array('melancia', 'banana', 'morango'); print end($frutas); // morango ?>

key -- Retorna uma chave da posio atual de um array associativo


mixed key ( array array )
<?php $array = array( 'fruit1' => 'apple', 'fruit2' => 'orange', 'fruit3' => 'grape', 'fruit4' => 'apple', 'fruit5' => 'apple'); // este ciclo exibir todas as chaves do array associativo // ausiliado pela funo next() while ($fruit_name = current($array)) { echo key($array).'<br>'; next($array); } ?> <?php $array = array( 'fruit1' => 'apple', 'fruit2' => 'orange', 'fruit3' => 'grape', 'fruit4' => 'apple', 'fruit5' => 'apple'); // este ciclo exibir toda a chave do array associativo // onde o valor igual a "apple" while ($fruit_name = current($array)) { if ($fruit_name == 'apple') { echo key($array).'<br>'; } next($array); } ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

11/165

next -- Avana o ponteiro interno de um array


mixed next ( array array )
<?php $transport = array('foot', 'bike', 'car', 'plane'); $mode = current($transport); // $mode = 'foot'; print"$mode<br>"; $mode = next($transport); // $mode = 'bike'; print"$mode<br>"; $mode = next($transport); // $mode = 'car'; print"$mode<br>"; $mode = prev($transport); // $mode = 'bike'; print"$mode<br>"; $mode = end($transport); // $mode = 'plane'; print"$mode<br>"; ?>

prev -- Retrocede o ponteiro interno de um array


mixed prev ( array array )
<?php $transport = array('foot', 'bike', 'car', 'plane'); $mode = current($transport); // $mode = 'foot'; print"$mode<br>"; $mode = next($transport); // $mode = 'bike'; print"$mode<br>"; $mode = next($transport); // $mode = 'car'; print"$mode<br>"; $mode = prev($transport); // $mode = 'bike'; print"$mode<br>"; $mode = end($transport); // $mode = 'plane'; print"$mode<br>"; ?> <pre> <h2>reset -- Faz o ponteiro interno de um array apontar para o seu primeiro elemento</h2> mixed reset ( array array ) <pre> <?php $array = array('primero passo', 'segundo passo', 'terceiro passo', 'quarto passo'); // por definio, o ponteiro est sobre o primeiro elemento echo current($array)."<br>\n"; // "Primeiro passo" // pula dois passos next($array); next($array); echo current($array)."<br>\n"; // "passo trs"

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

12/165

// reinicia o ponteiro, comea novamente o primeiro passo reset($array); echo "Depois de resetado...: " . current($array)."<br>\n"; // "primeiro passo" ?>

sizeof -- Apelido de count() sort -- Ordena um array pelo seu valor


void sort ( array array [, int sort_flags] )
<?php $frutas = array("limao", "laranja", "banana", "melancia"); sort($frutas); reset($frutas); while (list($chave, $valor) = each($frutas)) { echo "frutas[".$chave."] = ".$valor."<br>"; } ?>

Os seguintes tambm so funcionalmente idnticos:


<?php $arr = array("one", "two", "three"); reset($arr); while (list($key, $value) = each ($arr)) { echo "Chave: $key; Valor: $value<br />\n"; } foreach ($arr as $key => $value) { echo "Chave: $key; Valor: $value<br />\n"; } ?>

Mais alguns exemplos para demonstrar os usos:


<?php /* exemplo foreach 1: somente valores */ $a = array(1, 2, 3, 17); foreach ($a as $v) { echo "Valor atual de \$a: $v.\n"; } /* exemplo foreach 2: valores (com as chaves impressas para ilustrao) */ $a = array(1, 2, 3, 17);

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
$i = 0; /* para exemplo somente */ foreach ($a as $v) { echo "\$a[$i] => $v.\n"; $i++; } /* exemplo foreach 3: chaves e valores */ $a = array ( "um" => 1, "dois" => 2, "trs" => 3, "dezessete" => 17 ); foreach ($a as $k => $v) { echo "\$a[$k] => $v.\n"; } /* exemplo foreach 4: arrays multidimensionais */ $a[0][0] $a[0][1] $a[1][0] $a[1][1] = = = = "a"; "b"; "y"; "z";

13/165

foreach ($a as $v1) { foreach ($v1 as $v2) { echo "$v2\n"; } } /* exemplo foreach 5: arrays dinmicos */ foreach (array(1, 2, 3, 4, 5) as $v) { echo "$v\n"; } ?>

Exemplo de array multidimensional


$produto[1][codigo] = "1"; $produto[1][nome] = "Joo Pereira Brito"; $produto[1][email] = "[email protected]"; $produto[1][rua] = "Vasco da Gama"; $produto[1][numero] = "1345"; $produto[2][codigo] = "2"; $produto[2][nome] = "Antnio queiroz";

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

14/165

Exemplo de Array
$i=0; while($i < $numregs){ $codigo=pg_result($consulta,$i,codigo); $nome=pg_result($consulta,$i,nome); $venc=pg_result($consulta,$i,vencimento); $apartamento=pg_result($consulta,$i,apartamento); $pessoas=pg_result($consulta,$i,pessoas); $cota_agua=pg_result($consulta,$i,cota_agua); $cota_condominio=pg_result($consulta,$i,cota_condominio); $cota_reserva=pg_result($consulta,$i,cota_reserva); $total = $cota_agua + $cota_condominio + $cota_reserva; $total = number_format($total,2, ',','.');

... $i++; }

Tambm podemos ter um array formado por outros arrays (neste caso, cada sub array uma linha do principal)
$arrayvarios = array( array(1, 3, 5, 7), array(2, 4, 6, 8), array(1, 1, 1, 1) );

Neste caso temos um array 2x4 (2 linhas por 4 colunas, que iniciam sempre com ndice zero). Ento se queremos retornar o valor 8, que est na linha 2 e coluna 4, devemos retornar o ndice 1,3 (linha2=ndice 1, coluna4=ndice3). print $arrayvarios[1][3]; Agora veremos com detalhes os pares: chave => valor:
$alunos = array( "0732355" => "Ribamar FS", "0823456" => "Antnio Brito", "0654345" => "Roberto Queiroz" );

O que isto retornaria?


print $alunos["0732355"]; print $alunos[0];

Experimente!! Atribuindo valores s chaves de arrays Tambm podemos fazer diretamente assim: print $alunos["0732355"] = "Joo Brito"; Lembrando que, a chave, exclusiva. Podemos ter
$alunos["0732355"] = "Joo Brito";

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
$alunos["0932355"] = "Joo Brito"; Mas no podemos ter: $alunos["0732355"] = "Joo Brito"; $alunos["0732355"] = "Ribamar FS";

15/165

Anexo agora um excelente tutorial sobre Arrays do Celso Goya publicado em: http://www.xoopstotal.com.br/modules/wfsection/article.php?articleid=51 Trabalhando com arrays Viso geral Para facilitar o entendimento, vamos definir array como um conjunto de valores, que podem ser identificados em grupo ou ento separadamente. Estes conjuntos podem ser muito teis enquanto programamos, pois em alguns casos podem substituir uma tabela em banco de dados ou ento utilizando mtodos mais avanados podemos carreg-los dinmicamente e utilizar quase como um banco de dados em memria. A linguagem PHP oferece uma incrvel gama de recursos para se trabalhar com arrays. Com destaque para as funes auxiliares que permitem fazer desde uma simples contagem de elementos at a converso automtica de um array em string. Neste artigo desenvolveremos como exemplo uma funo para gerar combo boxes com os estados do Brasil. Muitas vezes criamos uma tabela no banco de dados para armazenar a lista de estados do Brasil sendo que neste caso existe um nmero finito de registros e menor que 100, ento as operaes de banco de dados no so to geis quanto o uso de um array. Criando o primeiro array Para utilizar um array, antes de mais nada preciso criar uma varivel do tipo array.
<?php $estados = array(); ?>

O prximo passo montar nossa lista de estados.


<?php $estados = array(); $estados[0] = "Acre"; $estados[1] = "Alagoas"; $estados[2] = "Amap"; $estados[3] = "Amazonas"; ?>

Os colchetes servem para identificar qual elemento do nosso conjunto estamos nos referindo e o nmero entre colchetes o cdigo identificador do elemento. Podemos fazer o seguinte teste:
<?php $estados = array(); $estados[0] = "Acre"; $estados[1] = "Alagoas";

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
$estados[2] = "Amap"; $estados[3] = "Amazonas"; echo($estados[0]); ?>

16/165

Neste caso ser exibida a palavra Acre, pois indicamos o tem [0] da varivel $estados, que um array. Voc deve estar se perguntando "O que h de to fantstico em um array?". Agora vamos mostrar alguns recursos. Criando o array de estados Nosso array no ser de grande valia se no permitir que as siglas dos estados sejam armazenadas tambm, pois desta forma podemos guardar no banco de dados apenas os dois caractres correspondentes sigla do estado, ou seja, utilizaremos apenas dois bytes no banco de dados. Ento vamos criar um array com duas colunas, sendo a primeira a sigla do estado e a segunda seu nome por extenso.
<?php $estados = array(); $estado[0][0] = "AC"; $estado[0][1] = "Acre"; $estado[1][0] = "AL"; $estado[1][1] = "Alagoas"; $estado[2][0] = "AP"; $estado[2][1] = "Amap"; $estado[3][0] = "AM"; $estado[3][1] = "Amazonas"; $estado[4][0] = "BA"; $estado[4][1] = "Bahia"; $estado[5][0] = "CE"; $estado[5][1] = "Cear"; $estado[6][0] = "DF"; $estado[6][1] = "Distrito Federal"; $estado[7][0] = "ES"; $estado[7][1] = "Esprito Santo"; $estado[8][0] = "GO"; $estado[8][1] = "Gois"; $estado[9][0] = "MA"; $estado[9][1] = "Maranho"; $estado[10][0] = "MG"; $estado[10][1] = "Minas Gerais"; $estado[11][0] = "MT"; $estado[11][1] = "Mato Grosso"; $estado[12][0] = "MS"; $estado[12][1] = "Mato Grosso do Sul"; $estado[13][0] = "PA"; $estado[13][1] = "Par"; $estado[14][0] = "PR"; $estado[14][1] = "Paran"; $estado[15][0] = "PE"; $estado[15][1] = "Pernambuco";

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
$estado[16][0] $estado[16][1] $estado[17][0] $estado[17][1] $estado[18][0] $estado[18][1] $estado[19][0] $estado[19][1] $estado[20][0] $estado[20][1] $estado[21][0] $estado[21][1] $estado[22][0] $estado[22][1] $estado[23][0] $estado[23][1] $estado[24][0] $estado[24][1] $estado[25][0] $estado[25][1] ?> = = = = = = = = = = = = = = = = = = = = "PI"; "Piau"; "RJ"; "Rio de Janeiro"; "RN"; "Rio Grande do Norte"; "RS"; "Rio Grande do Sul"; "RO"; "Rondnia"; "RR"; "Roraima"; "SC"; "Santa Catarina"; "SP"; "So Paulo"; "SE"; "Sergipe"; "TO"; "Tocantins";

17/165

A diferena neste exemplo que utilizamos dois identificadores de elemento, ou seja, agora para cada elemento do array possuimos mais outros dois dependentes. Da mesma forma que criamos dois elementos o 0 e 1 para cada item de estado poderiamos criar n novos sub-elementos, por exemplo:
<?php $estado = array(); $estado[0][0] = "SP"; $estado[0][1] = "So Paulo"; $estado[0][2] = "Sudeste"; ?>

Vamos considerar partir de agora que um array possui linhas e colunas, onde as linhas so equivalentes ao primeiro conjunto de colchetes e as colunas so equivalentes ao segundo conjunto de colchetes. A funo de exibio do combo box de estados Agora vamos exibir todos os elementos de nosso array em uma funo:
<?php /*Nossa funo reebe 3 parmetros $pNome :: Corresponde ao nome do SELECT $pSelected :: Corresponde ao elemento que dever possuir o status de selecionado automaticamente $extra :: Caso precise adicionar um style, ou ento opo de multiple */ function renderCombo($pNome = "", $pSelected = "SP", $extra = ""){ echo("<SELECT NAME='".$pNome."' ".$extra.">"); /* Para exibir todos os itens do nosso combo utilizamos o comando for , lembre-se que como usamos nmeros para identificar nosso array, ento podemos substitu-lo automaticamente com o for

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
*/

18/165

//Realiza o loop em todos os elementos do array for( $i = 0; $i < 26;$i++ ){ //Imprime a TAG OPTION usando a primeira coluna do array echo("<OPTION VALUE='".$estado[$i][0]."'"); //Efetua a comparao para verificar se este o tem selecionado if( $estado[$i][0] == $pSelected ){ //Caso a comparao seja verdadeira seleciona o tem echo(" SELECTED"); } //Imprime o nome por extenso do estado, equilavente a segunda coluna do array echo(">".$estado[$i][1]."</option>\n"); } //Finaliza a tag SELECT echo("</SELECT>\n"); } ?>

Eureka! Esta feita uma funo para exibir um combo de estados. Identificadores alternativos Na linguagem PHP podemos utilizar palavras para identificar um elemento de um array, este recurso muito bom, pois facilita muito a depurao e o entendimento de programas que utilizam arrays. Vamos utilizar nosso array de estados como exemplo:
<?php $estado[0]["sigla"] = "SP"; $estado[0]["nome"] = "So Paulo"; $estado[0]["regiao"] = "Sudeste"; echo($estado[0]["sigla"]); ?>

Desta forma podemos deixar o cdigo de nossos programas mais fceis de se compreender. Repare que utilizamos uma string simples para identificar um elemento do array, sendo assim, podemos utilizar variveis para identificar um item do array, por exemplo:
<?php $estado[0]["sigla"] = "SP"; $estado[0]["nome"] = "So Paulo"; $estado[0]["regiao"] = "Sudeste"; $variavel = "sigla"; echo($estado[0][$variavel]); ?>

importante lembrar que mesmo existindo uma string para identificar um elemento do array ainda podemos utilizar nmeros se quisermos, por exemplo: Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
<?php $estado[0]["sigla"] = "SP"; $estado[0]["nome"] = "So Paulo"; $estado[0]["regiao"] = "Sudeste"; echo($estado[0][0]); ?>

19/165

Nos trs casos o resultado o mesmo, diferindo apenas no mtodo como chamamos o array. O que voc viu neste artigo o bsico sobre arrays, caso voc se interessar pelo assunto e queira dar uma pesquisada rpida na web, vai encontrar outras formas de declarar arrays bem como usos diferenciados. O XOOPS utiliza muito este recurso. s dar uma olhada em algum arquivo xoops_version.php, que voc vai encontrar um exemplo prtico do uso de arrays. Final do tutorial do Celso Goya.

Convertendo objetos para um array


http://www.revistaphp.com.br/print.php?id=147

$array = array(); if(is_array($array)){ echo 'Varivel $array um array'; } else { echo 'Variable is not an array'; } Usando Array em Laos For <?php $animals = array( 'dingo', 'wombat', 'Steve Irwin', 'playpus', 'emu' ); /*** Recebe o tamanho do array ***/ $size = sizeof( $animals ); for( $i=0; $i<$size; $i++ ){ echo $animals[$i].'<br />'; } ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado While <?php $animals = array( 'dingo', 'wombat', 'Steve Irwin', 'playpus', 'emu' ); $size = sizeof( $animals ); /*** set um contador ***/ $i = 0; while( $i < $size ) { echo $animals[$i].'<br />'; $i++; } ?> foreach O foreach varre todos os elementos de um array <?php $animals = array( 'dingo', 'wombat', 'Steve Irwin', 'playpus', 'emu' ); foreach( $animals as $animal ) { echo $animal.'<br />'; } ?> Adicionar um Elemento para um Array Usar a funo array_push(). <?php $animals = array( 'ernie'=>'dingo', 'wally'=>'wombat', 'rat bag'=>'Steve Irwin', 'playto'=>'platypus', 'marty'=>'emu' ); /*** Adicionar um novo elemento para o array ***/ array_push( $animals, 'wallaby', 'stingray' );

20/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado foreach( $animals as $key=>$animal ){ echo $key.' - '.$animal.'<br />'; } ?> Excluir elemento de array Usar a funo unset() <?php /*** create an array ***/ $animals = array( 'ernie'=>'dingo', 'wally'=>'wombat', 'rat bag'=>'Steve Irwin', 'playto'=>'platypus', 'marty'=>'emu' ); /*** delete an array element ***/ unset( $animals['rat bag'] ); /*** loop over the array ***/ foreach( $animals as $key=>$animal ) { echo $key.' - '.$animal.'<br />'; } ?>

21/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

22/165

9.2 - Trabalhando com Formulrios em PHP


Manipulando dados de formulrios com PHP Parte 1 Uma das dvidas mais freqentes entre programadores PHP iniciantes como manipular os dados de formulrio enviados para os scripts PHP, principalmente dados de "checkbox" e upload de arquivos. Nessa primeira parte desse artigo, estarei mostrando como receber e manipular dados de campos comuns de formulrios. Na prxima semana estarei mostrando como manipular o upload de arquivos atravs dos formulrios. Para facilitar, esta primeira parte est divida nos seguintes tpicos: 1 - Introduo 2 - Campos Hidden 3 - Campos Text e Textarea 4 - Campos Radio 5 - Campos Checkbox 6 - Campos Select 1 - Introduo Um formulrio HTML apenas um "rosto bonito" para onde os usurios podero inserir informaes que sero interpretados de alguma maneira por algum script do lado do servidor. E no nosso caso, esse script um script PHP. Primeiro: antes para poder enviar as informaes, seu formulrio deve conter um boto "submit", isso se consegue atravs do comando:
<input type=submit value="Texto do Boto">

Segundo: todos os campos que sero tratados no script PHP devem conter o parmetro "NAME", caso contrrio, os dados no sero passados para o script PHP. Ex: <input type=text name=nome_do_campo> Como as informaes do formulrio so passadas para esse script PHP e como as informaes do formulrio enviado so tratadas, dependem de voc. Existem 2 mtodos como as informaes podem ser passadas: GET e POST. O recomendvel sempre, para todos os formulrios usar o mtodo POST, onde os dados enviados no so visveis nas URLs, ocultando possveis importantes informaes e permitindo o envio de longas informaes. O GET totalmente o contrrio disso. Como as informaes chegam para o script PHP?

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Assuma o seguinte formulrio:


<form action="script.php" method="post"> Campo 1: <input type=text name=campo1><br> Campo 2: <input type=text name=campo2><br> <input type=submit value="OK"> </form>

23/165

Esse formulrio usa o mtodo POST para envio das informaes, ento em "script.php":
<?php echo "O valor de CAMPO 1 : " . $_POST["campo1"]; echo "<br>O valor de CAMPO 2 : " . $_POST["campo2"]; ?>

Se o formulrio tivesse sido enviado usando o mtodo GET, voc simplesmente usaria $_GET no lugar de $_POST. Observaes: Em vez de usar $_GET ou $_POST voc pode escrever a varivel com o mesmo nome do campo do formulrio (no exemplo, $campo1 e $campo2). Mas, esse uso no recomendado, pois se a diretiva "register_globals" na configurao do seu PHP estiver desativada, as variveis com nome dos campos dos formulrios, tero um valor vazio. Uma soluo para isso usar a funo import_request_variables no comeo dos seus scripts que interpretam formulrios. Essa funo aceita 3 letras como argumentos: P, G e C, referentes a $_POST, $_GET e $_COOKIE respectivamente. Exemplo de uso:
<?php import_request_variables("gP"); ?>

O que acontece? Exemplo: Voc possui formulrio com os campos "nome", "endereo" e "idade". Assuma que a diretiva "register_globals" do seu PHP esteja desligada, mas, voc j havia programado o script usando as variveis no escopo global, no lugar de $_POST. Adicionando aquela funo no comeo do script, as variveis do seu formulrio postado: $_POST["nome"], $_POST["endereco"] e $_POST["idade"] sero extradas cada para uma varivel diferente: $nome, $endereco e $idade. 2 - Campos Hidden Os campos hidden so usados para passar informaes que no podem ser alteradas pelo usurio que estar inserindo informaes no formulrio. Por exemplo: voc tem um site com sistema de login e o usurio quer alterar as informaes de login dele. O script que ir manipular esse formulrio, precisa saber o ID do usurio para poder alterar as informaes no banco de dados, Ribamar FS http://cursodephp.ribafs.org

PHP Avanado ento esse ID um campo hidden. Cdigos Exemplos: hidden.html

24/165

<form action="hidden.php" method="post"> <input type=hidden name=escondido value="valor do escondido"> <input type=hidden name=id value="111"> <input type=submit> </form>

hidden.php
<?php echo "Campo Hidden: " . $_POST["escondido"]; echo "<br>Oi, seu ID : " . $_POST["id"]; ?>

3 - Campos Text e Textarea Os campos text e textarea so os tipos mais simples, onde h somente um possvel valor por campo. Dispensam maiores explicaes. Cdigos Exemplos: texts.html
<form action="texts.php" method="post"> Nome: <input type=text name=nome><br> Email: <input type=text name=email><br><br> Mensagem: <textarea name=mensagem cols=8 rows=3></textarea><br> <input type=submit> </form>

texts.php
<?php echo "Ol " . $_POST["nome"] . " (email: " . $_POST["email"] . ")<br><br>"; echo "Sua mensagem: " . $_POST["mensagem"]; ?>

4 - Campos Radio Campos Radio permitem um relacionamento de um para muitos entre identificador e valor, ou seja, eles tm mltiplos possveis valores, mas somente um pode ser pr-exibido ou selecionado. Por exemplo: voc tem um sistema de "quiz". Cada pergunta possui 5 possveis respostas. Cada resposta um radio, onde os 5 radios dessa pergunta possuem o mesmo identificador, mas cada com valores diferentes.

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Cdigos Exemplos: radio.html

25/165

<form action="radio.php" method="post"> <B>Qual seu sistema operacional?</B><br> <input type=radio name=sistema value="Windows 98"> Win 98 <input type=radio name=sistema value="Windows XP"> Win XP <input type=radio name=sistema value="Linux"> Linux <input type=radio name=sistema value="Mac"> Mac <br><br> <B>Qual a marca de seu monitor?</B><br> <input type=radio name=monitor value="Samsung"> Samsung <input type=radio name=monitor value="LG"> LG <input type=radio name=monitor value="Desconhecido"> Desconhecido <br><br> <input type=submit> </form>

radio.php
<?php echo "Seu sistema operacional : " . $_POST["sistema"]; echo "<br>Seu monitor : " . $_POST["monitor"]; ?>

5 - Campos Checkbox O tipo Checkbox tem somente um possvel valor por entrada: on value (marcado) ou no value (desmarcado). No script voc deve fazer a verificao para saber se o campo foi marcado ou no. Se possvel tambm utilizar grupos de checkbox com o mesmo nome. Para voc deve adicionar "[]" no final do nome, para o PHP interpretar como array, veja o cdigo exemplo. Cdigos Exemplos: checkbox.html
<form action="checkbox.php" method="post"> <B>Escolha os numeros de sua preferncia:</B><br> <input type=checkbox name="numeros[]" value=10> 10<br> <input type=checkbox name="numeros[]" value=100> 100<br> <input type=checkbox name="numeros[]" value=1000> 1000<br> <input type=checkbox name="numeros[]" value=10000> 10000<br> <input type=checkbox name="numeros[]" value=90> 90<br> <input type=checkbox name="numeros[]" value=50> 50<br> <input type=checkbox name="numeros[]" value=30> 30<br> <input type=checkbox name="numeros[]" value=15> 15<br><BR> <input type=checkbox name="news" value=1> <B>Receber Newsletter?</B><br><BR> <input type=submit> </form>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado checkbox.php


<?php // Verifica se usurio escolheu algum nmero if(isset($_POST["numeros"])) { echo "Os nmeros de sua preferncia so:<BR>"; // Faz loop pelo array dos numeros foreach($_POST["numeros"] as $numero) { echo "- " . $numero . "<BR>"; } } else { echo "Voc no escolheu nmero preferido!<br>"; } // Verifica se usurio quer receber newsletter if(isset($_POST["news"])) { echo "Voc deseja receber as novidades por email!"; } else { echo "Voc no quer receber novidades por email..."; } ?>

26/165

6 - Campos Select Os campos select permitem tratar uma variedade de opes, onde o usurio pode selecionar apenas uma opo ou mltiplas opes. Quando voc permite mltiplas selees, deve adicionar "[]" no final do nome, para o PHP interpretar como array. Nos exemplos, mostro o funcionamento e tratamento de ambas. Cdigos Exemplos: select.html
<form action="select.php" method="post"> <B>Qual seu processador?</B><br> <select name=processador> <option value=Pentium>Pentium</option> <option value=AMD>AMD</option> <option value=Celeron>Celeron</option> </select><BR><BR> <B>Livros que deseja comprar?</B><br> Obs: segure "CTRL" para selecionar mais de um.<BR> <select name="livros[]" multiple> <option value="Biblia do PHP 4">Biblia do PHP 4</option>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

27/165

<option value="PHP Professional">PHP Professional</option> <option value="Iniciando em PHP">Iniciando em PHP</option> <option value="Novidades do PHP 5">Novidades do PHP 5</option> <option value="Biblia do MySQL">Biblia do MySQL</option> </select><BR><BR> <input type=submit> </form>

select.php
<?php echo "Seu processador : " . $_POST["processador"] . "<BR>"; // Verifica se usurio escolheu algum livro if(isset($_POST["livros"])) { echo "O(s) livro(s) que voc deseja comprar:<br>"; // Faz loop para os livros foreach($_POST["livros"] as $livro) { echo "- " . $livro . "<br>"; } } else { echo "Voc no escolheu nenhum livro!"; } ?>

Clique aqui para baixar os cdigos desse artigo Quaisquer dvidas que tiver, no hesite em contatar-me! At a prxima semana, onde estarei mostrando como manipular o upload de arquivos de formulrios e algumas boas tcnicas para com formulrios => PHP. Alfred Reinold Baudisch Desenvolvedor de Sistemas Web [email protected] www.estacaonet.com

Excluir Marcados <?php /* Banco - excluir_varios Tabela CREATE TABLE `produtos` ( `id` int(11) NOT NULL, Ribamar FS http://cursodephp.ribafs.org

PHP Avanado `produto` char(45) default NULL, `categoria` char(45) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; */ // Form com arquivo chamando a si mesmo $conexao = mysql_connect('localhost','root','ribafs'); mysql_select_db('excluir_varios',$conexao); $consultar = "SELECT * FROM produtos ORDER BY id"; $resultado = mysql_query($consultar, $conexao);

28/165

if(mysql_num_rows($resultado) != 0){ echo "<form name='frmExcluir' method='post' action='teste.php'>"; echo "<table border=1><tr><th>&nbsp</th><th>Produto:</th><th>Categoria:</th></tr>"; while($linha = mysql_fetch_row($resultado)){ echo "<td><input type='checkbox' name='id[]' value='$linha[0]'></td> <td>$linha[1]</td> <td>$linha[2]</td></tr>"; } echo "<tr><td colspan='3'><input type='submit' name='excluir' value='Excluir!'></td></tr>"; echo "</table></form>"; }else{ echo "Nenhum registro foi encontrado!"; } if(isset($_POST['id'])){ $opcoes = $_POST['id']; $opcoes_text = implode(", ", $opcoes); $strexcluir = "DELETE FROM produtos WHERE id in (" . $opcoes_text . ")"; mysql_query($strexcluir, $conexao) or die("Ocorreu algum erro"); }else{ echo " necessrio escolher quem ser excludo<br>"; echo "<a href='javascript: history.back();'>Voltar</a>"; } ?> Bsico de GET e POST Usar GET em situaes seguras e POST em situaes que precisem de segurana. GET suporta apenas 1024 caracteres na string. POST sem limite.

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Exemplo de uso de formulrio com PHP chamando outro script <body onLoad="document.form1.nome.focus()"> <form name="form1" method="POST" action="inserir.php"> Nome.<input type="text" name="nome"><br> E-mail<input type="text" name="email"><br> <input type="hidden" name="oculto" value="OK"> Senha<input type="password" name="senha"><br> SenhaCript<input type="password" name="senhacript"><br> <input type="submit" value="Enviar"><br> </form> <?php //$nome=$_POST["nome"]; //$email=$_POST["email"]; if (isset($nome)){ echo "O nome digitado foi " . $nome . "<br>"; echo "O e-mail digitado foi " . $email . "<br>"; echo "O campo oculto contm " . $oculto . "<br>"; echo "A senha digitada foi " . $senha . "<br>"; echo "A senha md5 digitada foi " . md5($senhacript) . "<br>"; } ?>

29/165

Exemplo de uso de formulrio com PHP chamando o mesmo script <body onLoad="document.form1.nome.focus()"> <form name="form1" method="POST" action="<?php $_PHPSELF ?>"> Nome.<input type="text" name="nome"><br> E-mail<input type="text" name="email"><br> <input type="submit" name="enviar" value="Enviar"><br> </form> <?php if(isset($_POST['enviar'])){ $nome = $_POST["nome"]; $email = $_POST["email"]; if(isset($nome)){ echo "O nome digitado foi " . $nome . "<br>"; echo "O e-mail digitado foi " . $email . "<br>"; } } ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

30/165

import_request_variables("gP"); import_request_variables -- Import GET/POST/Cookie variables into the global scope Muito indicado para quem tem o register_globals desativado e no quer digitar $_POST, $_GET ou $_COOKIE. Sempre deve vir na primeira linha do script ou antes do uso da varivel. import_request_variables("gP", "rvar_"); echo $rvar_foo; Alerta: evite usar o recurso acima em produo, use apenas em caso de teste e ainda assim deve ser evitado e em teste devemos reproduzir o que iremos usar em produo. As informaes digitadas em um formulrio podem ser capturadas por um script PHP. Veja como: form.html <form action="recebe.php" method="POST"> Nome <input type="text" name="nome"><br> Idade <input type="text" name="idade"><br> <input type="submit" value="Enviar"> </form> recebe.php <?php echo $_POST["nome"]; echo "<br>"; echo $_POST["idade"]; ?> Recebendo dados via URL Se temos a seguinte situao: Temos um arquivo c:\www\teste.php, com o seguinte cdigo: <?php echo $_GET['codigo']; ?> Queremos passar uma varivel cdigo com valor 5, fazemos: http://127.0.0.1/teste.php?codigo=5

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

31/165

Para receber mais de uma varivel ou campo usar: http://127.0.0.1/teste.php?codigo=5&nome="Antnio"&email="[email protected]" echo "Cdigo = ".$_GET['codigo']." Nome = ".$_GET['nome']." E-mail = ".$_GET['email']; Tambm podemos passar variveis pela URL, assim teste.php?codigo=$cod

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

32/165

9.3 - Trabalhando com Arquivos em PHP


Quando abrimos um arquivo para leitura (r+) o ponteiro situa-se no incio do arquivo. Quando abrimos um arquivo para anexar (a+) o ponteiro situa-se no final do arquivo. Sempre usar fclose() quando finalizar de trabalhar com o arquivo para economizar memria. O PHP suporta duas funes bsicas para escrever em arquivos: file_put_contents() - que escreve ou anexa uma string para um arquivo. fwrite() - funo que incrementalmente escreve dados para um arquivo texto. Exemplos: file_put_contents($string, $arquivo); A funo file($arquivo) l arquivos texto. Ler todo um arquivo em uma string: $file = file_get_contents("/windows/system32/drivers/etc/services"); print("Size of the file: ".strlen($file)."\n"); Abrir um arquivo para leitura $file = fopen("/windows/system32/drivers/etc/hosts", "r"); print("Tipo de manipulador de arquivo: " . gettype($file) . "\n"); print("Primeira linha do manipulador do arquivo: " . fgets($file)); fclose($file); Ler um nico caractere de um arquivo: <?php $file = fopen("/windows/system32/drivers/etc/services", "r"); $count = 0; while ( ($char=fgetc($file)) !== false ) { if ($char=="/") $count++; } fclose($file); print("Number of /: $count\n"); ?> Contedo do meuarquivo.txt 1|Meu nome|Meu site|Ol pessoal 2|Meu nome1|Meu site|Ol pessoal 3|Meu nome2|Meu site|Ol pessoal 4|Meu nome3|Meu site|Ol pessoal 5|Meu nome4|Meu site|Ol pessoal Primeiro, vamos colocar todo o arquivo num array. Use o seguinte cdigo: $meuArray = file("nomedoarquivo.txt"); Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Vamos excluir a linha que tenha o primeiro valor do array igual a 3.

33/165

Para isto, temos que ler cada linha do array e fazer um "explode" delas, separando os "|" como se fosse em colunas. Depois, faremos um [cfIF[/cf] perguntando se a coluna desejada igual ao valor que queremos: 3 for($n=0; $n < count($meuArray); $n++) { $cadaLinha = explode("|", $meuArray[$n]); if($cadaLinha[0] == 3) { echo "Meu nome: $cadalinha[1] - Site: $cadalinha[2]"; } } Excluindo linhas do array e salvando nos arquivos: $meuArray = file("nomedoarquivo.txt"); // coloco todo o arquivo num array $arrayModificado = array(); // crio um array vazio. for($n=0; $n < count($meuArray); $n++) { $cadaLinha = explode("|", $meuArray[$n]); if($cadaLinha[0] <> 3) { $arrayModificado[] = $meuArray[$n]; } } Depois s salvar o array no arquivo, incluindo cada linha do array j modificado: $bufferArquivo = fopen('nomedoarquivo.txt',"w"); for($n=0; $n < count($arrayModificado); $n++) { fwrite($bufferArquivo, $arrayModificado[$n]); } fclose($bufferArquivo); Autor: Emannuel em http://www.codigofonte.net/dicas/php/130_trabalhando-com-arquivos Veja tambm: http://onlamp.com/pub/a/php/2002/10/03/php_foundations.html http://onjava.com/pub/a/php/2002/12/12/php_foundations.html http://onlamp.com/pub/a/php/2003/01/09/php_foundations.html

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

34/165

1 Abrir arquivo 2 Gravar em Arquivo 3 Ler Arquivo 4 fgets() 5 fgetc() 6 Ler Todo um Arquivo 7 file() 8 Ler Arquivo Via URL 9 feof(handle) 10 Contando o Nmero de Linhas de um arquivo 11 Contar palavras de um arquivo mostrando duplicadas 12 Ler de forma inversa um arquivo, linha a linha 13 Ler aleatoriamente linha de arquivo 14 Ler linha especfica de arquivo 15 Operaes com Diretrios 16 Mostrando contedo de diretrio 17 Excluindo arquivos do SO 18 Copiando arquivos 19 Processando todos os arquivos de um diretrio 20 Teste se Arquivo pode ser lido 21 Testar se Arquivo Permite Escrita 22 Testar se Arquivo Existe 23 Testar se Arquivo ou Diretrio 24 Outras Funes 25 Espao Total no Disco 26 Espao Livre no Disco 27 Tamanho de Diretrio, nmero de arquivos e sub-diretrios 27.1 Detalhes : $path 28 Tamanho de diretrio 29 Trechos do Tutorial - The right way to read files with PHP da IBM 30 L e imprime todo o contedo de um arquivo CSV 31 rmdir -- Remove um diretrio 32 rename -- Renomear um arquivo ($antigo, $novo) 33 unlink -- Apaga um arquivo 34 mkdir -- Criar um diretrio 35 file_exists -- Checa se um arquivo ou diretrio existe 36 disk_free_space -- Retorna o espao disponivel no diretrio 37 Receber Contedo de URL 38 Recursively find files by filename pattern 39 Referncia

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

35/165

Abrir arquivo
fopen(filename, mode, [use_include_path]); filename: pode ser simplesmente um nome, ou um caminho completo. Exemplos: "arquivo.txt", "./arquivo.dat", "/data/data.txt". mode: especifica o modo de abertura, ou seja, se o arquivo deve ser aberto para leitura, escrita, etc. Modos de abertura:
- r: abre o arquivo no modo somente leitura e posiciona o ponteiro no incio do arquivo; o arquivo j deve existir; - r+: abre o arquivo para leitura/escrita, posiciona o ponteiro no incio do arquivo; - w: abre o arquivo no modo somente escrita; se o arquivo j existir, ser sobrescrito; seno, ser criado um novo; - w+: abre o arquivo para escrita/leitura; se o arquivo j existir, ser sobrescrito; seno, ser criado um novo; - a: abre o arquivo para anexar dados, posiciona o ponteiro no final do arquivo; se o arquivo no existir, ser criado um novo; - a+: abre o arquivo para anexo/leitura, posiciona o ponteiro no final do arquivo; se o arquivo no existir, ser criado um novo; <?php $fp = fopen("./arquivo.dat", "r"); // $fp conter o handle do arquivo que abrimos ?> <pre> <h2>Fechar Arquivo</h2> <pre> fclose(handle_arquivo); <?php fclose($fp); ?>

Gravar em Arquivo
<?php $fp = fopen("./dados.txt", "w"); fwrite($fp, "Ol mundo do PHP!"); // grava a string no arquivo. Se o arquivo no existir ele ser criado fclose($fp); ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

36/165

Ler Arquivo
<?php $fp = fopen("./dados.txt", "r"); $texto = fread($fp, 20); // l 20 bytes do arquivo e armazena em $texto fclose($fp); echo $texto; ?>

fgets()
Esta funo usada na leitura de strings de um arquivo. fgets() l "length - 1" bytes do arquivo. Por default l 1024 bytes para o comprimento da linha. Se for encontrado o final da linha e o nmero de bytes especificados no tiver sido atingido, fgets() terminar a leitura no final da linha (ou no final do arquivo, se for o caso). Eis a sua sintaxe: fgets(handle, length); - handle: handle do arquivo de onde os dados sero lidos; - length: tamanho em bytes do buffer de leitura; Exemplo:
<?php $fp = fopen("./dados.txt", "r"); $texto = fgets($fp, 3); fclose($fp); echo $texto; ?>

fgetc()
Esta funo permite ler caractere por caractere de um arquivo. Seguem a sintaxe e um exemplo de utilizao: fgetc(handle); - handle: manipulador do arquivo de onde os dados sero lidos;

Ler Todo um Arquivo


<?php $fp = fopen("./dados.txt", "r"); while (!feof($fp)){ $char .= fgetc($fp); } fclose($fp); echo $char."<br><br>"; ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

37/165

file()
Esta funo l um arquivo completo, e armazena cada linha do arquivo como um elemento de um array. Depois de ler todo o contedo do arquivo, file() o fecha automaticamente, no sendo necessria uma chamada a fclose(); Vejamos a sintaxe:

Ler Arquivo Via URL


$fh = fopen("http://127.0.0.1/", "r"); file(filename); - filename: nome ou caminho completo de um arquivo. Exemplo:
<?php // file() l todo o arquivo $file_lines = file("./dados.txt"); echo "Primeira linha: " . $file_lines[0]."<br>"; echo "Segunda linha: " . $file_lines[1]."<br>"; echo "Terceira linha: " . $file_lines[2]; ?>

Alm dessas funes para leitura e escrita, existe ainda uma funo bastante til, que testa se o final do arquivo foi atingido. a funo feof(), que tem a seguinte sintaxe:

feof(handle)
- handle: handle do arquivo; Exemplo:
<?php $fp = fopen("./dados.txt", "r"); while(!feof($fp)) { $char .= fgetc($fp); } fclose($fp); echo $char; ?>

Contando o Nmero de Linhas de um arquivo


<?php // Contar o nmero de linhas de um arquivo, iniciando com 1 $fp = "./dados.txt"; $line_count = count (file ($fp)); echo $line_count; ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

38/165

Contar palavras de um arquivo mostrando duplicadas


/* // Contar palavras repetidas em um arquivo $fn = "./dados.txt"; $f_contents = preg_split ("/[\s+/", implode ("", file ($fn))); foreach ($f_content as $palavra) { $ar[$palavra]++; } print "A seguinte palavra tem duplicatas<br>"; foreach ($ar as $palavra => $conta_palavra) { if (conta_palavra > 1) { print "Palavra: $palavra<br>Nmero de ocorrncias: $conta_palavra<br><br>"; } } */

Ler de forma inversa um arquivo, linha a linha


<?php $fn = "./dados.txt"; $f_contents = array_reverse (file ($fn)); foreach ($f_contents as $linha_inversa) { print $linha_inversa; } ?>

Ler aleatoriamente linha de arquivo


<?php $fn = "./pensamentos.txt"; $f_contents = file ($fn); srand ((double)microtime()*1000000); $linha_aleatoria = $f_contents[ rand (0, (count ($f_contents) - 1)) ]; print $linha_aleatoria; ?>

Ler linha especfica de arquivo


<?php $fn = "./dados.txt"; $nr_linha = 38; $f_contents = file ($fn); $sua_linha = $f_contents [$nr_linha]; print $sua_linha; ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

39/165

Operaes com Diretrios Mostrando contedo de diretrio


<?php $dn = opendir ("/home/1www/"); while ($file = readdir ($dn)) { print "$file<br>"; } closedir($dn); ?>

Excluindo arquivos do SO
<?php $fn = "./dados0.txt"; // Excluindo arquivo $ret = unlink ($fn); if ($ret){ die ("Arquivo excludo!"); }else{ die ("Erro ao excluir arquivo"); } ?>

Copiando arquivos
<?php $fn = "./dados.txt"; if (copy ($fn, "dados0.txt")){ die ("Arquivo '$fn' copiado para dados0.txt "); }else{ die ("Erro ao copiar arquivo"); } ?>

Processando todos os arquivos de um diretrio


<?php $dh = dir ("/home/1www/"); while ($entrada = $dh->read()) { print $entrada . "<br>"; } $dh->close(); ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

40/165

Teste se Arquivo pode ser lido


<?php if (is_readable('http://127.0.0.1/index.html')) { header('Location: http://127.0.0.1/index.html'); }else{ echo "Este arquivo no pode ser lido!"; } ?> <?php // TESTAR SE ARQUIVO PERMITE LEITURA print '<br>'; $filename = 'teste2.php'; if (is_readable($filename)) { echo 'O arquivo permite leitura'; } else { echo 'O arquivo no permite leitura'; } print '<br>';

//Outro <?php if (is_readable('http://127.0.0.1/index.html')) {


header('Location: http://127.0.0.1/index.html');

}else{ echo "Este arquivo no pode ser lido!"; } ?>

Testar se Arquivo Permite Escrita


if (is_writable($filename)) { echo 'O arquivo permite escrita'; } else { echo 'O arquivo no permite escrita'; } ?>

Testar se Arquivo Existe


<?php print '<br>'; // TESTAR SE ARQUIVO EXISTE $filename = 'teste2.php'; if (file_exists($filename)) {

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
echo "O arquivo $filename existe"; } else { echo "O arquivo $filename no existe"; } ?>

41/165

Testar se Arquivo ou Diretrio


<?php print '<br>'; // TESTAR SE ARQUIVO UM ARQUIVO COMUN OU SE DIRETRIO $filename = 'teste2.php'; $filename2 = 'c:\windows'; if (is_file($filename)) { echo "O arquivo $filename comun"; }else{ echo "O arquivo $filename no um arquivo comun"; } print '<br>'; if (is_file($filename2)){ echo "O arquivo $filename2 comun"; }else{ echo "O arquivo $filename2 no um arquivo comun"; } print '<br>'; if (is_dir($filename2)){ echo "$filename2 um diretrio"; }else{ echo "$filename2 no um diretrio"; }

Outras Funes
is_link($diretorio) readlink($dir_link) // retorna o path completo do link bool symlink ( string $destino, string $linkorigem ) // Cria um link simblico

Espao Total no Disco


<?php // ESPAO TOTAL NO DISCO $diretorio="c:/"; print disk_total_space($diretorio); print " ";

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

42/165

Espao Livre no Disco


// ESPAO LIVRE NO DISCO // $df contm o nmero de bytes disponvel em "/" $df = disk_free_space("c:/"); print $df ?>

Tamanho de Diretrio, nmero de arquivos e sub-diretrios


<?php // CALCULANDO TAMANHO OCUPADO POR UM DIRETRIO, NR DE ARQUIVOS E SUBDIRETRIOS // http://www.go4expert.com/forums/showthread.php?t=290 function getDirectorySize($path) {
$totalsize = 0; $totalcount = 0; $dircount = 0; if ($handle = opendir ($path)) { while (false !== ($file = readdir($handle))) { $nextpath = $path . '/' . $file; if ($file != '.' && $file != '..' && !is_link ($nextpath)) { if (is_dir ($nextpath)) { $dircount++; $result = getDirectorySize($nextpath); $totalsize += $result['size']; $totalcount += $result['count']; $dircount += $result['dircount']; } elseif (is_file ($nextpath)) { $totalsize += filesize ($nextpath); $totalcount++; } } } } closedir ($handle); $total['size'] = $totalsize; $total['count'] = $totalcount; $total['dircount'] = $dircount; return $total;

} function sizeFormat($size) {
if($size<1024) {

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
return $size." bytes"; } else if($size<(1024*1024)) { $size=round($size/1024,1); return $size." KB"; } else if($size<(1024*1024*1024)) { $size=round($size/(1024*1024),1); return $size." MB"; } else { $size=round($size/(1024*1024*1024),1); return $size." GB"; }

43/165

} // Usando $path="D:/_xampplite/htdocs/desweb/7AplicativosExemplo/extras"; $ar=getDirectorySize($path); echo " Detalhes : $path "; echo "Tamanho total : ".sizeFormat($ar['size'])." "; echo "No. de arquivos : ".$ar['count']." "; echo "No. de diretrios : ".$ar['dircount']." "; ?>

Tamanho de diretrio
<? // CALCULANDO TAMANHO (BYTES) OCUPADO POR UM DIRETRIO // http://www.weberdev.com/get_example-4171.html function dir_size( $dir ) {
if( !$dir or !is_dir( $dir ) ) { return 0; } $ret = 0; $sub = opendir( $dir ); while( $file = readdir( $sub ) ) { if( is_dir( $dir . '/' . $file ) && $file !== ".." && $file !== "." ) { $ret += dir_size( $dir . '/' . $file ); unset( $file );

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
} elseif( !is_dir( $dir . '/' . $file ) ) { $stats = stat( $dir . '/' . $file ); $ret += $stats['size']; unset( $file ); }

44/165

} closedir( $sub ); unset( $sub ); return $ret;

} echo dir_size("D:/_xampplite/htdocs/desweb/1LinguagemPHP/php/tutoriais/trabalhando_com"); ?> <?php // MAIS UMA TIMA FUNO PARA LER O TAMANHO DE UM DIRETRIO /*
* * * * * * * * * * * * * * * * * * * * * * * * * * * PHP Freaks Code Library http://www.phpfreaks.com/quickcode.php Title: Directory Size Version: 1.0 Author: Nathan Taylor aka(Lakario) Date: Saturday, 12/20/2003 - 12:34 PM

NOTICE: This code is available from PHPFreaks.com code Library. This code is not Copyrighted by PHP Freaks. PHP Freaks does not claim authorship of this code. This code was submitted to our website by a user. The user may or may not claim authorship of this code. If there are any questions about the origin of this code, please contact the person who submitted it, not PHPFreaks.com! USE THIS CODE AT YOUR OWN RISK! NO GUARANTEES ARE GIVEN! SHAMELESS PLUG: Need WebHosting? Checkout WebHost Freaks: http://www.webhostfreaks.com WebHosting by PHP Freaks / The Web Freaks!

/ // * Description / Example: // * // * This code will allow an individual to quickly obtain the size and number of files inside a directory recursively. // * // * It also includes a convenient byte value converter to kilobyte, megabyte, gigabyte, or trilobyte accordingly. ?> Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

45/165

Trechos do Tutorial - The right way to read files with PHP da IBM
USANDO fscanf

fscanf Coming back to string processing, fscanf again follows the traditional C file library functions. If you're unfamiliar with it, fscanf reads field data into variables from a file. list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s"); FUNO fpassthru No matter how you've been reading your file, you can dump the rest of your data to your standard output channel using fpassthru. fpassthru($fh); my_file = file_get_contents("myfilename"); echo $my_file; Although it isn't best practice, you can write this command even more concisely as: echo file_get_contents("myfilename"); This article is primarily about dealing with local files, but it's worth noting that you can grab, echo, and parse other Web pages with these functions, as well. echo file_get_contents("http://127.0.0.1/"); This command is effectively the same as: $fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh); You must be looking at this and thinking, "That's still way too much effort." The PHP developers agree with you. So you can shorten the above command to: readfile("http://127.0.0.1/"); The readfile function dumps the entire contents of a file or Web page to the default output buffer. By default, this command prints an error message if it fails. To avoid this behavior (if you want to), try: @readfile("http://127.0.0.1/"); Of course, if you actually want to parse your files, the single string that file_get_contents returns might be a bit overwhelming. Your first inclination might be to break it up a little bit with the split() Ribamar FS http://cursodephp.ribafs.org

PHP Avanado function. $array = split("\n", file_get_contents("myfile"));

46/165

But why go through all that trouble when there's a perfectly good function to do it for you? PHP's file() function does this in one step: It returns an array of strings broken up by lines. $array = file("myfile"); It should be noted that there is a slight difference between the above two examples. While the split command drops the newlines, the newlines are still attached to the strings in the array when using the file command (as with the fgets command). PHP's power goes far beyond this, though. You can parse entire PHP-style .ini files in a single command using parse_ini_file. The parse_ini_file command accepts files similar to Listing 4. Listing 4. A sample .ini file
; Comment [personal information] name = "King Arthur" quest = To seek the holy grail favorite color = Blue [more stuff] Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

The following commands would dump this file into an array, then print that array:
$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;

The following output is the result:


Listing 5. Output Array ( [name] => King Arthur [quest] => To seek the Holy Grail [favorite color] => Blue [Samuel Clemens] => Mark Twain [Caryn Johnson] => Whoopi Goldberg )

Of course, you might notice that this command merged the sections. This is the default behavior, but you can fix it easily by passing a second argument to parse_ini_file: process_sections, which is a Boolean variable. Set process_sections to True. $file_array = parse_ini_file("holy_grail.ini", true); print_r $file_array; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

47/165

And you'll get the following output: Listing 6. Output


Array ( [personal information] => Array ( [name] => King Arthur [quest] => To seek the Holy Grail [favorite color] => Blue ) [more stuff] => Array ( [Samuel Clemens] => Mark Twain [Caryn Johnson] => Whoopi Goldberg ) )

PHP placed the data into an easily parsable multidimensional array. This is just the tip of the iceberg when it comes to PHP file processing. More complex functions like tidy_parse_file and xml_parse can help you handle HTML and XML documents, respectively. See Resources for details on how these particular functions work. These are well worth looking at if you'll be dealing with those types of files, but instead of considering every possible file type you might run into in detail in this article, here are a few good general rules for dealing with the functions I've described thus far. Good practice Never assume that everything in your program will work as planned. For example, what if the file you're looking for has moved? What if the permissions have been altered and you're unable to read the contents? You can check for these things in advance by using file_exists and is_readable. Listing 7. Use file_exists and is_readable
$filename = "myfile"; if (file_exists($filename) && is_readable ($filename)) { $fh = fopen($filename, "r"); # Processing fclose($fh); } In practice, however, such code is probably overkill. Processing the return value of fopen is simpler and more accurate. if ($fh = fopen($filename, "r")) { # Processing fclose($fh);

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
}

48/165

Final do trecho do tut IBM---------------

L e imprime todo o contedo de um arquivo CSV


<?php // L e imprime todo o contedo de um arquivo CSV $row = 1; $handle = fopen ("test.csv","r"); while ($data = fgetcsv ($handle, 1000, ",")) { $num = count ($data); print "<p> $num campos na linha $row: <br>"; $row++; for ($c=0; $c < $num; $c++) { print $data[$c] . "<br>"; } } fclose ($handle); ?> <pre> Outra: <pre> <?php define('CSV_BOTH', 1); define('CSV_ASSOC', 2); define('CSV_NUM', 3); function parse_csv($filename, $result_type = CSV_BOTH) { if(!file_exists($filename)) { die("file (" . $filename . ") does not exist\n"); } $lines = file($filename); $title_line = trim(array_shift($lines)); $titles = split(",", $title_line); $records = array(); foreach($lines as $line_num => $line) { $subject = trim($line); $fields = array(); for($field_num = 0; $field_num < count($titles); $field_num++) { if($subject{0} == '"') { preg_match('/^"(([^"]|\\")*)",?(.*)$/', $subject, $matches); $value = $matches[1]; $subject = $matches[3]; if($result_type == CSV_BOTH || $result_type == CSV_ASSOC) { $fields[$titles[$field_num]] = $value; }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

49/165

if($result_type == CSV_BOTH || $result_type == CSV_NUM) { $fields[$field_num] = $value; } } else { preg_match('/^([^,]*),?(.*)$/', $subject, $matches); $value = $matches[1]; $subject = $matches[2]; if($result_type == CSV_BOTH || $result_type == CSV_ASSOC) { $fields[$titles[$field_num]] = $value; } if($result_type == CSV_BOTH || $result_type == CSV_NUM) { $fields[$field_num] = $value; }

} } } } ?> <pre>

$records[] = $fields;

return $records;

This version is conditional - it only adds quotes if needed: <pre> <? function csv_escape($str) { $str = str_replace(array('"', ',', "\n", "\r"), array('""', ',', "\n", "\r"), $str, &$count); if($count) { return '"' . $str . '"'; } else { return $str; } } ?>

<?php $caminho = "/home/httpd/html/index.php"; $arquivo = basename ($caminho); // $arquivo = "index.php" $arquivo = basename ($caminho,".php"); // $arquivo = "index" ?>

rmdir -- Remove um diretrio


This functions deletes or empties the directory. Without using recursive functions!
<?php

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

50/165

/** * Removes the directory and all its contents. * * @param string the directory name to remove * @param boolean whether to just empty the given directory, without deleting the given directory. * @return boolean True/False whether the directory was deleted. */ function deleteDirectory($dirname,$only_empty=false) { if (!is_dir($dirname)) return false; $dscan = array(realpath($dirname)); $darr = array(); while (!empty($dscan)) { $dcur = array_pop($dscan); $darr[] = $dcur; if ($d=opendir($dcur)) { while ($f=readdir($d)) { if ($f=='.' || $f=='..') continue; $f=$dcur.'/'.$f; if (is_dir($f)) $dscan[] = $f; else unlink($f); } closedir($d); } } $i_until = ($only_empty)? 1 : 0; for ($i=count($darr)-1; $i>=$i_until; $i--) { echo "\nDeleting '".$darr[$i]."' ... "; if (rmdir($darr[$i])) echo "ok"; else echo "FAIL"; } return (($only_empty)? (count(scandir)<=2) : (!is_dir($dirname))); } ?> //Outra <?php /* Function to remove directories, even if they contain files or subdirectories. Returns array of removed/deleted items, or false if nothing was removed/deleted. by Justin Frim. 2007-01-18

Feel free to use this in your own code. */ function rmdirtree($dirname) { if (is_dir($dirname)) { //Operate on dirs only

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

51/165

$result=array(); if (substr($dirname,-1)!='/') {$dirname.='/';} //Append slash if necessary $handle = opendir($dirname); while (false !== ($file = readdir($handle))) { if ($file!='.' && $file!= '..') { //Ignore . and .. $path = $dirname.$file; if (is_dir($path)) { //Recurse if subdir, Delete if file $result=array_merge($result,rmdirtree($path)); }else{ unlink($path); $result[].=$path; } } } closedir($handle); rmdir($dirname); //Remove dir $result[].=$dirname; return $result; //Return array of deleted items }else{ return false; //Return false if attempting to operate on a file } } ?>

rename -- Renomear um arquivo ($antigo, $novo)


<?php rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt"); ?>

unlink -- Apaga um arquivo mkdir -- Criar um diretrio


mkdir ("/path/to/my/dir", 0700); is_file -- Diz se o arquivo um arquivo comum (no diretrio) file -- Le um arquivo inteiro para um array
<?php // Le um arquivo em um array. Nesse exemplo voc pode obter via HTTP para obter // o cdigo fonte HTML de uma URL. $lines = file ('http://www.exemplo.com/'); // Roda atravs do array, mostrando o fonte HTML com numerao de linhas. foreach ($lines as $line_num => $line) { echo "Linha #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br>\n"; } // Outro exemplo, onde obtemos a pgina web inteira como uma string. Veja tambm file_get_contents(). $html = implode ('', file ('http://www.exemplo.com/')); ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

52/165

file_exists -- Checa se um arquivo ou diretrio existe


$filename = '/caminho/para/qualquer.txt'; if (file_exists($filename)) { print "O arquivo $filename existe"; } else { print "O arquivo $filename no existe"; }

disk_free_space -- Retorna o espao disponivel no diretrio Receber Contedo de URL


<?php // Trazer contedo de arquivo ou de pgina para string // Define a context for HTTP. $aContext = array(
'http' => array( 'proxy' => 'tcp://10.0.0.1:3128', // This needs to be the server and the port of the NTLM Authentication Proxy Server. 'request_fulluri' => True, ), );

$cxContext = stream_context_create($aContext); // Now all file stream functions can use this context. $sFile = file_get_contents("http://www.google.com", False, $cxContext); echo $sFile; ?>

Recursively find files by filename pattern


http://snippets.dzone.com/posts/show/4147 Scans a directory, and all subdirectories for files, matching a regular expression. Each match is sent to the callback provided as third argument. A simple example: function my_handler($filename) {
echo $filename . "\n";

} find_files('c:/', '/php$/', 'my_handler'); And the actual snippet function find_files($path, $pattern, $callback) {
$path = rtrim(str_replace("\\", "/", $path), '/') . '/';

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

53/165

$matches = Array(); $entries = Array(); $dir = dir($path); while (false !== ($entry = $dir->read())) { $entries[] = $entry; } $dir->close(); foreach ($entries as $entry) { $fullname = $path . $entry; if ($entry != '.' && $entry != '..' && is_dir($fullname)) { find_files($fullname, $pattern, $callback); } else if (is_file($fullname) && preg_match($pattern, $entry)) { call_user_func($callback, $fullname); } }

} <?php $file='file.inc'; $php_errormsg = 'Erro na operao do arquivo!'; // Determinaod onde o penteiro est /* $fr = fopen($file, 'r'); fseek($fr, rand(1, 1024)); $offset = ftell($fr); echo "We randomly landed on the $offset byte of the file.<BR>"; */ ?> <?php // Escreve no incio do arquivo $file_name= $file; if(file_exists($file_name)) { //open file for writng and place pointer at the end $handle = fopen($file_name, 'a+'); if(!$handle) { die("couldn't open file <i>$file_name</i>"); } //place pointer at the beginning of the file. //rewind($handle); $data = fgets($handle, 4096);

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado // move de volta para o inicio do arquivo // o mesmo que rewind($fp); fseek($handle, 0); //write to file //fwrite($handle, "Student ID: 12345"); echo "success writing to start of file"; } else { echo "file <i>$file_name</i> doesn't exists"; } fclose($handle); // Posio atual $fp = fopen($file, 'a+'); $data = fgets($fp, 4096); echo '<br>Onde estamos '.ftell($fp).'<br>'; fclose($fp); // Retornar a ltima linha do arquivo function readlastline($file) { $fp = @fopen($file, "r"); $pos = -1; $t = " "; while ($t != "\n") { fseek($fp, $pos, SEEK_END); $t = fgetc($fp); $pos = $pos - 1; } $t = fgets($fp); fclose($fp); return $t; } print readlastline($file); ?> <?php /* $file_name= $file; if(file_exists($file_name)) { //open file for writng and place pointer at the end $handle = fopen($file_name, 'a+');

54/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado if(!$handle) { die("couldn't open file <i>$file_name</i>"); } fwrite($handle, "Student GPA: 2.9"); echo "success writing to file"; } else { echo "file <i>$file_name</i> doesn't exists"; } fclose($handle); */ ?> <?php /* // move de volta para o inicio do arquivo // o mesmo que rewind($fp); fseek($fp, 0); // Escrevendo com quebra de linha $file_name = "myfile.txt"; if(file_exists($file_name)) { //open file for writng and place pointer at the end $handle = fopen($file_name, 'w'); if(!$handle) { die("couldn't open file <i>$file_name</i>"); } $str.= "Student Name: Mark Fendisen\r\n"; $str.= "Student ID: 12345\r\n"; $str.= "Student GPA: 2.9\r\n"; fwrite($handle, $str); echo "success writing to file"; } else { echo "file <i>$file_name</i> doesn't exists"; } fclose($handle); */ ?> Referncia http://phpbrasil.com/articles/print.php/id/310

55/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

56/165

9.4 - Trabalhando com Diretrios no PHP


$Dir = C:\\PHP; $DirOpen = opendir($Dir); while ($CurFile = readdir($DirOpen)) { echo $CurFile . <br />; } closedir($DirOpen); $Dir = C:\\PHP; $DirEntries = scandir($Dir); foreach ($DirEntries as $Entry) { echo $Entry . <br />; } mkdir($diretorio); is_writable($dir); file_exists($dir); is_dir($dir); copy($arq_origem, $arq_destino); unlink($arquivo); rmdir($dir);

<?php // Listar contedo de diretrio function listar_dir($arquivo){ $dn = opendir ($arquivo); while ($file = readdir ($dn)) { return "$file<br>"; } closedir($dn); } // Espao total em disco em KB function total_space($dir){ return round(disk_total_space($dir)/(1024*1024),2) . ' KB'; } //print total_space('/home/ribafs'); // Espao livre em disco em KB Ribamar FS http://cursodephp.ribafs.org

PHP Avanado function free_space($dir){ return round(disk_free_space($dir)/(1024*1024),2) . ' KB'; } //print free_space('/home/ribafs'); // Receber tamanho de diretrio recursivamente function getdirsize($dir) { // Initialize the size value $size = 0; // Get the files and directories // inside the given directory $files = scandir($dir); // Loop through the files foreach ($files as $file) { // Filter-out .. and . if (strlen(str_replace('.', '', $file))>0) { if (is_dir($dir.'/'.$file)) { // If the item is a directory // run this function again and // get the size of the files inside $size += getdirsize($dir.'/'.$file); } else { // If it's a file, calculate the size // and add it to the size variable $size += filesize($dir.'/'.$file); } } } // Finally, return the calculated size return $size; } //print getdirsize('/home/ribafs/uteis'); function dir_size($directory, $type, $round) { $dir = scandir($directory); $size = 0; foreach($dir as $value) { if(is_dir($directory.'/'.$value)) { $init = scandir($directory.'/'.$value); foreach($init as $subfile) { $filesize = filesize($directory.'/'.$value.'/'.$subfile); $size = $size + $filesize; } if(is_file($directory.'/'.$value)) { $filesize = filesize($directory.'/'.$value); $size = $size = $filesize; } }

57/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado } if($type==1) { // returns KB $size = $size / 1024; if(isset($round)) $size = round($size, $round); echo $size.'KB'; } elseif($type==2) { $size = $size / 1048576; if(isset($round)) $size = round($size, $round); echo $size.'MB'; } elseif($type==3) { $size = $size / 1073741824; if(isset($round)) $size = round($size, $round); echo $size.'GB'; } else { if(isset($round)) $size = round($size, $round); echo $size.'Bytes'; }

58/165

} /* * #1 with how you would like the data to be shown (1 = KB, 2 = MB, 3 = GB, 0 or nothing is Bytes), and #2 is optional, if you want it to make the number perttier enter how many numbers AFTER the . to have, so if you put in 2, and the number before it rounded it was 3.4325214 it would be something like, 3.44 or so after it rounds it. */ dir_size("/home/ribafs", 1, 2); function dir_size2( $dir ) { if( !$dir or !is_dir( $dir ) ) { return 0; } $ret = 0; $sub = opendir( $dir ); while( $file = readdir( $sub ) ) { if( is_dir( $dir . '/' . $file ) && $file !== ".." && $file !== "." ) { Ribamar FS http://cursodephp.ribafs.org

PHP Avanado $ret += dir_size( $dir . '/' . $file ); unset( $file ); } elseif( !is_dir( $dir . '/' . $file ) ) { $stats = stat( $dir . '/' . $file ); $ret += $stats['size']; unset( $file ); } } closedir( $sub ); unset( $sub ); return $ret; } //print dir_size2('/home/ribafs/htdocs');

59/165

/** * Removes the directory and all its contents. * * @param string the directory name to remove * @param boolean whether to just empty the given directory, without deleting the given directory. * @return boolean True/False whether the directory was deleted. */ function delete_dir($dirname,$only_empty=false) { if (!is_dir($dirname)) return false; $dscan = array(realpath($dirname)); $darr = array(); while (!empty($dscan)) { $dcur = array_pop($dscan); $darr[] = $dcur; if ($d=opendir($dcur)) { while ($f=readdir($d)) { if ($f=='.' || $f=='..') continue; $f=$dcur.'/'.$f; if (is_dir($f)) $dscan[] = $f; else unlink($f); } closedir($d); } } $i_until = ($only_empty)? 1 : 0; for ($i=count($darr)-1; $i>=$i_until; $i--) { echo "\nDeleting '".$darr[$i]."' ... "; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado if (rmdir($darr[$i])) echo "ok"; else echo "FAIL"; } return (($only_empty)? (count(scandir)<=2) : (!is_dir($dirname))); }

60/165

/* Function to remove directories, even if they contain files or subdirectories. Returns array of removed/deleted items, or false if nothing was removed/deleted. by Justin Frim. 2007-01-18 Feel free to use this in your own code. */ function rmdirtree($dirname) { if (is_dir($dirname)) { //Operate on dirs only $result=array(); if (substr($dirname,-1)!='/') {$dirname.='/';} //Append slash if necessary $handle = opendir($dirname); while (false !== ($file = readdir($handle))) { if ($file!='.' && $file!= '..') { //Ignore . and .. $path = $dirname.$file; if (is_dir($path)) { //Recurse if subdir, Delete if file $result=array_merge($result,rmdirtree($path)); }else{ unlink($path); $result[].=$path; } } } closedir($handle); rmdir($dirname); //Remove dir $result[].=$dirname; return $result; //Return array of deleted items }else{ return false; //Return false if attempting to operate on a file } } ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

61/165

9.5 - Trabalhando com Path no PHP


1 PATH 2 Exemplos simples de uso de funes para path do PHP 3 Recebendo o Path Absoluto do Script Atual 4 Recebendo o path relativo do webserver do script atual

Exemplos simples de uso de funes para path do PHP


<?php $path=dirname(realpath($_SERVER['SCRIPT_FILENAME'])); $path=substr($path,0,strlen($path) - 5); echo "<br>Path deste script sem 5 finais caracteres - " . $path; echo "<br><br>Diretrio atual - ".dirname(__FILE__); echo "<br>Caminho completo do script atual - ".__FILE__; echo "<br>URL do script atual - " . "http://" . $_SERVER['HTTP_HOST'] . $HTTP_SERVER_VARS["SCRIPT_NAME"]; ?> <?php $path = "/etc/passwd"; $file = dirname($path); // $file is set to "/etc" ?> <?php $path = "/home/httpd/html/index.php"; $file = basename($path); // $file is set to "index.php" $file = basename($path, ".php"); // $file is set to "index" ?> <?php echo dirname($_SERVER["REQUEST_URI"]); ?>

Recebendo o Path Absoluto do Script Atual


dirname(__FILE__)

Recebendo o path relativo do webserver do script atual


function GetRelativePath($path){ $npath = str_replace('\\', '/', $path); return str_replace(GetVar('DOCUMENT_ROOT'), '', $npath); }

GetRelativePath(dirname(__FILE__)); Ribamar FS http://cursodephp.ribafs.org

PHP Avanado <?php if (DIRECTORY_SEPARATOR=='/')


$absolute_path = dirname(__FILE__).'/';

62/165

else
$absolute_path = str_replace('\\\\', '/', dirname(__FILE__)).'/';

?> Resultar em um path absoluto no estilo UNIX que funciona tambm em PHP5 sob Windows. Em algumas instalaes (< 4.4.1) $_SERVER['REQUEST_URI'] no est configurado, usado o cdigo para corrigir:
<?php if (!isset($_SERVER['REQUEST_URI'])) { $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'],1); if (isset($_SERVER['QUERY_STRING'])) $_SERVER['REQUEST_URI'].='?'. $_SERVER['QUERY_STRING']; } ?> $my_uri = "http://" . $_SERVER['HTTP_HOST'] . $HTTP_SERVER_VARS["SCRIPT_NAME"]; // ento <?php echo ("$my_uri");?> <?php include("{$_SERVER['DOCUMENT_ROOT']}/includes/my_include.php"); ?>

Voc pode usar isso para receber o diretrio pai: dirname(dirname(__FILE__)) ...include a file relative to file path: include(dirname(__FILE__) . '/path/relative/file_to_include.php'); Isso colocar ambos os paths "www" e "file" de forma fcil para transportar o array.
<?php // build the www path: $me = $_SERVER['PHP_SELF']; $Apathweb = explode("/", $me); $myFileName = array_pop($Apathweb); $pathweb = implode("/", $Apathweb); $myURL = "http://".$_SERVER['HTTP_HOST'].$pathweb."/".$myFileName; $PAGE_BASE['www'] = $myURL;

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

63/165

// build the file path: strstr( PHP_OS, "WIN") ? $strPathSeparator = "\\" : $strPathSeparator = "/"; $pathfile = getcwd (); $PAGE_BASE['physical'] = $pathfile.$strPathSeparator.$myFileName; // this is so you can verify the results: $www = $PAGE_BASE['www']; $physical = $PAGE_BASE['physical']; echo "$physical<p>"; echo "$www<p>"; ?>

retornar algo como: Windows: F:\dev\Inetpub\wwwroot\somedirectory\index.php http://devserver/somedirectory/index.php Unix: /home/somepathto/gieson.com/webroot/index.php http://www.gieson.com/index.php Path absoluto do script em execuo $path=dirname(realpath($_SERVER['SCRIPT_FILENAME']));

print 'Diretrio atual=> '.dirname($_SERVER["SCRIPT_FILENAME"]); print '<br>Diretrio atual=> '.dirname(__FILE__); print '<br>Diretrio anterior=> '.dirname(dirname(__FILE__)); print '<br>Diretrio anterior 2 nveis=> '.dirname(dirname(dirname(__FILE__))); print '<br>Diretrio raiz geral => '.dirname($_SERVER['PHP_SELF']); print '<br>Diretrio atual isolado => '.basename(dirname(__FILE__)); print '<br>Arquivo atual isolado => '.$_SERVER['REQUEST_URI']; print '<br>Arquivo atual path completo => '.__FILE__; print '<br>Arquivo raiz geral => '.dirname($_SERVER["SCRIPT_NAME"]); $site_path = realpath(dirname(__FILE__)); define ('__SITE_PATH', $site_path); function fixPath ($path) ( return dirname($path . '/.'); )

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado fixPath('/one'); fixPath('/one/'); fixPath('/one//two'); fixPath('/one////two////'); // '/one' // '/one' // '/one/two' // '/one/two'

64/165

Checar permisso de escrita: error_reporting(E_ALL); $dir_name = '/var/www/virtual/phpintra/htdocs/php/'; do { $b_is_writable = is_writable($dir_name); echo sprintf("Dir[%s]Writable[%s]\n", $dir_name, $b_is_writable? 'YES':'NO'); }while (($dir_name = dirname($dir_name)) !='/'); //Restringindo acesso direto if (!defined("BASE_PATH")) define('BASE_PATH', dirname($_SERVER['SCRIPT_NAME'])=='/' ? './' : str_repeat("../", substr_count(dirname($_SERVER["SCRIPT_NAME"]), "/"))); function myRealPath($path) { // Check if path begins with "/". => use === with strpos if (strpos($path,"/") === 0) { $path = $_SERVER['DOCUMENT_ROOT'].$path; } else { // Strip slashes and convert to arrays. $currentDir = preg_split("/\//",dirname($_SERVER['PATH_TRANSLATED'])); $newDir = preg_split('/\//',$path); // Drop one directory from the array for each ".."; add one otherwise. foreach ($newDir as $dir) { if ($dir == "..") array_pop($currentDir); elseif ($dir != ".") //test for "." which represents current dir (do nothing in that case) array_push($currentDir,$dir); } // Return the slashes. $path = implode($currentDir,"/"); } return $path; } //print myRealPath("./"); $p = getcwd(); // recebe o diretrio atual //echo $p; $dir_path = str_replace( $_SERVER['DOCUMENT_ROOT'], "", dirname(realpath(__FILE__)) ) . Ribamar FS http://cursodephp.ribafs.org

PHP Avanado DIRECTORY_SEPARATOR; //print $dir_path; /* echo realpath(dirname(__FILE__)); //Similar ao getcwd() $inc = $_SERVER["DOCUMENT_ROOT"]."/inc"; include $inc."/config.php"; include $about."/setup.php"; include $inc."/header.php"; include $inc."/topnav.php"; include $inc."/left.php"; include $inc."/right.php"; echo __FILE__AbsolutePath(__FILE__)."\n"; function __FILE__AbsolutePath($Filename) { switch (PHP_OS) { case "WINNT": $needle = "\\"; break; case "Linux": $needle = "/"; break; default: $needle = "/"; break; // TODO : Mac check } $AbsPath = substr($Filename, 0, strrpos($Filename, $needle)); return $AbsPath; } */ function __FILE__AbsolutePath() { $d = debug_backtrace(); $Filename = $d[0]['file']; switch (PHP_OS) { case "WINNT": $needle = "\\"; break; case "Linux": $needle = "/"; break; default: $needle = "/"; break; // TODO : Mac check } $AbsPath = substr($Filename, 0, strrpos($Filename, $needle)); return $AbsPath; } //print __FILE__AbsolutePath() ;

65/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

66/165

9.6 - Trabalhando com Includes em PHP


INCLUDE - inclue e avalia o contedo do arquivo. REQUIRE - tambm inclue e avalia o contedo do arquivo includo. A diferena entre ambos que o include ao encontrar um erro, lana um warning apenas, enquanto que o require lana um Fatal Error, que pra o processamento. Uso do require: para cdigos que requerem maior segurana. INCLUDE_ONCE e REQUIRE_ONCE - so semelhantes ao include e require, sendo que estes incluem um arquivo somente uma vez. Mostrando uso do require_once: echo.php <?php echo "Hello"; ?> teste.php <?php require('echo.php'); require_once('echo.php'); ?> Executar teste.php sada: "Hello". Agora teste2.php: <?php require('echo.php'); require('echo.php'); ?> Executar teste2.php sada: "HelloHello". Agora teste3.php: <?php require_once('echo.php'); require('echo.php'); ?> Executar teste3.php sada: "HelloHello". Ou seja, ao encontrar require_once, ele verifica se o arquivo j foi includo, e somente o incluir Ribamar FS http://cursodephp.ribafs.org

PHP Avanado novamente se ele ainda no tiver sido includo. <?php // Isto est errado e no funcionar como desejado if ($condition) include $arquivo; else include $outro; // E este est correto if ($condition) { include $arquivo; } else { include $outro; } ?> <?php $path="/full/path/to/script/"; if (getdomain($path) == 'yourdomain'){ include($path.'somefile.php'); } ?> "variables.php" <?php $includer = basename($_SERVER['SCRIPT_NAME']); switch ($includer) { case 'a.php': $this_variable = 'included by script a.php'; break; case 'b.php': $this_variable = 'included by script b.php'; break; default: $this_variable = 'included by unkown script';

67/165

} echo $this_variable; ?> Test with 3 different files "a.php", "b.php", "c.php", all with the same content: <?php include 'variables.php'; ?> Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

68/165

9.7 - Trabalhando com Funes no PHP


O PHP conta com uma grande quantidade de boas bibliotecas de funes internar sobre vrios assuntos, como strings, arrays, arquivos, diretrios, data e hora, etc. Alm das funes embutidas tambm podemos criar nossas prprias funes quando no encontrarmos uma funo que atenda as nossas necessidades. Funes so blocos de cdigo, conjuntos de instrues, que ficam quietos, sem vida, at que sejam chamadas em algum lugar do cdigo. Funes reduzem o trabalho de digitao, o tamanho dos scripts em geral, os erros, reaproveitando cdigo, facilitando e organizando o trabalho de desenvolvimento.

1 Exemplos de funes definidas pelo usurio 2 Variveis globais 3 Varivel externa acessvel na funo 4 Acessando variveis Externas 4.1 Varivel externa inacessvel 5 Variveis estticas 6 Recursiva 7 Declarando variveis static 8 Retornar mais de um valor de uma funo 9 Passando Argumentos atravs de Funes 10 Por Valor 11 Por Referncia 12 Otimizao do tempo de execuo 13 Funo com parmetro default 14 Trabalhando com Funes OB

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

69/165

Exemplos de funes definidas pelo usurio


function quadrado($numero) { print $numero*$numero; }

Executando: quadrado(6); // Sada: 36

Variveis globais
$var1 = 5; function testeGlobal1(){ $var1 = 1; print "<br>Valor de \$var1: $var1"; } echo testeGlobal1();

Varivel externa acessvel na funo


$var2 = 10; function testeGlobal2(){ global $var2; print "<br>Valor de \$var2 $var2"; } echo testeGlobal2(); $var5 = 15; function testeGlobal5(){ $var5 = 5; print "<br><br>A varivel global vale $GLOBALS[var5], "; print "J a varivel local vale $var5<br><br>"; } testeGlobal5(); function cliente($codigo, $idade = 18){ print "Cdigo = $codigo, Idade = $idade"; } cliente(1); //Exibir: Cdigo = 1, Idade = 18

function cubo($num){ return ($num*$num*$num); } $var1 = 2 * cubo(5);echo "<br>".$var1;

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

70/165

Acessando variveis Externas


Normalmente de dentro de uma funo no temos acesso s variveis que esto fora dela. Mas veja como contornar isso:

Varivel externa inacessvel


$var1 = 5; function testeGlobal1(){ $var1 = 1; print Valor de \$var1: $var1; } echo testeGlobal1(); Varivel externa acessvel na funo $var2 = 10; function testeGlobal2(){ global $var2; print Valor de \$var2 $var2; } echo testeGlobal2();

Outra alternativa usar o array $GLOBALS[], que contm todas as variveis globais. Veja um exemplo:
$var5 = 15; function testeGlobal5(){ $var5 = 5; print "<br><br>A varivel global vale $GLOBALS[var5], "; print "J a varivel local vale $var5<br><br>"; } testeGlobal5();

Variveis estticas
function contador(){ static $x = 0; return $x++; } echo "<br>"; echo contador();echo contador();echo contador(); //A sada ser: 012 function contador2(){ $x = 0; return $x++; } echo "<br>"; echo contador2();echo contador2();echo contador2(); //A sada ser: 000. function staticfunction() { static $count = 0;

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

71/165

$count++; if ($count==1){ echo "A Funo foi executada $count vez<br>"; }else{ echo "A Funo foi executada $count vezes<br>"; } } for($i = 0; $i < 5; $i++) { staticfunction(); } function Teste1() { static $a = 0; echo $a; $a++; } for($x=0;$x<=10;$x++){ echo Teste1()." "; }

Recursiva
function Teste() { static $count = 0; $count++; echo $count." "; if ($count < 10) { Teste (); } $count--;

Teste();

Declarando variveis static


function foo(){ static $int = 0; // correro // static $int = 1+2; // errado ( uma expresso) // static $int = sqrt(121); // errado ( uma expresso tambm) $int++; echo $int; }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
function aumentoSalario($sal, $perc=5){ $salario = $sal * $perc/100; echo $salario; } echo "<br>Aumento: " . aumentoSalario(1956); function redirecionar($url){ header("Location: $url"); } echo "<br>"; redirecionar("http://ribafs.phpnet.us/"); echo "<br>";

72/165

Retornar mais de um valor de uma funo


usa-se arrays e list() array() retorna e list() exibe //Exemplo:
function recebe_hoje(){ $data_abreviada=date("d/m/Y"); $data_extensa=date("l, d F \d\e Y"); return array($data_abreviada, $data_extensa); } list($data_abreviada, $data_extensa)=recebe_hoje(); print $data_extensa; echo "<br>"; print $data_abreviada; <h2>Declarao dinmica de funo</h2> <pre> if ($f == 1){ function f1(){ echo "funcao1"; } }else{ function f2(){ echo "funcao2"; } } <h2>Retornando o nmero de argumentos de uma funo</h2> <pre> function ret_args_funcao() { $numargs = func_num_args(); echo "Nmero de argumentos: $numargs<br>\n"; if ($numargs >= 2) { echo "Segundo argumento vale : " . func_get_arg (1) . "<br>\n"; } $arg_list = func_get_args();

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

73/165

for ($i = 0; $i < $numargs; $i++) { echo "Argumento $i vale: " . $arg_list[$i] . "<br>\n"; }

ret_args_funcao (1, 2, 3);

Passando Argumentos atravs de Funes


O default 'por valor', que passa uma cpia do valor da varivel. Tambm podemos passar 'por referncia', onde se passa o endereo da prpria varivel. Quando atribumos uma varivel a outra passando como referncia, no fazemos cpia alguma, mas sim passamos o endereo da varivel original, portanto qualquer alterao nesta referncia refletir na varivel original. ByRef mais eficiente em termos de memria ao lidar com variveis e arrays grandes e tambm permite alterar o valor da varivel original, o que no acontece com o ByVal, mas a vantagem de desempnho somente percebida em grandes arrays em grandes loops. Para maior segurana setar: allow_call_time_pass_reference no php.ini Impede a passagem de valores por referncia nas chamadas, mas permite somente na definio das funes. $var1 = & $var2; Agora ambas apontam para o mesmo endereo e valor. Reter valor de variveis entre chamadas (static) (Guarda o valor da ltima chamada at o final da execuo do script, tantas vezes quantas a funo for chamada). Exemplo:
$valor = 4; $ref = &$valor; $ref = 3; $valor = 4; $ref = &$valor; // Aqui tornamos ambas as variveis com o mesmo endereo // O que alterarmos em $ref alteramos em $valor $ref = 3; // Com isso tambm alteramos $valor para 3, veja abaixo. echo $valor . "<br>"; $valor=0; echo $ref; // Com isso tambm alteramos $ref para 0, veja abaixo.

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

74/165

Por Valor
function val_subtracao($num1, $num2){ if($num1 < $num2){ die("Nmeros negativos"); }else{ $return_result=0; while($num1 > $num2){ $num1 = $num1 - 1; $return_result = $return_result + 1; } } return($return_result); } $primeiro_op=493; $segundo_op=355; $resultado1 = val_subtracao($primeiro_op, $segundo_op); print ("Resultado1 $resultado1<br>"); $resultado2 = val_subtracao($primeiro_op, $segundo_op); print("Resultado2 $resultado2<br>");

Por Referncia
function subtracao_ref(&$num1, &$num2){ if($num1 < $num2){ die("Nmeros negativos"); }else{ $return_result=0; while($num1 > $num2){ $num1 = $num1 - 1; $return_result = $return_result + 1; } } return($return_result); } $primeiro_op=493; $segundo_op=355; $resultado1 = subtracao_ref($primeiro_op, $segundo_op); print ("<br><br>Resultado1 $resultado1<br>"); $resultado2 = subtracao_ref($primeiro_op, $segundo_op); print("Resultado2 $resultado2<br>"); echo "Agora, se se ns executarmos exatamente a mesma chamada da subtrao como fizemos a primeira vez, receberemos a sada: resultado1 138 e resultado2 0"; /* Sugesto de chamada de funo: if (nome_funcao($argumento){ .... ....

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
}else{ } */ ?> <?php // Retorna o tipo e o valor de varivel function ss_as_string (&$thing, $column = 0) { if (is_object($thing)) { return ss_object_as_string($thing, $column); } elseif (is_array($thing)) { return ss_array_as_string($thing, $column); } elseif (is_double($thing)) { return "Double(".$thing.")"; } elseif (is_long($thing)) { return "Long(".$thing.")"; } elseif (is_string($thing)) { return "String(".$thing.")"; } else { return "Unknown(".$thing.")"; } } // Retorna o tipo e o valor de array function ss_array_as_string (&$array, $column = 0) { $str = "Array(<BR>\n"; while(list($var, $val) = each($array)){ for ($i = 0; $i < $column+1; $i++){ $str .= " "; } $str .= $var.' ==> '; $str .= ss_as_string($val, $column+1)."<BR>\n"; } for ($i = 0; $i < $column; $i++){ $str .= " "; } return $str.')'; } ....

75/165

// Retorna o tipo e o valor de objeto function ss_object_as_string (&$object, $column = 0) { if (empty($object->classname)) { return "$object"; } else { $str = $object->classname."(<BR>\n"; while (list(,$var) = each($object->persistent_slots)) { for ($i = 0; $i < $column; $i++){ $str .= " "; }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

76/165

} for ($i = 0; $i < $column; $i++){ $str .= " "; } return $str.')'; } }

global $$var; $str .= $var.' ==> '; $str .= ss_as_string($$var, column+1)."<BR>\n";

$var="Riba"; echo ss_as_string($var); //echo ss_as_string($GLOBALS);

Otimizao do tempo de execuo


function ss_timing_start ($name = 'default') { global $ss_timing_start_times; $ss_timing_start_times[$name] = explode(' ', microtime()); } function ss_timing_stop ($name = 'default') { global $ss_timing_stop_times; $ss_timing_stop_times[$name] = explode(' ', microtime()); } function ss_timing_current ($name = 'default') { global $ss_timing_start_times, $ss_timing_stop_times; if (!isset($ss_timing_start_times[$name])) { return 0; } if (!isset($ss_timing_stop_times[$name])) { $stop_time = explode(' ', microtime()); } else { $stop_time = $ss_timing_stop_times[$name]; } // do the big numbers first so the small ones aren't lost $current = $stop_time[1] - $ss_timing_start_times[$name][1]; $current += $stop_time[0] - $ss_timing_start_times[$name][0]; return $current; } ?>

Funo com parmetro default


Parmetro default aquele cujo valor j faz parte da funo, sendo opcional.
function cliente($codigo, $idade = 18){ print "Cdigo = $codigo, Idade = $idade"; }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
cliente(1); //Exibir: Cdigo = 1, Idade = 18

77/165

Trabalhando com Funes OB


- Artigo do Adriano Oliveira Gonalves na Revista do PHP

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

78/165

9.8 - Trabalhando com Session no PHP


Sesses so usadas para guardar dados enquanto a janela do browser estiver aberta. So geralmente usadas para manter dados como nome do usurio, tipo do usurio (se o administrador ou se um visitante no cadastrado, por exemplo), entre outros dados importantes. Dica: NUNCA COLOQUE A SENHA NA SESSO. VOC S PRECISA DELA PARA AUTENTICAO! Para iniciar uma sesso no PHP usamos a funo:
session_start();

Se quisermos destruir a sesso (no caso de o usurio ter feito logoff), usamos a funo:
session_destroy();

Agora precisamos apenas setar os valores que ficaro na sesso. No PHP os valores so armazenados em um vetor associativo chamado $_SESSION. As associaes so feitas com pares chave e valor. Por exemplo, vamos setar o nome do usurio e a permisso dele, e colocar esses dados na seo. Vamos buscar esses dados a partir de um formulrio fictcio, via POST.
< ?php session_start(); //iniciamos a sesso $_SESSION['usuario'] = $_POST['usuario']; //colocamos na sesso o valor do campo usurio vindo do formulrio $_SESSION['permissao'] = $_POST['admin']; //da mesma forma setamos suas permisses header("location:pagina_principal.php"); //Redirecionamos para a pagina principal ? >

Com isso feito, podemos acessar as variveis da sesso de qualquer lugar da nossa aplicao atravs do vetor $_SESSION. Fonte: http://maozinhadaweb.blogspot.com/2007/05/tutorial-de-php-parte-3-sesses-e.html

Sessions em PHP
Session ou sesso o mtodo ou via pela qual podemos gravar informao de variveis, funcionando assim como uma varivel global. A grande vantagem das sessions podermos navegar por vrias pginas sem que esta informao se perca evitando assim passar o valor das variveis indivdualmente de pgina em pgina. Ao contrrio dos cookies que ficam gravadas no computador do utilizador, as sessions so gravadas no servidor e automaticamente eliminadas quando o utilizador fecha o browser. Exemplificando: Vamos criar a pgina pagina1.php Ribamar FS http://cursodephp.ribafs.org

PHP Avanado <?php //Iniciar sesso session_start(); //Gravar variveis em sesso $_SESSION[id]=1; $_SESSION[nome]=Paulo; //Imprimir o valor das variveis guardadas print($id); print($nome); ?>

79/165

Podemos verificar que so imprimidos os valores das variveis atribudas session: 1 e Paulo, ou seja, esses valores ficam gravados numa session e podem ser utilizados em qualquer pgina onde essa sesso esteja aberta. Modificar e remover sessions Quando utilizamos sessions podemos ter a necessidade de modificar ou remover variveis de sesso. Para alterar o valor de uma varivel basta fazer nova atribuio: $_SESSION[nome]=Pedro; A varivel $nome passaria a ter o valor de Pedro a partir desta linha. Para remover todas as variveis da session basta colocar o comando session_unset() ou apenas unset() para remover variveis indivdualmente. Para eliminar ou destruir completamente toda a sesso utilizamos o comando session_destroy(). Como referido anteriormente, a sesso acaba sempre que o utilizador fechar o browser, mas a durao das sesses tambm podem ser alteradas para um espao de tempo pre-definido. Para isso dever ser alterado o php.ini na linha session.cookie_lifetime = 0 colocando o nmero de segundos desejados no lugar do 0 (zero). Gravar sessions num directrio As sesses tambm podem ser gravadas num directrio no servidor. Para que esta operao seja realizada devera ser dada a instruo atravs da funo session_save_path(). Nesta funo dever ser dado o caminho para a pasta que guardar as sesses: session_save_path(sessions). Neste caso a pasta sessions que guardar as sesses fica localizada na ras. Para que esta funo funcione dever ser colocada sempre antes do comando session_start(). Vamos experimentar: <?php //Pasta onde vai gravar sesso Ribamar FS http://cursodephp.ribafs.org

PHP Avanado session_save_path(sessions); //Iniciar sesso session_start(); //Gravar variveis em sesso $_SESSION[id]=1; $_SESSION[nome]=Paulo; //Imprimir o valor das variveis guardadas print($id); print($nome); ?>

80/165

Pode confirmar que gravado um ficheiro na pasta sessions com um nome do tipo sess_t4k884rd8uunp8ojt83picc9j1. Se abrir este ficheiro com o Notepad pode verificar que se encontram l gravadas as variveis dadas sesso. Convm salientar que, por razes bvias, a pasta onde so gravadas as sessions dever estar protegida. Fonte: http://www.techcaffe.net/site/tutoriais.php?recID=4 Exemplo prtico de Session em PHP index.php <?php session_start(); ?> <h1 align="center">Usando SESSION em PHP</h1> Podemos preservar valores de variveis enquanto durar uma sesso do browser atravs do uso de SESSION.<br> Para isso devemos startar a sesso em cada pgina que desejamos usar esta varivel com<br><br> sesssion_start();<br><br> Lembrando que esta funo deve vir antes de qualquer comando que mande algo para a tela, caso<br> o session esteja configurado para usar cookie.<br> Na primeira pgina deve ter um formulrio com algum campo que devemos usar no session.<br> Experimente gravar a URL de uma das pginas internas e acessar diretamente (http://localhost/session3) <br>Primeiro feche todas as sees do browser e depois abra o browser com essa URL.<br> <br> Veja que SESSION muito bom para preservar o valor de variveis entre pginas de um site numa seo.<br> Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

81/165

Portanto seu uso muito til quando pretendemos autenticas os visitantes de todas as as pginas de um site.<BR> Como tambm para outros usos em que pretendemos reaproveitar o valor de variveis (algo como global).<BR> Acompanhe este exemplo para ver detalhes.<br><br><br> <form method=post action=session2.php> Login<input type=text size=8 name=login><br> <input type=submit value=Enviar> </form></center> session2.php <?php session_start(); $_SESSION['login']=$_POST['login']; if (isset($_SESSION['login'])){ echo "Entre. Session2. <a href=session3.php>Session3</a>"; } else { echo "Acesso no autenticado!"; } ?> session3.php <?php session_start(); if (isset($_SESSION['login'])){ echo "Entre. Session3. <a href=session4.php>Session4</a><br>"; echo "<a href=destruir.php>Drestruir Sesso</a>"; } else { echo "Acesso no autenticado!"; } ?> session4.php

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado <?php session_start(); if (isset($_SESSION['login'])){ echo "Entre. Session4. <a href=session5.php>Session5</a>"; } else { echo "Acesso no autenticado!"; } ?> session5.php <?php session_start(); if (isset($_SESSION['login'])){ echo "Entre. Session5. <a href=index.php>Index</a><br><br>";

82/165

echo "Informaes: <br>ID da Sesso: <b>" . session_id() . "</b><br>Varivel mantida pela SuperGlobal \$_SESSION: <b>" . $_SESSION['login']; } else { echo "Acesso no autenticado!"; } ?> Dicas sobre Session: print ini_get('max_execution_time'); ini_set("session.gc_maxlifetime","3600"); session_save_path("/my/own/path/without/url/sessions"); Bom tutorial em: http://www.phpro.org/tutorials/Introduction-To-PHP-Sessions.html

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

83/165

9.9 - Trabalhando com Cookies no PHP


Setando o Cookie Para gravar um cookie no navegador do visitante usa-se a funo setcookie: setcookie(nome, valor, data_expirao): Exemplo:
//Calculate 60 dias no futuro //segundos * minutos * horas * dias + tempo atual $emDoisMeses = 60 * 60 * 24 * 60 + time(); setcookie('UltimaVisita', date("G:i - d/m/Y"), $emDoisMeses);

Recebendo o Cookie
if(isset($_COOKIE['UltimaVisita'])) $visita = $_COOKIE['UltimaVisita']; else print "You've got some stale cookies!"; echo "Sua ltima visita foi - ". $visita;

Fonte: http://www.tizag.com/phpT/phpcookies.php

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

84/165

9.10 - Tratamento de Erros no PHP


Os 25 erros de programao mais perigosos segundo a SANS By coredump Saiu no site da SANS a lista criada com o consenso entre varios profissionais e empresas do ramo de segurana e desenvolvimento descrevendo os 25 erros de programao mais perigosos para o desenvolvimento seguro. Eu vou traduzir os nomes e informao bsicos mas o melhor ler o artigo na ntegra, em ingls. Os erros esto separados em trs categorias: Interao insegura entre componentes, Gerenciamento arriscado de recursos, Defensas porosas. Categoria: Interao insegura entre componentes 1. Validao Imprpria de Entradas: Entradas que recebem dados e os aceitam mesmo sem certificar que eles so do tipo/formato esperado. 2. Codificao ou Escape Imprprios de Sada: Sadas que no so codificadas ou escapadas corretamente so a maior fonte de ataques de injeo de cdigo. 3. Falha ao Preservar a Estrutura da Busca SQL (conhecido como Injeo de SQL): Se os atacantes podem influenciar as procuras SQL do seu programa, ento eles podem controlar o seu banco de dados. 4. Falha ao Preservar a Estrutura do Cdigo da Pgina (conhecido como Cross-site Scripting): Assim como o anterior, se os atacantes podem injetar cdigo ou scripts em sua pgina, eles podem controlar a pgina. 5. Falha ao Preservar a Estrutura de Comandos do Sistema Operacional: Se voc permitir que entradas ilegais sejam passadas para aplicativos do sistema operacional, o atacante pode controlar o servidor. 6. Transmisso de Dados Sensveis em Texto Puro: Senhas, dados de carto e qualquer informao considerada sensvel deve ser criptografada. 7. Falsificao de Requisio Entre Sites: Um atacante pode criar uma requisio que enviada a outro site forjando a origem e fazendo o mesmo partir de um usurio inocente, aproveitando credenciais de autenticao e acessos. 8. Condio de Corrida: Atacantes vo sempre procurar por condies de corrida no software para conferir se alguma informao importante no obtida no processo. 9. Vazamento de Informaes em Mensagens de Erro: Atacantes vo procurar por mensagens de erro que descrevam mais que o necessrio, como nomes de campos SQL, objetos e bibliotecas sendo utilizadas. Categoria: Gerenciamento arriscado de recursos: 1. Falha ao Limitar Operaes aos Limites de um Buffer de Memria: O conhecido buffer overflow. 2. Controle Externo de Dados Sensveis: Informaes crticas que so mantidas fora de um banco de dados por questes de performance no deviam ser facilmente acessveis por atacantes. 3. Controle Externo de de Caminho ou Nome de Arquivo: Quando voc usa dados externos para montar um nome de arquivo ou caminho de gravao, voc est se arriscando a ser atacado. 4. Caminho de Procura Inseguro: Se o caminho de procura de recursos estiver em algum lugar sob controle de um atacante, bibliotecas ou cdigo pode ser inserido a revelia. Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

85/165

5. Falha ao Controlar a Gerao de Cdigo: Caso o atacante consiga influenciar a gerao de cdigo dinmico (se gerao de cdigo dinmico for utilizada no programa) ele poder controlar todo seu cdigo. 6. Download de Cdigo sem Verificao de Integridade: Se voc executa cdigo obtido por download, voc confia na fonte. Atacantes podem aproveitar esta confiana. 7. Desligamento ou Liberao Imprprias de Recursos: Arquivos, conexes e classes precisam ser corretamente encerradas. 8. Inicializao Imprpria: Dados, bibliotecas e sistemas inicializados incorretamente podem abrir margens para problemas. 9. Clculos Incorretos: Quando o atacante tem algum controle sobre as entradas usadas em operaes matemticas, isso pode gerar vulnerabilidades. Categoria: Defensas porosas: 1. Controle de Acesso Imprprio: Se voc no garante que seus usurios esto fazendo apenas o que deviam, os atacantes iro se aproveitar de sua autenticao. 2. Uso de um Algoritmo Criptogrfico Quebrado ou Vulnervel: Utilizao de algoritmos fracos ou comprometidos levam a falhas de criptografia e vulnerabilidades. 3. Senha no Cdigo: deixar um usurio e uma senha no prprio cdigo traz inmeros problemas. 4. Permisso de Acesso Insegura para Recurso Crtico: Configuraes, arquivos de dados e bancos de dados devem ter suas permisses de acesso protegidas. 5. Uso de Valores Insuficientemente Aleatrios: Se voc usa tipos de segurana que dependem de aleatoriedade, usar um gerador aleatrio insuficiente s vai causar problemas. 6. Execuo com Privilgios Desnecessrios: Se seu programa precisa de privilgios elevados para executar suas funes, ele deve abrir mo destes direitos assim que ele termina de executar as aes que precisavam dos privilgios. 7. Aplicao de Segurana do Lado do Servidor pelo Cliente: Atacantes podem usar engenharia reversa em um cliente de software e escrever seus prprios clientes removendo testes e aplicaes de segurana. Algumas coisas foram realmente chatas de traduzir, sinta-se livre para sugerir correes. intel PS: Lembre-se sempre os 25 mais no quer dizer os 25 nicos. Grain of Salt faz bem. Fonte: http://core.eti.br/2009/01/22/os-25-erros-de-programacao-mais-perigosos-segundo-a-sans/

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

86/165

Exemplo simples de uso de Exception <?php /* http://www.sourcecode4you.com/article/articleview/956dd1bb-a5a2-42ad-ae31-ad836eec24f3/trycatch-block-in-php.aspx Try Catch Block In Php Try catch block handle runtime exception which occur in function. */ function dividebyZero() { try { $k= 10/0; } catch(Exception $ex) { echo $ex; } } dividebyZero(); function throwException() { try { throw new Exception("My Custom Exception"); } catch(Exception $ex) { echo $ex; } } throwException(); ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

87/165

Introduo a manipulao de erros em PHP


Autor: Lorran Luiz <lorranluiz at click21.com.br> Data: 22/01/2009 Introduo Na histria humana muitos conquistaram grandes coisas. Tiveram problemas claro, mas em suas decises no erraram ou erraram pouco (pois , com os erros que aprendemos). Os erros enfim tiveram um papel relativamente importante para o sucesso dessas pessoas. Foi com eles (os erros) que as solues apareceram, pois no existe soluo se no h um erro para ser consertado. claro que erros nos decepcionam, mas eles s refletem a realidade - de que ainda no estamos completamente qualificados a fazer tal ato com xito completo. Os erros mostram que no somos perfeitos. A fato de no sermos perfeitos esbarra no que fazemos. Enfim, os programadores erram, os usurios podem errar ou at mesmo alguma parte do programa que est a ser executado pode falhar de alguma maneira. So nesses erros que envolvem o aplicativo e/ou os atores envolvidos no sistema que grandes desastres comeam a se formar. Verdadeiras bolas de neve vo crescendo a medida que um programador digita seu cdigo sem preocupar-se com a menor possibilidade de algo dar errado. Depois que um sistema est completamente construdo, sem base alguma para o tratamento correto de erros, o "problema quase que irresolvvel" estar montado! A cada passo na vida desse sistema a possibilidade da ocorrncia de erros "no identificveis" aumentar, e a cada erro, mais e mais do seu tempo se consumir para se chegar a resoluo do mesmo. O sistema enfim se torna insustentvel e todas aquelas horas de trabalho foram desperdiadas! Situaes como estas poderiam ser evitadas se medidas simples como a construo de um cdigo "supervisionado" com clusulas e blocos que garantem a manipulao correta e segura de erros fossem implementadas logo nas primeiras linhas. Situaes de possveis erros Veremos a partir de ento o bsico quando o assunto manipulao de erros. Com tal conhecimento o programador se capacitar a avanar no estudo de tratamento de erros e posteriormente aprender tcnicas para tal.

Algumas situaes
Suspeite de qualquer situao em que seu cdigo far algo decisivo para o funcionamento do seu sistema. Coisas como conectar a um banco de dados, abrir algum arquivo que contenha parmetros importantes, carregar uma classe (ou uma biblioteca) essencial na aplicao ou armazenar alguma informao numa tabela de banco de dados, entre muitas outras situaes requerem uma execuo sem falhas e por isso deve haver uma preocupao maior com os erros que acontecerem.

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

88/165

Podemos dizer que em certas partes de seu cdigo necessitaremos de "vigilantes" atentos a possveis situaes anormais. Veremos ento quem so os vigilantes da programao no PHP.

Os "vigilantes"
Podemos rodear determinadas reas de seu script com "vigilantes", que esperam que algo d errado para passar o controle da situao aos seus "superiores". Usamos a palavra-chave try para representar esses vigias virtuais no seu cdigo fonte. O try seguido de um bloco de cdigos no qual ele estar responsvel por capturar eventuais erros. Os erros so denominados excees, ou seja, situaes que saem do esperado. Sintaxe: try { //Cdigo suspeito }

Excees
Em orientao a objeto, no PHP, excees representam um objeto. Esse objeto necessita de um "molde" para ser construdo, esse molde denominado Classe e a classe usada para "modelar" uma exceo a classe Exception. Abaixo vemos a classe Exception: <?php class Exception { protected $message = 'Unknown exception'; // Mensagem da exceo protected $code = 0; // Cdigo da exceo definido pelo usurio protected $file; // Arquivo gerador da exceo protected $line; // Linha geradora da exceo function __construct(string $message=NULL, int code=0); final function getMessage(); // Mensagem da exceo final function getCode(); // Cdigo da exceo final function getFile(); // Arquivo gerador final function getTrace(); // um array com o backtrace() final function getTraceAsString(); // String formatada do trace /* Sobrecarregvel */ function _toString(); } Ribamar FS http://cursodephp.ribafs.org // String formatada para ser mostrada

PHP Avanado ?>

89/165

A classe Exception no precisa ser inserida em seu cdigo, ela uma classe nativa do PHP introduzida no Zend 2.

Os "superiores"
Os "superiores" so aqueles que tem competncia para fazer algo, devem resolver um problema ou passar essa responsabilidade para quem resolva. No PHP usamos a palavra-chave catch para representar esse superior. O "catch" responsvel pela identificao do erro, ou seja, ele "sabe" qual o tipo de exceo ocorreu, de acordo com a classe, derivada de Exception, que "modelou" o objeto de exceo passado para ele. O "catch" necessita de um parmetro, o nome da classe Exception ou derivada seguida da varivel que conter o objeto da exceo e um bloco de cdigo. Sintaxe: catch (Exception $variavel) { //Cdigo que manipular tal exceo } A palavra-chave catch deve ser posicionada logo aps o bloco de cdigo rodeado pela clusula try. Ficando ento assim: Sintaxe: try { //Cdigo suspeito } catch (Exception $variavel) { //Cdigo que manipular tal exceo } Preparando seu cdigo para as excees J vimos como cercar uma parte do cdigo para manipular os erros que nela ocorrerem. Veremos a partir de ento como "delatar" os erros e alertar o sistema quanto a eles.

Construindo uma exceo


O mtodo construtor da classe Exception requer 2 parmetros, sendo 1 opcional: public Exception::__construct ([ string $message=NULL [, int $code ]] ) O primeiro parmetro a mensagem do erro e o segundo o cdigo do erro (opcional).

Disparando o alarme
Em PHP usamos a palavra-chave throw para alertar o sistema da ocorrncia de um erro, uma Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

90/165

exceo. Throw seguido de um cdigo que solicita a construo de um novo objeto de exceo. Para instanciar uma classe no PHP usamos a palavra-chave new seguida do nome da classe. Ento a sintaxe ficar assim: throw new Exception("Mensagem", 1);

Como usar "throw"


Podemos usar a condicional if para decidirmos quando disparar uma exceo. Veja o exemplo abaixo: if (!@mysql_connect ("localhost", "usurio", "senha")) throw new Exception("No foi possvel conectar ao banco de dados"); Obs.: Podemos usar o operador de supresso (@) de erros para evitar que sejam exibidas as mensagens de erro padro do PHP. Estendendo e especificando excees Podemos tornar nossas excees mais especficas e por consequncia saber com mais preciso que tipo de erro ocorreu, manipulando-o assim da melhor maneira possvel. Usamos a palavra-chave extends para estender uma classe, ou seja, criar uma classe derivada (ou classe filha). Quando uma classe estende outra, ela herda da ltima atributos e mtodos dependendo do nvel de acesso de cada elemento que constitui o corpo da classe. A classe filha pode sobrecarregar mtodos (redefin-los). Exception uma classe que pode ser herdada, sendo assim podemos definir classes que derivem e aumentem sua funcionalidade, passando de uma simples exceo genrica para excees mais precisas.

Excees derivadas
Definamos algumas classes derivadas de Exception: class DBException extends Exception { protected $variavel; //Uma variavel qualquer public function __construct($exceptionMessage, $errorCode = 0) { parent::__construct($exceptionMessage, $errorCode); } //Aqui vemos alguns mtodos caractersticos da classe derivada de Exception public function getVariavel() { return $this->variavel_qualquer; } Ribamar FS http://cursodephp.ribafs.org

PHP Avanado public function setVariavel($valor = NULL) { $this->variavel = $valor; } } class FopenException extends Exception { protected $arquivo; //Varivel contendo o nome de um arquivo

91/165

public function __construct($nomeDoArquivo, $exceptionMessage, $errorCode = 0) { parent::__construct($exceptionMessage, $errorCode); $this->arquivo = $nomeDoArquivo; } //Mtodos caractersticos dessa classe public function getNomeDoArquivo() { return $this->arquivo; } public function exibirNomeDoArquivo() { echo "Nome do arquivo: {$this->arquivo}"; } } Um cdigo bsico com tratamento de erros Veremos e entenderemos como funcionaria ento um cdigo bsico completo que trataria de uma maneira certa os possveis erros que ocorressem durante sua execuo.

O cdigo
O cdigo que se seguir meramente explicativo e por isso talvez no possua utilidade numa situao real. Criaremos um cdigo onde ser criado um manipulador de arquivos; O contedo do arquivo ser lido; Efetuaremos uma conexo com o servidor de banco de dados; Esse contedo ser inserido numa clula de uma tabela de um banco de dados; E se tudo ocorrer bem, ser exibida a mensagem: Operao efetuada com sucesso; Caso ocorra um erro ser exibida uma mensagem de erro que ser reportada ao programador.

Veja abaixo: //A CLASSE: class ArmazenadorDeArquivoEmDB { Ribamar FS http://cursodephp.ribafs.org

PHP Avanado protected $db_obj; protected $db_usuario; protected $db_senha; protected $db_dsn; protected $nomeDoArquivo; protected $manipuladorDoArquivo; protected $conteudoDoArquivo; protected $db_tabela; protected $db_dbName;

92/165

public function __construct($usuario, $senha, $tabela, $db, $servidor) { //Construir objeto $this->db_usuario = $usuario; $this->db_senha = $senha; $this->db_tabela = $tabela; $this->db_dbName = $db; $this->db_dsn = $servidor; } public function conectar() { if(!($this->db_obj = @mysql_connect($this->db_dsn, $this->db_usuario, $this->db_senha))) { throw new DBException("No foi possvel conectar ao banco de dados", 281); //Lembrando que o cdigo de erro no um parmetro obrigatrio } } public function armazenarArquivoNoDB($nomeDoArquivo) { //O parmetro requer endereo completo do arquivo $this->nomeDoArquivo = $nomeDoArquivo; try { if (empty($this->db_obj)) { //Se no existir uma conexo aberta com o DB $this->conectar(); } } catch ( DBException $e ) { //Caso haja algum erro durante a tentativa de conexo... throw $e; // ...o "alarme" ir disparar } //Iremos abrir o arquivo: if (!file_exists($nomeDoArquivo)) throw new FopenException($nomeDoArquivo, "O arquivo especificado no existe.", 282); if (!($this->manipuladorDoArquivo = @fopen($nomeDoArquivo, "r"))) throw new FopenException($nomeDoArquivo, "No foi possvel abrir um manipulador para este arquivo.", 283); if (!($this->conteudoDoArquivo = @fread($this->manipuladorDoArquivo, intval(sprintf("%u", filesize($nomeDoArquivo)))))) throw new FopenException($nomeDoArquivo, "No foi possvel abrir o contedo deste arquivo.", 284); //O 2 parmetro de fread() possibilita a leitura de arquivos maiores que 2GB //Armazenaremos agora o contedo do arquivo no DB Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

93/165

$sql = 'INSERT INTO `' . $this->db_dbName . '`.`' . $this->db_tabela . '` (`nome`, `conteudo`) VALUES (\'' . $this->nomeDoArquivo . '\', \''. $this->conteudoDoArquivo . '\');'; if(!($insert = @mysql_query($sql))) throw new DBException("No foi possvel inserir o arquivo no banco de dados.", 285); else echo '<html><head></head><body onload="alert(\'O arquivo foi armazenado com sucesso no banco de dados\')"></body></html>'; } } //O OBJETO EM AO: $armazenadorDeArquivoEmDB = new ArmazenadorDeArquivoEmDB("usuario", "senha", "tabela", "banco_de_dados", "sevidor"); //Criamos um objeto que armazena um arquivo num banco de dados try { //Tentiva de conexo $armazenadorDeArquivoEmDB->armazenarArquivoNoDB("Ergue-te Marcos.txt"); //Aqui entra o nome do arquivo a ser armazenado no DB } catch ( DBException $e ) { //Houve um erro relativo ao banco de dados echo nl2br("<b>{$e->getMessage()}</b>\n<br />Detalhes:\n{$e->__toString()}"); //Exibir string contendo informaes sobre a exceo $gossipy->reportar($e); //A nvel exemplificativo, temos este objeto fictcio, imaginrio, que envia por email informaes sobre o erro ao programador } catch ( FopenException $e ) { //Houve um erro referente ao arquivo, e podemos dar um tratamento especfico a este tipo de exceo! echo nl2br("<b>{$e->getMessage()}</b>\n<br />Detalhes:\n{$e->__toString()}"); //Exibir string contendo informaes sobre a exceo $gossipy->reportar($e); //A nvel exemplificativo, temos este objeto fictcio, imaginrio, que envia por email informaes sobre o erro ao programador } Poderamos ter explorado mais desta fantstica linguagem que o PHP e ter feito um tratamento de erros mais proveitoso no cdigo acima, mas acho que para fins meramente explicativos e didticos no necessrio tanta complexidade. Vocs podem ver que poderamos ter criado no cdigo acima subclasses de Exception bem mais especficas, a idia a mesma de quando criamos as classes "FopenException" e "DBException". Classes mais especficas para a manipulao de excees relativas ao banco de dados poderiam ser definidas apenas estendendo a classe "DBException", veja: SQLException extends DBException { } E cada vez podemos ir tornando as excees mais especficas (e a manipulao mais precisa). Resumindo Faremos ento uma compilao de tudo o que aprendemos: Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

94/165

Neste artigo revisamos conceitos bsicos do poderoso recurso que a orientao a objetos do PHP 5; Vimos algumas situaes de risco que podem surgir durante a execuo de seu cdigo; Vimos tambm que podemos aprender com as situaes frustradoras se tratarmos melhor as informaes relativas a aquele problema; Vimos que o PHP 5 conta com excelentes ferramentas para tratarmos da maneira certa as excees que ocorrerem; Estudamos as principais palavras-chave quando o assunto tratamento de erros em PHP 5: try, catch e throw; Estudamos superficialmente a classe Exception; Aprendemos a disparar o "sinal de alerta" aproveitando a condicional "if" e usando-a em conjunto com throw. Aprendemos o funcionamento bsico do "sistema" de manipulao dos erros no PHP 5: Quando um erro (exceo) ocorre, este "percebido" (com por exemplo a condicional "if"), instancia-se ento a classe Exception (com "throw new Exception('msg', 01)") ou uma derivada, o controle passado para o bloco "catch" correspondente, que por vez pode usar as informaes que recebeu a respeito do erro na sua manipulao, como melhor convir. Depois que todo o cdigo do bloco catch que manipulou o erro executado, o controle do cdigo volta ao escopo mais geral (exceto se uma funo exit() ou similar for executada dentro do bloco catch, o que terminaria a execuo do cdigo neste instante).

Encerrando
Espero sinceramente ter sido claro, e mesmo sem aprofundar muito neste estudo, ter passado o mximo de conhecimento a respeito dos fundamentos do tratamento de erro com excees em PHP. Continuemos a estudar e talvez um dia melhorar nosso pas com o conhecimento! Um abrao para todos da comunidade VOL! L. Luiz

http://www.vivaolinux.com.br/artigo/Introducao-a-manipulacao-de-erros-em-PHP

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

95/165

9.11 - Trabalhando com Validao de Dados no PHP

timo artigo em 5 partes na Revista do PHP de autoria do Er Abbott


- Validao de Formulrios - 5 e ltima parte: Validando no servidor - Validao de Formulrios - Parte 04 (A fonteira cliente/servidor) - Validao de Formulrios - Parte 3: O baile de mscaras - Validao de Formulrios - Parte 2: Os Campos Especiais - Validao de formulrios - Parte 1 (O Planejamento) Turbinando a Validao de Formulrios

Validao de e-mails
Check valid e-mail
function esEmailValido($email) { if (ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([_a-zA-Z0-9-]+\.)*[a-zA-Z0-9-] {2,200}\.[a-zA-Z]{2,6}$", $email ) ) { return true; } else { return false; } }

http://snippets.dzone.com/posts/show/4346

Tipos de Variveis
<?php function ss_array_as_string (&$array, $column = 0) { $str = "Array(<BR>\n"; while(list($var, $val) = each($array)){ for ($i = 0; $i < $column+1; $i++){ $str .= " "; } $str .= $var.' ==> ';

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
$str .= ss_as_string($val, $column+1)."<BR>\n"; } for ($i = 0; $i < $column; $i++){ $str .= " "; } return $str.')'; }

96/165

function ss_object_as_string (&$object, $column = 0) { if (empty($object->classname)) { return "$object"; } else { $str = $object->classname."(<BR>\n"; while (list(,$var) = each($object->persistent_slots)) { for ($i = 0; $i < $column; $i++){ $str .= " "; } global $$var; $str .= $var.' ==> '; $str .= ss_as_string($$var, column+1)."<BR>\n"; } for ($i = 0; $i < $column; $i++){ $str .= " "; } return $str.')'; } } function ss_as_string (&$thing, $column = 0) { if (is_object($thing)) { return ss_object_as_string($thing, $column); } elseif (is_array($thing)) { return ss_array_as_string($thing, $column); } elseif (is_double($thing)) { return "Double(".$thing.")"; } elseif (is_long($thing)) { return "Long(".$thing.")"; } elseif (is_string($thing)) { return "String(".$thing.")"; } else { return "Unknown(".$thing.")"; } } $my_variable=3; //echo ss_as_string($my_variable); echo ss_as_string($GLOBALS); ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Validao Usando Filtros do PHP

97/165

Suportados pelo PHP com verso 5.2 ou superior. Constantes pr-definidas As contantes abaixo so definidas por esta extenso e somente estaro disponveis quando a extenso foi compilada com o PHP ou carregada dinamicamente durante a execuo. INPUT_POST (integer) Variveis POST. INPUT_GET (integer) Variveis GET. INPUT_COOKIE (integer) Variveis COOKIE. INPUT_ENV (integer) Variveis ENV. INPUT_SERVER (integer) Variveis SERVER. INPUT_SESSION (integer) Variveis SESSION. (ainda no implementada) INPUT_REQUEST (integer) Variveis REQUEST. (ainda no implementada) FILTER_FLAG_NONE (integer) Sem flags. FILTER_REQUIRE_SCALAR (integer) Flag usada para requerir escalar como entrada FILTER_REQUIRE_ARRAY (integer) Requer um array como entrada. FILTER_FORCE_ARRAY (integer) Sempre retorna um array. FILTER_NULL_ON_FAILURE (integer) Usa NULL ao invs de FALSE em falha. FILTER_VALIDATE_INT (integer) ID do filtro "int". FILTER_VALIDATE_BOOLEAN (integer) ID do filtro "boolean". FILTER_VALIDATE_FLOAT (integer) ID do filtro "float". FILTER_VALIDATE_REGEXP (integer) ID do filtro "validate_regexp". FILTER_VALIDATE_URL (integer) ID do filtro "validate_url". FILTER_VALIDATE_EMAIL (integer) ID do filtro "validate_email". FILTER_VALIDATE_IP (integer) ID do filtro "validate_ip". Ribamar FS http://cursodephp.ribafs.org

PHP Avanado FILTER_DEFAULT (integer) ID do filtro padro ("string"). FILTER_UNSAFE_RAW (integer) ID do filtro "unsafe_raw". FILTER_SANITIZE_STRING (integer) ID do filtro "string". FILTER_SANITIZE_STRIPPED (integer) ID do filtro "stripped". FILTER_SANITIZE_ENCODED (integer) ID do filtro "encoded". FILTER_SANITIZE_SPECIAL_CHARS (integer) ID do filtro "special_chars". FILTER_SANITIZE_EMAIL (integer) ID do filtro "email". FILTER_SANITIZE_URL (integer) ID do filtro "url". FILTER_SANITIZE_NUMBER_INT (integer) ID do filtro "number_int". FILTER_SANITIZE_NUMBER_FLOAT (integer) ID of "number_float" filter. FILTER_SANITIZE_MAGIC_QUOTES (integer) ID do filtro "magic_quotes". FILTER_CALLBACK (integer) ID do filtro "callback". FILTER_FLAG_ALLOW_OCTAL (integer) Permite notao octal (0[0-7]+) no filtro "int". FILTER_FLAG_ALLOW_HEX (integer) Permite notao hexadecimal (0x[0-9a-fA-F]+) no filtro "int". FILTER_FLAG_STRIP_LOW (integer) Remove caracteres com valor ASCII menor que 32. FILTER_FLAG_STRIP_HIGH (integer) Remove caracteres com valor ASCII maior que 127. FILTER_FLAG_ENCODE_LOW (integer) Codifica caracteres com valor ASCII menor que 32. FILTER_FLAG_ENCODE_HIGH (integer) Codifica caracteres com valor ASCII maior que 127. FILTER_FLAG_ENCODE_AMP (integer) Codifica &. FILTER_FLAG_NO_ENCODE_QUOTES (integer) No codifica ' e ". FILTER_FLAG_EMPTY_STRING_NULL (integer) (Nenhum uso no momento.) FILTER_FLAG_ALLOW_FRACTION (integer) Permite parte fracional no filtro "number_float". FILTER_FLAG_ALLOW_THOUSAND (integer) Permite separador de milhar (,) no filtro "number_float". FILTER_FLAG_ALLOW_SCIENTIFIC (integer) Permite notao cientfica (e, E) no filtro "number_float".

98/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado FILTER_FLAG_SCHEME_REQUIRED (integer) Requer scheme no filtro "validate_url". FILTER_FLAG_HOST_REQUIRED (integer) Requer host no filtro "validate_url". FILTER_FLAG_PATH_REQUIRED (integer) Requer path no filtro "validate_url". FILTER_FLAG_QUERY_REQUIRED (integer) Requer query no filtro "validate_url". FILTER_FLAG_IPV4 (integer) Permite somente endereo IPv4 no filtro "validate_ip". FILTER_FLAG_IPV6 (integer) Permite somente endereo IPv6 no filtro "validate_ip". FILTER_FLAG_NO_RES_RANGE (integer) No permite endereos reservados no filtro "validate_ip". FILTER_FLAG_NO_PRIV_RANGE (integer) No permite endereos privados no filtro "validate_ip". Funes de Filtragem

99/165

filter_has_var Verifica se a varivel de um especificado tipo existente filter_id Retorna o ID de um dado nome de filtro filter_input_array Obtem variveis externas e opcionalmente as filtra filter_input Obtem a especfica varivel externa pelo nome e opcionalmente a filtra filter_list Retorna a lista de todos filtros suportados filter_var_array Obtm mltiplas variveis e opcionalmente as filtra filter_var Filtra a varivel com um especificado filtro

Detectando o tipo de varivel: $_GET['test'] = 1; echo filter_has_var(INPUT_GET, 'test') ? 'Sim' : 'No'; Retornando uma lista com os tipos de filtros suportados <?php print_r(filter_list()); ?> Filter_input: $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS); $search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED); echo "You have searched for $search_html.\n"; echo "<a href='?search=$search_url'>Search again.</a>"; filter_var

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

100/165

var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL)); var_dump(filter_var('example.com', FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQ UIRED)); <?php error_reporting(E_ALL | E_STRICT); $data = array( 'product_id' => 'libgd<script>', 'component' => '10', 'versions' => '2.0.33', 'testscalar' => array('2', '23', '10', '12'), 'testarray' => '2', ); $args = array( 'product_id' 'component' 'max_range' => 10) 'versions' => 'doesnotexist' => 'testscalar' => ), FILTER_SANITIZE_ENCODED, FILTER_VALIDATE_INT, array( 'filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_REQUIRE_SCALAR, ), array( 'filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_FORCE_ARRAY, ) => FILTER_SANITIZE_ENCODED, => array('filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_FORCE_ARRAY, 'options' => array('min_range' => 1,

'testarray'

=>

); $myinputs = filter_var_array($data, $args); var_dump($myinputs); echo "\n"; ?> Just a little filter to validate IP v4 & v6 This little script display result in function of the query <?php $ipv6="2a01:e35:aaa4:6860:a5e7:5ba9:965e:cc93"; $ipv4="82.237.3.3"; $fake = "3342423423"; $ipv4priv = "255.255.255.255"; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

101/165

$ipv6priv = "::1"; echo "<pre>"; echo $ipv4; echo "<br />"; var_dump(filter_var($ipv4,FILTER_VALIDATE_IP)); echo "<br />"; echo $ipv6; echo "<br />"; var_dump(filter_var($ipv6,FILTER_VALIDATE_IP)); echo "<br />"; echo $fake; echo "<br />"; var_dump(filter_var($fake,FILTER_VALIDATE_IP)); echo "<br />"; echo $ipv4priv; echo "<br/>"; echo "FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE"; echo "<br />"; var_dump(filter_var($ipv4priv,FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); echo "<br />"; echo $ipv4priv; echo "<br/>"; echo "FILTER_FLAG_NO_PRIV_RANGE"; echo "<br />"; var_dump(filter_var($ipv4priv,FILTER_FLAG_NO_PRIV_RANGE)); echo "<br />"; echo $ipv6priv; echo "<br/>"; echo "FILTER_FLAG_NO_PRIV_RANGE"; echo "<br />"; var_dump(filter_var($ipv6priv,FILTER_FLAG_NO_PRIV_RANGE)); echo "<br />"; echo $ipv6priv; echo "<br />"; var_dump(filter_var($ipv6priv,FILTER_VALIDATE_IP)); echo "</pre>";

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

102/165

9.12 Trabalhando com XML em PHP


XML no Manual do PHP - http://www.php.net/manual/pt_BR/book.xml.php Introduo ao XML - http://www.criarweb.com/manuais/24 Lendo extrutura completa de arquivo XML: data.xml <?xml version='1.0'?> <!DOCTYPE chapter SYSTEM "/just/a/test.dtd" [ <!ENTITY plainEntity "FOO entity"> <!ENTITY systemEntity SYSTEM "xmltest2.xml"> ]> <chapter> <TITLE>Titulo</TITLE> <para> <informaltable> <tgroup cols="3"> <tbody> <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row> <row><entry>a2</entry><entry>c2</entry></row> <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row> </tbody> </tgroup> </informaltable> </para> &systemEntity; <section id="about"> <title>Sobre este documento</title> <para> <!-- this is a comment --> <?php echo 'Hi! This is PHP version '.phpversion(); ?> </para> </section> </chapter> ler_xml.php <?php //Exemplo de Entity externa $file = "data.xml"; function trustedFile($file) { // only trust local files owned by ourselves if (!eregi("^([a-z]+)://", $file) && fileowner($file) == getmyuid()) { return true; } Ribamar FS http://cursodephp.ribafs.org

PHP Avanado return false; } function startElement($parser, $name, $attribs) { echo "&lt;<font color=\"#0000cc\">$name</font>"; if (sizeof($attribs)) { while (list($k, $v) = each($attribs)) { echo " <font color=\"#009900\">$k</font>=\"<font color=\"#990000\">$v</font>\""; } } echo "&gt;"; } function endElement($parser, $name) { echo "&lt;/<font color=\"#0000cc\">$name</font>&gt;"; } function characterData($parser, $data) { echo "<b>$data</b>"; } function PIHandler($parser, $target, $data) { switch (strtolower($target)) { case "php": global $parser_file; // If the parsed document is "trusted", we say it is safe // to execute PHP code inside it. If not, display the code // instead. if (trustedFile($parser_file[$parser])) { eval($data); } else { printf("Untrusted PHP code: <i>%s</i>", htmlspecialchars($data)); } break; } } function defaultHandler($parser, $data) { if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") { printf('<font color="#aa00aa">%s</font>', htmlspecialchars($data)); } else { printf('<font size="-1">%s</font>', htmlspecialchars($data)); } }

103/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

104/165

function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Could not open entity %s at %s\n", $openEntityNames, $systemId); return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("XML error: %s at line %d while parsing entity %s\n", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), $openEntityNames); xml_parser_free($parser); return false; } } xml_parser_free($parser); return true; } return false; } function new_xml_parser($file) { global $parser_file; $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); xml_set_processing_instruction_handler($xml_parser, "PIHandler"); xml_set_default_handler($xml_parser, "defaultHandler"); xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler"); if (!($fp = @fopen($file, "r"))) { return false; } if (!is_array($parser_file)) { settype($parser_file, "array"); } $parser_file[$xml_parser] = $file; return array($xml_parser, $fp); } if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("could not open XML input"); }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado echo "<pre>"; while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d\n", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } echo "</pre>"; echo "parse complete\n"; xml_parser_free($xml_parser); ?> Ler XML usando simplexml: xml_lido.php

105/165

<?php $xmlstr = <<<XML <?xml version='1.0' encoding='ISO-8859-1' ?> <filmes> <filme> <titulo>PHP: Iniciando o Parser</titulo> <personagens> <personagem> <nome>Joo de Brito</nome> <actor>Brito</actor> </personagem> <personagem> <nome>Manoel Cunha</nome> <actor>Manoel</actor> </personagem> </personagens> <comentario> O XML uma linguagem. Ela como uma linguagem de programao. Ou uma linguagem de script? Tudo ser revelado aps ler bem toda a documentao. </comentario> <votos type="thumbs">7</votos> <votos type="stars">5</votos> </filme> </filmes> XML; ?> xml_ler.php <?php include 'xml_lido.php'; $xml = simplexml_load_string($xmlstr); Ribamar FS http://cursodephp.ribafs.org

PHP Avanado echo $xml->filme[0]->comentario; // "So this language. It's like..." print '<br>'; echo $xml->filme[0]->titulo; print '<br>'; echo $xml->filme[0]->personagens[0]->personagem[0]->nome; print '<br>'; echo $xml->filme[0]->votos[0]; print '<br>'; echo $xml->filme[0]->votos[1]; ?>

106/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

107/165

9.13 Trabalhando com Constantes Mgicas e Superglonais em PHP


Variveis do servidor $_SERVER Este um array (vetor) 'superglobal', ou automaticamente global. Isto significa que ele disponvel em todos os escopos (nveis) de um script. Voc no precisa fazer um: ... global $_SERVER; ... para poder acess-lo dentro de funes ou mtodos, como era necessrio com $HTTP_SERVER_VARS. O array superglobal $_SERVER existe em qualquer sesso PHP e j contm um conjunto de chaves (ndices) pr definidos e valorados. Os ndices mais importantes so: 'REQUEST_URI' O URI fornecido para acessar a pgina atual, por exemplo, '/index.html'. 'SCRIPT_NAME' Contm o caminho completo do script atual. til para pginas que precisam apontar para elas mesmas (dinamicamente). A constante __FILE__ contm o caminho completo e nome do arquivo (mesmo includo) atual. 'PHP_SELF' O nome do arquivo do script atualmente em uso, relativo ao document root. Por exemplo, $_SERVER['PHP_SELF'] em um script com o endereo http://example.com/test.php/foo.bar pode ser /test.php/foo.bar. A constante __FILE__ contm o caminho completo e nome do arquivo (mesmo includo) atual. Se estiver rodando o PHP em linha de comando, esta varivel no est disponvel. 'SERVER_NAME' O nome host do servidor onde o script atual executado. Se o script est rodando em um host virtual, este ser o valor definido para aquele host virtual. 'REQUEST_METHOD' Contm o mtodo de request utilizando para acessar a pgina. Geralmente 'GET', 'HEAD', 'POST' ou 'PUT'. 'QUERY_STRING' A query string (string de solicitao), se houver, pela qual a pgina foi acessada. 'DOCUMENT_ROOT' O diretrio raiz sob onde o script atual executado, como definido no arquivos de configurao do servidor. 'SCRIPT_FILENAME' O caminho absoluto o script atualmente em execuo. Nota: Se o script for executado pela CLI com um caminho relativo, como file.php ou ../file.php, $_SERVER['SCRIPT_FILENAME'] ir conter o caminho relativo especificado pelo usurio.

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

108/165

Exemplos
$current_script = dirname($_SERVER['SCRIPT_NAME']); $current_path = dirname($_SERVER['SCRIPT_FILENAME']);

$request_uri = $_SERVER['REQUEST_URI']; // Pick the predefined variable that works on your server return $_ENV['SCRIPT_URL']; $_SERVER['QUERY_STRING']) $sPathPS = $_SERVER[PHP_SELF]; $sPathFS = __FILE__; echo 'http'; if($_SERVER['HTTPS']=='on'){echo 's';} echo '://'.$_SERVER['SERVER_PORT'].$_SERVER['SCRIPT_NAME']; if($_SERVER['QUERY_STRING']>' '){echo '?'.$_SERVER['QUERY_STRING'];}

Constantes Mgicas
__LINE__ A linha atual do script. __FILE__ O caminho completo e nome do arquivo. Se utilizado dentro de um include, o nome do arquivo includo ser retornado. __FUNCTION__ O nome da funo (Acrescentado no PHP 4.3.0). A partir do PHP 5 esta constante retorna o nome da funo como ela foi declarada (sensvel a maisculas e minsculas). No PHP 4 sempre retorna o nome em minsculas. __CLASS__ O nome da classe (Acrescentado no PHP 4.3.0). A partir do PHP 5 esta constante retorna o nome da funo como ela foi declarada (sensvel a maisculas e minsculas). No PHP 4 sempre retorna o nome em minsculas. __METHOD__ O nome do mtodo de classe. (Acrescentado no PHP 5.0.0). O nome do mtodo retornado como foi declarado (sensvel a maisculas e minsculas). Exemplo: if (realpath(__FILE__) == realpath($_SERVER['SCRIPT_FILENAME'])) { exit; }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

109/165

9.14 Trabalhando com Formatao de Sada em PHP


Temos as trs funes - printf, sprintf e vprintf printf -- Mostra uma string formatada void printf ( string format [, mixed args] ) sscanf -- Interpreta a entrada de uma string de acordo com um formato mixed sscanf ( string str, string formato [, string var1] ) <?php // Pegando o nmero serial $serial = sscanf("SN/2350001","SN/%d"); // e a data de criao $mandate = "January 01 2000"; list($month, $day, $year) = sscanf($mandate,"%s %d %d"); echo "O Item $serial foi criado em: $year-".substr($month,0,3)."-$day\n"; ?> Se paretros opcionais so passados, a funo retornar o nmero de valores assumidos. Os parmetros opcionais devem ser passados por referncia. Exemplo 2. sscanf() - usando parmetros opcionais <?php // pega informao do autor e gera uma entrada de DocBook $auth = "24\tLewis Carroll"; $n = sscanf($auth,"%d\t%s %s", &$id, &$first, &$last); echo "<author id='$id'> <firstname>$first</firstname> <surname>$last</surname> </author>\n"; ?> fscanf -- Interpreta a leitura de um arquivo de acordo com um formato mixed fscanf ( resource handle, string formato [, string var1] ) $handle = fopen ("users.txt","r"); while ($userinfo = fscanf ($handle, "%s\t%s\t%s\n")) { list ($name, $profission, $countrycode) = $userinfo; //... fazer algo com os valores } fclose($handle); $goodevil = array ('There is a difference between %s and %s', 'good', 'evil'); echo call_user_func_array('sprintf',$goodevil); <?php $heading1 = "Label 1"; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado $heading2 = "Label 2"; $value1 = "31298"; $value2 = "98"; print "<pre>\n"; printf ("%'.-15.15s%'.6.6s\n", $heading1, $value1); printf ("%'.-15.15s%'.6.6s\n", $heading2, $value2); print "</pre>\n"; ?>

110/165

<?php $f='<?php $f=%c%s%c; printf($f,39,$f,39); ?>'; printf($f,39,$f,39); ?> sprintf -- Retorna uma string formatada string sprintf ( string format [, mixed args] ) Um especificador de tipo que diz que o argumento deve ser tratado como do tipo. Os tipos possivis so: % - Um caractere porcento. No requerido neenhum argumento. b - O argumento tratado com um inteiro, e mostrado como um binrio. c - O argumento tratado como um inteiro, e mostrado como o caractere ASCII correspondente. d - O argumento tratado como um inteiro, e mostrado como um nmero decimal com sinal. u - O argumento tratado com um inteiro, e mostrado como um nmero decimal sem sinal. f - O argumento tratado como um float, e mostrado como um nmero de ponto flutuante. o - O argumento tratado com um inteiro, e mostrado como un nmero octal. s - O argumento tratado e mostrado como uma string. x - O argumento tratado como um inteiro, e mostrado como um nmero hexadecimal (com as letras minsculas). X - O argumento tratado como um inteiro, e mostrado como um nmero hexadecimal (com as letras maisculas). <?php $format = "There are %d monkeys in the %s"; printf($format,$num,$location); ?> Este deve mostrar, "There are 5 monkeys in the tree". Mas imagine que ns estejamos criando a string de formatao em um arquivo separado, normalmente para internacionalizar e rescrevemos como: Exemplo 2. Troca de argumentos <?php $format = "The %s contains %d monkeys"; printf($format,$num,$location); ?> Agora ns temos um problema. A ordem dos argumentos na string de formatao no combina com os argumentos no cdigo. Ns gostariamos de deixar o cdigo como esta e simplesmente indicar na Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

111/165

string de formatao quais argumentos pertencem aonde. Podemos escrever a string de formatao assim: Exemplo 3. Troca de argumento <?php $format = "The %2\$s contains %1\$d monkeys"; printf($format,$num,$location); ?> Um beneficio adicional disto ue voc pode repetir os especificadores de converso sem adicionar mais argumentos em seu cdigo. Por exemplo: Exemplo 4. Troca de argumento <?php $format = "The %2\$s contains %1\$d monkeys. That's a nice %2\$s full of %1\$d monkeys."; printf($format, $num, $location); ?> Veja tambm printf(), sscanf(), fscanf(), vsprintf() e number_format(). Examplos Exemplo 5. sprintf(): inteiros prenchidos com zero <?php $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day); ?> Exemplo 6. sprintf(): formatando dinheiro <?php $money1 = 68.75; $money2 = 54.35; $money = $money1 + $money2; // echo $money ir mostrar "123.1"; $formatted = sprintf("%01.2f", $money); // echo $formatted ir mostrar "123.10" ?> vprintf -- Mostra uma string formatada void vprintf ( string formato, array args ) Mostra uma string formatada de acordo com o formato (o qual descrito na documentao para a funo sprintf()). Funciona como printf() mas aceita uma matriz de argumentos, ao invs de um nmero variavel de argumentos. <?php $fruits = array(1, 'banana',1, 'apples', 3, 'oranges', 2, 'peaches'); vprintf("I have %d %s, %d %s, %d %s and %d %s.", $fruits); ?> Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

112/165

9.15 Trabalhando com Imagens e Grficos em PHP


1 Trabalhando com a biblioteca grfica GD 2 Gerando Thumbnails com GD 3 Gerando Imagens Dinamicamente 4 Desenhando retngulos 5 Desenhando polgonos 6 Desenhando arcos 7 Gerando Grficos em PHP com a Biblioteca JPGraph 7.1 O que a JpGrapf? 7.2 Requisitos 7.3 Parmetros de Compilao 8 Referncia

Trabalhando com a biblioteca grfica GD


(Se no Windows remover o ponto-e-vrgula ";" da linha "extension=php_gd.dll" do php.ini)

Gerando Thumbnails com GD


Artigo do BOZO no PHPBrasil: http://phpbrasil.com/articles/article.php/id/1350

Gerando Imagens Dinamicamente


por Luiz Ribeiro O PHP oferece uma interface ao mdulo GD de Thomas Boutell. Usando tal mdulo, voc pode criar e editar imagens nos formatos JPEG e PNG. O formato GIF j foi aceito, mas como o algoritmo de compresso do GIF (LZW) contm uma patente de posse da Unisys, os desenvolvedores do mdulo foram obrigados retirar o suporte a esse formato nas verses mais recentes. Bom, para iniciar vou explicar o procedimento para criar uma imagem usando o mdulo GD em PHP. Se voc no tem esse mdulo, voc pode fazer o download dele em http://www.boutell.com/gd/. Normalmente a GD acompanha uma instalao completa do PHP. Para se criar a imagem, ser usada a funo ImageCreate(), ento sero realizadas as alteraes na imagem, ento ser finalizada a imagem usando ImageJpeg(), ImagePng() ou at ImageGif() se a verso do mdulo GD for inferior 1.4. Bom, vamos ao que interessa. Primeiramente vamos criar uma pequena imagem com o seguinte texto: PHPBrasil. O cdigo ficar da seguinte forma: Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

113/165

<?php header("Content-type: image/gif"); //Informa ao browser que o arquivo uma imagem no formato GIF $imagem = ImageCreate(150,40); //Cria uma imagem com as dimenses 100x20 $vermelho = ImageColorAllocate($imagem, 255, 0, 0); //Cria o segundo plano da imagem e o configura para vermelho $branco = ImageColorAllocate($imagem, 255, 255, 255); //Cria a cor de primeiro plano da imagem e configura-a para branco ImageString($imagem, 3, 3, 3, "PHPBrasil", $branco); //Imprime na imagem o texto PHPBrasil na cor branca que est na varivel $branco ImageGif($imagem); //Converte a imagem para um GIF e a envia para o browser ImageDestroy($imagem); //Destri a memria alocada para a construo da imagem GIF. ?>

Bom, o script est todo comentado e acho que voc entendeu. Se alguma dvida ficar martelando a, manda um comentrio. =D Bom, neste exemplo usamos a funo ImageGif() para converter a imagem, $imagem, e depoisa enviamos ao navegador. Mas poderamos ter salvo esta imagem em um arquivo, ao invs de mostrar ela no navegador. Veja o exemplo:
<?php $arquivo = "imagem1.gif"; $imagem = ImageCreate(150,40); $vermelho = ImageColorAllocate($imagem, 255, 0, 0); $branco = ImageColorAllocate($imagem, 255, 255, 255); ImageString($imagem, 3, 3, 3, "PHPBrasil", $branco); ImageGif($imagem, $arquivo); ImageDestroy($imagem); echo "A imagem foi salva no arquivo $arquivo."; ?>

Como voc deve ter notado, apenas retiramos aquele header() (que informava ao browser que o arquivo era uma imagem), afinal este exemplo no ir mostrar a imagem no navegador e sim gravar ela em $arquivo, e tambm mudamos os parmetros da funo ImageGif() para salvar a imagem no arquivo. Nesta parte do artigo, irei explicar como desenhar retngulos, polgonos e arcos.

Desenhando retngulos
Vamos ao primeiro exemplo, que ir desenhar um simples retngulo preenchido usando GD (o formato da imagem a seguir PNG). Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
<?php header("Content-type: image/png"); $imagem = ImageCreate(100, 20); $branco = ImageColorAllocate($imagem, 255, 255, 255); $azul = ImageColorAllocate($imagem, 20, 93, 233); ImageFilledRectangle($imagem, 5, 10, 60, 14, $azul); ImagePng($imagem); ImageDestroy($imagem); ?>

114/165

Bom, neste exemplo s h uma funo nova, a funo ImageFilledRectangle() que como seu prprio nome diz uma funo que cria um retngulo com as dimenses e posio informadas, e na cor azul, que foi definida na varivel $azul. J para criar um retngulo sem preenchimento voc simplesmente ir trocar a funo ImageFilledRectangle() por ImageRectangle(). O exemplo ficar da seguinte forma:
<?php header("Content-type: image/png"); $imagem = ImageCreate(100, 20); $branco = ImageColorAllocate($imagem, 255, 255, 255); $azul = ImageColorAllocate($imagem, 20, 93, 233); ImageRectangle($imagem, 5, 10, 60, 14, $azul); ImagePng($imagem); ImageDestroy($imagem); ?>

Como foi dito, este exemplo ir criar uma imagem com um retngulo sem preenchimento, mas sua borda ter a cor $azul.

Desenhando polgonos
Para desenhar polgonos, vamos usar a funo ImagePolygon(), que ir criar um polgono sem preenchimento, e a funo ImageFilledPolygon() que ir desenhar um polgono com preenchimento. Em nosso primeiro exemplo, vamos desenhar um polgono com vrtices de (12, 10), (15, 20), (50, 17) e (70, 10) com uma borda de azul-claro:
<?php header("Content-type: image/png"); $imagem = ImageCreate(100, 20); $branco = ImageColorAllocate($imagem, 255, 255, 255); $azul = ImageColorAllocate($imagem, 20, 93, 233); $pontos = array(12, 10, 15, 20, 50, 17, 70, 10); ImagePolygon($imagem, $pontos, 4, $azul); ImagePng($imagem); ImageDestroy($imagem); ?>

Bom, agora vamos criar um polgono preenchido, voc j deve ter pensado que o cdigo ser o mesmo, mas ao invs de ImagePolygon() usaremos ImageFilledPolygon(), se voc nsou isso, acertou em cheio. Vamos ver como ficaria nossa imagem com um retngulo preenchido:
<?php

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
header("Content-type: image/png"); $imagem = ImageCreate(100, 20); $branco = ImageColorAllocate($imagem, 255, 255, 255); $azul = ImageColorAllocate($imagem, 20, 93, 233); $pontos = array(12, 10, 15, 20, 50, 17, 70, 10); ImageFilledPolygon($imagem, $pontos, 4, $azul); ImagePng($imagem); ImageDestroy($imagem); ?>

115/165

Desenhando arcos
Bom, agora vamos desenhar alguns arcos em nossas imagens, para isso vamos usar a funo ImageArc(). Antes de comearmos, vou passar a sintaxe da funo: int ImageArc(int im, int cx, int cy, int w, int h, int s, int e, int co1); Esta funo desenha um arco em uma imagem, im, com uma posio inicial de X de cx e uma posio inicial Y de cy. O arco de largura w e altura h, com um ngulo inicial de s e um ngulo final de e, tudo na cor co1. Agora que j entendemos a funo ImageArc() vamos ao nosso primeiro exemplo que ir desenhar uma elipse:
<?php header("Content-type: image/gif"); $imagem = ImageCreate(500, 100); $branco = ImageColorAllocate($imagem, 255, 255, 255); ImageColorTransparent($imagem, $branco); $vermelho = ImageColorAllocate($imagem, 20, 93, 233); ImageArc($imagem, 40, 50, 50, 40, 0, 360, $vermelho); ImageGif($imagem); ImageDestroy($imagem); ?>

O cdigo acima funciona, pois para ter uma elipse, voc precisa de uma diferena de 360 graus entre a posio inicial e a posio final. Aplicando esse conhecimento, tambm podemos desenhar um crculo preenchido usando a funo ImageFillToBorder(). (Note que isso um crculo, no uma elipse, porque os parmetros de largura e altura tm o mesmo valor.)
<?php header("Content-type: image/gif"); $imagem = ImageCreate(500, 100); $branco = ImageColorAllocate($imagem, 255, 255, 255); ImageColorTransparent($imagem, $branco); $vermelho = ImageColorAllocate($imagem, 20, 93, 233); ImageArc($imagem, 40, 50, 50, 50, 0, 360, $vermelho); ImageFillToBorder($imagem, 50, 40, $vermelho); ImageGif($imagem); ImageDestroy($imagem); ?>

Observao: os exemplos acima foram retirados do livro PHP: Guia do Desenvolvedor que est na Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

116/165

lista de livros recomendados da PHPBrasil. Nos exemplos s foram alterados os nomes de algumas variveis para facilitar a compreenso. Bom, esse o bsico do mdulo GD. Voc com certeza tem muito a explorar ainda, em breve vou trazer mais alguns artigos sobre o assunto, para os que se interessaram, ou no entenderam alguma funo podem ver no manual do PHP todas as funes de imagem: http://br.php.net/manual/pt_BR/ref.image.php

Gerando Grficos em PHP com a Biblioteca JPGraph


O que a JpGrapf?
A JpGraph uma biblioteca orientada a objetos de criao de grficos, inteiramente escrita em PHP, que tem como base a extenso GD2 ou GD1 que acompanha o PHP. Pode ser utilizada para criar diversos tipos de grficos, de maneira fcil e escrevendo um mnimo de cdigo. Quando aliada a bancos de dados torna os grficos ainda mais interessantes.

Requisitos
Apache (http://httpd.apache.org ) PHP (www.php.net ) JpGraph (http://www.aditus.nu/jpgraph/ )

Parmetros de Compilao
- Compilar o PHP com suporte a GD e s fontes TTF (Linux): Sugesto da documentao oficial da JpGrapf:
./configure --prefix=/usr/share \ --datadir=/usr/share/php \ --with-apxs=/usr/sbin/apxs \ --libdir=/usr/share \ --includedir=/usr/include \ --bindir=/usr/bin \ --with-config-file-path=/etc \ --enable-mbstring --enable-mbregex \ --with-pdflib=/usr \ --with-mysql \ --with-ttf-dir=/usr/lib \ --with-freetype-dir=/usr/lib \ --with-gd --enable-gd-imgstrttf --enable-gd-native-ttf \ --with-zlib-dir=/usr/lib \ --with-png-dir=/usr/lib --with-jpeg-dir=/usr/lib --with-xpm-dir=/usr/X11R6 \ --with-tiff-dir=/usr/lib \ --enable-ftp \ --enable-memory-limit --enable-safe-mode \ --bindir=/usr/bin \ --enable-bcmath -enable-calendar \ --enable-ctype --with-ftp \

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
--enable-magic-quotes \ --enable-inline-optimization \ --with-bz2 \ --with-iconv

117/165

- No Windows basta descomentar no php.ini o suporte GD2. Obs.: No cdigo de um grfico no pode haver nenhuma sada em HTML ou texto.

Captura do site oficial. Verses Para PHP4 indicada a verso 1.19 da JpGrapf e para a verso 5 do PHP indicada a verso 2.0 beta. Download das Fontes TTF (Linux) http://corefonts.sourceforge.net/ http://www.gnome.org/fonts/ Como saber se o PHP j tem o suporte JpGrapf? Executar a funo phpinfo(), que deve retornar: - GD support - enabled - FreeTypeSupport enabled - JPG support enabled - PNG support enabled - WBMP support enabled Exemplos que podem ser encontrados no site official em http://www.aditus.nu/jpgraph/pdf/jpgraphddda.pdf

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

118/165

Exemplos de Grficos Grfico dos Poos perfurados pelo DNOCS de 1900 a 1999, por estado:

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

119/165

Este grfico acessa um banco PostgreSQL. Num pequeno form algum informa um ano entre 1900 e 1999 e recebe o grfico correspondente. Caso no informe o ano retornar o grfico de todos os anos. Cdigo abaixo:
//Pequneo form de consulta <h2 align=center>Consulta de Poos - DNOCS</h2> <form name=frmPocos action="barras_pocos.php" method="post"> <center>Que ano que deseja Consultar? (Todos = vazio)<input name="ano" size=10> <input type=submit value=Consultar></center> </form> //Arquivo barras_pocos.php <?php // Incluso da biblioteca include ("jpgraph.php"); include ("jpgraph_bar.php"); // Conexo ao banco PostgreSQL e consulta $db = pg_connect("host=10.0.0.100 dbname=banco port=5432 user=user password=pass") or die(pg_last_error()); $ano=$_POST['ano']; // Se no for informado o ano da pesquisa no form anterior, exibir todos os poos, caso contrrio mostra // somente os poos do ano solicitado if ($ano == "") $sql=pg_query($db,"SELECT estado, count(poco) as quant from recursos_hidricos.pocos group by estado"); else $sql=pg_query($db,"SELECT estado, count(poco) as quant from recursos_hidricos.pocos where recursos_hidricos.pocos.ano = $ano group by estado");

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

120/165

while($row = pg_fetch_array($sql)) { $quant[] = $row[1]; //Este array ($quant[]) sera usado em um dos eixos $estado[] = $row[0]; // Este em outro eixo } // Construo da base do grfico $graph = new Graph(650,350,"auto"); $graph->SetScale("textint"); //Exibir as escalas $graph->img->SetMargin(50,50,70,50); //Margens dos 4 lados $graph->title->Set('DNOCS - Poos X Estado do ano de '.$ano); // Ttulo do grfico $graph->title->SetFont(FF_VERDANA, FS_BOLD, 16);//Fonte do ttulo $graph->AdjBackgroundImage(0.4,0.7,-1); //Tipo de background $graph->xaxis->title->Set('Estados'); //Ttulo do eixo X $graph->xaxis->SetLabelAngle(30); //ngulo dos labels do eixo X $graph->xaxis->SetTickLabels('Estados'); $graph->xaxis->SetFont(FF_VERDANA, FS_BOLD);//Fonte para o ttulo do eixo X $graph->xaxis->SetTickLabels($estado); // Recebe o array dos estados do banco $graph->yaxis->title->Set('Poos'); $graph->yaxis->SetFont(FF_FONT1, FS_BOLD); $graph->yaxis->title->SetFont(FF_FONT1, FS_BOLD); $graph->SetShadow(); //Adicionar sombra ao grfico //Adicionar um tipo de grfico (barras) $bplot = new BarPlot($quant); //Recebe o outro array do banco $bplot->SetFillColor("lightgreen"); // Cor do grfico $bplot->value->Show(); $bplot->value->SetFont(FF_ARIAL,FS_BOLD); //Fonte $bplot->value->SetAngle(45); //ngulo $bplot->value->SetColor("black","navy"); //Cores $graph->Add($bplot); //Adicionar o grfico base $graph->Stroke(); ?>

Ao baixar a JpGraph e descompactar no diretrio web, veja a documentao, que exibe inmeros tipos de grficos com seus respectivos cdigos ao lado, como tambm o subdiretrio samples que tem 337 exemplos de grficos. Referncia http://www.phpbrasil.com/articles/print.php/id/164 http://www.zend.com/zend/tut/tutsweat3.php (timo tutorial, em ingls) http://phpbrasil.com/articles/print.php/id/315 (outro muito bom e em portugus) http://www.phpfreaks.com/print.php?cmd=tutorial&tut_id=115 (este abordando uso do MySQL)

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

121/165

9.16 Trabalhando com Nmeros em PHP

Muito Cuidado ao Lidar com Nmeros em Ponto Flutuante


Teste em PHP
<?php echo (int) ((0.1 + 0.7 ) * 10); ?>

Agora teste isso: echo (int) ((0.2 + 0.7 ) * 10); No conclua muito apressadamente que deficincia do PHP. Neste momento devemos ter conhecimento de como se comportam os nmeros, especialmente os floats, que so normalizados pelo IEEE. Teste em Java
class teste { public static void main(String[] args) { System.out.println((int) ((0.1 + 0.7 ) * 10)); //Display the string. } }

Em Java tambm d o mesmo resultado do PHP, o que leva a crer que a coisa no depende da linguagem mas das normas de como foram construdos os nmeros pelo IEEE. O Effective Java sugere que se use int, long ou BigDecimal para representar os valores monetrios. A classe BigDecimal foi desenvolvida para resolver dois tipos de problemas associados a nmeros de ponto flutuante (floats e doubles): primeiro, resolve o problema da inexatido da representao de nmeros decimais; segundo, pode ser usado para trabalhar com nmeros com mais de 16 dgitos significativos. Em compensao, utilizar BigDecimal pode tornar o programa menos legvel por no haver sobrecarga dos operadores matemticos para ela, sendo necessrio usar mtodos da classe. Veja, por exemplo, como voc faria o programa da listagem 1 com BigDecimal: BigDecimal d1 = new BigDecimal("1.95"); BigDecimal d2 = new BigDecimal("1.03"); System.out.println(d1.subtract(d2)); Utilizar os primitivos normalmente mais rpido e mais prtico, mas o problema fica por conta da definio das casas decimais. Voc pode controlar diretamente as casas decimais, por exemplo, utilizando como unidade para os valores o centavo ao invs de real. Um int ou um long passariam a representar a quantidade de centavos presentes no valor, e no a quatidade de reais. Por exemplo: long l1 = 195; long l2 = 103; System.out.println(l1 ? l2); Listagem 6: Programa da listagem 1 com long Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

122/165

As variveis acima dizem que voc tem 195 centavos (e no R$ 1,95) e vai gastar 103 centavos, e no R$ 1,03. No final voc ficar com 92 centavos (e no R$ 0,92).

Agora veja as recomendaes do manual do PHP


O tamanho de um float depende tambm da plataforma e de 64bits no formato IEEE(*). Nunca compare nmeros em ponto flutuante em igualdades, sob pena de cometer erros. Teste com PostgreSQL SELECT CAST((0.1 + 0.7)*10 AS INTEGER); Este sim, retorna o valor esperado. Em Java: System.out.println(1.95 - 1.03); // Retorna errado e em PHP retorna OK. Em Ruby (1.8+0.1)==(1.9) retorna false O mesmo ocorre em Phyton.

<?php /* extenso.php Copyright (C) 2002 Lyma This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Lyma ([email protected]) http://lymas.com Esta funo recebe um valor numrico e retorna uma string contendo o valor de entrada por extenso. Ribamar FS http://cursodephp.ribafs.org

PHP Avanado entrada: $valor (use ponto para centavos.) Ex.:

123/165

echo extenso("12428.12"); //retorna: doze mil, quatrocentos e vinte e oito reais e doze centavos ou use: echo extenso("12428.12", true); //esta linha retorna: Doze Mil, Quatrocentos E Vinte E Oito Reais E Doze Centavos sada..: string com $valor por extenso em reais e pode ser com iniciais em maisculas (true) ou no. ------------------------------------------------------------------------------------------------------------------Modificado por Claudio Monteoliva - [email protected] tambm possvel passar o valor para a funcao com a vrgula decimal. exemplo: echo extenso("12428,12"); // o retorna o mesmo que a passagem com ponto decimal */ function extenso($valor=0, $maiusculas=false) { // verifica se tem virgula decimal if (strpos($valor,",") > 0) { // retira o ponto de milhar, se tiver $valor = str_replace(".","",$valor); // troca a virgula decimal por ponto decimal $valor = str_replace(",",".",$valor); } $singular = array("centavo", "real", "mil", "milho", "bilho", "trilho", "quatrilho"); $plural = array("centavos", "reais", "mil", "milhes", "bilhes", "trilhes", "quatrilhes"); $c = array("", "cem", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos"); $d = array("", "dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa"); $d10 = array("dez", "onze", "doze", "treze", "quatorze", "quinze","dezesseis", "dezesete", "dezoito", "dezenove"); $u = array("", "um", "dois", "trs", "quatro", "cinco", "seis", "sete", "oito", "nove"); $z=0; $valor = number_format($valor, 2, ".", "."); $inteiro = explode(".", $valor); for($i=0;$i<count($inteiro);$i++) for($ii=strlen($inteiro[$i]);$ii<3;$ii++) Ribamar FS http://cursodephp.ribafs.org

PHP Avanado $inteiro[$i] = "0".$inteiro[$i];

124/165

$fim = count($inteiro) - ($inteiro[count($inteiro)-1] > 0 ? 1 : 2); for ($i=0;$i<count($inteiro);$i++) { $valor = $inteiro[$i]; $rc = (($valor > 100) && ($valor < 200)) ? "cento" : $c[$valor[0]]; $rd = ($valor[1] < 2) ? "" : $d[$valor[1]]; $ru = ($valor > 0) ? (($valor[1] == 1) ? $d10[$valor[2]] : $u[$valor[2]]) : ""; $r = $rc.(($rc && ($rd || $ru)) ? " e " : "").$rd.(($rd && $ru) ? " e " : "").$ru; $t = count($inteiro)-1-$i; $r .= $r ? " ".($valor > 1 ? $plural[$t] : $singular[$t]) : ""; if ($valor == "000")$z++; elseif ($z > 0) $z--; if (($t==1) && ($z>0) && ($inteiro[0] > 0)) $r .= (($z>1) ? " de " : "").$plural[$t]; if ($r) $rt = $rt . ((($i > 0) && ($i <= $fim) && ($inteiro[0] > 0) && ($z < 1)) ? ( ($i < $fim) ? ", " : " e ") : " ") . $r; } if(!$maiusculas){ return($rt ? $rt : "zero"); } else { return (ucwords($rt) ? ucwords($rt) : "Zero"); } } //echo extenso("12428,12"); //Completar com zeros esquerda de um numero at que fique com o numero de caracteres $X, // retornando como Carter function ZeroEsquerda($kNumero, $X) { $NumStrZero = trim((string)$kNumero); $QuantosZeros = $X - strlen($NumStrZero); for ( $i = 1; $i <= $QuantosZeros; $i++ ) { $NumStrZero = '0'.$NumStrZero; } return $NumStrZero; } ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

125/165

9.17 Trabalhando com Permisses de Arquivos e Diretrios

chmod - altera permisses de arquivos e diretrios


<?php chmod ("/arquivo/diretorio", 755); // decimal; provavelmente incorreto chmod ("/arquivo/diretorio", "u+rwx,go+rx"); // string; incorreto chmod ("/arquivo/diretorio", 0755); // octal; representao correta do modo ?> function permissoes($arquivo,$perms,$acao){ print "<form name=frm method=post action=acoes.php>"; print "<input name=pm value=$perms>"; print "<input type=hidden name=perms value=$perms>"; print "<input type=hidden name=ar value=$arquivo>"; print "<input type=hidden name=acao value=$acao>"; print "<input name=ar value=$arquivo readonly style='backgroundcolor:#FAEBD7'>"; print "<input type=submit name=prm value=Alterar>"; print "</form>"; if (isset($_POST['prm'])){ $ar=$_POST['ar']; $perms=octdec($_POST['pm']); $ch = chmod($ar, $perms); if(!$ch) { die ("Erro ao alterar as permiss es!"); }else{ print "<script>location='index.php'</script>"; } }

<?php // Escrita e leitura para o proprietario, nada ninguem mais chmod ("/somedir/somefile", 0600); // Escrita e leitura para o proprietario, leitura para todos os outros chmod ("/somedir/somefile", 0644); // Tudo para o proprietario, leitura e execucao para os outros chmod ("/somedir/somefile", 0755); // Tudo para o proprietario, leitura e execucao para o grupo do prop chmod ("/somedir/somefile", 0750); ?> Value Permission Level 400 Owner Read 200 Owner Write 100 Owner Execute 40 Group Read 20 Group Write 10 Group Execute 4 Global Read

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
2 1 Global Write Global Execute

126/165

<?php function chmodnum($mode) { $mode2=$mode; $realmode = ""; $legal = array("","w","r","x","-"); $attarray = preg_split("//",$mode); for($i=0;$i<count($attarray);$i++){ if($key = array_search($attarray[$i],$legal)){ $realmode .= $legal[$key]; } } $mode = str_pad($realmode,9,'-'); $trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1'); $mode = strtr($mode,$trans); $newmode = ''; $newmode .= $mode[0]+$mode[1]+$mode[2]; $newmode .= $mode[3]+$mode[4]+$mode[5]; $newmode .= $mode[6]+$mode[7]+$mode[8]; return $mode2.' = '.$newmode; } echo chmodnum('drwxr-xr-x'); ?> alguns exemplos: drwxr-xr-x drwxr-xr-x dr-xr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxrwxrwt drwxr-xr-x drwxr-xr-x lrwxrwxrwx => => => => => => => => => => => 755 755 555 755 755 755 755 776 755 755 777

chown
Esta funo no trabalha com arquivos remotos
<?php $file_name= "test"; $path = "/var/www/html/test/" . $file_name ; $user_name = "root"; chown($path, $user_name);

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
?> <?php function recurse_chown_chgrp($mypath, $uid, $gid) { $d = opendir ($mypath) ; while(($file = readdir($d)) !== false) { if ($file != "." && $file != "..") { $typepath = $mypath . "/" . $file ;

127/165

//print $typepath. " : " . filetype ($typepath). "<BR>" ; if (filetype ($typepath) == 'dir') { recurse_chown_chgrp ($typepath, $uid, $gid); } chown($typepath, $uid); chgrp($typepath, $gid); } } recurse_chown_chgrp ("uploads", "ribafs", "meugrupo") ; ?> <?php function recurse_chown_chgrp($path2dir, $uid, $gid){ $dir = new dir($path2dir); while(($file = $dir->read()) !== false) { if(is_dir($dir->path.$file)) { recurse_chown_chgrp($dir->path.$file, $uid, $gid); } else { chown($file, $uid); chgrp($file, $gid); } } $dir->close(); } ?> }

chgrp -- Modifica o grupo do arquivo


filegroup -- L o grupo do arquivo fileperms -- L as permisses do arquivo fileowner -- L o dono (owner) do arquivo is_readable -- Diz se o arquivo/diretrio legivel (readable)
<?php if (is_readable('my_link')) {

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
} ?> header('Location: /my_link');

128/165

is_writable -- Diz se pode-se escrever para o arquivo (writable)


<?php $file = '/home/vincent/arquivo.sh'; if(is_executable($file)) { echo $file.' executvel'; } else { echo $file.' no executvel'; } ?>

umask -- Modificar a umask atual


<?php umask(0670); $handle = fopen('file', 'w'); mkdir("/path/dir"); ?> //- set umask //- 0006 //- 0107

calculate the result: <?php $umask = 0670; umask($umask); //- if you are creating a new directory, $permission = 0777; //- if you are creating a new file, $permission = 0666. printf( "result: %04o", $permission & ( 0777 - $umask) ); ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

129/165

9.18 Trabalhando com Strings em PHP


1 substr -- Retorna uma parte de uma string 2 substr_replace 3 Encontrar Posio de caractere em String 4 Contando Ocorrncias de Substring em String 5 Trocando Ponto por Vrgula e vice-versa 6 Converso de Strings 7 Trabalhando com os Caracteres de Strings 8 Validao de Caracteres 9 ctype_alnum - Checa por caracteres alfanumricos 10 ctype_alpha - Checa por caracteres alfabticos 11 ctype_digit - Checa por caracteres numricos 12 ctype_lower - Checa por caracteres minsculos 13 ctype_punct - Checa por Caracteres que no sejam espao em branco nem alfanumricos 14 ctype_space - Checa por espaos em branco 15 Validao de Tipos 16 Cases 17 ndices com Str_Pad 18 String para TimeStamp

Retorna uma parte de uma string


string substr ( string string, int start [, int length] ) Exemplo 1. Uso bsico de substr()
<?php $rest $rest $rest $rest = = = = substr("abcdef", substr("abcdef", substr("abcdef", substr("abcdef", 1); 1, 3); 0, 4); 0, 8); // // // // retorna retorna retorna retorna "bcdef" "bcd" "abcd" "abcdef"

// Outra opo acessar atravz de chaves $string = 'abcdef'; echo $string{0}; // retorna a echo $string{3}; // retorna d ?>

Se start for negativo, a string retornada ir comear no caractere start a partir do fim de string. Exemplo 2. Usando um inicio negativo
<?php $rest = substr("abcdef", -1); // retorna "f" $rest = substr("abcdef", -2); // retorna "ef" $rest = substr("abcdef", -3, 1); // retorna "d" ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Exemplo 3. Usando um length negativo


<?php $rest $rest $rest $rest ?> = = = = substr("abcdef", substr("abcdef", substr("abcdef", substr("abcdef", 0, -1); 2, -1); 4, -4); -3, -1); // // // // retorna retorna retorna retorna "abcde" "cde" "" "de"

130/165

<h2>Sobrescrevendo Strings</h2> str_replace str_replace -- Substitui todas as ocorrncias da string de procura com a string de substituio mixed str_replace ( mixed pesquisa, mixed substitui, mixed assunto [, int &count] ) <pre> <?php // Fornece: <body text='black'> $bodytag = str_replace("%body%", "black", "<body text='%body%'>"); // Fornece: Hll Wrld f PHP $vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U"); $onlyconsonants = str_replace($vowels, "", "Hello World of PHP"); // Fornece: voc comeria pizza, cerveja e sorvete todos os dias $frase = "voc comeria frutas, vegetais, e fibra todos os dias."; $saudavel = array("frutas", "vegetais", "fibra"); $saboroso = array("pizza", "cerveja", "sorvete"); $novafrase = str_replace($saudavel, $saboroso, $frase); // Uso do parmetro count est disponvel no PHP 5.0.0 $str = str_replace("ll", "", "good golly miss molly!", $count); echo $count; // 2 ?>

substr_replace
substr_replace -- Substitui o texto dentro de uma parte de uma string string substr_replace ( string string, string replacement, int start [, int length] )
<?php $var = 'ABCDEFGH:/MNRPQR/'; echo "Original: $var<hr>\n"; /* Estes dois exemplos substituem tudo de $var com 'bob'. */ echo substr_replace($var, 'bob', 0) . "<br>\n"; echo substr_replace($var, 'bob', 0, strlen($var)) . "<br>\n"; /* Insere 'bob' direto no comeo de $var. */

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
echo substr_replace($var, 'bob', 0, 0) . "<br>\n";

131/165

/* Estes dois exemplos substituem 'MNRPQR' em $var com 'bob'. */ echo substr_replace($var, 'bob', 10, -1) . "<br>\n"; echo substr_replace($var, 'bob', -7, -1) . "<br>\n"; /* Deleta 'MNRPQR' de $var. */ echo substr_replace($var, '', 10, -1) . "<br>\n"; ?>

Encontrar Posio de caractere em String


strpos strpos -- Encontra a posio da primeira ocorrncia de uma string int strpos ( string str, string procurar [, int offset] ) Exemplos strpos()
<?php //$str = 'abc'; $str = 'cba'; $procurar = 'a'; $posicao = strpos($str, $procurar); // Note o uso de ===. Simples == no funcionaria como esperado // por causa da posio de 'a' 0 (primeiro) caractere. if ($pos === false) { echo "A string '$procurar' no foi encontrada na string '$str'"; } else { echo "A string '$procurar' foi encontrada na string '$str'"; echo " e est na posio $posicao"; } ?> <?php //$email = '[email protected]'; $email = '[email protected]'; $usuario = substr ($email, 0, strpos ($email, '@')); // Lembrando: substr ( string string, int start [, int length] ) $dominio = substr ($email, strpos ($email, '@')+1); echo "Usurio '$usuario' e Domnio '$dominio'"; // o comprimento default at o final ?>

Contando Ocorrncias de Substring em String


substr_count -- Conta o nmero de ocorrncias de uma substring Ribamar FS http://cursodephp.ribafs.org

PHP Avanado int substr_count ( string str, string conte_me )

132/165

substr_count() retorna o nmero de vezes que a substring conte_me ocorre na string str.
<?php $str = "Ol mundo do PHP"; if (substr_count($str, "do") == 0) echo "nenhum"; // same as: if (strpos($str, "do") === false) echo "nenhum"; ?>

Exemplo 1. Exemplo substr_count()


<?php print substr_count("This is a test", "is"); // mostra 2 ?>

Trocando Ponto por Vrgula e vice-versa


Se temos campos tipo moeda, devemos exibir com vrgula e gravar no banco com ponto. Para isso uma boa sada usar a dupla de funes implode e explode. Antes de exibir na tela (em consultas): $f_custo_produtivo=explode(".",$f_custo_produtivo); $f_custo_produtivo=implode(",",$f_custo_produtivo); Antes de gravar no banco (incluso e atualizao): $f_custo_produtivo=explode(",",$f_custo_produtivo); $f_custo_produtivo=implode(".",$f_custo_produtivo);

Converso de Strings
$foo $foo $foo $foo $foo $foo $foo $foo = = = = = = = = 1 + "10.5";echo $foo."<br>"; // $foo float (11.5) 1 + "-1.3e3";echo $foo."<br>"; // $foo float (-1299) 1 + "bob-1.3e3";echo $foo."<br>"; // $foo integer (1) 1 + "bob3";echo $foo."<br>"; // $foo integer (1) 1 + "10 Small Pigs";echo $foo."<br>"; // $foo integer (11) 4 + "10.2 Little Piggies";echo $foo."<br>"; // $foo float (14.2) "10.0 pigs " + 1;echo $foo."<br>"; // $foo float (11) "10.0 pigs " + 1.0;echo $foo."<br>"; // $foo float (11)

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

133/165

Trabalhando com os Caracteres de Strings


// Pega o primeiro caracter da string $str = 'Isto um teste.'; $first = $str{0}; echo $first."<br>"; // Pega o terceiro caracter da string $third = $str{2}; echo $third."<br>"; // Pega o ltimo caracter da string $str = 'Isto ainda um teste.'; $last = $str{strlen($str)-1}; echo $last."<br>"; // Modifica o ultimo caracter da string $str = 'Olhe o mal'; echo $str{strlen($str)-1} = 'r';

Validao de Caracteres
ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_graph ctype_lower ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit

ctype_alnum - Checa por caracteres alfanumricos


$strings = array('AbCd1zyZ9', 'foo!#$bar'); foreach ($strings as $testcase) { if (ctype_alnum($testcase)) { echo "The string $testcase consists of all letters or digits.\n"; } else { echo "The string $testcase does not consist of all letters or digits.\n"; } }

ctype_alpha - Checa por caracteres alfabticos


$strings = array('KjgWZC', 'arf12'); foreach ($strings as $testcase) { if (ctype_alpha($testcase)) { echo "The string $testcase consists of all letters.\n"; } else { echo "The string $testcase does not consist of all letters.\n"; }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
}

134/165

ctype_digit - Checa por caracteres numricos


$strings = array('1820.20', '10002', 'wsl!12'); foreach ($strings as $testcase) { if (ctype_digit($testcase)) { echo "The string $testcase consists of all digits.\n"; } else { echo "The string $testcase does not consist of all digits.\n"; } } // Alerta: Ao executar veja que somente vlido quando todos so dgitos // No indicado para testar valores decimais, com ponto ou vrgula

ctype_lower - Checa por caracteres minsculos


$strings = array('aac123', 'qiutoas', 'QASsdks'); foreach ($strings as $testcase) { if (ctype_lower($testcase)) { echo "The string $testcase consists of all lowercase letters.\n"; } else { echo "The string $testcase does not consist of all lowercase letters.\n"; } }

ctype_punct - Checa por Caracteres que no sejam espao em branco nem alfanumricos
$strings = array('ABasdk!@!$#', '!@ # $', '*&$()'); foreach ($strings as $testcase) { if (ctype_punct($testcase)) { echo "The string $testcase consists of all punctuation.\n"; } else { echo "The string $testcase does not consist of all punctuation.\n"; } }

ctype_space - Checa por espaos em branco Validao de Tipos


intval is_array

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
is_bool is_callable is_double is_float is_int is_integer is_long is_null is_numeric is_object is_real is_resource is_scalar is_string isset print_r serialize settype strval unserialize unset

135/165

Cases
strtoupper($str) - tudo maisculo strtolower($str) - tudo minsculo ucfirst($str) - Converte para maiscula o primeiro caractere de uma STRING ucwords($STR) - Converte para maisculas o primeiro caractere de cada PALAVRA

ndices com Str_Pad


str_pad -- Preenche uma string para um certo tamanho com outra string string str_pad ( string input, int pad_length [, string pad_string [, int pad_type]] ) Exemplo: $players =
array("DUNCAN, king of Scotland"=>"Larry", "MALCOLM, son of the king"=>"Curly", "MACBETH"=>"Moe", "MACDUFF"=>"Rafael");

echo "
"; // Print a heading echo str_pad("Dramatis Personae", 50, " ", STR_PAD_BOTH) . "\n"; // Print an index line for each entry foreach($players as $role=>$actor) echo str_pad($role, 30, ".")

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado
. str_pad($actor, 20, ".", STR_PAD_LEFT) . "\n"; echo "

136/165

"; Resultado:
Dramatis Personae DUNCAN, king of Scotland.....................Larry MALCOLM, son of the king.....................Curly MACBETH........................................Moe MACDUFF.....................................Rafael

String para TimeStamp


// Absolute dates and times $var = strtotime("25 December 2002"); $var = strtotime("14/5/1955"); $var = strtotime("Fr1, 7 Sep 2001 10:28:07 -1000"); // The current time: equivalent to time( $var = strtotime("now"); // Relative times echo strtotime("+1 day"); echo strtotime("-2 weeks"); echo strtotime("+2 hours 2 seconds"); //Care should be taken when using strtotime( ) with user-supplied dates. It's better to limit the use of strtotime( ) to cases when //the string to be parsed is under the control of the script, for example, checking a minimum age using a relative date: // date of birth: timestamp for 16 August, 1983 $dob = mktime(0, 0, 0, 16, 8, 1982); // Now check that the individual is over 18 if ((float)$dob < (float)strtotime("-18 years")) echo "Legal to drive in the state of Victoria"; )

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

137/165

9.19 Trabalhando com URLs no PHP

Passando Parmetros pela URL


Primeiro (ncora) <a href="arquivo.php?parametro1=valor1&parametro2=valor2&parametro3=valor3">Link</a>
arquivo.php $par1=$_GET['parametro1']; $par2=$_GET['parametro2']; $par3=$_GET['parametro3'];

Segundo (action de form)


<form name=frm method=post action="arquivo2.php? parametro1=valor1&parametro2=valor2"> ...

arquivo2.php
$par1=$_POST['parametro1']; $par2=$_POST['parametro1'];

Terceiro (URL) http://localhost/teste.php?parametro1=valor1 teste.php $par1=$_GET['parametro1']; Quarto (location no javascript)


<?php // J vindo de outro script, chamado via POST $a = $_POST['a']; ?> <script> if(confirm("Confirma?")){ location="vai.php?a='<?=$a?>' "; }else{ location='volta.php'; } </script>

Reconstruct URL string in PHP


// find out the domain: $domain = $_SERVER['HTTP_HOST']; // find out the path to the current file: $path = $_SERVER['SCRIPT_NAME']; // find out the QueryString: $queryString = $_SERVER['QUERY_STRING'];

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

138/165

// put it all together: $url = "http://" . $domain . $path . "?" . $queryString; echo "The current URL is: " . $url . " "; // An alternative way is to use REQUEST_URI instead of both // SCRIPT_NAME and QUERY_STRING, if you don't need them seperate: $url2 = "http://" . $domain . $_SERVER['REQUEST_URI']; echo "The alternative way: " . $url2;

Do site - http://snippets.dzone.com/posts/show/4054

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

139/165

9.20 Trabalhando com Criptografia no PHP


Classe usando a funo crypt do PHP para criptografar e descriptografar uma script. Fonte: http://phpro.org <?php // make it of break it error_reporting(E_ALL); /** * Class to provide 2 way encryption of data * * @author Kevin Waterson * @copyright 2009 PHPRO.ORG * */ class proCrypt { /** * * This is called when we wish to set a variable * * @access public * @param string $name * @param string $value * */ public function __set( $name, $value ) { switch( $name) { case 'key': case 'ivs': case 'iv': $this->$name = $value; break; default: throw new Exception( "$name cannot be set" ); } } /** * * Gettor - This is called when an non existant variable is cal led Ribamar FS http://cursodephp.ribafs.org

PHP Avanado * * @access public * @param string $name * */ public function __get( $name ) { switch( $name ) { case 'key': return 'keee';

140/165

case 'ivs': return mcrypt_get_iv_size( MCRYPT_RIJNDAEL_128, MCRYPT _MODE_ECB ); case 'iv': return mcrypt_create_iv( $this->ivs ); default: throw new Exception( "$name cannot be called" ); } } /** * * Encrypt a string * * @access public * @param string $text * @return string The encrypted string * */ public function encrypt( $text ) { // add end of text delimiter $data = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->key, $ text, MCRYPT_MODE_ECB, $this->iv ); return base64_encode( $data ); } /** * * Decrypt a string * * @access public * @param string * @return string

$text The decrypted string

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

141/165

* */ public function decrypt( $text ) { $text = base64_decode( $text ); return mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $this->key, $t ext, MCRYPT_MODE_ECB, $this->iv ); } } // end of class

Exemplo de Uso
<?php // a new proCrypt instance $crypt = new proCrypt; // encrypt the string $encoded = $crypt->encrypt( 'my message'); echo $encoded."\n"; // decrypt the string echo $crypt->decrypt( $encoded ) . "\n"; ?> Encode e Decode PHP/MySQL - Funo ()encode e ()decode Fala galera! Nesse artigo estarei dando continuao ao assunto criptografia em PHP. Como vocs puderam observar na semana passada, eu expliquei a funo password(), que tem por finalidade fazer a criptografia de senhas. Uma desvantagem do uso dessa funo, que no podemos descriptografar o dado depois. A seguir, vou apresentar um outro mtodo de criptografia que o encode (codifica o dado) e o decode (decodifica o dado). Exemplo prtico 1. Vamos criar uma tabela (mensagem.php): CREATE TABLE tb_mensagem ( id int(3) NOT NULL auto_increment, de varchar(80) NOT NULL DEFAULT '' , para varchar(80) NOT NULL DEFAULT '' , mensagem text NOT NULL DEFAULT '' , Ribamar FS http://cursodephp.ribafs.org

PHP Avanado PRIMARY KEY (id) ); 2. "Popular" a nossa base de dados: INSERT INTO tb_mensagem(de,para,mensagem) VALUES('Jlio Csar Martini','iMasters', encode('Mensagem sigilosa: Artigo sobre criptografia','teste')) Resultado:

142/165

Id | De | Para | Mensagem 1 | Jlio Csar Martini | iMasters |$P5_JnzOAHG8 6EY%O,{ Depois de ter efetuado este comando SQL, o resultado que voc tem na sua tabela (tb_mensagem) o apresentado acima. Como voc pode observar, o campo mensagem o que recebeu a funo encode(). Veja o monte de caracteres esquisitos que apareceram no lugar da mensagem original. Agora vocs vo me perguntar, como eu fao para ele mostrar a mensagem certa? Para isso, vamos fazer uso da funo decode(). 3. Arquivo que conecta com a nossa base de dados MySQL: <? /* Conecta com um banco de dados MySQL conforme parmetros enviados (servidor = localhost) Banco de Dados: $dbname Porta: $usuario Senha: $senha*/ $dbname="nomedobd"; $usuario=""; $password=""; //1 passo - Conecta ao servidor MySQL if(!($id = mysql_connect("localhost",$usuario,$password))) { echo "<p align="center"><big><strong>No foi possvel estabelecer uma conexo com o gerenciador MySQL. Favor Contactar o Administrador. </strong></big></p>"; exit; } //2 passo - Seleciona o Banco de Dados if(!($con=mysql_select_db($dbname,$id))) { echo " <p align="center"><big><strong>No foi possvel estabelecer uma conexo com o gerenciador MySQL. Favor Contactar o Administrador. </strong></big></p>"; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado exit; } ?>

143/165

4. Vamos criar uma pgina index.php que vai exibir a mensagem na tela: <? include "conecta.php"; //Arquivo que conecta com a nossa base de dados MySQL $sql = mysql_query("SELECT de,para,decode(mensagem,'teste') FROM tb_mensagem") or die("ERRO no SQL : ".mysql_error()); $array = mysql_fetch_array($sql); echo $array['de']; echo "<br>"; echo $array['para']; echo "<br><br>"; echo $array['mensagem']; ?> Na linha do SELECT, fazemos uso da funo decode(), que vai decodificar aquela mensagem para que ela possa ser exibida corretamente na tela para o usurio. Como vocs podem observar nessa linha: decode(mensagem,'teste'), passamos a chave para decodificar a mensagem. Nesse caso teste. Lembre-se que na hora de fazer o encode(), definimos teste como sendo a chave. Ento, para decodificar, precisamos informar ela novamente. Convido o leitor a tirar o decode() do SQL e ver o resultado. A linha vai ficar assim: <? ... $sql = mysql_query("SELECT de,para,mensagem) FROM tb_mensagem") or die("ERRO no SQL : ".mysql_error()); ... ?> No deixe de nos enviar crticas ou sugestes para o prximo assunto, afinal a coluna de vocs. Autor/fonte: Jlio Csar Martini E-mail/Url: n/a Site: http://www.htmlstaff.org

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Encode e Decode usando base64 $str = 'Ribamar Ferreira de Sousa'; //echo base64_encode($str); $str2 = 'UmliYW1hciBGZXJyZWlyYSBkZSBTb3VzYQ== '; echo base64_decode($str2);

144/165

Encode-Decode in PHP
<?php /* Tutorial by AwesomePHP.com -> www.AwesomePHP.com */ /* Function: Encode or Decode anything based on a string */ $secretPass = 'kljhflk73#OO#*U$O(*YO'; $encodeThis = 'Please meet me at 05:44 time.'; /* Regular $encoded = /* Another $decoded = Encoding */ Encode($encodeThis,$secretPass); pass to decode */ Encode($encoded,$secretPass);

echo 'Encoded String: '.$encoded; echo '<br />Decoded String: '.$decoded; /* Important: If passing this value via URL you might want to make it explorer friendler */ $encoded = bin2hex(Encode($encodeThis,$secretPass)); /* Another pass to decode */ $decoded = Encode(hex2bin($encoded),$secretPass); echo '<br /><br />Encoded String: '.$encoded; echo '<br />Decoded String: '.$decoded; function Encode($data,$pwd) { $pwd_length = strlen($pwd); for ($i = 0; $i < 255; $i++) { $key[$i] = ord(substr($pwd, ($i % $pwd_length)+1, 1)); $counter[$i] = $i; } for ($i = 0; $i < 255; $i++) { $x = ($x + $counter[$i] + $key[$i]) % 256; $temp_swap = $counter[$i]; $counter[$i] = $counter[$x]; $counter[$x] = $temp_swap; } for ($i = 0; $i < strlen($data); $i++) { $a = ($a + 1) % 256; $j = ($j + $counter[$a]) % 256; $temp = $counter[$a];

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

145/165

} return $Zcrypt;

$counter[$a] = $counter[$j]; $counter[$j] = $temp; $k = $counter[(($counter[$a] + $counter[$j]) % 256)]; $Zcipher = ord(substr($data, $i, 1)) ^ $k; $Zcrypt .= chr($Zcipher);

function hex2bin($hexdata) { for ($i=0;$i<strlen($hexdata);$i+=2) { $bindata.=chr(hexdec(substr($hexdata,$i,2))); } return $bindata; } ?>

Site de origem: http://www.awesomephp.com/?Tutorials*3/Encode-Decode-in-PHP.html <?php Encriptar $cod = base64_encode("senha"); print $cod; Decriptar echo "<br>".base64_decode($cod); /** * Decodes a text with many algorithms many times * * @param string $text the text to decode * @param string $mode the sequence of decryption methods separated by commas [,] * G : gEncryption method using the class gEncrypter * base64 : base64 decoding algorithm * uu : decryption using the function uudecode() * [default: G] * @param string $key the key to use separated by commas [,] * one for each "G" you put in the sequence * [gEncrypter only] [default: ilarvet] * @return string the text finally decrypted */ function decode($text, $mode = "G", $key = "ilarvet") { $exmode = explode(",", $mode); $exkey = explode(",", $key); $kcount = 0; $dec = $text; for ($i=0; $i<count($exmode); $i++) Ribamar FS http://cursodephp.ribafs.org

PHP Avanado { $exmode[$i] = trim($exmode[$i]);

146/165

switch (strtolower($exmode[$i])) { case "g": include_once($this->include_path . "gEncrypter.php"); $e = new gEncrypter; $dec = $e->gED($dec, $exkey[$kcount]); $kcount ++; break; case "base64": $dec = base64_decode($dec); break; case "uu": $dec = convert_uudecode($dec); break; default: break; } } return $dec; } function encode($text, $mode = "G", $key = "ilarvet") { $exmode = explode(",", $mode); $exkey = explode(",", $key); $kcount = 0; $enc = $text; for ($i=0; $i<count($exmode); $i++) { $exmode[$i] = trim($exmode[$i]); switch (strtolower($exmode[$i])) { case "g": include_once($this->include_path . "gEncrypter.php"); $e = new gEncrypter; $enc = $e->gED($enc, $exkey[$kcount]); $kcount ++; break; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado case "base64": $enc = base64_encode($enc); break; case "uu": $enc = convert_uuencode($enc); break; default: break; } } } ?>

147/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

148/165

9.21 Trabalhando com e-mails em PHP


Enviar e-mail simples: mail("[email protected]", "Aqui fica o assunto", "Aqui o corpo do e-mail"); Envio de e-mail com tratamento de erro: $to = [email protected]'; $subject = 'Assunto'; $from = '[email protected]'; $message = 'Como vai?'; if(mail($to, $subject, $message, "From: $from")) echo "E-mail enviado com sucesso!"; else echo "Falha no envio do e-mail mensagem no enviada"; ?> Mais um: $subject = "Assunto"; $content = "Text type email does not need br tags for line breaks; A simple line break in your code will do the trick, as the Content-type is set to text in the header."; $headers = 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text; charset=iso-8859-1' . "\n"; $headers .= 'From: [email protected]'; mail($to,$subject,$content,$headers); Mais um exemplo de envio de e-mail com PHP: $headers = "From: Testando Envio de Email <$assunto>"; // pegando data $date = date("d/m/Y h:i"); // teoricamente iremos enviar para esse email fictcio, mas podemos trazer de um BD o email sem algum problema. $seuemail = "[email protected]"; // assunto do email, como vai ficar em sua caixa de entrada, cuidado para no colocar nomes inseridas em blacklists de email. $assunto = "Sistema de envio de Email"; // Corpo do texto, fiz um exemplo bsico de cadastro trazendo em variavel. $mensagem = " Nome: $variavel1 Endereco: $variavel2 Bairro: $variavel3 Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Telefone: $variavel4 Email: $variavel5 Enviado em: $date";

149/165

// eis aqui o envio prpriamente dito.... essa linha onde se dispara o email. mail($seuemail, $assunto, $mensagem, $headers); Envio de E-mail no formato HTML <?php //define the receiver of the email $to = '[email protected]'; //define the subject of the email $subject = 'Test HTML email'; //create a boundary string. It must be unique //so we use the MD5 algorithm to generate a random hash $random_hash = md5(date('r', time())); //define the headers we want passed. Note that they are separated with \r\n $headers = "From: [email protected]\r\nReply-To: [email protected]"; //add boundary string and mime type specification $headers .= "\r\nContent-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\""; //define the body of the message. ob_start(); //Turn on output buffering ?> --PHP-alt-<?php echo $random_hash; ?> Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hello World!!! This is simple text email message. --PHP-alt-<?php echo $random_hash; ?> Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: 7bit <h2>Hello World!</h2> <p>This is something with <b>HTML</b> formatting.</p> --PHP-alt-<?php echo $random_hash; ?>-<?php //copy current buffer contents into $message variable and delete current output buffer $message = ob_get_clean(); //send the email $mail_sent = @mail( $to, $subject, $message, $headers ); //if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" echo $mail_sent ? "Mail sent" : "Mail failed"; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado ?>

150/165

Envio de e-mail com anexo: <?php //define the receiver of the email $to = '[email protected]'; //define the subject of the email $subject = 'Test email with attachment'; //create a boundary string. It must be unique //so we use the MD5 algorithm to generate a random hash $random_hash = md5(date('r', time())); //define the headers we want passed. Note that they are separated with \r\n $headers = "From: [email protected]\r\nReply-To: [email protected]"; //add boundary string and mime type specification $headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; //read the atachment file contents into a string, //encode it with MIME base64, //and split it into smaller chunks $attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); //define the body of the message. ob_start(); //Turn on output buffering ?> --PHP-mixed-<?php echo $random_hash; ?> Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>" --PHP-alt-<?php echo $random_hash; ?> Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hello World!!! This is simple text email message. --PHP-alt-<?php echo $random_hash; ?> Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: 7bit <h2>Hello World!</h2> <p>This is something with <b>HTML</b> formatting.</p> --PHP-alt-<?php echo $random_hash; ?>---PHP-mixed-<?php echo $random_hash; ?> Content-Type: application/zip; name="attachment.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment <?php echo $attachment; ?> --PHP-mixed-<?php echo $random_hash; ?>-Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

151/165

<?php //copy current buffer contents into $message variable and delete current output buffer $message = ob_get_clean(); //send the email $mail_sent = @mail( $to, $subject, $message, $headers ); //if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" echo $mail_sent ? "Mail sent" : "Mail failed"; ?>

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

152/165

9.22 Trabalhando com Data e Hora em PHP


<?php // Funes diversas // Definir o horrio brasileiro: //date_default_timezone_set('Brazil/East'); // Somar dias a data atual function add_dias($dias) { return date('d/m/Y',mktime(0,0,0,date('m'),date('d')+$dias,date('Y'))); } /* Funo SomarDias() Usada para calcular a data de feriados mveis. Esta funo adiciona 'n_dias' data 'data', passado como argumento, a qual deve estar no formato dd/mm/yyyy ou yyyy-mm-dd. O argumento 'forma' serve para especificar o formato da data retornada. Ele pode conter os seguintes valores: "pt" => Retornar a data no formato DD/MM/YYYY "en" => Retornar a data no formato YYYY-MM-DD Se 'forma' no for especificada, adotar-se- a forma brasileira (pt). */ public function SomarDias ($data, $n_dias, $forma = "pt") { if (!is_int ($n_dias)) { echo "<p>Funo <strong>". __FUNCTION__ ."</strong>: o argumento \"n_dias\" deve ser um nmero inteiro.</p>"; return false; } $forma = strtolower ($forma); if ($forma != "en" AND $forma != "pt") $forma = "pt"; if (preg_match ("/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/", $data)) list ($dia, $ms, $ano) = explode ("/", $data); elseif (preg_match ("/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/", $data)) list ($ano, $ms, $dia) = explode ("-", $data); else { echo "<p>Funo <strong>". __FUNCTION__ ."</strong>: Formato de data invlido (". Ribamar FS http://cursodephp.ribafs.org

PHP Avanado $data .").</p>"; return false; } //transforma $n_dias em segundos //86400 = 60 * 60 * 24 $segs_n_dias = $n_dias * 86400;

153/165

// tranforma $data em timestamp $segs_data = strtotime ($ano . "-" . $ms . "-" . $dia); $segs_nova_data = $segs_data + $segs_n_dias; $nova_data = ($forma == "pt") ? date("d/m/Y", $segs_nova_data) : date("Y-m-d", $segs_nova_data); return $nova_data; }

/* Funo SubtrairDias() Usada para calcular a data de feriados mveis. Esta funo subtrai 'n_dias' da data 'data', passado como argumento, a qual deve estar no formato dd/mm/yyyy ou yyyy-mm-dd. O argumento 'forma' serve para especificar o formato da data retornada. Ele pode conter os seguintes valores: "pt" => Retornar a data no formato DD/MM/YYYY "en" => Retornar a data no formato YYYY-MM-DD Se 'forma' no for especificada, adotar-se- a forma brasileira (pt). */ public function SubtrairDias ($data, $n_dias, $forma = "pt") { if (!is_int ($n_dias)) { echo "<p>Funo <strong>". __FUNCTION__ ."</strong>: O argumento \"n_dias\" deve ser um nmero inteiro.</p>"; return false; } $forma = strtolower ($forma); if ($forma != "en" AND $forma != "pt") $forma = "pt"; if (preg_match ("/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/", $data)) list ($dia, $ms, $ano) = explode ("/", $data); elseif (preg_match ("/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/", $data)) Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

154/165

list ($ano, $ms, $dia) = explode ("-", $data); else { echo "<p>Funo <strong>". __FUNCTION__ ."</strong>: Formato de data invlido (". $data .").</p>"; return false; } //transforma $n_dias em segundos //86400 = 60 * 60 * 24 $segs_n_dias = $n_dias * 86400; // tranforma $data em timestamp $segs_data = strtotime ($ano . "-" . $ms . "-" . $dia); $segs_nova_data = $segs_data - $segs_n_dias; $nova_data = ($forma == "pt") ? date("d/m/Y", $segs_nova_data) : date("Y-m-d", $segs_nova_data); return $nova_data; } // Somar meses function add_meses($meses) { return date('d/m/Y',mktime(0,0,0,date('m')+$meses,date('d'),date('Y'))); } // Somar anos function add_anos($anos) { return date('d/m/Y',mktime(0,0,0,date('m'),date('d'),date('Y')+$anos)); } function somar_dias_uteis($str_data,$int_qtd_dias_somar = 7) { // Caso seja informado uma data do MySQL ou PostgreSQL do tipo DATETIME - aaaa-mm-dd 00:00:00 // Transforma para DATE - aaaa-mm-dd $str_data = substr($str_data,0,10); // Se a data estiver no formato brasileiro: dd/mm/aaaa // Converte-a para o padro americano: aaaa-mm-dd if ( preg_match("@/@",$str_data) == 1 ) { $str_data = implode("-", array_reverse(explode("/",$str_data))); } $array_data = explode('-', $str_data); $count_days = 0; $int_qtd_dias_uteis = 0; while ( $int_qtd_dias_uteis < $int_qtd_dias_somar ) { Ribamar FS http://cursodephp.ribafs.org

PHP Avanado

155/165

$count_days++; if ( ( $dias_da_semana = gmdate('w', strtotime('+'.$count_days.' day', mktime(0, 0, 0, $array_data[1], $array_data[2], $array_data[0]))) ) != '0' && $dias_da_semana != '6' ) { $int_qtd_dias_uteis++; } } return gmdate('d/m/Y',strtotime('+'.$count_days.' day',strtotime($str_data))); } //Exemplo de uso: //echo somar_dias_uteis('05/12/2006'); //echo somar_dias_uteis('2006-12-01',15); // http://leandrovieira.com/archive/somando-dias-uteis-a-uma-data-especifica-com-php function SomarData($data, $dias, $meses, $ano) { //passe a data no formato dd/mm/yyyy $data = explode('/', $data); $newData = date('d/m/Y', mktime(0, 0, 0, $data[1] + $meses, $data[0] + $dias, $data[2] + $ano) ); return $newData; } //Exemplo de como usar: //echo SomarData('04/04/2007', 1, 2, 1); //Este exemplo acima estamos adicionando 1 dia, 2 meses e 1 ano na data informada. O resultado ento seria '05/06/2008' //http://www.codigofonte.com.br/codigo/php/data-hora/funcao-para-somar-datas-em-php /* Funes sub_data() e som_data() Desenvolvidas por InFog (Evaldo Junior Bento) em Junho de 2007 [email protected] Este script disponibilizado utilizando a licena GPL em sua verso mais atual. Distribua, aprenda, ensine mas mantenha os crditos do autor Viva ao Software Livre e livre informao */ /* Funo sub_data() Esta funo recebe a data no formato brasileiro dd/mm/AAAA Ribamar FS http://cursodephp.ribafs.org

PHP Avanado e o nmero de dias que sero subtrados dela. Certifique-se de checar se a data vlida antes de chamar a funo */

156/165

function sub_data($data, $dias) { $data_e = explode("/",$data); $data2 = date("m/d/Y", mktime(0,0,0,$data_e[1],$data_e[0] - $dias,$data_e[2])); $data2_e = explode("/",$data2); $data_final = $data2_e[1] . "/". $data2_e[0] . "/" . $data2_e[2]; return $data_final; } /* Funo soma_data() Esta funo recebe a data no formato brasileiro dd/mm/AAAA e o nmero de dias que sero adicionados dela. Certifique-se de checar se a data vlida antes de chamar a funo */ function soma_data($data, $dias) { $data_e = explode("/",$data); $data2 = date("m/d/Y", mktime(0,0,0,$data_e[1],$data_e[0] + $dias,$data_e[2])); $data2_e = explode("/",$data2); $data_final = $data2_e[1] . "/". $data2_e[0] . "/" . $data2_e[2]; return $data_final; } //Autor/fonte: Evaldo Junior //E-mail/Url: http://tuxmasters.blogspot.com/2007/06/somando-datas-no-php.html function hoje(){ return date("d/m/Y"); } function agora(){ return date("H:i:s"); } function databr_atual(){ return date("d/m/Y"); } function hora_atual(){ return date("H:i:s"); }

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado //Verifica se Data1 menor que Data2, alm de valid-las //Entrada no formato Brasileiro function ChecaVarData($data1,$data2) { if (DataValida($data1) and DataValida($data1)) { $data1=DataBrasilMySQL($data1); $data2=DataBrasilMySQL($data2); Return($data1<=$data2); } else { Return(false); } }

157/165

function data_valida($data){ $d = explode("/",$data); $d2 = checkdate ($d[1],$d[0],$d[2]); if (!$d2){ ?><script>alert("A data "+<?=$d[0].$d[1].$d[2] ?>+" no vlida!")</script><?php exit; } } function idade($dia,$mes,$ano) { if($mes >= date(m)) { if($dia >=date(d)) { $idade = date(Y) - $ano + 1; }else{ $idade = date(Y) - $ano; } }else{ $idade = date(Y) - $ano; } return $idade; } //echo idade(03,08,1956); /* * * $arrDia=array ('Domingo','Segunda','Tera','Quarta','Quinta','Sexta','Sbado '); $arrMes=array (1=>'Janeiro','Fevereiro','Maro','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'); ?> <form> Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Selecione a data completa<br> <select name="semana"> <?php for($i = 0; $i < 7; $i++){ echo"<option> $arrDia[$i]"; } echo'</select><select name="dia">'; for ($i=1;$i<=31; $i++){ echo"<option>$i"; } echo '</select> de <select name="mes">'; for ($i=1;$i<=12;$i++){ echo "<option value=\"$i\"> $arrMes[$i]"; } echo '</select> de <select name="ano">'; //Faltava ; $start_year = date('Y') - 10; $end_year = $start_year + 20; for($i = $start_year; $i <= $end_year; $i++){ echo "<option> $i"; } */ $arrDia=array ('Domingo','Segunda','Tera','Quarta','Quinta','Sexta','Sbado '); $arrMes=array (1=>'Janeiro','Fevereiro','Maro','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'); ?> <form> Selecione a data completa<br> <select name="semana"> <?php for($i = 0; $i < 7; $i++){ echo"<option> $arrDia[$i]"; } echo'</select><select name="dia">'; for ($i=1;$i<=31; $i++){ echo"<option>$i"; } echo '</select> de <select name="mes">'; for ($i=1;$i<=12;$i++){ echo "<option value=\"$i\"> $arrMes[$i]"; } echo '</select> de <select name="ano">'; //Faltava ; $start_year = date('Y') - 10; $end_year = $start_year + 20;

158/165

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado for($i = $start_year; $i <= $end_year; $i++){ echo "<option> $i"; }

159/165

/* Cdigo Original/ Original Code by Woodys * http://www.zend.com/codex.php?id=176 * * adaptao/traduo para o portugus e formato brasileiro das datas * * Alguns exclarecimentos * - O que TIMESTAMP do Unix? * - a contagem, em segundos, desde o dia 1 de janeiro de 1970 00:00:00 GMT * ,i.e., os segundos que se passaram at momento desde as ZERO horas do dia 1 de janeiro de 1970 * exemplo: * timestamp = 1042752929 => passaram-se 1042752929 segundos desde 1/jan/1970 00horas 00min 00 seg * * Traduo e Adaptao by Calvin */ ?> <?php /** * Calcula a quantidade de dias teis entre duas datas (sem contar feriados) * @author Marcos Regis * @param String $datainicial * @param String $datafinal=null */ function dias_uteis($datainicial,$datafinal=null){ if (!isset($datainicial)) return false; if (!isset($datafinal)) $datafinal=time(); $segundos_datainicial = strtotime(preg_replace("#(\d{2})/(\d{2})/(\d{4})#","$3/$2/$1", $datainicial)); $segundos_datafinal = strtotime(preg_replace("#(\d{2})/(\d{2})/(\d{4})#","$3/$2/$1",$datafinal)); $dias = abs(floor(floor(($segundos_datafinal-$segundos_datainicial)/3600)/24 ) ); $uteis=0; for($i=1;$i<=$dias;$i++){ $diai = $segundos_datainicial+($i*3600*24); $w = date('w',$diai); if ($w==0){ //echo date('d/m/Y',$diai)." Domingo<br />"; }elseif($w==6){ //echo date('d/m/Y',$diai)." Sbado<br />"; Ribamar FS http://cursodephp.ribafs.org

PHP Avanado }else{ //echo date('d/m/Y',$diai)." dia til<br />"; $uteis++; } } return $uteis; } ?> ex. de uso <?php $data='28/02/2007'; echo "Existem ".dias_uteis($data)." dias teis entre $data e hoje"; ?> <?php //Impresso atravs do site http://www.htmlstaff.org //Funo para pegar todos os feriados do ano

160/165

//Uma funo para pegar todos os feriados do ano (fixos e mveis). Coloquei dois estaduais, mas no ser problema em edit-los conforme a cidade/estado. //Funo: /** * @param $ano ano em que se quer calcular os feriados * @return array com os feriados do ano (fixo e moveis) */ function getFeriados($ano){ $dia = 86400; $datas = array(); $datas['pascoa'] = easter_date($ano); $datas['sexta_santa'] = $datas['pascoa'] - (2 * $dia); $datas['carnaval'] = $datas['pascoa'] - (47 * $dia); $datas['corpus_cristi'] = $datas['pascoa'] + (60 * $dia); $feriados = array ( '01/01', // Confraternizao universal '02/02', // Navegantes date('d/m',$datas['carnaval']), date('d/m',$datas['sexta_santa']), date('d/m',$datas['pascoa']), '21/04', //Tiradentes '01/05', date('d/m',$datas['corpus_cristi']), '20/09', // Revoluo Farroupilha m/ '12/10', '02/11', Ribamar FS http://cursodephp.ribafs.org

PHP Avanado '15/11', '25/12', ); return $feriados; } $feriados = getFeriados('2008'); for($x=0;$x<12;$x++){ print $feriados[$x].'<br>'; }

161/165

//Autor/fonte: Maiquel Leonel //E-mail/Url: http://www.vivaolinux.com.br/scripts/verScript.php?codigo=3430 ?> Feriados Brasileiros Feriados nacionais Os feriados nacionais so definidos pelas seguintes leis: n 662 (de 1949)[1], n 6.802 (de 1980)[2], n 9.093 (de 1995)[3], e n 10.607 (de 2002)[4]. Os feriados nacionais brasileiros so: Data Feriado Motivao 1 de janeiro Confraternizao Universal social 21 de abril Tiradentes cvica 1 de maio Dia do Trabalho social 7 de setembro Independncia do Brasil cvica 12 de outubro Nossa Senhora Aparecida religiosa (catlica) 2 de novembro Finados religiosa (catlica) 15 de novembro Proclamao da Repblica cvica 25 de dezembro Natal religiosa (crist)

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Feriados mveis

162/165

So feriados que dependem da Pscoa. Os judeus celebram a Pscoa segundo o que prescreve o livro do xodo, no captulo 12, no dia 14 do ms de Nissan. a celebrao da libertao da escravido do Egito para a liberdade da Terra Prometida por Deus a Abrao. O cristianismo celebra a Pscoa crist, Ressurreio de Cristo, acompanhando de certa forma a data Pscoa judaica. Mas o calendrio judeu baseado na Lua, ento a data da Pscoa crist passou a ser mvel no calendrio cristo, assim como as demais datas referentes Pscoa, tanto na Igreja Catlica como nas Igrejas Protestantes e Igrejas Ortodoxas. O primeiro Concilio geral da Igreja, o de Nicia, no ano 325, determinou que a Pscoa crist seria celebrada no domingo seguinte primeira Lua cheia aps o equincio da primavera do hemisfrio Norte (21 de maro); podendo ocorrer entre 22 de maro e 25 de abril.

Outros feriados que dependem da Pscoa: Carnaval (tera-feira) - quarenta e sete dias antes da Pscoa. Quaresma - inicia na quarta-feira de cinzas e termina no Domingo de Ramos (uma semana antes da Pscoa). Sexta-feira Santa - a sexta-feira imediatamente anterior Sbado da Solene Viglia Pascal - o sbado de vspera Pentecostes - o oitavo domingo aps a Pscoa. Corpus Christi - a quinta-feira imediatamente aps o Pentecostes. Feriados estaduais A Lei n 9.093, de 12 de setembro de 1995, incluiu entre os feriados civis, antes apenas os declarados em lei federal, a "data magna do Estado fixada em lei estadual". Acre Data Feriado 23 de janeiro Dia do evanglico 15 de junho Aniversrio do estado 6 de agosto Incio da Revoluo Acreana 5 de setembro Dia da Amaznia 17 de novembro Assinatura do Tratado de Petrpolis Alagoas Data Feriado 24 de junho So Joo ( decreto estadual n.4.087, de 18 de dezembro de 2008) 29 de junho So Pedro ( decreto estadual 4.087, de 18 de dezembro de 2008) 16 de setembro Emancipao poltica Ribamar FS http://cursodephp.ribafs.org

PHP Avanado 20 de novembro Dia da Conscincia Negra

163/165

Amap Data Feriado 19 de maro Dia de So Jos 5 de outubro Criao do estado 20 de novembro Dia da Conscincia Negra Amazonas Data Feriado 5 de setembro Elevao do Amazonas categoria de provncia 20 de novembro Dia da Conscincia negra 8 de dezembro Dia de Nossa Senhora da Conceio Bahia Data Feriado 2 de julho Independncia da Bahia 20 de novembro Dia da Conscincia Negra Cear O Cear no tem data magna. Em 2007, o deputado estadual Lula Morais apresentou o Projeto de Lei n 53, para definir o dia 19 de maro como Data Magna do Estado do Cear. O relator do projeto na Comisso de Constituio e Justia da Assembleia Legislativa, deputado Joo Jaime, devolveu o projeto ao autor, com a sugesto de transform-lo em projeto de indicao. Em junho de 2007, o projeto de lei foi retirado pelo autor e arquivado. Desde ento, ningum mais apresentou projeto que fixasse a data magna estadual cearense. Distrito Federal Data Feriado 21 de abril Fundao de Braslia 30 de novembro Dia do Evanglico Esprito Santo Data Feriado 23 de maio Colonizao do solo esprito-santense 28 de outubro Dia do Servidor Pblico Gois Data Feriado 28 de outubro Dia do Servidor Pblico Maranho Data Feriado 28 de julho Adeso do Maranho independncia do Brasil 8 de dezembro Dia de Nossa Senhora da Conceio

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado Mato Grosso Data Feriado 20 de novembro

164/165

Dia da Conscincia Negra

Mato Grosso do Sul Data Feriado 11 de outubro Criao do estado Minas Gerais Data Feriado 21 de abril Tiradentes Par Data Feriado 15 de agosto Adeso do Gro-Par independncia do Brasil 8 de dezembro Nossa Senhora da Conceio Paraba Data Feriado 5 de agosto Emancipao poltica do estado Paran Data Feriado 19 de dezembro

Emancipao poltica (emancipao do Paran de So Paulo)

Pernambuco Data Feriado Legislao Observaes 6 de maro Revoluo Pernambucana de 1817 ponto facultativo Piau Data Feriado 13 de maro Dia da Batalha do Jenipapo 19 de outubro Dia de Piau Rio de Janeiro Data Feriado 23 de abril Dia de So Jorge 15 de outubro Dia do Comrcio 20 de novembro Dia da Conscincia Negra Rio Grande do Norte Data Feriado 29 de junho Dia de So Pedro 3 de outubro Mrtires de Cunha e Uruau Rio Grande do Sul Data Feriado

Lei n 13.386[1], de 24 de dezembro de 2007

Ribamar FS http://cursodephp.ribafs.org

PHP Avanado 20 de setembro Revoluo Farroupilha

165/165

Rondnia Data Feriado 4 de janeiro Criao do estado 18 de junho Dia do Evanglico Roraima Data Feriado 5 de outubro Criao do estado Santa Catarina Data Feriado 11 de agosto Criao da capitania, separando-se de So Paulo So Paulo Data Feriado 25 de janeiro Dia de So Paulo 9 de julho Revoluo Constitucionalista de 1932 20 de novembro Dia da Conscincia Negra 12 de outubro Nossa Senhora da Conceio Aparecida Sergipe Data Feriado 8 de julho Autonomia poltica de Sergipe Tocantins Data Feriado 5 de outubro Criao do estado Feriados municipais Os municpios podem declarar, em lei municipal, at quatro feriados religiosos, de acordo com a tradio local, entre eles a Sexta-Feira da Paixo. A Lei n 9.335, de 10 de dezembro de 1996[7], acrescentou, ainda, como feriado civil, os dias do incio e do trmino do ano do centenrio de fundao do municpio, desde que fixado em lei municipal. Fonte: http://pt.wikipedia.org/wiki/Feriados_no_Brasil Referncias http://php.net http://pt.wikibooks.org/wiki/Aplicativos_em_PHP

Ribamar FS http://cursodephp.ribafs.org

Você também pode gostar