Ler Atributos XML – Extendendo a Classe SimpleXMLElement

Opa!

Vamos criar uma Classe Extendida para ler os atributos de um XML,  iremos extender  a SimpleXMLElement.
Para carregar o XML vamos utilizar o SimpleXml, não se assuste com tantos nomes de classes, o que precisamos fazer para ler os atributos é bem simples! 

O XML é o padrão de sempre, uma playlist…  =D

<?xml version="1.0" encoding="iso-8859-1"?>
<playlist>
 <faixa>
 <titulo id="55" duracao="04:08" mp3="http://site.com/mp3/atari/01.mp3">Revolution Action</titulo>
 <album>60 Second Wipe Out</album>
 <autor>Atari Teenage Riot</autor>
 </faixa>
 <faixa>
 <titulo id="50" duracao="03:55" mp3="http://site.com/mp3/atari/03.mp3">Speed</titulo>
 <album>60 Second Wipe Out</album>
 <autor>Atari Teenage Riot</autor>
 </faixa>
</playlist>

Extendendo a Classe SimpleXMLElement e lendo o XML

<?php
//extendendo a classe SimpleXMLElement
//neste caso a classe SimpleXMLAttribute extende a classe SimpleXMLElement
//com o novo método Attribute
class SimpleXMLAttribute extends SimpleXMLElement
{
// metodo retorna o valor do atributo
 public function Attribute( $name )
 {
 // percorre os atributos
 foreach( $this->Attributes() as $key => $val )
 {
 // verifica existencia e retorna o valor
 if( $key == $name )
 {
 //converte/retorna valor string
 return (string) $val;
 }
 }
 }
}

//carregando o XML com o simplexml passamos como parametro a classe SimpleXMLAttribute
//esse parametro deve ser uma classe que extenda o SimpleXMLElement
$xml = simplexml_load_file( "playlist.xml", 'SimpleXMLAttribute' );
//percorrendo o nó faixa da playlist
foreach( $xml->faixa as $faixa )
{
 //printando valores e atributos
 echo
 $faixa->titulo
 . "<br />"
 //retorna o atributo id passado ao método Attribute()
 . $faixa->titulo->Attribute( 'id' )
 . "<br />"
 //retorna o atributo duracao
 . $faixa->titulo->Attribute( 'duracao' )
 . "<br />"
 //ja deu para entender né
 . $faixa->titulo->Attribute( 'mp3' )
 . "<br />"
 //retorna o album
 . $faixa->album
 . "<br />"
 //retorna o autor
 . $faixa->autor
 . "<br /> <br />";
}
//descomente a linha abaixo p/ ver os atributos
//echo "<pre>"; print_r($xml->faixa); print_r($xml->faixa->titulo);
?>

Output’s:

Download dos fontes

Referências:
Extends
SimpleXMLElement
SimpleXML
Enjoy!!!

Ler Atributos XML com PHP

Publicado: janeiro 27, 2012 em PHP, XML

Ler atributos de XML usando a classe PHP Simple Large XML Parser 

Olá, neste exemplo vamos utilizar a classe Simple Large XML Parser para ler/exibir  XML contendo atributos.

O arquivo XML é um exemplo de playlist, contendo título, album e autor, sendo que título possui os atributos: ID, Duracao e MP3 (este último seria o caminho do arquivo)

<?xml version="1.0" encoding="iso-8859-1"?>
<playlist>
 <faixa>
 <titulo id="55" duracao="04:08" mp3="http://site.com/mp3/atari/01.mp3">Revolution Action</titulo>
 <album>60 Second Wipe Out</album>
 <autor>Atari Teenage Riot</autor>
 </faixa>
 <faixa>
 <titulo id="50" duracao="03:55" mp3="http://site.com/mp3/atari/03.mp3">Speed</titulo>
 <album>60 Second Wipe Out</album>
 <autor>Atari Teenage Riot</autor>
 </faixa>
</playlist>

 


<?php
// incluindo a classe
require_once('SimpleLargeXMLParser.class.php');
// seta o caminho do XML
$xml = dirname(__FILE__)."/playlist.xml";
// cria objeto
$parser = new SimpleLargeXMLParser();
// carrega XML
$parser->loadXML($xml);
// seta no parser o nó a ser listado/percorrido
$playlist = $parser->parseXML("//playlist/faixa", true);
// percorre o XML
foreach($playlist as $faixas)
{
 //percorre o nó faixa
 foreach($faixas as $faixa => $titulos)
 {
 if(isset($titulos[0]['value']['titulo']))
 {
 // armazena no objeto titulo o nó atual
 $titulo = (object) $titulos[0]['value']['titulo'];
 // adiciona o nó album no objeto titulo
 $titulo->album = $faixas['album'][0]['value']['album']['value'];
 // adiciona o nó autor no objeto titulo
 $titulo->autor = $faixas['autor'][0]['value']['autor']['value'];
 // print o valor do nó titulo
 echo $titulo->value
 . "<br />"
 // printa o atributo id do titulo
 . $titulo->attributes['id']
 . "<br />"
 // printa o atributo duracao
 . $titulo->attributes['duracao']
 . "<br />"
 // printa o atributo mp3
 . $titulo->attributes['mp3']
 . "<br />"
 // printa o nó album
 . $titulo->album
 . "<br />"
 // printa o nó autor
 . $titulo->autor
 . "<br /><br />" ;
 }
 }
}
?>

Output:
print result

É isso, é bom dar um print_r($playlist) para ver a estrutura criada pelo Parser!

Download: XMLAttr
Parser : PHP Simple Large XML Parser

Voltei!!!

Sobre o que deve ser o próximo Post?

Publicado: junho 15, 2011 em PHP

Opa,
Estou fraco de imaginação, gostaria que cada um comentasse este POST com o assunto sobre qual iremos tratar no próximo post!
É preciso que o comentário seja objetivo para eu poder “filtrar” e ver qual assunto iremos tratar!
Ex:  XML, Jquery, PHP + BD, Login, Session, Upload, etc…

Conto com o apoio de vocês para que o post seja realmente útil, principalmente aos que acompanham fielmente minhas postagens.
Você vai perder apenas 15 segundos para comentar com o assunto!

Obrigado à todos pela participação que está cada vez maior!
Abraços,

E ae?
Vamos ver um exemplo simples de como calcular automaticamente o valor total dos itens em um formulário.
A idéia: O cálculo é realizado em tempo real conforme o usuário informa a quantidade de determinados itens, cada item/produto terá o valor em um índice do array no PHP.
Em princípio, o array possui valores fixos, no entanto, partimos da idéia de que esse array seja resultante de uma consulta no banco.

Utilizaremos jQuery e PHP para realizar o cálculo.

Vamos começar pelo bom e velho HTML contendo o formulário com os supostos códigos dos produtos.

<form name="produto" id="produto">
<label>Produto 1:</label>
<input type="text" name="produto_1" id="produto_1" />

<label>Produto 2:</label>
<input type="text" name="produto_2" id="produto_2" />

<label>Produto 3:</label>
<input type="text" name="produto_3" id="produto_3" />

<label>Produto 4:</label>
<input type="text" name="produto_4" id="produto_4" />

<label>Produto 5:</label>
<input type="text" name="produto_5" id="produto_5" />

<label>Produto N:</label>
<input type="text" name="produto_n" id="produto_n" />

<label>Valor Total:</label>
<span id="total"></span>
<input type="hidden" name="total_compra" id="total_compra" />
</form>

Perceba que o elementos possuem NAME e ID com os supostos nomes ou códigos dos produtos, o negócio está aí!
Os nomes utilizados em name e id devem corresponder aos indíces do array que veremos a seguir.
Temos também um campo hidden que armazena o valor total para utilizarmos ao submetermos o formulário.

Vamos ver agora como monitorar os campos com o método .bind() do jQuery e enviar ao PHP os valores contidos em cada campo do formulário.
Chamei o arquivo Javascript de calculo.js, vejamos:

$(document).ready(function(){
// monitorando o evento change dos campos
$('#produto input').bind('change',function(){
// enviando os valores atuais dos campos ao PHP
$.post('calculo.php',{
// serializando o formulario
dataForm: $("#produto").serialize()
},
function(data){
// obtendo o retorno do PHP / atualizando o valor
$('#total').html(data)
// informando o total ao campo hidden
// sera utilizado ao submeter o form
$('#total_compra').val(data)
})
})

// realiza o calculo no inicio ou após um refresh
$.post('calculo.php',{
dataForm: $("#produto").serialize()
},
function(data){
$('#total').html(data)
$('#total_compra').val(data)
})
})

Acredito que os comentários no código bastam, mas…

O evento $(document).ready(function(){ //code }) é como o velho window.onload, ou seja, irá realizar os precidementos contidos dentro do block ao carregar o documento.
Dentro desse bloco nós utilizamos o $(‘#produto input’).bind(‘change’,function(){ //code }) para monitorar o evento change dos campos, ou seja, a cada vez que o campo tiver seu valor alterado as ações contidas no monitoramente serão realizadas, nesse caso a ação é realizada por:
$.post(‘calculo.php’,{//post vars },function(data){ //code })

Esse cara, o $.post é quem envia por post os dados para o PHP, passamos à ele a var dataForm contendo os dados serializados do formulário através de $(“#produto”).serialize(), esse pega todos os valores dos campos existentes no formulário de ID produto e serializa passando à var dataForm que por sua vez é enviada ao PHP.
Sei que ficou um pouco redundante mas as vezes a redundancia fixa o raciocínio (nem acredito que eu disse isso, mas também olha a hora).

Após enviar os dados via post o retorno é armazenado na var data que está em function(data) e esse valor nada mais é que o cálculo dos campos retornados do PHP, apenas isso.

E porque aparecem 2 vezes o bloco abaixo?

$.post('calculo.php',{
dataForm: $("#produto").serialize()},
function(data){
$('#total').html(data)
$('#total_compra').val(data)
})

Eu explico, claro!

Acontece que o primeiro bloco está dentro do .bind() e irá acontecer apenas se algum campo tiver seu valor alterado.
O segundo ocorre na inicialização para realizar o primeiro cálculo que retornará 0(zero), mas isso também está aí porque se o usuário der um refresh na tela depois de ter alterado algum campo o valor que aparece no total irá desaparecer, isso porque o valor está em um elemento span, no entanto o mesmo valor está contido em um campo oculto, campo do tipo hidden que deve ser utilizado para recuperar o valor total dos itens ao submetermos o formulário.

Quando ocorre o $(‘#total’).html(data) o valor está sendo passado ao elemento span apenas para visualização do usuário, não poderia ser um campo input text para que o usuário não alterasse o valor total.  :0

No entanto, após setar o valor do elemento span é chamado também o $(‘#total_compra’).val(data) que guarda o valor no campo oculto.

Tá legal, vamos ver como o cálculo realmente é feito, até agora só vimos como enviar e recuperar o valor mas como é realizada a soma, ainda não.
E chegou a vez do PHP mostrar sua arte também, ué!

Chamei o arquivo PHP de calculo.php


<?php
// Indices e valores dos produtos
$valor = array(
'produto_1' => 20,
'produto_2' => 10.50,
'produto_3' => 15,
'produto_4' => 30,
'produto_5' => 20,
'produto_n' => 2.50
);
// valor total inicial = 0
$total = 0;
// passando os dados do form para um array
$params = array();
parse_str($_POST['dataForm'], $params);
// calculando o valor dos produtos e somando ao total
foreach($params as $item => $value)
{
if(isset($valor[$item]) && !empty($item))
$total += $valor[$item] * $value;
}
// retornando o total calculado e formatado BRL
echo number_format($total,2, ',', '.');
?>

Como está comentado no código, o array de nome $valor contém em seus índices os códigos dos itens (que devem ser iguais ao do formulário para que ocorra o cálculo correto) e também os valores dos mesmos.
Seria assim:
o produto_1 custa 20 rúpias.

Importante: os valores devem ser separados por ponto(.) e não vírgula(,) para que o cálculo ocorre corretamente, não se esqueça disso para não ficar sofrendo aí.
obs: E eu escrevo como se alguém fosse utilizar mesmo o código kas kas kas kas.

Enfim,

A linha parse_str($_POST['dataForm'], $params); passa para um array os valores recebidos do jQuery através do dataForm: $(“#produto”).serialize(), lembra né? blz!
Após passar para o array $params realizamos a verificação if(isset($valor[$item]) && !empty($item)), ou seja, verificamos se existe no array $valor o índice contido em $params.
No foreach nos percorremos todos os índices de $params que nada mais é que os campos do form e verificamos se existe aquele índice no array $valor.
Para fixar a idéia:
$param são os campos do formulário e $valor é o array que contém os índices de mesmo nome que os campos do form, então:
$params['produto_1'] = valor['produto_1']

E a partir disso vamos somando/multiplicando ao $total como a linha:
$total += $valor[$item] * $value;

Essa linha diz o seguinte:
$total += $valor['produto_1'] * $quantidade_digitada_no_produto_1

O echo retorna o jQuery o total calculado, no jQuery é retornado esse valor em function(data), lembra né? blz!
Obs: o valor só atualizado quando o campo é alterado e isso implica em você “sair” daquele campo, mudar de o focu do cursor!

Bom, fica aí a demo para você curtir: demo   |  fontes

Links:
jQuery $.post
PHP  parse_str
PHP numer_format

Abraços e até logo++,

Olá, nesse post veremos como utilizar de forma simples, as sessões no PHP.
É claro que já é simples trabalhar com sessões no PHP, no entanto escrevi uma classe na tentativa de facilitar ainda mais, sabe-se que para iniciar uma sessão basta utilizar o comando:

 <?php
 session_start();
 ?
 

Até aí beleza e depois? O que mais precisamos fazer não só para manter a sessão mas também para utiliza-la afim de recuperar informações?

Adianto que não utilizaremos recursos para aplicar segurança  e toda aquela coisa, comento isso porque as vezes aparecem um ou outro artista que dizem coisas do tipo:
- Pá comessá ten di tê siguranssa na çeção.

Então, já aviso de prima que não é abordada nesse post  a questão de segurança em sessões com PHP!

Bem, vou citar aqui o que a classe propõe para trabalharmos com uma sessão:
- setar/recuperar  o tempo de sessão em segundos, ex: 3600 segundos (1 hora)
- gravar/recuperar informações em um array da sessão
- checar o status da sessão (validar)

É pouca coisa mas penso eu que a classe facilita a forma de faze-lo, vejamos um exemplo no arquivo login.php que é responsável por iniciar/setar uma sessão:

<?php
// incluindo a classe
require_once 'session.class.php';
// nova sessao
$ses = new Session;
// iniciando a sessao
$ses->start();
// tempo de sessao com 3600 seg. (1 hora)
$ses->init(3600);
// inserindo uma informação adicional na sessao
$ses->addNode('userName', 'Rafael Clares');
?>

O arquivo login inicia e seta o tempo de  sessão para 1 hora e também adiciona à sessão no índice  “userName” o valor  “Rafael Clares“, essa informação poderá ser recuperada nas demais páginas, assim como podem ser adicionados novos índices no array da sessão, ex:

<?php
 $ses->addNode('userName', 'Rafael Clares');
 $ses->addNode('userID', '123456');
 $ses->addNode('userMail', 'rafaelclares@foo.bar');
?>

A idéia é que durante o login você possa adicionar informações que sejam úteis durante a sessão, lembrando…  informações essas que não venham comprometer a segurança, como por exemplo adicionar à sessão uma senha ou dado importante do usuário(#wrong).

Para não ficar dúvidas, não estamos falando de login e sim de sessão, para você implementar a sessão no login (e isso é que torna utilizável)  você precisa implementar o login e dentro da condição verdadeira implementar a sessão, ex (não vou colocar a consulta em bd, então nem comentem lances de SQL Injection, criptografia e coisas do tipo ) :

<?php
if(  $row['login']  == "$usuario"  and  $row['password'] == "$senha" )
{
require_once 'session.class.php';
$ses = new Session;
$ses->start();
$ses->init(3600);
}
?>

Bem, seria a “grosso” modo o local onde você deve implementar a sessão!

Prosseguindo,  após ter setado a sessão você precisa “checar” nas demais páginas para permitir a navegação, então vamos utilizar aqui page1 e page2 como exemplo.

page1

<?php
// incluindo a classe
require_once 'session.class.php';
// nova sessao
$ses = new Session;
// iniciando a sessao
$ses->start();
// checando a sessao
if(!$ses->check())
{
// imprimindo mensagem de status (sessao inativa)
echo $ses->status();
exit;
}
else
{
// imprindo o nome do usuario
echo "Olá, " . $ses->getNode('userName');
// imprimindo tempo restante
echo "Tempo restante: ". $ses->getLeftTime();
}
?>

Perceba que nesse arquivo já não temos mais a chamada ao método $ses->init($time);
Esse método é responsável por setar a sessão, inicializa-la, logo, precisamos/devemos utiliza-la apenas uma vez!
Quase todo o restante parece igual a não ser pelo fato de que agora estamos recuperando as informações além de checar se a sessão está ativa, estamos também imprimindo (toscamente) o nome do usuário e o tempo restante de sessão.

$ses->getNode(‘userName’)  recupera a informação passada à sessão durante o (suposto) login c/ o método addNode(‘node’,'value’).
$ses->getLeftTime() recupera o tempo restante da sessão, ou seja, momento em que o login foi efetuado – momento atual.

O recurso do método getLefTime() é bastante utilizado (não com esse nome, claro) em sites como internet banking por exemplo, acho que todos que utilizam o serviço já devem ter notado no topo que fica constantemente aparecendo o tempo de sessão restante, nesse exemplo ele recupera apenas quando atualiza a página, claro… No entanto, irei comentar como fazer para que ele fique o tempo todo contando e trazendo a informação mesmo que a página não seja atualizada!

Bem, até agora vimos que o arquivo login seta/inicializa a sessão e em seguida não mais o consultaremos e também não faremos mais chamadas à alguns métodos presentes nesse arquivo para que a sessão não seja “resetada”.

No arquivo page1 vimos que ele checa a sessão e imprime algumas informações.

Para que possamos realmente testar a funcionalidade precisamos de navegação, ou seja, transitar da page 1 para page 2  através de uma sessão, bem, o arquivo page 2 é identico ao arquivo page 1.

Na verdade a única diferença é que no arquivo page 1 existe um link para o arquivo page 2logout e no  page 2 exise o link para page 1logout, acontece que não estão presentes nos códigos acima, resolvi não colocar para não ficar muita “sujeira” no código de explicação, no entanto no link demo tem os links e são links comuns, claro(acho que nem conheço links incomuns)…
Bom, o links vocês notarão nos fontes, o html logo abaixo do PHP.

Para ficar mais claro,
O motivo de não ter colocado é que os links seriam a única diferença entre os 2 arquivos, isso porque a única coisa que você precisa fazer em todas as páginas que dependerão de sessão é inserir a verificação, ou seja, no cabeçalho de cada página você vai colocar :

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
if(!$ses->check())
{
echo $ses->status();
exit;
}
?>

E também poderia ser assim:

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
if(!$ses->check())
{
// incluindo o form de login
include 'formulario_login.html';
exit;
}
?>

E se você preferir pode ser um include, algo como “check_session.php” com o conteúdo acima.
Claro que se você for utilizar os outros métodos da classe você adiciona-los ao include, se essas informações forem comuns à todas as páginas!

Lembrando que os métodos podem ser utilizados depois de ter iniciado as sessão, quero dizer que você pode mesmo depois de estar na sessão, chamar um método e depois recuperar a informação, ex:

<?php
$ses->addNode('status_aviso_home','leu o aviso');
?>

Ha-ha, confesso que eu deveria ter me inspirado mais para dar esse exemplo acima, mas você entenderam que eu sei ($ses->addNode(‘QueBurro’,'DaZeroPraEle’)) !

Retomando, faltou ainda o cara responsável por encerrar a sessão, o tal de logout, vejamos:

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
// destruindo a sessao
$ses->destroy();
// destruindo objeto
unset($ses);
?>

Com isso nós finalizamos e como se diz lá pelas 5 da manhã, vamos pensar um pouco

- O login.php é o cara que após ter se certificado de que deve iniciar uma sessão,  seta os parâmetros e faz o trabalho dele de “startar” a sessão.
- O page1.php é o cara que só vai exibir o conteúdo caso a sessão esteja ativa e para isso ele faz a verificação como o $ses->check() que retorna false se não estiver ativa a sessão.
- O page2.php é outro cara que utilizamos para ficar “para lá e para cá” entre as páginas com intuito de testar a navegação com sessão (se estiver ativa).
- O logout.php é quem encerra a sessão e destrói o objeto $ses.
- O session.class.php é quem faz os if’s hahahahaha (é ow, eu tbm sinto sono e hj não tá rolando Atari Teenage Riot) .

Nota:
Quando a sessão está inativa aparece a mensagem “A sessão requerida não está ativa“.
Essa mensagem pode ser alterada na classe ou você pode seta-la durante a verificação, ou seja, antes do método  check(), ficaria assim:

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
$ses->setMsg("Escreva aqui que o cara precisa se logar");
if(!$ses->check())
{
echo $ses->status();
exit;
}
?>

demo:  session
fontes: download

Valeu pessoal e até a próxima sessão.
abraço à todos

$ses->destroy();

PHP + JQuery Part II

Publicado: janeiro 6, 2011 em Ajax, Javascript, Jquery, PHP
Tags:, ,

PHP + JQuery  Part II

Olá, dando continuidade ao post anterior
Já vimos como funciona basicamente o método $.post do JQuery, agora vamos utilizar o método val() para obter os dados do formulário e enviar ao PHP.
No arquivo PHP iremos inserir no banco de dados as informações do formulário HTML e retornar o status da transação ao JQuery.

Lembrando que por enquanto não iremos abordar validações tanto no JQuery quanto no PHP (aff, lembrei do Faustão, tanto no pessoal quanto no profissional), enfim, o que vamos ver serão os métodos de recuperação dos dados do form, envio ao PHP, retorno do PHP ao JQuery e mensagem de status para o usuário, por enquanto as mensagens serão no pobretão alert(), mais para frente vamos ver o JQuery aparecendo com os dialog box, mensagens com efeitos e a coisa toda, mas agora é importante nos concentrar nessa questão da “conversa entre as linguagens”.

JQuery não é difícil, mas para fazer algo  é preciso estar consciente dessa ligação entre as linguagens, envio, consulta, retorno, etc… Estando bom nessa parte já dá para brincar de JQuery Effects.
Acredito que a maior dificuldade para quem está chegando (como eu) é justamente essa, entender o que está enviando, para onde está enviando e onde recuperar essas informações.

Tenha em mente que a forma de programar o PHP não muda!
Em curtas palavras o JQuery, à princípio, não fará nada além de “pegar os dados no HTML”, “enviar ao PHP” e “exibir o retorno do PHP”.

Bem, acabou o culto, vamos ver  os códigos!

Primeiramente, vamos ver um simples formulário HTML.

<form id="add" name="add" method="post">
 <label>Nome: </label>
 <input id="nome" name="nome" type="text" />

 <label>Mail: </label>
 <input id="mail" name="mail" type="text" />

 <button id="bntAdd" onclick="return addUser()">Add User</button>
</form>

Antes de mais nada, uma dica muito importante!
Para tornar mais simples essa troca de informações entre as linguagens, utilize sempre os mesmos nomes em variáveis, campos do form e campos do SQL.
Isso facilita muito na hora da troca de dados entre HTML, JQuery, PHP e SQL.

Sobre o HTML:
- Repare que o botão Add User possui um ID (todos os elementos devem possuir name e id), por enquanto vamos passar o evento no elemento do botão, mas nos próximos exemplos iremos criar o evento no JQuery, atribuiremos o eventos através do ID do elemento ao invés de passar no onClick, isso irá produzir um HTML mais limpo.
- Os nomes dos campos do formulários são os mesmos da tabela  SQL, isso irá facilitar no PHP, dessa forma utilizaremos apenas o método extract() do PHP.

Vejamos agora o código JQuery


function addUser()
{
 // valor do campo nome no form
 nome = $('#nome').val()
 // valor do campo mail no form
 mail = $('#mail').val()
 // validações  (campo vazio, invalido, etc...)
 // codigo da validacao

 // enviando os dados do formulario via post
 $.post('data.php',{nome: nome, mail: mail},function(data){
 // verifica o retorno
 if(data == 0)
 {
 // igual à 0 ok
 alert('user add ok')
 }
 else
 {
 // diferente de 0 erro
 alert('erro ao adicionar user')
 }
 }
}

No JS temos apenas um método, addUser(), ele recupera os valores dos campos do formulário e envia ao PHP pelo método post que você já entendeu como funciona.
Lembrando que validações não são o foco agora, a idéia é entender o transporte dos dados de uma linguagem para outra.
Ah, o código JS está pobre ainda porque estamos apenas enviando/recebendo dados e exibindo os retornos no alert, mais para frente tornaremos isso mais elegante!

Para acessar os elementos via JQuery basta fazer: $(‘#nomeDoElemento’).metodo() – neste caso utilizamos o método val() que recupera o valor do campo.
Doc Jquery – método val()

Para entender a função addUser, repare que ele envia os dados ao PHP e verifica se o retorno do PHP é igual à 0(zero) ou 1 (um), de acordo com o retorno a mensagem é exibida no alert, mas isso você só irá entender ao ver o código PHP.

No geral, o que ocorre é que ao executar a query o PHP retorna (com echo) 0 ou 1, retorna 1 se a query não for bem sucedida!
A única coisa que muda na forma de programar no PHP com JQuery é que você não exibe mais os dados no PHP, quero dizer que você não imprime na tela através do PHP, nós o utilizamos códigos de status, ou seja, retornamos alguma informação ao JQuery onde iremos tratar a resposta ao usuário, seja uma mensagem de sucesso/falha ou para completar um formulário.
Por exemplo, nós enviamos um ID ao PHP que irá nos retornar um array em JS/JSON ou outra forma que possamos através do JQuery enviar à interface/HTML.

Vamos ver o arquivo PHP


<?php
 // extrai os dados do post
 extract($_POST);
 // monta a instrucao SQL
 $strSql = "insert into users (nome,email) values ('$nome','$mail')";
 // conexao com o banco
 $con = mysql_connect('host', 'user', 'pass');
 // seleciona o bd
 mysql_select_db('foo', $con);
 // executa a query
 $query = mysql_query("$strSql");
 // verifica status da query
 if($query)
 {
 // se bem sucedida
 echo 0;
 }
 else
 {
 // mal sucedida
 echo 1;
 }
?>

No PHP,
estamos recebendo os dados via POST e extraindo-os com o extract (se não costuma utilizar o extract, dê uma lida nesse post). Perceba que no insert estão as vars de mesmo nome, ou seja, os dados vindos do form são de mesmo nome que os dados da tabela sql, o extract transforma em var no PHP os dados vindos do post.

nos conectando ao MySql, sem validações, não é o foco.

executamos a query

se a query rodou certinho, ou seja, se houve a inserção no BD temos como retorno o Ø (zero) se houve falha temos o 1 como retorno, é apenas isso que o PHP irá retornar ao JQuery, na função addUser é que iremos tratar as mensagens ou ações com a interface/html/usuário.

Como eu disse, por enquanto esse retorno do PHP nos produz apenas um alert, no entanto, é o suficiente para entendermos essa troca de informações.
Claro que ao invés de retornar números/códigos você pode retornar mensagens no PHP, no entanto na hora de comparar no JQuery o status para dar uma resposta ao usuário pode ser um pouco confusa se precisar comparar mensagens, particularmente utilizo nesse formato que apresentei e no JQuery retorno o status de acordo com o retorno vindo do PHP, ex:

retorno = 0 : Sucesso ao executar
retorno = 1 : Erro ao executar o procedimento
retorno <> de 0 ou 1 : exibir a mensagem original do PHP, ou seja, alert(data), onde data será sempre o retorno do PHP, mesmo que seja um erro de conexão ou qualquer outra informação.

Sendo “retorno” a var “data” que está como parâmetro no método addUser ( function(data) ).

Acho que por agora é só isso mesmo, mas vai ficar legal à medida em que passarmos a ver mais códigos que explicação.

Até agora só estamos entendendo como funciona, logo iremos ver o que é possível fazer de funcional.

abraços,

Part I do post

Olá, estou atualizando o post “Calcular Diferença Entre Datas”, usaremos uma função mais simples para calcular diferença entre Anos, Meses, Dias, Horas, Minutos e Segundos.

A função recebe 3 ou 4 parâmetros.

1º  Parâmetro é o data inicial
2º  Parâmetro é a data final
3º  Parâmetro é o que se deseja calcular, ex. Ano, Mes, Dia, Hora, Minuto. Sendo o parâmetro a primeira letra ( ‘A’ = ano, ‘M’ = meses, etc …)
4º  Parâmetro é opcional e só precisa ser passado se o separador for diferente de “-” (ex: 2010/04/10 neste caso deve ser passado o separador no parâmetro).

O formato da data deve ser “Ano-Mês-Dia”, ex  2010-12-31, ou seja, $d1 = “2010-12-31″.

<?php

function diffDate($d1, $d2, $type='', $sep='-')
{
 $d1 = explode($sep, $d1);
 $d2 = explode($sep, $d2);
 switch ($type)
 {
 case 'A':
 $X = 31536000;
 break;
 case 'M':
 $X = 2592000;
 break;
 case 'D':
 $X = 86400;
 break;
 case 'H':
 $X = 3600;
 break;
 case 'MI':
 $X = 60;
 break;
 default:
 $X = 1;
 }
 return floor( ( ( mktime(0, 0, 0, $d2[1], $d2[2], $d2[0]) – mktime(0, 0, 0, $d1[1], $d1[2], $d1[0] ) ) / $X ) );
}

?>

Exemplos de uso:
Calcular diferença entre Dias (3º parâmetro D).

<?php

$d1 = "2011-01-01";
$d2 = "2011-01-10";
echo diffDate($d1,$d2,'D');

?>

Calcular diferença entre Meses (3º parâmetro M).

<?php

$d1 = "2011-01-01";
$d2 = "2011-02-01";
echo diffDate($d1,$d2,'M');

?>

Calcular diferença em Minutos (3º parâmetro MI).

<?php

$d1 = "2011-01-01";
$d2 = "2011-02-01";
echo diffDate($d1,$d2,'MI');

?>

Calcular diferença entre Anos (3º parâmetro A).

<?php

$d1 = "2010-01-01";
$d2 = "2011-01-01";
echo diffDate($d1,$d2,'A');

?>

Calcular diferença em Horas (3º parâmetro H).

<?php

$d1 = "2011-01-01";
$d2 = "2011-02-01";
echo diffDate($d1,$d2,'H');

?>

Calcular diferença em Dias com separador “/”  (3º parâmetro D e 4º parâmetro / ).

<?php

$d1 = "2011/01/01";
$d2 = "2011/02/01";
echo diffDate($d1,$d2,'D',"/");

?>

Calcular diferença em Segundos (omitindo o 3º e 4º parâmetro ).

<?php

$d1 = "2011-01-01";
$d2 = "2011-02-01";
echo diffDate($d1,$d2);

?>

Olá pessoal, primeiramente feliz 2011 à todos, este ano prometo criar mais que um post por semestre (por precaução eu fiz figa)!

É o primeiro post do ano e veremos um pouco sobre o que foi a coqueluche da web em 2010 e que certamente irá ficar, o JQuery.
O assunto é muito extenso mas para começar nada como os primeiros passos, o básico.
Durante os próximos post’s  veremos  alguns métodos simples que utilizaremos para Ajax, talvez não vejamos efeitos.

Para começar vamos falar do método  $.post.

O Método $.post tem a seguinte sintaxe:


$.post(url,{vars},function(data){
 // resto do código
}

Os parâmetros do método:

url:  é o destino do post ex. data.php
vars: são os dados que você deseja enviar via post ex.  { nome: ‘Joe’, mail: ‘joe@foo.com’ }
data: nesta var será atribuido o retorno de data.php

o “data” é o que você irá “trabalhar” após a chamada do método.

Vejamos um exemplo, para isso precisaremos criar o arquivo de destino do post, no nosso caso será em PHP (data.php).

Primeiramente vamos criar o método JQuery/Js para enviar os dados para data.php


function getUser()
{
 $.post('data.php',{nome: 'Joe', mail: 'joe@foo.com'},function(data){
 //mostrando o retorno do post
 alert(data)
 })
}

A função getUser() está enviando via post pelo JQuery os dados nome e mail para data.php e o rotorno  estará contido na var “data“.

O arquivo data.php irá receber os dados via post e retorna-los com o echo disponibilizando o resultado na var data do JQuery, onde os exibimos com o alert.


<?php
 // extrai os dados do post
 extract($_POST);
 // imprime os dados do post
 echo "Nome: $nome, Mail: $mail";
?>

Para isso é claro que precisamos do HTML, não vamos adentrar o HTML agora, no geral precisamos apenas chamar a função getUser();


<button onclick="return getUser()">get</button>

Ao chamar o método getUser estaremos enviando os dados {nome: ‘Joe’, mail: ‘joe@foo.com’} para data.php que os recebe e devolve a mensagem com o echo, esse retorno fica disponível na var data de function(data) do método $.post.

É o básico do método mas a idéia desse post é dar uma noção do funcionamento, nos próximos post’s sobre o JQuery veremos como tornar isso realmente funcional, iremos criar um arquivo PHP com diversos métodos e parâmetros, um arquivo JS/JQuery e HTML para vermos como podemos tornar isso produtivo.

Por hoje é só isso, espero que acompanhem essa sequência de post’s (tentarei postar um por dia durante uma semana).

Abraços,

Part II desse post

Gerando uma senha aleatória PHP

Publicado: dezembro 27, 2010 em PHP

Gerar senha aleatória  com PHP

 <?php
 // caracteres utilizados
 $chars = 'abcdxywzABCDZYWZ0123456789';
 $max = strlen($chars)-1;
 $pass = "";
 // tamanho da senha
 $width = 8;
 for($i=0; $i<$width; $i++)
 {
  $pass .= $chars{mt_rand(0, $max)};
 }
 // exibindo a senha gerada
 echo $pass;
 ?>
 

Para mudar o tamanho da senha basta alterar a var $width;

Opa!

Escrevi uma função para aplicar máscara em campos/valores como cpf, cnpj, data, hora, coordenadas estelares e o que desejar.

É bem simples, estou sem sono e resolvi escrever algo, é eu gosto de escrever aqui huahuha.
Quer ver o script e eu aqui com papo de sonâmbulo… então tá!


<?

function mask($val, $mask)
{
 $maskared = '';
 $k = 0;
 for($i = 0; $i<=strlen($mask)-1; $i++)
 {
 if($mask[$i] == '#')
 {
 if(isset($val[$k]))
 $maskared .= $val[$k++];
 }
 else
 {
 if(isset($mask[$i]))
 $maskared .= $mask[$i];
 }
 }
 return $maskared;
}

?>

Exemplo de uso:


<?

$cnpj = "11222333000199";
$cpf = "00100200300";
$cep = "08665110";
$data = "10102010";

echo mask($cnpj,'##.###.###/####-##');
echo mask($cpf,'###.###.###-##');
echo mask($cep,'#####-###');
echo mask($data,'##/##/####');

?>

Saídas:
11.222.333/0001-99
001.002.003-00
08665-110
10/10/2010

A saída é exatamente como você definir com os “#”, você pode utilizar qualquer separador, qualquer caracter, ex:


<?

$data = "10102010";

echo mask($data,'##/##/####');
echo mask($data,'[##][##][####]');
echo mask($data,'(##)(##)(####)');

?>

Saídas:
10/10/2010
[10][10][2010]
(10)(10)(2010)

Exemplo esquisito que ninguém jamais utilizará:


<?

$hora = "021050";

echo mask($hora,'Agora são ## horas ## minutos e ## segundos');
echo mask($hora,'##:##:##');

?>

Saídas:
Agora são 02 horas 10 minutos e 50 segundos
02:10:50  (esse você vai usar, claro)

Enfim, desde que a quantidade de # seja igual a quantidade de números, ou seja  lá o que contiver a variável, porque não se limita apenas à números, poderia ser:


 <?

 $str = "adoleta";

 echo mask($str,'#-##-##-##');

 ?>

 

Saída: a-do-le-ta


<?

$valor = "100000";

echo mask($valor,'#.###,##');

?>

Sáida: 1.000,00

Pensou que era brincadeira o lance da coordenada estelar né ? tá bão!


<?

$coord_estelar = "10100505";
echo mask($coord_estelar,'p=(#.#,#.#,#.#,#.#)');

?>

Saída: p=(1.0,1.0,0.5,0.5)

É isso galera, sigam as estrelas!
abs