PHP Avancado
PHP Avancado
PHP Avancado
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
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.
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
4/165
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
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
7/165
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
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
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 ?>
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
11/165
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" ?>
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"; } ?>
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" );
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(); ?>
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.
$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
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
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
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
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
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> </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
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;
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:
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; ?>
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
38/165
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
39/165
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"); } ?>
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
40/165
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
echo "O arquivo $filename existe"; } else { echo "O arquivo $filename no existe"; } ?>
41/165
Outras Funes
is_link($diretorio) readlink($dir_link) // retorna o path completo do link bool symlink ( string $destino, string $linkorigem ) // Cria um link simblico
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
42/165
} 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
} 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
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;
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
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
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" ?>
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 } } ?>
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
52/165
$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; ?>
} 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
<?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
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
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
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
Variveis globais
$var1 = 5; function testeGlobal1(){ $var1 = 1; print "<br>Valor de \$var1: $var1"; } echo testeGlobal1();
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
70/165
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();
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
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"; }
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.')'; } }
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
cliente(1); //Exibir: Cdigo = 1, Idade = 18
77/165
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
78/165
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
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
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
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
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.
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);
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.
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
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
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
PHP Avanado return false; } function startElement($parser, $name, $attribs) { echo "<<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 ">"; } function endElement($parser, $name) { echo "</<font color=\"#0000cc\">$name</font>>"; } 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
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
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
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
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
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).
<?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
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
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
<?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(); } ?> }
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
} ?> header('Location: /my_link');
128/165
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
// 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
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"; ?>
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"; ?>
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
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
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
}
134/165
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"; } }
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
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
Ribamar FS http://cursodephp.ribafs.org
PHP Avanado
137/165
arquivo2.php
$par1=$_POST['parametro1']; $par2=$_POST['parametro1'];
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
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
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
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);
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
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
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
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
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
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
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
164/165
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
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
Ribamar FS http://cursodephp.ribafs.org
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