sábado, 27 de julho de 2013

Manipulando arquivos XML com PHP - 2/2

Olá Pessoal.
Aprenderemos um pouco sobre a manipulação de arquivos XML com PHP.
Veremos neste 2º passo sobre a leitura deste tipo de arquivo.
Nossos exemplos serão baseados na biblioteca SimpleXML


NOSSO EXEMPLO DE XML SERÁ O ARQUIVO GERADO NO POST ANTERIOR

# 1. INICIALMENTE VEREMOS UM PEQUENO EXEMPLO DE LEITURA XML COM PHP

exemplo1.xml

<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
    <livro nome="PHP & JQuery">
        <descricao>
            Este livro trata da integração entre duas linguagens

            distintas, mas que juntas podem oferecer muitos recursos
            para aplicações web...
        </descricao>
    </livro>
</biblioteca> 

 
<?php


# ESTA FORMA CARREGA O ARQUIVO EM UMA VARIÁVEL POR UM METODO DA SIMPLEXML
    $xml = simplexml_load_file('diretorio/exemplo1.xml');

    foreach ($xml -> livro as $livro)
    {
        print "<p>" . utf8_decode(
$livro -> attributes()-> nome ."<br>". $livro -> descricao) . "</p><hr/>";
    }
# 2. OUTRA FORMA É CARREGAR O CONTEÚDO DO ARQUIVO PELA FUNÇÃO NATIVA DO
# PHP EM UMA VARIÁVEL E DEPOIS UTILIZAR ESTE CONTEÚDO COMO UM ARQUIVO XML
# COMO NO 1º EXEMPLO DE GERAÇÃO DE ARQUIVOS, NO POST ANTERIOR

   $arquivo = file_get_contents('diretorio/exemplo1.xml');

   $xml = new SimpleXMLElement($
arquivo);

   foreach($xml as $livro)
   {
      $nome =
utf8_decode($livro -> attributes()-> nome);
      $descricao = utf8_decode($livro -> descricao);
      
      print "<h3>" . $nome . "<br/>" . $descricao . "</h3>";
   }


 # 3. AGORA VEREMOS A LEITURA E GRAVAÇÃO DAS INFORMAÇÕES NO BANCO DE DADOS
  $agora = date("Y-m-d H:i:s");
  $host     = 'localhost';
  $usuario  = 'root';
  $senha    = 'secreta';
  $db       = 'db_exemplos';
  $sql      = 'INSERT INTO tb_biblioteca (nome, descricao) VALUES ';
    $conexao = new mysqli($host, $usuario, $senha, $db);

# PARA NÃO TERMOS PROBLEMAS COM CHARSETS E ENCODES UTF-8 x ISO-8859-1 
APLICAMOS ALGUMAS CONFIGURAÇÕES AO NOSSO BANCO
  $conexao -> query("SET NAMES 'utf8'");
  $
conexao -> query("SET character_set_connection='utf8'");
  $
conexao -> query("SET character_set_client='utf8'");
  $
conexao -> query("SET character_set_results='utf8'");

  $xml = simplexml_load_file('diretorio/exemplo1.xml');

  foreach ($xml -> livro as $livro)
  {

     $nome = $conexao -> real_escape_string($livro -> attributes() -> nome);
     $descricao = $conexao -> real_escape_string($livro -> descricao);
     
     $sql .= "('"$nome ."', '"$descricao) . "'),";
  }

  

  # RETIRAMOS A ULTIMA ',' E SUBSTITUÍMOS POR UM ';'
  $sql = substr($sql,0,-1).";";
  
  $conexao -> query($sql);

  

# AGORA IMAGINEMOS QUE TIVÉSSEMOS QUE TRABALHAR COM DADOS VINDOS DE UMA PLANILHA DO MS EXCEL, OU SEJA, ESTA PLANILHA FOSSE SALVA COMO XML.

 $arquivo = 'diretorio/exemplo1.xml';

 $sql = "";

 if($xml = simplexml_load_file($arquivo))
 {       
    # 1 - PERCORRO A PLANILHA
    foreach($xml -> Worksheet as $planilha)
    {
# RETIRA O CABEÇALHO DA PLANILHA
        unset($planilha -> Table -> Row[0]);

# 2 - PERCORRO A TABELA
foreach($planilha -> Table as $tabela)
{
                # 3 - PERCORRO AS LINHAS
        foreach($tabela -> Row as $linha)
        {
$sql .= "(";

# 4 - PERCORRO AS CELULAS
foreach($linha -> Cell as $celula)
{
            $sql.= $celula->Data != """'".$conexao -> real_escape_string($celula->Data)."', " : "'', ";
}

$sql.= "'".$agora."'),";
      }

     $sql = $sql != """INSERT INTO tb_biblioteca (nome, assunto, tema, descricao, isbn, ano, autor, dt_cadastro)VALUES "substr($sql,0,-1).";";
    }
   }
 }

  # INICIO TRANSACAO *  Não funciona com tabelas não baseadas em transações (como MyISAM ou ISAM).
  $conexao -> autocommit(FALSE);

  if($conexao -> query($sql))
  {
     # CONFIRMA TRANSACAO
  $conexao -> commit();
  }
  else
  { 
     # CANCELA TRANSACAO
     $conexao -> rollback();
  }

  $conexao -> close();
?>

Estes pequenos exemplos de leitura de arquivos xml dão uma pequena mostra do quanto é possível ser feito com os dados obtidos.Podemos fazer atualizações, remoções, entre outras tarefas na Base de Dados. Imaginem, atualizar todos os pagamentos de uma tabela de compras lendo um arquivo de retorno bancário em XML

quinta-feira, 25 de julho de 2013

Manipulando arquivos XML com PHP - 1/2

Olá Pessoal.
Agora aprenderemos um pouco sobre a manipulação de arquivos XML com PHP.
Veremos como criar e ler este tipo de arquivo que cada vez mais está presente na web e na comunicação entre sistemas e plataformas.
Nossos exemplos serão baseados na biblioteca SimpleXML



# 1. INICIALMENTE VEREMOS UM PEQUENO EXEMPLO DE CRIAÇÃO XML COM PHP




<?php

$string = "<?xml version=1.0 encoding=\"UTF-8\"?>
            <raiz>
            <linguagem>
<escola>
                  FALE Idiomas
</escola>
              <idioma>
                  Madarin
              <idioma>
            </linguagem>
           </raiz>";

# AGORA CRIAMOS NOSSO XML A PARTIR DA STRING
$xml = new SimpleXMLElement($string);

# SALVAMOS O ARQUIVO EM UM DIRETÓRIO DESEJADO E PRONTO! TEMOS NOSSO 1º XML
$xml -> saveXML('diretorio/arquivo.xml');


#----------------------------------------------------------------#
# 2. EXEMPLO SIMPLES DE CRIAÇÃO A PARTIR DE UMA CONSULTA AO BANCO
DE DADOS
 $host     = 'localhost';
 $usuario  = 'root';
 $senha    = 'secreta';
 $db       = 'db_exemplos';
 $sql      = 'SELECT * FROM tb_biblioteca ORDER BY nome ASC';
 $nrLinhas = 0;

 $conexao = mysqli_connect($host, $usuario, $senha, $db);

 $consulta mysqli_query($conexao, $sql);

 $nrLinhas = mysqli_num_rows($consulta);

 if($nrLinhas > 0)
 {
   $conteudoXML= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
   $conteudoXML.= "<biblioteca>\n\t";
   while($registros = mysqli_fetch_array($consulta, MYSQLI_ASSOC))
   {
     $conteudoXML.= "<livro nome=\""$registros['nome'] . "\">\n\t\t";
     $conteudoXML.= "<descricao>\n\t\t\t\t";
     $conteudoXML.= $registros['descricao']."\n\t\t";
     $conteudoXML.= "</descricao>\n\t";
     $conteudoXML.= "</livro>\n";
   }
 
   $conteudoXML.= "</biblioteca>";
  
   $xml = new SimpleXMLElement($conteudoXML);

  $xml -> saveXML("diretorio/exemplo1.xml");
 }

mysqli_close($conexao):

NOTA: Este exemplo e bem parecido com o primeiro, a consulta é armazenada em uma string e depois usamos os métodos para criar o xml à partir dela.


# 3. AGORA VEREMOS A CRIAÇÃO SÓ COM MÉTODOS DA BIBLIOTECA SIMPLEXML (OO)

 $conexao = new mysqli($host, $usuario, $senha, $db);

 $consulta = $conexao -> query($sql);

 $nrLinhas = $consulta -> num_rows;

 if($nrLinhas > 0)
 {
   $xml"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
   $xml.= "<biblioteca>\n</biblioteca>";

# NESTE MOMENTO CRIAMOS/INSTANCIAMOS O ARQUIVO NA MEMÓRIA
   $conteudoXML = new SimpleXMLElement($xml);
   while($registros = $consulta -> fetch_object())
   {
     # ADICIONAMOS O NÓ LIVRO AO CONTEÚDO DO ARQUIVO
     $noLivro = $conteudoXML -> addChild("livro");
     
# ADICIONAMOS O ATRIBUTO AO NÓ LIVRO
     $noLivro -> addAttribute("nome", utf8_encode($registros -> nome));
     
# ADICIONAMOS O NÓ DESCRICAO AO CONTAÚDO DO NÓ LIVRO
     $noLivro -> addChild("descricao"utf8_encode($registros -> descricao));
   }
 
   $conteudoXML -> saveXML("diretorio/exemplo2.xml");
 }

 $conexao -> close();

?>

Estes pequenos exemplos de criação de arquivos xml dão uma pequena mostra do quanto o PHP está preparado para lidar com novas tecnologias e arquivos.

A geração e leitura são muito importantes para portais que exigem inúmeras consultas ao Banco de Dados e têm um nº de acessos significativo. A técnica de databaseless pode ser utilizada através de leitura e geração de arquivos xml, diminuindo assim as requisições ao Banco de Dados.

A leitura também é muito útil para armazenar informações de fontes externas à sua aplicação PHP:
retornos bancários, retornos de órgãos governamentais, etc

No próximo post aprenderemos como o PHP lida ao ler estes tipos de arquivos. Até lá...

quarta-feira, 24 de julho de 2013

Tipos de conexão MySql com PHP

Olá Pessoal.
Logo veremos como criar e ler arquivos XML com PHP
Hoje o XML está cada vez mais presente na web e crescendo sua importância, mas para entrarmos neste assunto vamos falar um pouco de conexão com banco de dados, uma vez que iremos precisar extrair dados do BD para criarmos nossos XML de exemplo, Mão à massa, ops! Quer dizer ao teclado!



# 1. MODO MAIS COMUM DE SE FAZER UMA CONEXÃO AO MYSQL
# ESTE MODO JÁ ESTÁ EM DESUSO, DESATUALIZADO E ACREDITO QUE LOGO SERÁ EXTINTO






<?php

 $host    = "enderecoHost";
 $usuario = "nomeUsuario";
 $senha   = "senha";
 $db      = "nomeBancoDados";

 $sql = "SELECT nome FROM tb_alunos ORDER BY nome";

# NOTE QUE DESTE MODO SE FAZ A CONEXÃO E DEPOIS ESCOLHEMOS O 
# BANCO DE DADOS QUE QUEREMOS UTILIZAR
 $conexao = mysql_connect($host, $usuario, $senha);

 mysql_select_db($db);

# AQUI EXECUTAMOS A CONSULTA NA BASE DE DADOS ESCOLHIDA
 $consulta = mysql_query($sql, $conexao) or die (mysql_error());

# AGORA OBTEMOS QUANTOS REGISTROS / LINHAS NOSSA CONSULTA TROUXE  
 $nrLinhas = mysql_num_rows($consulta);

# COLOCAMOS TODOS OS REGISTROS EM UM ARRAY / LISTA E O PERCORREMOS
 while($registros = mysql_fetch_array($consulta))
 {
    print "<h3>" . $registros['nome'] . "</h3>";
 }

 mysql_close($conexao);



# 2. O SEGUNDO MODO É UTILIZANDO MYSQLI QUE É UM CONCEITO MAIS ATUAL VOLTADO A 
# ORIENTAÇÃO A OBJETO

$conexao = mysqli_connect($host, $usuario, $senha, $db);

# AQUI EXECUTAMOS A CONSULTA
 $consulta mysqli_query($conexao, $sql);

# AGORA OBTEMOS QUANTOS REGISTROS / LINHAS NOSSA CONSULTA TROUXE  
 $nrLinhas = mysqli_num_rows($consulta);

# COLOCAMOS TODOS OS REGISTROS EM UM ARRAY / LISTA E O PERCORREMOS
 while($registros = mysqli_fetch_array($consulta, MYSQLI_ASSOC))
 {
    print "<h3>" . $registros['nome'] . "</h3>";
 }

 mysqli_close($conexao);



# 3. CASO VOCÊ ESTEJA QUERENDO SABER MAIS SOBRE ORIENTAÇÃO A OBJETO
# SEGUEM DOIS EXEMPLO DE COMO USAR O MYSQLI ORIENTADO A OBJETO

 # INSTANCIAMOS UM OBJETO DA CLASSE MYSQLI PASSANDO DADOS DE CONEXÃO PARA SEU
 # CONSTRUTOR
 $conexao = new mysqli($host, $usuario, $senha, $db);

 $consulta = $conexao -> query($sql);

 while($resp = $consulta -> fetch_object())
 {
     print "<h3>" . $resp -> nome . "</h3>";
 }

 $conexao -> close();


 # 4. PODEMOS TER UM RESULTADO PARECIDO UTILIZANDO UMA CLASSE

 class Banco
 {
private $host = "enderecoHost";
private $user = "nomeUsuario";
private $password = "senha";
private $db = "nomeBancoDados";
public $con;

function __construct()
{
    $this -> con = mysqli_connect($this->host, $this->user, $this->password, $this->db);
}

function consulta($query)
{
    return mysqli_query($this -> con, $query);
}

function lista($consulta)
{
    return mysqli_fetch_array($consulta);
}
 }


 $a = new Banco();

 $consult = $a -> consulta($sql);

 while($resp = $-> lista($consult))
 {
     print "<h3>" . $resp ['nome'] . "</h3>";
 }

?>
NOTA: Estes são apenas exemplos didáticos, há muitos outros meios de se fazer conexões com banco de dados no PHP. Utilizando as classes e métodos da biblioteca PDO você poderá fazer conexões com diversos Bancos de dados diferentes do MySql. Como utilizaremos consultas ao Mysql para a próxima postagem resolvi antecipar-me, pois não adiantaria falar de XML e sua criação com PHP se não fosse algo dinâmico.

terça-feira, 23 de julho de 2013

Captcha com PHP

Pessoal, boa tarde.
Para quem procura uma validação com captcha em php, segue uma que utilizo muito em meus desenvolvimentos:
Caso você se interesse mais pela biblioteca de imagens do php leia mais em:
http://www.php.net/manual/pt_BR/refs.utilspec.image.php
Nesta página há muito mais sobre processamento e geração de imagens, a biblioteca é nativa do PHP, no entanto, é bom verificar a disponibilidade das funções para sua versão PHP. 

Após esta dica, é só usar a criatividade para fazer a validação que quiser em seus formulários html.
Fiquem com Deus e sucesso a todooOOOS!
 



# PARA A CRIAÇÃO DE UMA VALIDAÇÃO DE FORMULÁRIO COM CAPTCHA EM PHP 
# DESENVOLVEREMOS DOIS ARQUIVOS:
# O PRIMEIRO É RESPONSÁVEL POR GERAR A IMAGEM (CAPTCHA)
# PRECISAREMOS DE UM TERCEIRO ARQUIVO DE FONT, O QUAL SERÁ USADO PARA ESCREVER O CAPTCHA
 
captcha.php
<?php

session_start();
 

# CRIA/DECLARA A IMAGEM DEFININDO LARGURA E ALTURA EM PIXELS
$image = imagecreate(200, 75);
 

# APLICA COR DE FUNDO À IMAGEM
$branco = imagecolorallocate($image, 255, 255, 255);
 

# CRIA UM ARRAY CONTENDO CÓDIGO DE CORES RGB PARA POSTERIORMENTE 
# ATRIBUIRMOS A ELIPSES QUE DESENHAREMOS NA IMAGEM
$elipseCores = array
(
    array(0,255,240),
    array(255,40,0),
    array(0,99,66),
    array(0,99,255),
    array(255,240,0)
);
 


# CRIA UM ARRAY CONTENDO CÓDIGO DE CORES RGB PARA POSTERIORMENTE 
# ATRIBUIRMOS A LINHAS QUE DESENHAREMOS NA IMAGEM

$linhasCores = array
(
    array(0,10,255),
    array(55,100,0),
    array(10,10,255),
    array(100,0,55),
    array(100,10,5),
    array(0,1,5),
    array(120,200,25),
    array(0,0,0)
);

# EXIBINDO VARIAS ELIPSES NA IMAGEM
for($i=1;$i<=20;$i++)
{
    $cor = $elipseCores[rand(0,4)];
    $corElipse = imagecolorallocate($image, $cor[0], $cor[1], $cor[2]);
    imagefilledellipse($image, rand(0,200), rand(10,100), rand(10,250), rand(0,70), $corElipse);
}

# EXIBINDO VARIAS LINHAS NA IMAGEM
 for($i=1;$i<=10;$i++)
{
    $cor = $
linhasCores [rand(0,7)];
    $corLinha = imagecolorallocate($image, $cor[0], $cor[1], $cor[2]);
    imageline($image, rand(0,200), rand(0,75), rand(0,200), rand(0,75), $corLinha);
}



# IMAGEM PREPARADA! AGORA VAMOS ESCREVER O TEXTO DO CAPTCHA SOBRE ESTA IMAGEM
settype($captcha, 'string');

for($j=0;$j<=5;$j++)
{
    $captcha .= $j%2 == 0 ? chr(rand(65,90)) : chr(rand(48,57));
}

$corTexto = imagecolorallocate($image, 0, 0, 0);


# GUARDAMOS O TEXTO SORTEADO EM UMA VARIÁVEL DE SESSÃO PARA VALIDAÇÃO FUTURA

$_SESSION['imgCaptcha'] = $captcha;







# ESCREVENDO TEXTO NA IMAGEM, ** AQUI UTILIZA O ARQUIVO DE FONT
for($j = 0 ; $j < strlen($captcha) ; $j++)
{
    imagettftext($image, rand(26,42), rand(-10,10), ($j * 30)+16, rand(55,68), $corTexto, '../fontes/arial.ttf', $captcha[$j]);
}

# GERA A IMAGEM

imagepng($image);


# LIBERA A MEMORIA

imagedestroy($image);

?>


 

# O SEGUNDO ARQUIVO DESENVOLVIDO CONTÉM O FORMULARIO E FAZ SUA VALIDAÇÃO
formulario.php
<?php

if(isset($_POST['enviar']))
{
    session_start();


    if($_SESSION['imgCaptcha'] == strtoupper($_POST['captcha']))
        print "Parabéns você digitou corretamente!";
    else
        print "A digitação não confere com os caracteres exibidos na imagem<br>Por favor, digite novamente";
}


?>


<html>
    <head>

       <title>
        CAPTCHA COM PHP, por Dominus Farib
       </title>
    </head>
    <body>
        <form action="" method="post">
        <h1>Digite os caracteres da imagem</h1>
        <p><img alt="CAPTCHA" src="captha.php"> </p>
        <p><input type="text" name="captcha"></p>
        <p><input type="submit" name="enviar" value="VALIDAR"> </p>
        </form>
    </body>
</html>


Função para validar Email com PHP com expessão regular

<?php
# ESTA FUNÇÃO É BASEADA EMM UMA EXPERSSÃO REGULAR QUE TESTA
# DESDE O INÍCIO DA STRING NEGANDO '/^' TUDO QUE FOR DIFERENTE
DE NÚMEROS E LETRAS, POIS EMAILS NÃO COMEÇAM COM CARACTERES
ESPECIAIS, APÓS O INÍCIO DA STRING É POSSÍVEL ALGUNS
# CARACTERES ESPECIAIS TAIS COMO '.', '_' E '-', E ANTES DO '@'
# É PRECISO QUE HAJA LETRA OU NºS. 


    function ValidaEmail($email)
    {
       if(
$email != "")
       { 
          if(!preg_match("/^([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([a-z,A-Z]){2,3}([0-9,a-z,A-Z])?$/", $email))
           {
            return false;
           }
           else
           {
                # SUGESTÃO PARA VALIDAÇÃO DE GMAIL
               // if(strpos($email,'gmail.com.br'))
               // return false;

              
             return true;
           }

        }
        return false;
    }

?>