<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cauan Cabral - Geek &#187; validação</title>
	<atom:link href="http://cauancabral.net/tag/validacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://cauancabral.net</link>
	<description>Geek, nerd e apaixonado por tecnologia</description>
	<lastBuildDate>Fri, 25 Jun 2010 23:31:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Classe para fazer Contagem de Linhas e Bônus</title>
		<link>http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/</link>
		<comments>http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 01:40:37 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=139</guid>
		<description><![CDATA[Classe para contar número de linhas &#8220;codadas&#8221; de uma aplicação. Foi escrita em PHP, pensando em extensões comuns nesse tipo de sistema, mas pode facilmente ser adaptado para contar linhas de sistemas em Java, C/C++ dentre outras. A idéia por &#8230; <a href="http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Classe para contar número de linhas &#8220;codadas&#8221; de uma aplicação. Foi escrita em PHP, pensando em extensões comuns nesse tipo de sistema, mas pode facilmente ser adaptado para contar linhas de sistemas em Java, C/C++ dentre outras.</p>
<p>A idéia por trás da classe foi matar a curiosidade geek de ver o tamanho de uma &#8220;criança&#8221; que ajudei a criar, além disso quero estudar uma forma de fazer melhores estimativas para custo e prazo para desenvolvimento de software.</p>
<p>A classe está disponível livremente, sob a licença MIT. Faça o download dela <a title="Classe Metrics" href="http://geek.cauancabral.net/wp-content/uploads/2009/07/metrics.class.php" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/07/metrics.class.php?referer=');"></a><a href="http://geek.cauancabral.net/wp-content/uploads/2009/08/metrics.zip" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/08/metrics.zip?referer=');">metrics.class.php</a>. Qualquer dúvida sobre sua utilização, deixe nos comentários ou entre em contato comigo.</p>
<p>Vou aproveitar e disponibilizar a atualização da classe para validação de dados e outras &#8220;firulas&#8221; mais que já disponibilizei anteriormente, porém agora com pequenas adições. Visualize ela <a href="http://geek.cauancabral.net/wp-content/uploads/2009/08/validation.zip" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/08/validation.zip?referer=');">validation.class.php</a><a title="Classe para validação e outros bônus" href="http://geek.cauancabral.net/wp-content/uploads/2009/07/validation.class.php" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/07/validation.class.php?referer=');"></a>.</p>
<p>Qualquer sugestão sobre ambas as classes pode ser feita nos comentários. Espero que seja útil para alguém.</p>
<p>Até a próxima.</p>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p>Atualizado: troquei os arquivos por equivalentes compactados em arquivo .zip . Valeu Gelinho e Felipe ;]</p>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p>Atualizado novamente: à um bom tempo meu amigo <a href="http://sites.google.com/site/raphoxaraujo/" onclick="pageTracker._trackPageview('/outgoing/sites.google.com/site/raphoxaraujo/?referer=');">Raphox</a> indicou na lista do <a title="Grupo de Usuários PHP de MS" href="http://www.phpms.org" onclick="pageTracker._trackPageview('/outgoing/www.phpms.org?referer=');">PHPMS</a> uma classe criada pelo grande <a title="Criador, dentre outras coisas, do PHPUNIT" href="http://sebastian-bergmann.de" onclick="pageTracker._trackPageview('/outgoing/sebastian-bergmann.de?referer=');">Sebastian Bergmann</a> para mensurar softwares em PHP, o nome da classe é PHPLOC e ela está disponível neste endereço: http://github.com/sebastianbergmann/phploc . Vale a pena conferir</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/11/19/google-analytics-e-adobe-facilitando-a-sua-vida/" rel="bookmark" class="crp_title">Google Analytics e Adobe &#8211; facilitando a sua vida</a></li><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li><li><a href="http://cauancabral.net/2008/07/16/software-freedom-day-08/" rel="bookmark" class="crp_title">Software Freedom Day 08</a></li><li><a href="http://cauancabral.net/2009/01/14/ajax-com-prototype/" rel="bookmark" class="crp_title">AJAX com Prototype</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CakePHP &#8211; Dúvidas Comuns #2</title>
		<link>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/</link>
		<comments>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 00:36:54 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[i10n]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=111</guid>
		<description><![CDATA[Dúvida: Como usar habilitar a internacionalização &#8211; o famoso I18N &#8211; nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views? Habilitar a internacionalização e ter a localização em &#8230; <a href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dúvida: Como usar habilitar a internacionalização &#8211; o famoso I18N &#8211; nos erros de validação de seu modelo? Fácil? Como fazer então no próprio modelo para não repetir frases em várias Views?</p>
<p>Habilitar a internacionalização e ter a localização em uma aplicação com CakePHP desde a versão 1.2  é relativamente simples: basta uma lida no nosso <a title="Internacionalizando uma aplicação em CakePHP" href="http://book.cakephp.org/pt/view/161/Internacionalizando" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/161/Internacionalizando?referer=');">Cookbook</a> e pronto.</p>
<p>Outra coisa que é relativamente simples de se fazer é validar os dados, basta termos um atributo em nosso modelo chamado &#8220;validate&#8221; e seguir as dicas do <a title="Validação de dados com CakePHP" href="http://book.cakephp.org/pt/view/125/Valida%C3%A7%C3%A3o-de-dados" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/125/Valida_C3_A7_C3_A3o-de-dados?referer=');">livro de receitas</a>.</p>
<p>Mas pelo Cookbook somos induzidos a fornecer a mensagem de erro na hora de criar a View, algo que eu particularmente não gosto. É até comum termos um modelo que é usado por Controllers diferentes e consequêntemente por Views diferentes.</p>
<p>Uma maneira de evitar isso, é definir as mensagens de erro já na definição das regras de validação, dentro do atributo &#8220;validate&#8221; do seu modelo. O grande problema é que para traduzir uma determinada expressão utilizamos um método, e a chamada de método na definição estática de um atributo não é permitida no PHP (dúvida? tente fazer o código abaixo)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Modelo <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$validate</span> <span style="color: #339933;">=</span> _<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ola mundo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//esse código não devera ser executado</span></pre></div></div>

<p>A solução para isso é a atribuição das regras de validação no momento da instanciação da classe, ou seja, no seu método construtor, da seguinte maneira</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">class</span> Modelo <span style="color: #000000; font-weight: bold;">extends</span> AppModel <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$validate</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #666666; font-style: italic;">/* aqui você pode definir as regras e mensagens,mesmo chamando um método */</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Qualquer dúvida não deixem de utilizar os comentários ;]</p>
<p>&#8212;&#8212;&#8211;<br />
Atualizado: havia esquecido da chamada ao construtor da superclasse AppModels ( através do parent::__construct() ) no último código mostrado.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li><li><a href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</a></li><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li><li><a href="http://cauancabral.net/2010/01/27/dica-rapida/" rel="bookmark" class="crp_title">Dica rápida</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AJAX com Prototype</title>
		<link>http://cauancabral.net/2009/01/14/ajax-com-prototype/</link>
		<comments>http://cauancabral.net/2009/01/14/ajax-com-prototype/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 13:37:56 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[comentários]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/?p=91</guid>
		<description><![CDATA[Prototype é uma biblioteca javascript bastante utilizada, mas que pra mim nunca chamou atenção (ao contrário do JQuery), mas como tenho utilizado o CakePHP e em sua estrutura de Helpers ele usa esta biblioteca, tive de &#8220;perder&#8221; um tempinho estudando-a. &#8230; <a href="http://cauancabral.net/2009/01/14/ajax-com-prototype/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a title="Página da biblioteca Prototype" href="http://www.prototypejs.org" onclick="pageTracker._trackPageview('/outgoing/www.prototypejs.org?referer=');">Prototype</a> é uma biblioteca javascript bastante utilizada, mas que pra mim nunca chamou atenção (ao contrário do <a title="A fantástica biblioteca js JQuery" href="http://jquery.com" onclick="pageTracker._trackPageview('/outgoing/jquery.com?referer=');">JQuery</a>), mas como tenho utilizado o <a title="Página do framework CakePHP" href="http://cakephp.org" onclick="pageTracker._trackPageview('/outgoing/cakephp.org?referer=');">CakePHP</a> e em sua estrutura de Helpers ele usa esta biblioteca, tive de &#8220;perder&#8221; um tempinho estudando-a.</p>
<p>Para isso, fiz como meu amigo <a title="PorKaria's blog" href="http://porkaria.wordpress.com" onclick="pageTracker._trackPageview('/outgoing/porkaria.wordpress.com?referer=');">PorKaria</a> e montei um sisteminha simples de comentários (na verdade o dele era o <a title="Livro Livre" href="http://phpbrasil.com/scripts/script.php/id/1661" onclick="pageTracker._trackPageview('/outgoing/phpbrasil.com/scripts/script.php/id/1661?referer=');">guestbook</a>, mas no fim fazem a mesmo coisa, hehehe).</p>
<p>Descrição do sistema:</p>
<p>Sistema usando AJAX (na verdade o X aqui é de XHTML, porque não utilizo XML) Permite a inserção de comentários, salvando-os em um banco de dados (MySQL), tudo de forma assíncrona. A bibliote utilizada para implementação da parte em javascript é a Prototype, a formatação (CSS) foi retirada de um tutorial do <a title="Referência em Web Semântica" href="http://www.tableless.com.br" onclick="pageTracker._trackPageview('/outgoing/www.tableless.com.br?referer=');">Tableless</a> sobre formatação de formulários e o PHP foi escrito por mim. Além do cadastro, fiz o que pode se chamar início de um sistema de busca com sugestão (famoso autocomplete). Digo o início porque ele não avalia bem o momento de se fazer a busca e não é possível clicar nos resultados, apenas vê-los.</p>
<p><span id="more-91"></span><br />
Estrutura:</p>
<ul>
<li>main.php : é a página onde está todo o sistema, apartir dela que é feito a leitura dos comentários e o envio de novos comentários;</li>
<li>adiciona_comentario.php : nesta página fazemos o processamento dos dados vindos do formulário e os salvamos no banco;</li>
<li>le_comentario.php : arquivo que recupera do banco todos os comentarios e retorna os dados em uma lista html;</li>
<li>busca_comentario.php : script que faz a busca dos comentários no banco para o &#8220;autocomplete&#8221; e retorna-os como uma lista;</li>
<li>validation.class.php : velho conhecido que faz a validação dos dados&#8230; a classe ainda está em implementação, mas já está mais completa do que a versão anterior que compartilhei.</li>
</ul>
<p>Irei comentar apenas a parte javascript, qualquer dúvida sobre o restante, deixe nos comentários ou email-me.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Funcao que recupera os dados do banco para apresentar ao usuário</span>
<span style="color: #003366; font-weight: bold;">function</span> recupera<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Updater</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'comentarios'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'adiciona_comentario.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O trecho acima define uma função que cria uma nova instância de Ajax.Updater, que fará uma chamada ao arquivo adiciona_comentario.php e usará a resposta para substituir o conteúdo da tag XHTML com ID &#8216;comentarios&#8217;. Ou seja, é essa função que ira carregar os comentários feitos na página.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Funcao que envia os dados do formulário para serem salvos no banco</span>
<span style="color: #003366; font-weight: bold;">function</span> envia<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'adiciona_comentario.php'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>
		method<span style="color: #339933;">:</span> <span style="color: #3366CC;">'post'</span><span style="color: #339933;">,</span>
		parameters<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;adiciona&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		onCreate<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'adiciona'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'enviando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>transport<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'enviando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'adiciona'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			recupera<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		onFailure<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Alguma coisa não deu certo...'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Este outro trecho define a função envia os dados do formulário para o arquivo adiciona_comentario. Aí é utilizado o objeto Ajax.Request, que é a implementação mais genérica do Prototype para Ajax.<br />
O que é passado para o objeto:</p>
<ol>
<li>O arquivo que receberá a requisição</li>
<li> Aqui vem o segundo parâmetro que é composto por vários subparâmetros
<ol>
<li>Método de envio: POST;</li>
<li>Variáveis enviadas: utilizo a função &#8216;serialize()&#8217; no formulário, ela transforma os dados dele em uma lista de variáveis, entendíveis pelo navegador e PHP;</li>
<li>Uma função callback que é disparada quando é criado a requisição. Uso ela para mostrar uma mensagem &#8216;Enviando&#8230;&#8217;;</li>
<li>Uma função callback que é disparada quando é concluído com sucesso a requisição. Ela esconde a mensagem mostrada anteriormente e chama a função &#8216;recupera()&#8217; para recarregar os comentários;</li>
<li>Por última uma função callback que é disparada quando ocorre um erro na requisição.</li>
</ol>
</li>
</ol>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Funcao que faz uma busca em Ajax e retorna os resultados como em um autocompletar</span>
<span style="color: #003366; font-weight: bold;">function</span> fazBusca<span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'busca_comentario.php'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#123;</span>
		method<span style="color: #339933;">:</span> <span style="color: #3366CC;">'post'</span><span style="color: #339933;">,</span>
		parameters<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'termo'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		onCreate<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>transport<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span>transport.<span style="color: #660066;">responseText</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
	onFailure<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Alguma coisa não deu certo...'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Aqui uma função que faz a busca pelos termos digitados. Utiliza o mesmo objeto da função anterior, o Ajax.Request, então não entrarei em detalhes.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//Evento que é disparado quando o documento termina de carregar sua estrutura</span>
document.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;dom:loaded&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'enviando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'carregando'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'resultados'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	recupera<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'busca'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keydown'</span><span style="color: #339933;">,</span> fazBusca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Por ultimo utilizo a função &#8216;observe()&#8217; no elemento &#8216;document&#8217; para que após concluída o carregamento da página (não incluído aí o carregamento de possíveis imagens), execute alguns comandos:<br />
Com a função &#8216;hide()&#8217; escondo os elementos de aviso ao usuário;<br />
Com a última linha, faço com que sempre que uma tecla for pressionada (keydown) no elemento com ID &#8216;busca&#8217;, execute a função &#8216;fazBusca&#8217;.</p>
<p>Um bônus:</p>
<p>Muitas pessoas enfrentam problemas com codificação quando trabalham com AJAX, para poupar dores de cabeça é recomendado o uso de UTF8 tanto no seu editor de texto (na hora de criar os códigos), quanto nos header dos documentos e no banco de dados. Tendo certeza que está tudo em UTF8, você provavelmente não terá problemas. Só não esqueça de um detalhe: o <a title="Página do PHP" href="http://br.php.net/" onclick="pageTracker._trackPageview('/outgoing/br.php.net/?referer=');">PHP</a> não trabalha nativamente com UTF8, então, antes de usar qualquer função que trate uma string, use a função <a title="documentação da função utf8_decode" href="http://br.php.net/manual/pt_BR/function.utf8-decode.php" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.utf8-decode.php?referer=');">utf8_decode</a> do PHP e depois, mas antes de salvar no banco de dados, utilize a função <a title="Documentação da função utf8_encode" href="http://br.php.net/manual/pt_BR/function.utf8-encode.php" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.utf8-encode.php?referer=');">utf8_encode</a>. Isso será necessário até o lançamento do <a title="Unicode no PHP" href="http://www.php.net/~derick/meeting-notes.html" onclick="pageTracker._trackPageview('/outgoing/www.php.net/_derick/meeting-notes.html?referer=');">PHP 6</a>.</p>
<p><a title="Arquivos do post" href="http://geek.cauancabral.net/wp-content/uploads/2009/01/comentarios.zip" onclick="pageTracker._trackPageview('/outgoing/geek.cauancabral.net/wp-content/uploads/2009/01/comentarios.zip?referer=');">Download de todos os arquivos do exemplo.</a><br />
obs.: descompacte os arquivos numa mesma pasta, em seguida crie um novo diretório chamado &#8216;lib&#8217; e mova o arquivo validation.class.php para ele.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li><li><a href="http://cauancabral.net/2008/10/22/usar-google-analytics-para-paginas-em-flash-ou-ajax-e-mole/" rel="bookmark" class="crp_title">Usar Google Analytics para páginas em Flash ou Ajax? É mole&#8230;</a></li><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li><li><a href="http://cauancabral.net/2008/12/12/3f-ferias-da-faculdade-finalmente/" rel="bookmark" class="crp_title">3F: Férias da Faculdade, Finalmente.</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2009/01/14/ajax-com-prototype/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Falta de tempo&#8230;</title>
		<link>http://cauancabral.net/2008/02/25/falta-de-tempo/</link>
		<comments>http://cauancabral.net/2008/02/25/falta-de-tempo/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 02:15:10 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[attachments]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/2008/02/25/falta-de-tempo/</guid>
		<description><![CDATA[Pois é&#8230; Estou trabalhando, estudando e colaborando . Não estou conseguindo dedicar o tempo que gostaria a escrita neste blog. Mas não vou abortá-lo, pretendo apenas aumentar o já grande intervalo entre posts. Meu próximo post na área de programação &#8230; <a href="http://cauancabral.net/2008/02/25/falta-de-tempo/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pois é&#8230;</p>
<p>Estou <a href="http://www.cauancabral.net" onclick="pageTracker._trackPageview('/outgoing/www.cauancabral.net?referer=');">trabalhando</a>, <a href="http://www.dct.ufms.br" onclick="pageTracker._trackPageview('/outgoing/www.dct.ufms.br?referer=');">estudando</a> e <a href="http://dce.ufms.br" onclick="pageTracker._trackPageview('/outgoing/dce.ufms.br?referer=');">colaborando</a> . Não estou conseguindo dedicar o tempo que gostaria a escrita neste blog. Mas não vou abortá-lo, pretendo apenas aumentar o já grande intervalo entre posts.</p>
<p>Meu próximo post na área de programação deverá ser sobre ActionScript. Pretendo mostrar a facilidade de se criar interfaces elaboradas com a linguagem.</p>
<p>Antes de encerrar, gostaria de avisar aos que já utilizam ou pretendem utilizar o Joomla! que a extensão que ajudei a traduzir para o nosso português está com uma nova versão: <a href="http://joomlacode.org/gf/download/frsrelease/6824/22766/attachments-1.2.2.zip" title="Clique para baixar direto do JoomlaCode" onclick="pageTracker._trackPageview('/outgoing/joomlacode.org/gf/download/frsrelease/6824/22766/attachments-1.2.2.zip?referer=');">Attachments 1.2.2 ( Anexos 1.2.2 )</a>.</p>
<p>Outra coisa, para os que se interessaram pela validação de dados em PHP5, vale a pena dar uma olhada nesta outra alternativa: <a href="http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7838" onclick="pageTracker._trackPageview('/outgoing/www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7838&amp;referer=');">http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7838</a>. Onde é abordado o uso de filtros da própria linguagem para validar ( confesso que nunca utilizei, mas me pareceu algo extremamente funcional, e com ótimo potencial ). Fica então as dicas.</p>
<p>Até breve.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/05/28/liberando-tudo-nem-tudo/" rel="bookmark" class="crp_title">Liberando tudo&#8230; (nem tudo)</a></li><li><a href="http://cauancabral.net/2008/01/21/e-os-posts/" rel="bookmark" class="crp_title">E os posts?</a></li><li><a href="http://cauancabral.net/2008/01/17/sentiram-falta/" rel="bookmark" class="crp_title">Sentiram falta?</a></li><li><a href="http://cauancabral.net/2008/01/04/sem-assunto-2/" rel="bookmark" class="crp_title">Sem assunto &#8211; parte 2</a></li><li><a href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2008/02/25/falta-de-tempo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Valida&#231;&#227;o de dados em PHP5 &#8211; final</title>
		<link>http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/</link>
		<comments>http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 02:26:21 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[algoritmo]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/</guid>
		<description><![CDATA[Olá a todos, Continuando e finalizando a sequência de artigos sobre validação ( veja também a parte 1, 2 e 3 ), iremos abordar a união de procedimentos na validação. Como vimos anteriormente, todo cuidado é pouco, então quanto maior &#8230; <a href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>Continuando e finalizando a sequência de artigos sobre validação ( veja também a parte <a title="Parte 1" href="http://cauancabral.net/blog/2008/01/02/validacao-de-dados-em-php5-parte-1/">1</a>, <a title="Parte 2" href="http://cauancabral.net/blog/2008/01/03/validacao-de-dados-em-php5-parte-2/">2</a> e <a title="Parte 3" href="http://cauancabral.net/blog/2008/01/23/validao-de-dados-em-php5-parte-3/">3</a> ), iremos abordar a união de procedimentos na validação.</p>
<p>Como vimos anteriormente, todo cuidado é pouco, então quanto maior o número de testes que submetermos um dado, maior a chance de ele chegar a nós da forma que esperamos ( sem causar danos a integridade do sistema ).</p>
<p>Vimos que a utilização de ER é essencial, toda vez que soubermos o padrão do valor esperado. Ou seja, se sabemos que um número de telefone é da forma &#8220;3333-4444&#8243;, e que isso nunca irá mudar, teremos as ER&#8217;s como nossa arma mais forte.</p>
<p>Mas existem casos em que não temos idéia do que o usuáiro pode inserir em um campo. Nestes casos, uma ER não tem grande utilidade, e temos de recorrer a outros recursos, como algumas funções do próprio PHP ou MySQL/Postgree para &#8220;limpar&#8221; as informações, de modo que ela não prejudique o fucionamento do sistema. Algumas destas funções são:</p>
<ul>
<li><a title="Referência da função" href="http://br.php.net/manual/pt_BR/function.strip-tags.php" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.strip-tags.php?referer=');">strip_tags()</a> , que tenta limpar ( retirar tags HTML e PHP ) e retornar uma string passada como parâmetro.</li>
<li><a title="Referência da função" href="http://br.php.net/manual/pt_BR/function.htmlentities.php" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.htmlentities.php?referer=');">htmlentities()</a> , substitui TODOS os caracteres que possuírem um correspondente html.</li>
</ul>
<p>Unindo a utilização destas funções, ER ( quando convir, não se esqueça que para se utilizar uma ER temos de ter um padrão esperado ) e cuidado na hora de pegar valores dos arrays superglobais ( $_POST, $_GET, &#8230; ), teremos um sistema com uma boa segurança a injeção de códigos por terceiros.</p>
<p>Vamos então fazer uma função ( não farei uma classe pois a idéia é ser bem especifico, podendo a função ser utilizada como um método sem problemas ).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> valida<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$valor</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tipo</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$erCPF</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/[0-9]{3}\.[0-9]{3}\.[0-9]{3}\-[0-9]{2}/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$erCEP</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/[0-9]{5}\-[0-9]{3}/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$erFONE</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/(0((([0-9]{2}){2})|([0-9]{2})))?[0-9]{3,5}\-[0-9]{4}/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$erEMAIL</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/[[:alnum:]]\@[[:alnum:]]+(\.[[:alnum:]])+/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$erDATA</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$erTEXTO</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/([a-z][A-Z])*/'</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//aceita somente letras</span>
<span style="color: #000088;">$erALPHANUM</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/[[:alnum:]]*/'</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//aceita numeros e letras</span>
<span style="color: #000088;">$erNUM</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/[0-9]*/'</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//aceita somente numeros</span>
<span style="color: #000088;">$erALL</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'*'</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//aceita qualquer coisa</span>
<span style="color: #000088;">$tipo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtoupper</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tipo</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$padrao</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'er'</span><span style="color: #339933;">.</span><span style="color: #000088;">$tipo</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//faço concatenação do prefixo 'er' com o tipo, para formar o nome da variavel com o padrao correto.</span>
<span style="color: #000088;">$valor</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">htmlentities</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$valor</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&amp;lt;a&amp;gt;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//limpo a variavel com valor, retirando possíveis funções do PHP ou tags HTML que possam ser prejudiciais ao sistema, mas permitindo algumas que podem ser uteis em determinados casos</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$$padrao</span><span style="color: #339933;">,</span> <span style="color: #000088;">$valor</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'O dado passou pela validação de padrão.&amp;lt;br/&amp;gt;'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//podemos validar melhor alguns dados</span>
<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$tipo</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'CPF'</span><span style="color: #339933;">:</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> validaCPF<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$valor</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'O CPF é válido.'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'O CPF não é valido'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//você pode por um 'case' para cada tipo de dado que quiser validar com alguma formula especifica</span>
<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'O dado foi validado'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'O dado não passou pela validação de padrão.&amp;lt;br/&amp;gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Bom, este é um exemplo de função que poderíamos utilizar para validação de dados, podendo ser inserida em uma classe com um método dela.</p>
<p>Mas como utilizamos ela? Simples, veja( supondo que temos vindo de um formulário um campo email, via POST:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> valida<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'email'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Email válido'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Email inválido'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Fica fácil não?</p>
<p>Bom, nesta função, é chamada outra função ( validaCPF ), que não é de minha autoria, e que dei os devidos <a title="autor: Jefferson Estanislau da Silva" href="http://www.vivaolinux.com.br/scripts/verScript.php?codigo=401" onclick="pageTracker._trackPageview('/outgoing/www.vivaolinux.com.br/scripts/verScript.php?codigo=401&amp;referer=');">créditos</a> na parte 3 desta série. Esta função implementa o algoritmo de validação do CPF, com seu digito verificador e tudo mais. É um algoritmo muito difundido, e bem documentado na internet, faça uma busca se estiver interessado no assunto. É  interessante.</p>
<p><a title="Veja ele em uso" href="http://cauancabral.net/blog/wp-content/uploads/2008/02/validacao.php">Função para validação de dado</a> &#8211; <a title="( veja o fonte )" href="http://cauancabral.net/blog/wp-content/uploads/2008/02/validacao.txt">( veja o fonte )</a><a title="Baixe o arquivo do exemplo" href="http://cauancabral.net/blog/wp-content/uploads/2008/02/validacao.php"> </a></p>
<p>É isso, espero ter ajudado, qualquer coisa, mail-me.</p>
<p>Até a próxima.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li><li><a href="http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; Parte 3</a></li><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a href="http://cauancabral.net/2008/12/12/3f-ferias-da-faculdade-finalmente/" rel="bookmark" class="crp_title">3F: Férias da Faculdade, Finalmente.</a></li><li><a href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Valida&#231;&#227;o de dados em PHP5 &#8211; Parte 3</title>
		<link>http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/</link>
		<comments>http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 12:13:32 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[er]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/</guid>
		<description><![CDATA[Depois de um longo período sem nada útil, vamos continuar a série mais querida deste blog: “Validação de dados em PHP5”. Está é a parte 3 da série, e talvez a última ( a menos que surjam pedidos ou dúvidas &#8230; <a href="http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Depois de um longo período sem nada útil, vamos continuar a série mais querida deste blog: “Validação de dados em PHP5”.</p>
<p>Está é a parte 3 da série, e talvez a última ( a menos que surjam pedidos ou dúvidas ) da série, se você não viu, veja: parte 1, parte 2.</p>
<p>Como falei na parte 2, o PHP trabalha com dois padrões de ER ( Expressões Regulares ): o padrão PCRE e o padrão POSIX. Adotaremos de agora em diante o padrão PCRE por ser recomendado pelo próprio manual do PHP.</p>
<p>Na última parte fizemos a validação de um número de CEP.</p>
<p>Agora veremos outros casos de uso, primeiro dois casos simples como o do CEP, um para validar um número de telefone ( possivelmente de celular ) e outro para validar um endereço de email – este último muito útil e utilizado, pois permite uma alta confiabilidade nos dados verificados.</p>
<p>Nossa ER para validar um telefone:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$telER</span> <span style="color: #339933;">=</span> ‘<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span>\<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#125;</span>\<span style="color: #009900;">&#41;</span>\ <span style="color: #009900;">&#41;</span>?<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#125;</span>\<span style="color: #339933;">-</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">9</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">/</span>’<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//formato: (67) 9999-0000</span></pre></td></tr></table></div>

<p>Simples não é? Que tal “complicar” um pouco mais? Então compliquemos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//formato: 0556733334444 ou 06733334444 ou 3333-4444</span>
&nbsp;
<span style="color: #000088;">$telER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/(0((([0-9]{2}){2})|([0-9]{2})))?[0-9]{3,5}[0-9]{4}/'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>E como validar uma data? Fácil fácil&#8230;</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//formato: 01/01/1001</span>
&nbsp;
<span style="color: #000088;">$dataER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}/'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Validar um CNPJ:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//formato: 11.222.333/0001-01</span>
&nbsp;
<span style="color: #000088;">$cnpjER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/[0-9]{2}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}\-[0-9]{2}/'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Depois que a gente começa, não da vontade de parar, mas parem mesmo assim. Agora que já viram alguns exemplos de ER, tentem fazer a de vocês mesmos. Façam uma ER para validar uma idade ( considerem que existe gente com mais de 100 anos ).</p>
<p>Depois de você ter feito suas ER, pode continuar&#8230;</p>
<p>Vamos validar um endereço de email agora:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//formato: nome@host.com ou nome@subhost.host.com</span>
&nbsp;
<span style="color: #000088;">$emailER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/[[:alnum:]]\@[[:alnum:]]+(\.[[:alnum:]])+/'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Será que já ta bom?</p>
<p>Não, mas chega de mostrar ER pronta para vocês, ta, uma última vez, fiz um arquivo de teste explicando algumas ER: <a href="http://cauancabral.net/teste-regex2.php" title="Expressão Regulares">Expressões Regulares</a> . Espero que seja útil.</p>
<p>Lembrem-se que estou utilizando o padrão PCRE, então nada de usar estas expressões com as funções “ereg”.</p>
<p>Enquanto escrevia esta parte, pensei em algumas coisas para continuação. Então, ainda esta semana concluo.</p>
<p>Até.</p>
<p>ps.: para quem ver o arquivo e ficar curioso sobre a verificação extra do CPF, saiba que é utilizado o Algoritmo de Validação do CPF ( procure por este termo no Google ) implementado em PHP pelo Jefferson Estanislau da Silva e disponibilizado no link: <a href="http://www.vivaolinux.com.br/scripts/verScript.php?codigo=401" onclick="pageTracker._trackPageview('/outgoing/www.vivaolinux.com.br/scripts/verScript.php?codigo=401&amp;referer=');">http://www.vivaolinux.com.br/scripts/verScript.php?codigo=401</a>. Fiz algumas alterações, pois no original, usava ER no padrão POSIX. Darei mais detalhes na continuação.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li><li><a href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li><li><a href="http://cauancabral.net/2008/12/12/3f-ferias-da-faculdade-finalmente/" rel="bookmark" class="crp_title">3F: Férias da Faculdade, Finalmente.</a></li><li><a href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validação de dados em PHP5 &#8211; Parte 2</title>
		<link>http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/</link>
		<comments>http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 22:59:33 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[er]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/</guid>
		<description><![CDATA[Continuando a série de artigos sobre validação de dados ( veja a primeira parte ) com PHP5. Nota: usarei “cliente” para me referir a um usuário do sistema, ou mesmo outro sistema que interaja conosco. Usarei também ER para designar &#8230; <a href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Continuando a série de artigos sobre validação de dados ( veja a primeira parte ) com PHP5.</p>
<p class="MsoNormal"><em>Nota: usarei “cliente” para me referir a um usuário do sistema, ou mesmo outro sistema que interaja conosco. Usarei também ER para designar expressão regular, que é o assunto base <a href="http://cauancabral.wordpress.com/2008/01/02/validacao-de-dados-em-php5-parte-1/" title="Validação de Dados em PHP5 - Parte 1" onclick="pageTracker._trackPageview('/outgoing/cauancabral.wordpress.com/2008/01/02/validacao-de-dados-em-php5-parte-1/?referer=');">deste post</a>.</em></p>
<p class="MsoNormal"><a href="http://cauancabral.wordpress.com/2008/01/02/validacao-de-dados-em-php5-parte-1/" title="Validação de Dados em PHP5 - Parte 1" onclick="pageTracker._trackPageview('/outgoing/cauancabral.wordpress.com/2008/01/02/validacao-de-dados-em-php5-parte-1/?referer=');">Anteriormente</a>, havíamos abordado uma validação mais geral, onde tínhamos de aceitar vários tipos de dados.</p>
<p class="MsoNormal">Agora, vamos abordar uma situação onde esperamos um dado específico vindo do cliente &#8211; usarei “cliente” para referir tanto ao usuário do sistema quanto outros sistemas &#8211; por exemplo, em um campo de formulário, onde esperamos um nome ou um email.</p>
<p>Um dos recursos mais eficientes em se tratando de validação é o uso de <em>expressões regulares</em>. E é com isto que iremos trabalhar.</p>
<p class="MsoNormal">Vamos a uma definição:</p>
<p class="MsoNormal">“Uma <strong>expressão regular</strong>, na <a href="http://pt.wikipedia.org/wiki/Inform%C3%A1tica" title="Informática" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Inform_C3_A1tica?referer=');">Informática</a>, define um padrão a ser usado para procurar ou substituir palavras ou grupos de palavras. É um meio preciso de se fazer buscas de determinadas porções de texto.” Fonte: <a href="http://pt.wikipedia.org/wiki/Express%C3%A3o_regular" title="Enciclopédia Livre - Expressões Regulares" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Express_C3_A3o_regular?referer=');">Wikipédia.</a></p>
<p class="MsoNormal">Então uma <em>expressão regular</em> é um padrão. Por isso não podemos utilizar uma expressão regular para validar algo que desconhecemos, porque seria muito difícil ou mesmo impossível encontrar um padrão para tudo.</p>
<p class="MsoNormal">Não pretendo explicar os fundamentos de uma expressão regular, se desejar alguma referência, recomendo o site: <a href="http://guia-er.sourceforge.net/" title="Guia de Expressões Regulares" onclick="pageTracker._trackPageview('/outgoing/guia-er.sourceforge.net/?referer=');">http://guia-er.sourceforge.net</a></p>
<p class="MsoNormal">Como podemos utilizar uma expressão regular para validar um campo de um formulário?<span>  </span>Precisamos de uma função do PHP que faça esta verificação para a gente, uma função que compare nossa expressão regular com o valor a ser testado.</p>
<p class="MsoNormal">O PHP oferece algumas funções para isso, vejamos duas delas:</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong>ereg</strong>( string $expressão<span>  </span>, string $variável<span>  </span>[, array $registros<span>  </span>] )</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Retorna <tt><strong><span style="font-family: 'Times New Roman'">TRUE</span></strong></tt> se <tt><em><span style="font-family: 'Times New Roman'">$variável</span></em></tt> “bater” com <tt><em><span style="font-family: 'Times New Roman'">$expressão</span></em></tt>, e <tt><strong><span style="font-family: 'Times New Roman'">FALSE</span></strong></tt> se a expressão não casar ou se acontecer algum erro. <a href="http://br.php.net/manual/pt_BR/function.ereg.php" title="Referência da função em Português" target="_blank" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.ereg.php?referer=');">referência</a></p>
<blockquote><p> //nossa ER, um padrão para CEP<br />
$cepER = &#8216;^[0-9]{5}\-[0-9]{3}$&#8217;;<br />
//vamos supor que temos a variável $_POST['cep'] vinda de um formulário</p>
<p>//fazemos então a verificação<br />
if( ereg( $cepER, $_POST['cep'] ) )<br />
echo &#8220;Isso parece um CEP válido&#8221;;<br />
else<br />
echo &#8220;Isso não é um CEP válido&#8221;;</p></blockquote>
<p class="MsoNormal">Por que não podemos afirmar se o CEP está correto? Simplesmente porque com a ER analisamos apenas a forma da variável, ou seja, se ela tem o mesmo número de caracteres, se são do mesmo tipo e estão nas mesmas posições. Para afirmarmos com segurança que o CEP é válido, teríamos de verificar se o valor está cadastrado nos Correios ou em alguma outra fonte segura. Mas isso foge ao nosso escopo.</p>
<p class="MsoNormal">Essa função <strong>ereg </strong>permite fazer a buscar por um padrão em uma string utilizando padrão POSIX, mas o PHP fornece outra função para a mesma tarefa, com desempenho melhor, e baseado no padrão PCRE ( compatível com PERL ). Esta função é a <strong>preg_match</strong>.</p>
<p class="MsoNormal"><strong>preg_match</strong>( string $expressão , string $variável [, array &amp;$matches [, int $flags [, int $offset ]]] )</p>
<p class="MsoNormal">Retorna 1 se a $variável “bater” com a $expressão, e 0 caso contrário. <a href="http://br.php.net/manual/pt_BR/function.preg-match.php" title="Referência da função em inglês" target="_blank" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.preg-match.php?referer=');">referência</a>.</p>
<p class="MsoNormal">Vamos ver o uso do preg_match na mesma situação do exemplo anterior:</p>
<blockquote>
<p class="MsoNormal">//nossa ER, um padrão para CEP<br />
$cepER = ‘/[0-9]{5}\-[0-9]{3}/’;</p>
<p>//vamos supor que temos a variável $_POST['cep'] vinda de um formulário<br />
//fazemos então a verificação, poderíamos omitir o &#8220;== 1&#8243;, já que o PHP converte 0 e 1 para <em>false</em> e <em>true</em> respectivamente<br />
if( preg_match ( $cepER, $_POST[‘cep’] ) == 1 )<br />
echo “Isso parece um CEP válido”;<br />
else<br />
echo “Isso não é um CEP válido”;</p></blockquote>
<p class="MsoNormal">Notem a diferença na nossa ER. Mudamos os caracteres de inicio e final, isto acontece por conta da diferença entre os padrões que as funções utilizam.</p>
<p class="MsoNormal">O artigo já está muito grande, continuarei a falar sobre ER nos próximos artigos. Vamos ver como criar ER para validar telefone, email e por último CPF ( que incluiremos outro teste de validação além da ER ).</p>
<p class="MsoNormal">Uma última dica, utilizem ER juntamente com o método do artigo anterior, para aumentar a segurança de seu sistema ( pense em outras formas para isso também ).</p>
<p class="MsoNormal">Por enquanto é só.</p>
<p class="MsoNormal">Não esqueçam de validar tudo.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 1</a></li><li><a href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li><li><a href="http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; Parte 3</a></li><li><a href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/" rel="bookmark" class="crp_title">Desenvolvimento rápido</a></li><li><a href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Validação de dados em PHP5 &#8211; Parte 1</title>
		<link>http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/</link>
		<comments>http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 21:41:02 +0000</pubDate>
		<dc:creator>Cauan Cabral</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[validação]]></category>

		<guid isPermaLink="false">http://geek.cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/</guid>
		<description><![CDATA[Olá a todos, nesta série de artigos ( espero eu ) estarei dando algumas dicas de como tratar valores com o PHP. Uma preocupação cada vez maior ao se criar sistemas é a segurança, e um das áreas em que &#8230; <a href="http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal">Olá a todos, nesta série de artigos ( espero eu ) estarei dando algumas dicas de como tratar valores com o PHP.</p>
<p class="MsoNormal">Uma preocupação cada vez maior ao se criar sistemas é a segurança, e um das áreas em que devemos ter maior preocupação é na hora de usar informações provenientes de agentes externos ( pessoas ou outros sistemas ).</p>
<p class="MsoNormal">Temos de levar sempre em consideração que nunca poderemos prever todas as maneiras que um usuário ( ou mesmo outro sistema ) utiliza nosso código. Os usuários sempre arrumam uma forma &#8220;inovadora&#8221; de usar nossos sistemas, podendo causar falhas críticas no mesmo. Então, sempre que for criar um sistema que interaja com alguém, proteja-se de todas as maneiras possíveis, e dependa o mínimo possível de fatores externos ( como boa vontade e conhecimento do usuário, ou que o sistema alheio não falhe ).</p>
<p class="MsoNormal">A palavra de ordem é: &#8220;Valide TUDO&#8221;. Sim, qualquer coisa que venha de fora de seu sistema tem de passar por validação. Seja um valor utilizado para atribuição à variável, seja para uma consulta à um banco de dados, tudo deve ser validado.</p>
<p class="MsoNormal">Nesta primeira parte, falarei sobre o tratamento de variáveis vindas do cliente ( usuário ou sistema ) pelos arrays superglobais $_POST e $_GET, e que não sabemos ao certo o que esperar ( ou seja, podemos utilizar este método para receber um nome, telefone, email, data ou qualquer outro dado suportado pelo PHP ).</p>
<p class="MsoNormal">Abaixo segue um método que utilizo para tratar estes valores:</p>
<blockquote>
<p class="MsoNormal"><span>public function __set( &amp;$atributo, $valor )<br />
{<br />
//Testa se existe algum valor a ser utilizado na atribuição<br />
if( !empty($valor) )<br />
{<br />
//Faz a conversão de tipo, como o PHP tem uma tipação fraca ( ou seja, deixa você atribuir uma String em um váriavel que tinha um Número ), isto pode ajudar.<br />
settype( $valor, gettype($atributo) );</span></p>
<p>//Verifico se magic_quotes_gpc está ativo na configuração do PHP, isto será removido no PHP 6( <a href="http://br.php.net/manual/pt_BR/ref.info.php#ini.magic-quotes-gpc" title="Referência da função em Português" target="_blank" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/ref.info.php_ini.magic-quotes-gpc?referer=');">veja sobre isto</a> )<br />
if (!get_magic_quotes_gpc())<br />
//Adiciono caracter de scape em tudo o que possa ser perigoso ( <a href="http://br.php.net/manual/pt_BR/function.addslashes.php" target="_blank" title="Referência para a função addslashes" onclick="pageTracker._trackPageview('/outgoing/br.php.net/manual/pt_BR/function.addslashes.php?referer=');">veja mais sobre isso</a> )<br />
$valor = addslashes($valor);<br />
//Faço a atribuição normalmente.<br />
$atributo = $valor;<br />
}<br />
}</p></blockquote>
<p class="MsoNormal">Este é um método que pode ser incluído em qualquer classe. Ele possui um nome especial &#8220;__set&#8221;, que para o PHP, indica que ele será usado toda vez que for feita uma atribuição de valor para um atributo da classe ( posso falar mais sobre os métodos especiais do PHP5 em um próximo post ).</p>
<p class="MsoNormal">Por exemplo, quando utilizarmos o comando abaixo, atribuindo o valor nome do array $_GET ao atributo nome de nossa classe:</p>
<blockquote><p>  $classe-&gt;nome = $_GET['nome'];</p></blockquote>
<p class="MsoNormal">O PHP interpretará como:</p>
<blockquote><p>  $classe-&gt;__set( nome, $_GET['nome'] );</p></blockquote>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">e fará todas as verificações que contém no método.</p>
<p class="MsoNormal">Podemos utilizar outras funções de validação em nosso método, mas temos de tomar cuidado para não restringir demais os dados, lembrando sempre que esta validação será usada TODA vez que fizermos uma atribuição.</p>
<p class="MsoNormal">Poderíamos por exemplo refinar nossa validação utilizando expressões regulares, mas isso provavelmente não lhe traria bons resultados, pois uma expressão regular define uma regra que deve ser seguida, e no nosso caso, nós não sabemos o que esperar, então como poderia impor uma regra? Perderíamos muitos dados corretos utilizando uma expressão regular ( a menos que ela fosse pouco restritiva, o que faria perder sua função ).</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">Por enquanto é isto.</p>
<p class="MsoNormal">Espero ter ajudado, e até a próxima.</p>
<div id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li><li><a href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li><li><a href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a href="http://cauancabral.net/2009/07/26/classe-para-fazer-contagem-de-linhas-e-bonus/" rel="bookmark" class="crp_title">Classe para fazer Contagem de Linhas e Bônus</a></li><li><a href="http://cauancabral.net/2009/01/14/ajax-com-prototype/" rel="bookmark" class="crp_title">AJAX com Prototype</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://cauancabral.net/2008/01/02/validacao-de-dados-em-php5-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
