<?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>DigitalDev &raquo; DigitalDev</title>
	<atom:link href="http://www.digitaldev.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.digitaldev.com.br</link>
	<description>Para quem gosta de programar</description>
	<lastBuildDate>Thu, 09 Feb 2012 17:04:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[Dica] Instalando o Plugin do flash no Google Chrome no Debian Squeeze</title>
		<link>http://www.digitaldev.com.br/2012/01/29/dica-instalando-o-plugin-do-flash-no-google-crhome-no-debian-squeeze/</link>
		<comments>http://www.digitaldev.com.br/2012/01/29/dica-instalando-o-plugin-do-flash-no-google-crhome-no-debian-squeeze/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 02:16:17 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Squeeze]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=703</guid>
		<description><![CDATA[Essa semana, instalei o Browser Google Chrome no meu Desktop com Debian 6 Squeeze para testar o comportamento de alguns layouts em que estou trabalhando. Como já era esperado, ainda era necessário a instalação do plugin do flash player para poder visualizar algumas animações e videos. Ao longo da tarefa de instalação do plugin, enfrentei &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2012/01/29/dica-instalando-o-plugin-do-flash-no-google-crhome-no-debian-squeeze/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2012/01/29/dica-instalando-o-plugin-do-flash-no-google-crhome-no-debian-squeeze/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2012/01/29/dica-instalando-o-plugin-do-flash-no-google-crhome-no-debian-squeeze/" data-text="[Dica] Instalando o Plugin do flash no Google Chrome no Debian Squeeze" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2012/01/29/dica-instalando-o-plugin-do-flash-no-google-crhome-no-debian-squeeze/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2012/01/adobe_flash_logo_640x360_130953449580_640x360.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2012/01/adobe_flash_logo_640x360_130953449580_640x360-e1327886778667.jpg" alt="" title="adobe_flash_logo_640x360_130953449580_640x360" width="350" height="360" class="aligncenter size-full wp-image-704" /></a></p>
<p>Essa semana, instalei o Browser Google Chrome no meu Desktop com Debian 6 Squeeze para testar o comportamento de alguns layouts em que estou trabalhando. Como já era esperado, ainda era necessário a instalação do plugin do flash player para poder visualizar algumas animações e videos.</p>
<p>Ao longo da tarefa de instalação do plugin, enfrentei alguns problemas na tentativa de encontrar repositórios para o download do mesmo. Então, decidi instalar o flash player na mão e com isso postar os passos usados por mim na instalação.<br />
<span id="more-703"></span></p>
<h3>1 &#8211; Passo (Efetuando o download do plugin)</h3>
<p>Vá até a página do Adobe Flash Player clicando <a href="http://get.adobe.com/br/flashplayer/?no_redirect" target="_blank"><strong>aqui</strong></a>, selecione o sistema operacional e navegador (no nosso caso o Chrome) que você está usando e escolha como tipo de arquivo pra download <strong>&#8220;tar.gz para outro linux&#8221;</strong>. Logo após, clique em <strong>Baixe Agora</strong>.</p>
<h3>2 &#8211; Passo (Descompactando e instalando o plugin)</h3>
<p>Após a finalização do download, abra o terminal (<strong>Aplicativos > Acessórios > Terminal</strong>) e navegue até a posta onde o arquivo do plugin foi descarregado (geralmente em <strong>~/Downloads</strong>).</p>
<p><strong>cd ~/Downloads</strong></p>
<p>Agora, descompacte o arquivo do plugin (no meu caso, o plugin se chama install_flash_player_11_linux.x86_64.tar.gz) </p>
<p><strong>tar -zxf install_flash_player_11_linux.x86_64.tar.gz</strong></p>
<p>Se você estiver logado no sistema como um usuário incluso no grupo de sudoers (usuários que podem usar o comando sudo), execute o comando para mover o arquivo do plugin para o diretório <strong>/opt/google/chrome</strong></p>
<p><strong>sudo mv libflashplayer.so /opt/google/chrome</strong></p>
<p>Caso contrário, logue-se como <strong>root</strong> usando o comando <strong>su</strong> e então mova o arquivo para o diretório <strong>/opt/google/chrome</strong> usando o comando</p>
<p><strong>mv libflashplayer.so /opt/google/chrome</strong></p>
<p>Feche o Google Chrome e abra novamente, nesse momento o seu navegador já estará configurado para mostrar à você animações e videos em flash</p>
<p>Com esse post, espero ajudar pessoas que estão enfrentando ou irão enfrentar o mesmo problema que eu. Qualquer dúvida, usem a área de perguntas e respostas abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2012/01/29/dica-instalando-o-plugin-do-flash-no-google-crhome-no-debian-squeeze/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intercalando cores entre linhas de uma tabela ou lista usando CSS3</title>
		<link>http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/</link>
		<comments>http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 18:01:31 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML / XHTML]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[lista]]></category>
		<category><![CDATA[lista zebrada]]></category>
		<category><![CDATA[tabela]]></category>
		<category><![CDATA[tabela zebrada]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=687</guid>
		<description><![CDATA[Intercalar as cores de um uma tabela ou lista está muito presente no dia a dia de um programador ou webdesigner. Se você é desenvolvedor web, sabe bem do que estou falando. Já vi muitos programadores escrevem códigos PHP ou ASP para produzir esse efeito de zebra, já vi tambem alguns webdesigners usam CSS + &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/" data-text="Intercalando cores entre linhas de uma tabela ou lista usando CSS3" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg" alt="" title="css-cascading-style-sheets" width="260" height="187" class="aligncenter size-full wp-image-578" /></a></p>
<p>Intercalar as cores de um uma tabela ou lista está muito presente no dia a dia de um programador ou webdesigner. Se você é desenvolvedor web, sabe bem do que estou falando.</p>
<p>Já vi muitos programadores escrevem códigos PHP ou ASP para produzir esse efeito de zebra, já vi tambem alguns webdesigners usam CSS + JavaScript para isso. Mas, graças ao CSS3, isso se tornou possível usando apenas duas linhas de código CSS.<br />
<span id="more-687"></span></p>
<pre class="brush: css; title: ; notranslate">
tr:nth-child(even) {background: #FFF}
tr:nth-child(odd) {background: #EEE}
</pre>
<p>onde &#8220;even&#8221; corresponde às linhas pares e &#8220;odd&#8221; às linhas impáres.</p>
<p>esse pequeno bloco de código pode tambem ser usado em conjunto com vários outros componentes HTML ou em classes CSS. Veja um exemplo do uso em Listas.</p>
<pre class="brush: css; title: ; notranslate">
li:nth-child(even) {background: #FFF}
li:nth-child(odd) {background: #EEE}
</pre>
<p>Agora, veja um exemplo do uso do zebrado anexado a uma classe css feita para formatar uma tabela.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;style type=&quot;text/css&quot;&gt;

		/*css global tabela*/
		.full_table_list{width: 200px;border-collapse: collapse;}

		/*colocando bordas nas linhas*/
		.full_table_list tr{border:1px black solid;}

		/*Definido cor das linhas pares*/
		.full_table_list tr:nth-child(even) {background: #FFF}

		/*Definindo cor das Linhas impáres*/
		.full_table_list tr:nth-child(odd) {background: #EEE}		

	&lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
	&lt;table class=&quot;full_table_list&quot;&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 1
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 2
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 3
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;
				Linha 4
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Isso reproduziu o efeito mostrado na imagem abaixo.</p>
<p><img src="http://www.digitaldev.com.br/wp-content/uploads/2012/01/zebrado.jpg" alt="" title="Tabela zebrada" width="273" height="155" class="aligncenter size-full wp-image-691" /></p>
<p>Eu não sou nenhum especialista em CSS, mas se houver alguma dúvida relacionado ao assunto do post, usem a área de perguntas e respostas abaixo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2012/01/27/intercalando-cores-entre-linhas-de-uma-tabela-ou-lista-usando-css3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comunicando-se com o Facebook usando PHP</title>
		<link>http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/</link>
		<comments>http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 21:38:44 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Facebook API]]></category>
		<category><![CDATA[Facebook SDK em PHP]]></category>
		<category><![CDATA[Integração]]></category>
		<category><![CDATA[Integração do Facebook com PHP]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=611</guid>
		<description><![CDATA[Com o crescimento do Facebook como rede social, o desejo de desenvolvedores e donos de sites em conectar suas aplicações web com a mais famosa rede social do mundo vem se tornando cada vez mais comum. Se você se enquadra nesse grupo de desenvolvedores, então veio ao lugar certo, pois nesse post irei explicar como &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/" data-text="Comunicando-se com o Facebook usando PHP" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/facebook-logo.jpg"><img class="aligncenter size-full wp-image-642" title="facebook-logo" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/facebook-logo.jpg" alt="" width="300" height="121" /></a></p>
<p>Com o crescimento do Facebook como rede social, o desejo de desenvolvedores e donos de sites em conectar suas aplicações web com a mais famosa rede social do mundo vem se tornando cada vez mais comum.</p>
<p>Se você se enquadra nesse grupo de desenvolvedores, então veio ao lugar certo, pois nesse post irei explicar como conectar o seu site feito em PHP com o Facebook seguindo alguns passos e usando uma classe de comunicação escrita em PHP.<br />
<span id="more-611"></span></p>
<h4>1º Passo &#8211; Criando uma App no Facebook</h4>
<p>Antes de começarmos, precisaremos criar uma App do Facebook, ela servirá como um canal de comunicação entre o nosso script PHP e a rede social.</p>
<p>Entre no <a href="http://facebook.com" target="_blank">Facebook</a> e efetue login usando seu usuário e senha, logo após, acesse a página de desenvolvedores do Facebook pelo endereço <a href="https://developers.facebook.com/" target="_blank">https://developers.facebook.com/</a> e clique em <strong>Aplicativos</strong>.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook1.jpg"><img class="aligncenter size-full wp-image-615" title="app_facebook1" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook1.jpg" alt="" width="500" height="346" /></a></p>
<p>Na próxima página, clique em <strong>+ Criar Novo Aplicativo</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook2.jpg"><img class="aligncenter size-full wp-image-617" title="app_facebook2" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook2.jpg" alt="" width="379" height="162" /></a></p>
<p>Uma caixa de formulário se abrirá no meio da tela, preencha a mesma de acordo com os dados (nome) do aplicativo que você deseja criar e clique em <strong>Continuar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook3-e1322961226746.jpg"><img class="aligncenter size-full wp-image-619" title="app_facebook3" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook3-e1322961226746.jpg" alt="" width="500" height="181" /></a></p>
<p>Na próxima página, preencha o campo de validação de acordo com o texto que aparece na imagem e clique em <strong>Enviar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4.jpg"><img class="aligncenter size-full wp-image-621" title="app_facebook4" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4-e1322961589797.jpg" alt="" width="500" height="188" /></a></p>
<p>Para garantir que sua conta de usuário no Facebook está realmente ligada a uma pessoa e que ela não é uma conta fake, o Facebook dirá que a conta precisa ser verificada. Você poderá fazer isso adicionando seu número de celular o cartão de credito (se você for usuário das operadoras Vivo ou Oi, aconselho optar pela validação por cartão de crédito)</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5.jpg"><img class="aligncenter size-full wp-image-622" title="app_facebook5" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5-e1322961887417.jpg" alt="" width="500" height="231" /></a></p>
<blockquote><p>Observação: Se sua conta no Facebook já foi validada anteriormente, você será redirecionado para a pagina final da criação do App.</p></blockquote>
<h5>Validação por Celular</h5>
<p>Ao escolher a validação por celular, uma janela para adicionar seu telefone será exibida. Preencha a mesma como seu telefone e clique em <strong>Confirmar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook6.jpg"><img class="aligncenter size-full wp-image-624" title="app_facebook6" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook6.jpg" alt="" width="473" height="327" /></a></p>
<p>Na próxima tela, um código será requisitado, provavelmente você recebeu esse código por SMS. Preencha o campo com tal código e clique novamente em <strong>Confirmar</strong>.</p>
<blockquote><p>Observação: Talvez o SMS demore alguns minutos, mas se o mesmo não chegar, clique em reenviar código ou refaça o procedimento optando pela validação por cartão de crédito.</p></blockquote>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook7.jpg"><img class="aligncenter size-full wp-image-625" title="app_facebook7" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook7.jpg" alt="" width="482" height="247" /></a></p>
<h5>Validação por Cartão de Crédito</h5>
<p>Ao escolher a validação por cartão de crédito, sua senha poderá ser novamente requisitada. Preencha o campo <strong>Senha</strong> e clique em <strong>Continuar</strong><br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook8.jpg"><img class="aligncenter size-full wp-image-631" title="app_facebook8" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook8.jpg" alt="" width="553" height="186" /></a></p>
<p>Preencha o formulário de acordo com os dados do seu cartão de crédito e clique em <strong>Salvar</strong>.<br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook9.jpg"><img class="aligncenter size-full wp-image-633" title="app_facebook9" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook9.jpg" alt="" width="549" height="496" /></a></p>
<p>Se tudo correu bem com a validação via cartão, o Facebook irá exibir os dados do seu cartão na próxima pagina.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook10.jpg"><img class="aligncenter size-full wp-image-635" title="app_facebook10" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook10.jpg" alt="" width="422" height="497" /></a></p>
<h4>Voltando para a criação do aplicativo</h4>
<p>Após os passos de validação da conta, tanto via telefone ou cartão de credito, volte a página de criação do aplicativo. Se você não fechou a mesma, a página de criação da APP deve estar aberta em paralelo com a de validação da conta, caso contrario, terá que recomeçar o processo de criação do App (o processo de validação da conta não se repetirá)</p>
<p>Na tela mostrada pela imagem abaixo, clique em <strong>Continuar</strong>.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5.jpg"><img class="aligncenter size-full wp-image-622" title="app_facebook5" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook5-e1322961887417.jpg" alt="" width="500" height="231" /></a></p>
<p>Novamente, você deve preencher o campo de validação de acordo com o texto que aparece na imagem mostrada pelo Facebook e clicar em <strong>Enviar</strong>.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4.jpg"><img class="aligncenter size-full wp-image-621" title="app_facebook4" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook4-e1322961589797.jpg" alt="" width="500" height="188" /></a></p>
<p>Se tudo correu bem até agora, uma página com os dados da sua App do Facebook será mostrada. Nela você poderá modificar os dados da aplicação e fazer upload de um ícone.</p>
<p>Nessa página, preencha o campo <strong>App Domain</strong> com o domínio do seu site e o campo <strong>Site Url</strong> com a url de onde seu código de integração se encontra. No meu caso, o meu dominio é <strong>digitaldev.com.br</strong> e a pasta onde coloquei o script de integração é <strong>http://digitaldev.com.br/facebook</strong>, por esse motivo, preenchi os campos como mostra a imagem abaixo.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook15.jpg"><img class="aligncenter size-full wp-image-668" title="app_facebook15" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook15.jpg" alt="" width="550" height="618" /></a></p>
<p>Ainda na mesma página, anote os números de <strong>App ID</strong> e <strong>App Secret</strong>. Pois eles serão usados pelo nosso script PHP para fazer referencia ao App do Facebook. Veja a localização dos mesmos visualizando a imagem abaixo.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook12.jpg"><img class="aligncenter size-full wp-image-639" title="app_facebook12" src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/app_facebook12.jpg" alt="" width="448" height="106" /></a></p>
<p>Ao final do processo, clique em <strong>Salvar alterações</strong></p>
<h4>2º Passo &#8211; Escrevendo o script PHP</h4>
<p>Para facilitar o nosso trabalho, iremos usar uma classe para gerenciar a comunicação entre nossa aplicação e o Facebook. Efetue o download da mesma clicando <a href="https://github.com/facebook/php-sdk/zipball/master" target="_blank">aqui</a>.</p>
<p>Ao descompactar o pacote, constataremos a existência de alguns exemplos de uso da classe, mas os arquivos que realmente serão usados são os que se encontram dentro da pasta <strong>src</strong>. Copie-os para uma pasta dentro da sua aplicação, pois você precisará efetuar um <strong>include</strong> ou <strong>require</strong> deles dentro do arquivo de integração.</p>
<p><strong>Vamos ao código PHP</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
//incluindo a classe de conexão com o facebook
require_once 'FacebookApi/facebook.php';

/*
* ID da App, vocé obteve isso na ultima
* página de geração do seu aplicativo no facebook
*/
$App_ID = '';

/*
* App Secret, você obteve isso na ultima
* página de geração do seu aplicativo no facebook
*/
$App_Secret = '';

//Instanciando o Objeto da classe do facebook
$facebook = new Facebook(array(
	    'appId'  =&gt; $App_ID ,
	    'secret' =&gt; $App_Secret
));

//Pegando Id do usuário Logado
$o_user = $facebook-&gt;getUser();

/*
* Verificando se está conectado
*/
if($o_user == 0)
{

	//Envia para a página de permissão do facebook, nela voce irá dar permissão ao aplicativo
	//acessar dados da sua conta
	$url = $facebook-&gt;getLoginUrl(array('scope' =&gt; array('publish_stream','read_stream')));
	header(&quot;Location:&quot;.$url);
}
else
{
	//Verificando se o comando de logout foi enviado
	if($_GET['action'] == 'finish' )
	{
		//Retirando a permissão do Aplicativo à sua conta no facebook
		session_destroy();
		header('Location: '.$facebook-&gt;getLogoutUrl());
	}
	else
	{
		//Atualizando seu status no facebook
		if( $_GET['action'] == 'publish' &amp;&amp; strlen($_POST['status']) &gt; 0 )
		{
			$post =  array('message' =&gt; $_POST['status']);
			$feed = $facebook-&gt;api('/me/feed', 'POST', $post);
		}
		else
		    //pegando as publicações do seu mural
			$feed = $facebook-&gt;api('/me/feed');
			//Use ver_dump($feed) ou print_r($feed)
			//para ver todos os campos retornados

		//pegando as informações do usuário conectado
		$me = $facebook-&gt;api('/me');
		//Use ver_dump($me) ou print_r($me)
		//para ver todos os campos retornados

		//pegando as publicações da sua home
		$home = $facebook-&gt;api('/me/home');
		//Use ver_dump($home) ou print_r($home)
		//para ver todos os campos retornados
	}
}

?&gt;

&lt;!DOCTYPE unspecified PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
  &lt;head&gt;
   &lt;title&gt;Integração com o Facebook&lt;/title&gt;
   &lt;meta content='text/html; charset=utf-8' http-equiv='Content-Type'&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;div align=&quot;center&quot;&gt;
	&lt;table width='600' border='1'&gt;
		&lt;tr&gt;
			&lt;td colspan=&quot;4&quot; align=&quot;center&quot;&gt;
				&lt;a href=&quot;&lt;?php echo $me['link']?&gt;&quot;&gt;
					&lt;?php echo $me['name']?&gt;
				&lt;/a&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td align=&quot;right&quot;&gt;
				Primeiro Nome:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['first_name']?&gt;
			&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;
				Ultimo Nome:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['last_name']?&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td align=&quot;right&quot;&gt;
				Cidade Natal:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['hometown']['name']?&gt;
			&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;
				Cidate onde mora:
			&lt;/td&gt;
			&lt;td align=&quot;center&quot;&gt;
				&lt;?php echo $me['location']['name']?&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
	&lt;br/&gt;

	&lt;?php
	//Imprimindo publicações do mural do usuário
	if(is_array($feed['data']))
	{
	?&gt;
		&lt;table width=&quot;700&quot; border=&quot;1&quot;&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					Seu Mural
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			foreach($feed['data'] AS $hist)
			{
			?&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					&lt;?php
					if(isset($hist['story']))
						echo $hist['story'];
					else
					{
						echo $hist['message'].'&lt;br/&gt;';
						if(isset($hist['picture']))
						?&gt;
						&lt;img src='&lt;?php echo $hist['picture']?&gt;'&gt;
						&lt;?php
					}
					?&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			}
			?&gt;
		&lt;/table&gt;
		&lt;br/&gt;
	&lt;?php
	}
	?&gt;

	&lt;?php
	//imprimindo publicações da home do usuário
	if(is_array($home['data']))
	{
	?&gt;
		&lt;table width=&quot;700&quot; border=&quot;1&quot;&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					Home
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			foreach($home['data'] AS $hist)
			{
			?&gt;
			&lt;tr&gt;
				&lt;td align=&quot;center&quot;&gt;
					&lt;?php
					if(isset($hist['story']))
						echo $hist['story'];
					else
					{
						echo $hist['message'].'&lt;br/&gt;';
						if(isset($hist['picture']))
						?&gt;
						&lt;img src='&lt;?php echo $hist['picture']?&gt;'&gt;
						&lt;?php
					}
					?&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			}
			?&gt;
		&lt;/table&gt;
		&lt;br/&gt;
	&lt;?php
	}
	?&gt;

	&lt;div&gt;
		&lt;form action=&quot;?action=publish&quot; method=&quot;POST&quot;&gt;
			&lt;textarea name=&quot;status&quot; rows=&quot;4&quot; cols=&quot;20&quot;&gt;&lt;/textarea&gt;
		&lt;br/&gt;
		&lt;button type=&quot;submit&quot;&gt;Enviar&lt;/button&gt;
		&lt;/form&gt;
	&lt;/div&gt;

	&lt;a href=&quot;?action=finish&quot;&gt;Sair&lt;/a&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Como você pode observar no código acima, eu copiei todo o conteúdo da pasta <strong>src</strong> do pacote que fizemos download para uma pasta chamada <strong>FacebookApi</strong> na raiz da pasta do meu script.</p>
<p>Para ver esse código funcionando, acesse <a href="http://digitaldev.com.br/facebook" target="_blank">http://digitaldev.com.br/facebook</a></p>
<p>Para fazer o download do código fonte do exemplo acima, clique <a href="http://digitaldev.com.br/downloads/facebook.zip">aqui</a></p>
<p>Para melhorar o seu entendimento do código do exemplo, leia as documentações abaixo.<br />
Graph API &#8211; <a href="https://developers.facebook.com/docs/reference/api/" target="_blank">https://developers.facebook.com/docs/reference/api/</a><br />
PHP SDK overview &#8211; <a href="https://developers.facebook.com/docs/reference/php/" target="_blank">https://developers.facebook.com/docs/reference/php/</a></p>
<p>Espero ter ajudado aos leitores que desejam efetuar a integração entre uma aplicação em PHP e o Facebook. Qualquer dúvida, entre em contato usando a área de perguntas e respostas desse post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/12/04/se-comunicando-com-o-facebook-usando-php/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Plugin jQuery para criação de máscara de moedas</title>
		<link>http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/</link>
		<comments>http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 22:06:01 +0000</pubDate>
		<dc:creator>Elaine</dc:creator>
				<category><![CDATA[JavaScript / Ajax]]></category>
		<category><![CDATA[Campo moeda]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Mascara de formulários]]></category>
		<category><![CDATA[Máscara para dinheiro]]></category>
		<category><![CDATA[Máscara para moeda]]></category>
		<category><![CDATA[Validação de Dados]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=601</guid>
		<description><![CDATA[Web 2.0 está aí, exigindo cada vez mais interatividade dos sites com os usuários. Como conseguir isso? Um dos modos, é utilizando javascript, o que pode não ser tão fácil assim. Por isso, existem bibliotecas gratuitas com MooTools, Dojo, Script.aculo.us e Prototype, que simplificam o desenvolvimento de aplicações web. Entre elas, está jQuery, com vasta &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/" data-text="Plugin jQuery para criação de máscara de moedas" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/12/jquery-logo-300x61.png"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/12/jquery-logo-300x61.png" alt="" title="jquery-logo-300x61" width="300" height="61" class="aligncenter size-full wp-image-602" /></a><br />
Web 2.0 está aí, exigindo cada vez mais interatividade dos sites com os usuários.</p>
<p><strong>Como conseguir isso?</strong></p>
<p>Um dos modos, é utilizando javascript, o que pode não ser tão fácil assim.</p>
<p>Por isso, existem bibliotecas gratuitas com <a title="MooTools" href="http://mootools.net/">MooTools</a>, <a title="http://dojotoolkit.org/" href="http://dojotoolkit.org/">Dojo</a>, <a title="Script.aculo.us" href="http://script.aculo.us/">Script.aculo.us</a> e <a href="http://www.prototypejs.org/">Prototype</a>, que simplificam o desenvolvimento de aplicações web.<br />
<span id="more-601"></span><br />
Entre elas, está <strong><a title="jQuery" href="http://jquery.com/">jQuery</a></strong>, com vasta documentação e constante atualização.</p>
<p><strong>Mas&#8230; Por que utilizar jQuery?</strong></p>
<p>Porque ela pode reduzir o tempo de criação, por exemplo, de efeitos visuais em uma página html.<!--more--></p>
<p>Como o próprio slogan diz: &#8221; Escreva menos, faça mais&#8221; (<em>Write less, do more</em>).</p>
<p>É possível criar animações com pouquíssimas linhas de código javascript, ao invés de utilizar flash ou outros recursos.</p>
<p>Quer um exemplo? Que tal brincar um pouco com o efeito drag &#8216;n drop (arrastar e soltar) nessa página?</p>
<p><a title="http://jqueryui.com/demos/droppable/#photo-manager" href="http://jqueryui.com/demos/droppable/#photo-managerhttp://jqueryui.com/demos/droppable/#photo-manager"> http://jqueryui.com/demos/droppable/#photo-manager</a></p>
<p>Outro fator importante é a grande compatibilidade entre navegadores.</p>
<p>Você não precisa se preocupar com a criação de funções específicas para cada um; a biblioteca já compatibiliza o código para você.</p>
<p>É possível utilizar requisições ajax de maneira muito fácil.</p>
<p><strong>Gostou? Quer uma dica?</strong></p>
<p>O jQuery tornou-se popular pelos inúmeros plugins disponíveis na internet. Esses plugins permitem criar novas funções com base nessa biblioteca.</p>
<p>A dica de hoje é o plugin para criação de máscara para moeda em campos html, ou seja, esse campo exibirá as casas decimais na digitação, por exemplo, do preço de um produto.</p>
<p>Recomendo o plugin <a title="MaskMoney" href="https://github.com/plentz/jquery-maskmoney">MaskMoney</a>.</p>
<p>Qual a diferença dos demais?</p>
<p>Ele permite a edição do campo sem a necessidade de apagar o valor completamente.</p>
<p>Muitas das máscaras disponíveis apresentam um bug quanto a isso.</p>
<p>É possível também customizar a máscara, para exibição de mais de duas casas após a vírgula com apenas uma linha de código.</p>
<p>Simples, não?</p>
<p>Mas cuidado na criação de código jQuery. Lembrem-se sempre de que o código é executado no navegador do cliente, então, se o código não for muito grande, pode travar o programa.</p>
<p>Fica a dica sobre alta performace com essa biblioteca:</p>
<p><a title="http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/" href="http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/">http://geeklove.com.br/2009/11/09/escrevendo-jquery-de-alta-performace/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/12/01/plugin-jquery-para-criacao-de-mascara-de-moedas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Construindo uma classe em PHP para validação de dados de entrada</title>
		<link>http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/</link>
		<comments>http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 02:09:32 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Classe de Validação de Dados]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Conversão de dados]]></category>
		<category><![CDATA[CPF]]></category>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[E-mail]]></category>
		<category><![CDATA[Filtros]]></category>
		<category><![CDATA[Formulário HTML]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Validação de Dados]]></category>
		<category><![CDATA[Validação de Formulário]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=533</guid>
		<description><![CDATA[Em uma aplicação Web dinâmica, as entradas de dados (formulários, Web Services, importação de arquivos) são responsáveis por alimentar e manter atualizada a nossa base de dados, ao mesmo tempo, essas entradas podem ser uma porta aberta para dados mal formatados, ataques do tipo script injection ou qualquer outro tipo de sujeira. Nesse post iremos &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/" data-text="Construindo uma classe em PHP para validação de dados de entrada" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/11/formulario1.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/11/formulario1.jpg" alt="" title="formulario" width="465" height="284" class="aligncenter size-full wp-image-537" /></a></p>
<p>Em uma aplicação Web dinâmica, as entradas de dados (formulários, Web Services, importação de arquivos) são responsáveis por alimentar e manter atualizada a nossa base de dados, ao mesmo tempo, essas entradas podem ser uma porta aberta para dados mal formatados, ataques do tipo script injection ou qualquer outro tipo de sujeira.</p>
<p><span id="more-533"></span></p>
<p>Nesse post iremos construir uma classe de validação que será capaz de filtrar, validar e criticar os dados de entrada de uma aplicação, garantindo a integridade dos dados e impedindo ataques.</p>
<h4>Requerimentos</h4>
<p>Para facilitar o entendimento do código abaixo, aconselho a leitura da documentação da classe <a href="http://www.php.net/manual/pt_BR/class.exception.php" target="_blank">Exception</a> e das funções <a href="http://br2.php.net/manual/pt_BR/function.isset.php" target="_blank">isset</a>, <a href="http://br2.php.net/manual/pt_BR/function.strlen.php" target="_blank">strlen</a>, <a href="http://br2.php.net/manual/pt_BR/function.str-replace.php" target="_blank">str_replace</a>, <a href="http://br2.php.net/manual/pt_BR/function.is-numeric.php" target="_blank">is_numeric</a>, <a href="http://br2.php.net/manual/pt_BR/function.mb-detect-encoding.php" target="_blank">mb_detect_encoding</a>, <a href="http://br2.php.net/manual/pt_BR/function.htmlentities.php" target="_blank">htmlentities</a>, <a href="http://br2.php.net/manual/pt_BR/function.html-entity-decode.php" target="_blank">html_entity_decode</a>, <a href="http://br2.php.net/manual/pt_BR/function.nl2br.php" target="_blank">nl2br</a>, <a href="http://br2.php.net/manual/pt_BR/function.strip-tags.php" target="_blank">strip_tags</a> no site <a href="http://www.php.net" target="_blank">www.php.net</a>. </p>
<h4>1º Passo – Criando uma classe de tratamento de erros</h4>
<p>Iremos criar uma classe para gerenciar os erros e exceções geradas por nossas classes principal e secundária e para que ela funcione adequadamente, deverá ser herdeira da classe <a href="http://www.php.net/manual/pt_BR/class.exception.php" target="_blank">Exception</a> (nativa do PHP).</p>
<pre class="brush: php; title: ; notranslate">
class DDException extends Exception
{

}
</pre>
<p>Você deve estar se perguntando “Por que não usar a classe Exception, já que a classe herdeira não tem nada implementado?”. Minha resposta é “Se em algum momento quisermos adicionar algum controle de erros ainda não implementado na classe Exception, basta modificar a classe DDException e tudo será resolvido”.</p>
<h4>2º Passo – Implementando classe de gerenciamento dos dados a serem validados</h4>
<p>Essa será a classe principal, ela será usada para armazenar e gerenciar os nossos dados</p>
<pre class="brush: php; title: ; notranslate">
class DDDataValidation
{
	private $v_data_values;
	private $v_data_itens_object;

	//constantes de charset
	const UTF_8 = 1;
	const ISO_8859_1 = 2;

	//constantes para formato de data
	const DATE_EN = 1;
	const DATE_BR = 2;

	//constantes de erro
	const ErrorEmpty = 1;
	const ErrorNumeric = 2;
	const ErrorMaximum = 3;
	const ErrorMinimum = 4;
	const ErrorCPF = 5;
	const ErrorEmail = 6;
	const ErrorDate = 7;

	function __construct()
	{
		$this-&gt;v_data_values = array();
		$this-&gt;v_data_itens_object = array();
	}

	/**
	* Adiciona dados para ser validados
	*
	* @param string $st_alias - Alias definido pelo desenvolvedor para fazer referencia ao dado
	* @param mixed $mx_data - Dado a ser validado
	*/
	public function setData($st_alias,$st_value)
	{
		$this-&gt;v_data_values[$st_alias] = $st_value;
		$this-&gt;v_data_itens_object[$st_alias] = new DDDataValidationItem(addslashes($st_value));
	}

	/**
	* Retorna um objeto contendo dados a serem validados
	*
	* @param string $st_alias - Alias definido pelo desenvolvedor para fazer referencia ao dado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function getData($st_alias)
	{
		if(isset($this-&gt;v_data_itens_object[$st_alias]))
			return $this-&gt;v_data_itens_object[$st_alias];
		else
			throw new DDException('Alias '.$st_alias.' not found');
	}

	/**
	* Retorna os dados sem nenhuma modificação
	*
	* @param string $st_alias - Alias definido pelo desenvolvedor para fazer referencia aos dados
	* @throws DDException
	*/
	public function getOriginal($st_alias)
	{
		if(isset($v_campos[$st_alias]))
			return $v_data_values[$st_alias];
		else
			throw new DDException('Alias '.$st_alias.' not found');
	}

	/**
 	* Retorna a quantidade de erros, idenpendente
 	* do alias referente ao campo
 	*
 	* @return integer
	*/
	public function countErrors()
	{
		foreach($this-&gt;v_data_itens_object AS $data_objects)
			$in_errors += $data_objects-&gt;countErrors();
		return $in_errors;
	}
}
</pre>
<h4>3º Passo – Implementando classe responsável pelos filtros</h4>
<p>Nesse momento, iremos implementar uma classe secundária. Ela será responsável por encapsular o dado propriamente dito e por executar os métodos de restrição, filtro e conversão dos dados.</p>
<pre class="brush: php; title: ; notranslate">
class DDDataValidationItem
{
	private $mx_value;
	private $v_error;
	private $v_boolean_error;

	/**
	* O valor do dado pode ser definidos ou não
	*
	* @param mixed $mx_value
	*/
	function __construct($mx_value = null)
	{
		if($mx_value != null)
			$this-&gt;set($mx_value);
	}

	/**
	* Recebe o dado à ser validado
	*
	* @param mixed $mx_value
	*/
	public function set($mx_value)
	{
		$this-&gt;mx_value = $mx_value;
	}

	/**
	* Retorna o dado validado
	*
	* @return mixed
	*/
	public function get()
	{
		return $this-&gt;mx_value;
	}

	/**
	* Retorna, se houver, o erro referente ao alias de verficação
	*
	* @param flag $mx_erro_code
	* 	Use DDDataValidation::ErrorEmpty - retorna o erro de preenchimento do campo
	*		DDDataValidation::ErrorNumeric - retorna o erro da validação de numero
	*		DDDataValidation::ErrorMaximum - retorna o erro da validação de quantidade de caracteres
	*		DDDataValidation::ErrorMinimum - retorna o erro da validação de quantidade de caracteres
	*		DDDataValidation::ErrorCPF - retorna o erro da validação de CPF
	*		DDDataValidation::ErrorEmail - retorna o erro da validação de e-mail
	*		DDDataValidation::ErrorDate - retornar o erro da validação de data
	*
	* @return string
	*/
	public function getErrorMsg($mx_erro_code)
	{
		if(isset($this-&gt;v_error[$mx_erro_code]))
			return $this-&gt;v_error[$mx_erro_code];
		else
			return new DDValidationItem();
		return $this-&gt;v_error[$mx_erro_code];
	}

	/**
	* Retorna o último erro ocorrido
	*
	* @return string
	*/
	public function getLastErrorMsg()
	{
		$st_message = end($this-&gt;v_error);
		if(isset($st_message))
			return $st_message;
	}

	/**
	* Retorna o primeiro erro ocorrido
	*
	* @return string
	*/
	public function getFirstErrorMsg()
	{
		$st_message = reset($this-&gt;v_error);
		if(isset($st_message))
			return $st_message;
	}

	/**
	* Retorna positivo se houver erro e nega
	*
	* @param mixed $mx_erro_code - Alias de referencia do campo
	* @return boolean
	*/
	public function getError($mx_erro_code)
	{
		if(isset($this-&gt;v_boolean_error[$mx_erro_code]))
			return $this-&gt;v_boolean_error[$mx_erro_code];
	}

	/**
	* Retorna todos os erros, separados apenas pelo delimitador
	*
	* @param character $ch_delimiter - Delimitador
	* @return string
	*/
	public function getAllErrosMessages($ch_delimiter = ' - ')
	{
		foreach($this-&gt;v_error AS $st_error)
			if(isset($st_all_error))
				$st_all_error .= $ch_delimiter.$st_error;
			else
				$st_all_error .= $st_error;
		return $st_all_error;
	}

	/**
	* Retorna a quantidade de erros gerados para aquele campo
	*
	* @return integer
	*/
	public function countErrors()
	{
		return count($this-&gt;v_error);
	}

	/************************/
	/* Métodos de restrição */
	/************************/

	/**
	* Verifica se o dado passado está vazio
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isEmpty( $st_message = null, $mx_error_code = DDDataValidation::ErrorEmpty )
	{
		$mx_value = $this-&gt;trim()-&gt;get();
		if(!(strlen($mx_value) &gt; 0))
		{
			if($st_message != null)
				$this-&gt;v_error[$mx_error_code] = $st_message;
			$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
		}
		return $this;
	}

	/**
	* Verifica se o dado passado é um numero
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isNumeric( $st_message = null, $mx_error_code = DDDataValidation::ErrorNumeric )
	{
		$mx_value = $this-&gt;trim()-&gt;get();
		$mx_value = str_replace(',', '.', $mx_value);
		if(!(is_numeric($mx_value)))
		{
			if($st_message != null)
				$this-&gt;v_error[$mx_error_code] = $st_message;
			$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
		}
		return $this;
	}

	/**
	* Verifica se o dado passado tem quantidade de
	* caracteres acima do limite passado como parametro
	*
	* @param integer $in_max_caracter_count - Quantidade máxima de caracteres
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function isMaximum( $in_max_caracter_count , $st_message = null , $mx_error_code = DDDataValidation::ErrorMaximum )
	{
		if(is_int($in_max_caracter_count))
		{
			if((strlen($this-&gt;mx_value) &gt;= $in_max_caracter_count))
			{
				if($st_message != null)
					$this-&gt;v_error[$mx_error_code] = $st_message;
				$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
			}
		}
		else
			throw new DDException('the variable in_max_caracter_count isn\'t numeric');
		return $this;
	}

	/**
	* Verifica se o dado passado tem quantidade de
	* caracteres abaixo do limite passado como parametro
	*
	* @param integer $in_min_caracter_count - Quantidade mínima de caracteres
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function isMinimum( $in_min_caracter_count , $st_message = null , $mx_error_code = DDDataValidation::ErrorMinimum )
	{
		if(is_numeric($in_min_caracter_count))
		{
			if(strlen($this-&gt;mx_value) &lt;= $in_min_caracter_count)
			{
				if($st_message != null)
					$this-&gt;v_error[$mx_error_code] = $st_message;
				$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
			}
		}
		else
			throw new DDException('the variable in_min_caracter_count isn\'t numeric');
		return $this;
	}

	/**
	* Verifica se o dado é um CPF válido
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isCPF( $st_message , $mx_error_code = DDDataValidation::ErrorCPF )
	{
		$st_cpf = $this-&gt;mx_value;
		$st_cpf = str_pad(ereg_replace('[^0-9]', '', $st_cpf), 11, '0', STR_PAD_LEFT);
		if
		(
			strlen($st_cpf) != 11 ||
			$st_cpf == '00000000000' ||
			$st_cpf == '11111111111' ||
			$st_cpf == '22222222222' ||
			$st_cpf == '33333333333' ||
			$st_cpf == '44444444444' ||
			$st_cpf == '55555555555' ||
			$st_cpf == '66666666666' ||
			$st_cpf == '77777777777' ||
			$st_cpf == '88888888888' ||
			$st_cpf == '99999999999'
		)
			$this-&gt;v_error[$mx_error_code] = $st_message;
		else
			for ($t = 9; $t &lt; 11; $t++)
			{
				for ($d = 0, $c = 0; $c &lt; $t; $c++)
					$d += $st_cpf{$c} * (($t + 1) - $c);

				$d = ((10 * $d) % 11) % 10;
				if ($st_cpf{$c} != $d)
				{
					if($st_message != null)
						$this-&gt;v_error[$mx_error_code] = $st_message;
					$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
				}
			}
		return $this;
	}

	/**
	* Verifica se o dado é um e-mail válido
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	*/
	public function isEmail( $st_message , $mx_error_code = DDDataValidation::ErrorEmail )
	{
		$st_email = $this-&gt;mx_value;
		$bo_valid = eregi
		(
			&quot;^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}$&quot;,
			$st_email,
			$check
		); 

		if(!$bo_valid)
		{
			if($st_message != null)
				$this-&gt;v_error[$mx_error_code] = $st_message;
			$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
		}
		return $this;
	}

	/**
	* Verifica se o dado é uma data válida
	* @param integer $in_format - Usado para definir qual o formato da data
	* 		Use DDDataValidation::DATE_BR para formato DD/MM/AAAA
	* 		Use DDDataValidation::DATE_EN para formato AAAA/MM/DD
	*
	* @param string $st_message - Mensagem de erro
	* @param mixed $mx_error_code - Código de erro, pode ser personalizado
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function isDate( $st_message = null , $in_format = DDDataValidation::DATE_BR , $mx_error_code = DDDataValidation::ErrorDate )
	{
		$dt_date = $this-&gt;mx_value;
		$v_date = preg_split('/[[:punct:]]/',$dt_date);
		if( !is_numeric($v_date[0]) || !is_numeric($v_date[1]) || !is_numeric($v_date[2])  )
		{
			{
					if($st_message != null)
						$this-&gt;v_error[$mx_error_code] = $st_message;
					$this-&gt;v_boolean_error[$mx_error_code] = TRUE;
				}
			return $this;
		}

		if($in_format == DDDataValidation::DATE_BR)
		{
			$in_day = $v_date[0];
			$in_month =  $v_date[1];
			$in_year =  $v_date[2];
		}
		elseif($in_format == DDDataValidation::DATE_EN)
		{
			$in_day = $v_date[2];
			$in_month =  $v_date[1];
			$in_year =  $v_date[0];
		}
		else
			throw new DDException('Invalid value for variable $in_format');

		if (!checkdate( $in_month , $in_day , $in_year ))
			$this-&gt;v_error[$mx_error_code] = $st_message;
		return $this;
	}

	/*********************/
	/* Métodos de filtro */
	/*********************/

	/**
	* Retira, por padrão, caracteres de espaço ( ), tab (\t), retorno de carro (\r)
	* e quebra de linhas (\n) no inicio e no fim do dado. Pode ser personalizada
	* usando a variável $st_characters
	*
	* @param string $st_characters - Caracteres que devem ser retirados no inicio
	* 		e no fim do dado, o valor padrão é &quot; \t\n\r&quot;
	*
	* @return DDDataValidationItem
	*/
	public function trim( $st_characters = &quot; \t\n\r&quot; )
	{
		$this-&gt;mx_value = trim( $this-&gt;mx_value , $st_characters );
		return $this;
	}

	/**
	* Retira, por padrão, todas as tags HTML encontradas no dado
	*
	* @param string $allowable_tags - Use-a para permitir tags especificadas
	* @return DDDataValidationItem
	*/
	public function noHTML( $allowable_tags = '' )
	{
		$this-&gt;mx_value = strip_tags($this-&gt;mx_value,$allowable_tags);
		return $this;
	}

	/**
	* Retira tudo que não for uma letra do alfabeto
	* ou um numero de 0 a 9 do dado
	*
	* @return DDDataValidationItem
	*/
	public function alphaNum()
	{
		$this-&gt;trim();
		$this-&gt;noHTML();
		$this-&gt;mx_value = ereg_replace(&quot;([[:punct:]]| )&quot;,&quot;&quot;,$this-&gt;mx_value);
		return $this;
	}

	/**
	* Retira tudo que não for um numero do dado
	*
	* @return DDDataValidationItem
	*/
	public function numeric()
	{
		$this-&gt;trim();
		$this-&gt;noHTML();
		$this-&gt;mx_value = ereg_replace(&quot;([[:punct:]]|[[:alpha:]]| )&quot;,&quot;&quot;,$this-&gt;mx_value);
		return $this;
	}

	/************************/
	/* Métodos de conversão */
	/************************/

	/**
	* Converte uma data do formato Brasileiro Ex: 10/11/2011
	* 	para o formato Americano Ex: 2011/11/10 ou vice-versa
	*
	* @param integer $f_actual_format - Especificar o formato atual da data
	* 	Use DDDataValidation::DATE_BR para formato Brasileiro
	* 	Use DDDataValidation::DATE_EN para formato Americano
	* @param integer $f_to_format - Especificar o formato de data desejado
	* 	Use DDDataValidation::DATE_BR para formato Brasileiro
	* 	Use DDDataValidation::DATE_EN para formato Americano
	* @param character $ch_delimiter - Especificar o caractere de separação
	* 	para dia mês e ano
	* @throws DDException
	*/
	public function convertDate($f_actual_format = DDDataValidation::DATE_BR , $f_to_format = DDDataValidation::DATE_EN , $ch_delimiter = '-' )
	{
		$dt_date = $this-&gt;mx_value;
		$v_date = preg_split('/[[:punct:]]/',$dt_date);

		if( !is_numeric($v_date[0]) || !is_numeric($v_date[1]) || !is_numeric($v_date[2])  )
			throw new DDException('this data isn\'t a valid date');

		if($f_actual_format != DDDataValidation::DATE_BR &amp;&amp; $f_actual_format != DDDataValidation::DATE_EN)
			throw new DDException('$f_actual_format isn\'t a valid flag');

		if($f_to_format != DDDataValidation::DATE_BR &amp;&amp; $f_to_format != DDDataValidation::DATE_EN)
			throw new DDException('$f_to_format isn\'t a valid flag');

		if($f_actual_format == DDDataValidation::DATE_BR)
		{
			$in_day = $v_date[0];
			$in_month =  $v_date[1];
			$in_year =  $v_date[2];
		}
		elseif($f_actual_format == DDDataValidation::DATE_EN)
		{
			$in_day = $v_date[2];
			$in_month =  $v_date[1];
			$in_year =  $v_date[0];
		}

		if (!checkdate( $in_month , $in_day , $in_year ))
			throw new DDException('this data isn\'t a valid date');

		if($f_to_format == DDDataValidation::DATE_BR)
			$this-&gt;mx_value = $in_day . $ch_delimiter . $in_month . $ch_delimiter . $in_year;
		elseif($f_to_format == DDDataValidation::DATE_EN)
			$this-&gt;mx_value = $in_year . $ch_delimiter . $in_month . $ch_delimiter . $in_day;
		return $this;
	}

	/**
	* Converte todos os caractéres especiais em suas
	* respectivas entidades HTML
	*
	* @return DDDataValidationItem
	*/
	public function htmlEntities()
	{
		$this-&gt;mx_value = htmlentities($this-&gt;mx_value);
		return $this;
	}

	/**
	* Converte entidades HTML em seus respectivos
	* caracteres especiais
	*
	* @return DDDataValidationItem
	*/
	public function htmlEntitiesDecode()
	{
		$this-&gt;mx_value = html_entity_decode($this-&gt;mx_value);
		return $this;
	}

	/**
	* Converte characteres de final de linha (\n) para
	* para a tag &lt;br/&gt; do HTML
	*
	* @return DDDataValidationItem
	*/
	public function nlToBr()
	{
		$this-&gt;mx_value = nl2br($this-&gt;mx_value);
		return $this;
	}

	/**
	* seta o charset do dado
	*
	* @param integer $in_actual_charset - Seta o charset atual do dado
	* 	Use DDDataValidation::ISO_8859_1 para ISO-8859-1
	* 	Use DDDataValidation::UTF-8 para UTF-8
	* @param integer $in_to_charset - Define o charset desejado
	* 	Use DDDataValidation::ISO_8859_1 para ISO-8859-1
	* 	Use DDDataValidation::UTF-8 para UTF-8
	* @return DDDataValidationItem
	* @throws DDException
	*/
	public function setCharset($in_actual_charset = DDDataValidation::ISO_8859_1 , $in_to_charset = DDDataValidation::UTF_8)
	{
		if($in_actual_charset != DDDataValidation::ISO_8859_1 &amp;&amp; $in_actual_charset != DDDataValidation::UTF_8)
			throw new DDException('invalid actual charset variable'); 

		if($in_to_charset != DDDataValidation::ISO_8859_1 &amp;&amp; $in_to_charset != DDDataValidation::UTF_8)
			throw new DDException('invalid to charset variable');

		if($in_actual_charset == DDDataValidation::UTF_8 &amp;&amp; $in_to_charset == DDDataValidation::ISO_8859_1)
			$this-&gt;mx_value = utf8_decode($this-&gt;mx_value);

		if($in_actual_charset == DDDataValidation::ISO_8859_1 &amp;&amp; $in_to_charset == DDDataValidation::UTF_8)
			$this-&gt;mx_value = utf8_encode($this-&gt;mx_value);
		return $this;
	}
}
</pre>
<p>Você deve está pensando &#8220;<em><strong>Nossa! Quanto código.</strong></em>&#8220;. Eu sei, é realmente muito código, mas ele será escrito apenas uma vez e usado milhares de vezes. Você só terá que mexer nele novamente se houver a necessidade de implementar um novo método ou fazer a manutenção em alguma parte do código. Resumindo, você só terá que entender o código (se você for um bom programador e não gosta de pegar código pronto na Internet) e aprender a usar.</p>
<h4>4º Passo – Testando o código</h4>
<p>Como teste, iremos usar nossa classe para validar um formulário. Veja o código em anexo abaixo.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
//se o formulário foi enviado

require_once 'DDFormValidation.php';
$o_validation = new DDDataValidation();

//verificando se algo foi enviado
if(count($_POST))
{
	//encapsulando os dados
	$o_validation-&gt;setData('nome', $_POST['nome']);
	$o_validation-&gt;setData('email', $_POST['email']);
	$o_validation-&gt;setData('cpf', $_POST['cpf']);
	$o_validation-&gt;setData('data_nascimento', $_POST['data_nascimento']);

	//efetuando as validações

	//validando nome
	$o_validation-&gt;getData('nome')-&gt;isEmpty('Nome é obrigatório');

	//validando email
	$o_validation-&gt;getData('email')-&gt;isEmpty('E-mail é obrigatório');
	$o_validation-&gt;getData('email')-&gt;isEmail('E-mail inválido');

	//validando CPF
	$o_validation-&gt;getData('cpf')-&gt;isEmpty('CPF é obrigatório');
	$o_validation-&gt;getData('cpf')-&gt;isCPF('CPF inválido');

	//validando data de nascimento
	$o_validation-&gt;getData('data_nascimento')-&gt;isEmpty('Data de Nascimento é obrigatória');
	$o_validation-&gt;getData('data_nascimento')-&gt;isDate('Data de Nascimento inválida',DDDataValidation::DATE_BR);

	if($o_validation-&gt;countErrors() == 0)
		$st_mensagem =  'cadastrado com sucesso';
}	

	?&gt;
&lt;html&gt;
&lt;head&gt;
&lt;style&gt;
body
{
font-family:&quot;tahoma&quot;;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div align=center&gt;
	&lt;br/&gt;
	&lt;br/&gt;
	&lt;form method=&quot;post&quot;&gt;
		&lt;table&gt;
			&lt;tr&gt;
				&lt;td colspan=&quot;2&quot; align=&quot;center&quot; style=&quot;font-size: 30px;&quot;&gt;
					DigitalDev Form
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td&gt;
					&amp;nbsp;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			if(isset($st_mensagem))
			{
			?&gt;
			&lt;tr&gt;
				&lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
					&lt;font color='red' size='4'&gt;&lt;?php echo $st_mensagem?&gt;&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;?php
			}
			?&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					Nome:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; name=&quot;nome&quot; value=&quot;&lt;?php echo $_POST['nome']?&gt;&quot; maxlength=&quot;40&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('nome')-&gt;getErrorMsg(DDDataValidation::ErrorEmpty)?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					E-mail:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; name=&quot;email&quot; maxlength=&quot;40&quot; value=&quot;&lt;?php echo $_POST['email']?&gt;&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('email')-&gt;getFirstErrorMsg()?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					CPF:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; size=&quot;11&quot; name=&quot;cpf&quot; maxlength=&quot;14&quot; value=&quot;&lt;?php echo $_POST['cpf']?&gt;&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('cpf')-&gt;getFirstErrorMsg()?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td align=&quot;right&quot;&gt;
					Data de nascimento:
				&lt;/td&gt;
				&lt;td&gt;
					&lt;input type=&quot;text&quot; size=&quot;10&quot; name=&quot;data_nascimento&quot; maxlength=&quot;10&quot; value=&quot;&lt;?php echo $_POST['data_nascimento']?&gt;&quot;&gt;
					&lt;font size='2' color='red'&gt;
						&lt;?php echo $o_validation-&gt;getData('data_nascimento')-&gt;getFirstErrorMsg()?&gt;
					&lt;/font&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td colspan=&quot;2&quot; align=&quot;center&quot;&gt;
					&lt;button type=&quot;submit&quot;&gt;Cadastrar&lt;/button&gt;
				&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/table&gt;
	&lt;/form&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Faça o download do código fonte do exemplo acima clicando <a href="http://digitaldev.com.br/downloads/DDFormulario.zip">aqui</a>.</p>
<p>Apesar dessa classe de validação de dados de entrada ser capaz de nos auxiliar na validação, filtro e conversão de dados de entrada, sempre irá existir situações em que ela não poderá nos auxiliar. Nessas situações o programador deverá efetuar manutenções no código ou implementar novos métodos.</p>
<p>Faça o download do código fonte da classe clicando <a href="http://digitaldev.com.br/downloads/DDDataValidation.zip">aqui</a>.</p>
<p>Artigos Relacionados</p>
<p><a href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" target="_blank">Construindo uma classe em PHP para conexão com Banco de Dados</a><br />
<a href="http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/" target="_blank">SQL Injection, como evitar esse tipo de ataque em páginas PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/11/30/construindo-uma-classe-em-php-para-validacao-de-dados-de-entrada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Centralizando objetos na tela com CSS</title>
		<link>http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/</link>
		<comments>http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 18:16:55 +0000</pubDate>
		<dc:creator>sergio</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[alinhamento]]></category>
		<category><![CDATA[altura]]></category>
		<category><![CDATA[centralizando]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[largura]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[tela]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=562</guid>
		<description><![CDATA[Veremos aqui como alinhar objetos no centro da tela, usando css. Usaremos como exemplo o alinhamento de uma imagem com DIV. Verifiquem que o processo é o mesmo caso queremos alinhar tabelas contendo textos ou imagens. Agora vejamos: A imagem possui um tamanho de 400 x 300, respectivamente, largura e altura (width e height). Insira &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/" data-text="Centralizando objetos na tela com CSS" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p style="text-align: center;"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg"><img class="alignnone size-full wp-image-578" title="css-cascading-style-sheets" src="http://www.digitaldev.com.br/wp-content/uploads/2011/11/css-cascading-style-sheets.jpg" alt="" width="260" height="187" /></a></p>
<p>Veremos aqui como alinhar objetos no centro da tela, usando css. Usaremos como exemplo o alinhamento de uma imagem com DIV. Verifiquem que o processo é o mesmo caso queremos alinhar tabelas contendo textos ou imagens.</p>
<p><span id="more-562"></span></p>
<p><strong>Agora vejamos:</strong></p>
<p>A imagem possui um tamanho de 400 x 300, respectivamente, largura e altura (width e height).</p>
<p>Insira a imagem dentro de um DIV, como abaixo:</p>
<p><em><span style="color: #333399;">&lt;div&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;img src=&#8221;imagem.jpg&#8221; alt=&#8221;" /&gt;</span></em><br />
<em><span style="color: #333399;"> &lt;/div&gt;</span></em></p>
<p><strong>Explicando o CSS:<br />
</strong>Acompanhando o tamanho da imagem, ou seja, 400px x 300px, definiremos no CSS uma largura de 400px e uma altura de 300px que &#8220;guardará&#8221; a imagem:</p>
<p><em><span style="color: #333399;">width: 400px;</span></em><br />
<em><span style="color: #333399;"> height: 300px;</span></em></p>
<p>É necessário entender que o alinhamento não é feito a partir do centro do objeto. Neste caso alinhamos pelas extremidades, onde o canto esquerdo superior passa ser o centro.</p>
<p><strong>Então definimos:</strong></p>
<p><em><span style="color: #333399;">position: absolute;</span></em></p>
<p><strong>E também:<br />
</strong>Distância de 50% a partir do topo e 50% a partir do lado esquerdo:</p>
<p><em><span style="color: #333399;">top: 50%;</span></em><br />
<em><span style="color: #333399;"> left: 50%;</span></em></p>
<p><strong>Para encerrar faremos uma espécie de hack do CSS:<br />
</strong>Definiremos valores negativos para a imagem, mais precisamente nas margens do topo e esquerda. Os valores negativos serão exatamente a metade da altura e da largura da imagem, conforme abaixo:</p>
<p><span style="color: #333399;"><em>margin-top: -150px;</em></span><br />
<span style="color: #333399;"><em> margin-left: -200px;</em></span></p>
<p><strong>Vejamos agora como deverá ficar o CSS final:</strong></p>
<p><em><span style="color: #333399;">.center {<br />
</span></em><em><span style="color: #333399;">     width: 400px;<br />
</span></em><em><span style="color: #333399;">     height: 300px;<br />
</span></em><em><span style="color: #333399;">     position: absolute;<br />
</span></em><em><span style="color: #333399;">     top: 50%;<br />
</span></em><em><span style="color: #333399;">     left: 50%;<br />
</span></em><em><span style="color: #333399;">     margin-top: -150px;<br />
</span></em><em><span style="color: #333399;">     margin-left: -200px;<br />
</span></em><em><span style="color: #333399;">}</span></em></p>
<p><strong>Veja como ficou o html:</strong></p>
<p><span style="color: #333399;"><em>&lt;html&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;head&gt;</em></span><br />
<span style="color: #333399;"><em>          &lt;title&gt;Título&lt;title&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;/head&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;body&gt;</em></span><br />
<span style="color: #333399;"><em>          &lt;div  class=&#8221;center&#8221;&gt;&lt;img src=&#8221;imagem.jpg&#8221; /&gt;&lt;/div&gt;</em></span><br />
<span style="color: #333399;"><em>     &lt;/body&gt;</em></span><br />
<span style="color: #333399;"><em>&lt;/html&gt;</em></span></p>
<p><strong>Isso também é possível:</strong></p>
<p><em><span style="color: #333399;">&lt;html&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;head&gt;</span></em><br />
<em><span style="color: #333399;">          &lt;title&gt;Título&lt;title&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;/head&gt;</span></em><br />
<em><span style="color: #333399;">     &lt;body&gt;<br />
&lt;table width=&#8221;400&#8243; border=&#8221;0&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;0&#8243;&gt;</span></em><br />
<em><span style="color: #333399;">               &lt;tr&gt; </span></em><br />
<em><span style="color: #333399;">                    &lt;td&gt;<br />
&lt;div  class=&#8221;center&#8221;&gt;&lt;img src=&#8221;imagem.jpg&#8221; /&gt;&lt;/div&gt;<br />
&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</span></em></p>
<p>Espero ter ajudado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/11/30/centralizando-objetos-na-tela-com-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Construindo uma classe em PHP para conexão com Banco de Dados</title>
		<link>http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/</link>
		<comments>http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 00:57:53 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Banco de dados]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Microsoft SQL Server]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Tutoriais]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=444</guid>
		<description><![CDATA[Ao se construir uma aplicação ou site em PHP que se comunique com algum banco de dados, uma classe de banco de dados de fácil uso e compreensão pode simplificar bastante o nosso trabalho. Nesse artigo mostrarei como construir uma classe da banco de dados, baseada na classe PDO (nativa do PHP), capaz de fazer &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" data-text="Construindo uma classe em PHP para conexão com Banco de Dados" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/Database.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/Database.jpg" alt="" title="Database" width="500" height="316" class="aligncenter size-full wp-image-445" style="border: 0px;"/></a></p>
<p>Ao se construir uma aplicação ou site em <a href="http://www.digitaldev.com.br/2011/07/03/o-que-e-php-e-qual-e-sua-historia/" target="_blank">PHP</a> que se comunique com algum banco de dados, uma classe de banco de dados de fácil uso e compreensão pode simplificar bastante o nosso trabalho.</p>
<p>Nesse artigo mostrarei como construir uma classe da banco de dados, baseada na classe <a href="http://www.php.net/manual/pt_BR/book.pdo.php" target="_blank">PDO</a> (nativa do PHP), capaz de fazer múltiplas conexões simultâneas e com suporte aos principais gerenciadores de banco de dados usados hoje em dia.<br />
<span id="more-444"></span></p>
<h4><strong>Requisitos</strong></h4>
<p>Como iremos usar a classe PDO do PHP na implementação de uma segunda classe, precisaremos que as extensões <strong>php_pdo_mssql</strong>, <strong>php_pdo_mysql</strong>, <strong>php_pdo_oci</strong>, <strong>php_pdo_pgsql</strong>, <strong>php_pdo_sqlite</strong> estejam ativas nas configurações do seu servidor PHP.</p>
<p>Para facilitar o entendimento do código abaixo, aconselho a leitura da documentação das classes <a href="http://www.php.net/manual/pt_BR/book.pdo.php" target="_blank">PDO</a> e <a href="http://www.php.net/manual/pt_BR/class.exception.php" target="_blank">Exception</a> no site <a href="http://www.php.net/" target="_blank">www.php.net</a>.</p>
<h3><strong>1º Passo &#8211; Criando uma classe de configuração</strong></h3>
<p>Antes de mais nada, precisaremos construir uma classe para guardar as configurações de cada conexão, como por exemplo, endereço do banco, tipo do banco, porta, nome do banco, usuário e senha.</p>
<pre class="brush: php; title: ; notranslate">
class DDConnectSettings
{
	const MYSQL = 1;
	const PGSQL = 2;
	const MSSQL = 3;
	const ORACLE = 4;
	const SQLite = 5;

	private $f_application;
	private $st_host;
	private $in_port;
	private $st_dbase;
	private $st_user;
	private $st_password;

	/**
	* define o gerenciador de banco de dados
	* @param int $f_aplication
	* @example $ob-&gt;setAplication(DDConnectSettings::MYSQL);
	*	Use
	* 	DDConnectSettings::MYSQL - para MySQL
	* 	DDConnectSettings::PGSQL - para PostgreSQL
	* 	DDConnectSettings::MSSQL - para Microsoft SQL Server
	* 	DDConnectSettings::ORACLE - para Oracle
	*	DDConnectSettings::SQLite - para SQLLite
	*/
	public function setApplication($f_aplication)
	{
		$this-&gt;f_application = $f_aplication;
	}

	/**
	* retorna qual o gerenciador de banco de dados definido
	* @return int
	*/
	public function getApplication()
	{
		return $this-&gt;f_application;
	}

	/**
	* define endereço (IP ou domínio) do servidor
	* @param string $st_host
	*/
	public function setHost($st_host)
	{
		$this-&gt;st_host = $st_host;
	}

	/**
	* retorna o endereço do servidor definido
	* @return string
	*/
	public function getHost()
	{
		return $this-&gt;st_host;
	}

	/**
	* define a porta a ser usada na conexão
	* @param int $in_port
	*/
	public function setPort($in_port)
	{
		$this-&gt;in_port = $in_port;
	}

	/**
	* retorna a porta definida
	* @return int
	*/
	public function getPort()
	{
		return $this-&gt;in_port;
	}

	/**
	* define o nome do banco de dados ou arquivo
	* @param string $st_dbase
	*/
	public function setDatabase($st_dbase)
	{
		$this-&gt;st_dbase = $st_dbase;
	}

	/**
	* retorna o nome do banco de dados ou arquivo definido
	* @return string
	*/
	public function getDatabase()
	{
		return $this-&gt;st_dbase;
	}

	/**
	* define o nome do usuário a ser usado em uma conexão protegida
	* @param string $st_user
	*/
	public function setUser($st_user)
	{
		$this-&gt;st_user = $st_user;
	}

	/**
	* retorna o nome do usuário definido no caso de uma conexão pretegida
	* @return string
	*/
	public function getUser()
	{
		return $this-&gt;st_user;
	}

	/**
	* define a senha de usuário a ser usado em uma conexão protegida
	* @param string $st_password
	*/
	public function setPassword($st_password)
	{
		$this-&gt;st_password = $st_password;
	}

	/**
	* retorna a senha de usuário definido no caso de uma conexão pretegida
	* @return string
	*/
	public function getPassword()
	{
		return $this-&gt;st_password;
	}
}
</pre>
<h3><strong>2º Passo &#8211; Criando uma classe de tratamento de erros</strong></h3>
<p>Também precisaremos de uma classe de tratamento de erros e para que ela funcione adequadamente, deverá ser herdeira da classe <a href="http://www.php.net/manual/pt_BR/language.exceptions.php" target="_blank">Exception</a> (também nativa do PHP).</p>
<pre class="brush: php; title: ; notranslate">
class DDDException extends Exception
{

}
</pre>
<p>Você deve estar se perguntando <em><strong>&#8220;Por que não usar a classe Exception, já que a classe herdeira não tem nada implementado?&#8221;</strong></em>. Minha resposta é <em><strong>&#8220;Se em algum momento quisermos adicionar algum controle de erros ainda não implementado na classe Exception, basta modificar a classe DDDException e tudo será resolvido&#8221;</strong></em>.</p>
<h3><strong>3º Passo &#8211; Implementando classe de dados</strong></h3>
<p>Esta classe de dados será responsável por encapsular os dados retornados na consulta SQL, como por exemplo, quantidade de linhas, colunas e dados propriamente ditos.</p>
<pre class="brush: php; title: ; notranslate">
class DDData
{
	const OBJECT = 1;
	const ARRAY_ASSOC = 2;
	const ARRAY_NUM = 3;
	const ARRAY_BOTH = 4;	

	private $o_PDOStatment;	

	/**
	* Retorna dados de uma consulta SQL
	*
	* @param int $f_tout - Usada para formatar a saída dos dados
	* @example $ob-&gt;getData(DDData::ARRAY_NUM)
	* 	Use
	* 	DDData::ARRAY_NUM - para retornar um array multidimensional de índices numéricos
	*	DDData::OBJECT - para retornar um array contendo como valores, objetos stdClass com os dados de cada linha
	*	DDData::ARRAY_ASSOC - para retornar um array multidimensional contendo como índices os nomes dos campos
	*   DDData::ARRAY_BOTH - para retornar um array contendo índices numericos e os nomes dos campos
	* @return array
	* @throws DDDException
	*/
	public function getData($f_tout = self::OBJECT)
	{
		if(!is_a($this-&gt;o_PDOStatment,'PDOStatement'))
			throw new DDDException('Nothing to return');

		if($this-&gt;o_PDOStatment-&gt;columnCount() &gt; 0)
		{
			$v_return = array();

			try
			{
				switch($f_tout)
				{
					case self::OBJECT:
						while($o_line = $this-&gt;o_PDOStatment-&gt;fetchObject())
							array_push($v_return, $o_line);
					break;

					case self::ARRAY_ASSOC:
						$v_return = $this-&gt;o_PDOStatment-&gt;fetchAll(PDO::FETCH_ASSOC);
					break;

					case self::ARRAY_NUM;
						$v_return = $this-&gt;o_PDOStatment-&gt;fetchAll(PDO::FETCH_NUM);
					break;

					case self::ARRAY_BOTH;
						$v_return = $this-&gt;o_PDOStatment-&gt;fetchAll(PDO::FETCH_BOTH);
					break;
				}
			}
			catch(PDOException $e)
			{
				throw  new DDDException($e-&gt;getMessage());
			}
		}
		else
			$v_return = FALSE;
		return $v_return;
	}

	/**
	* Recebe um objeto da classe PDOStatment,
	* este objeto será usado apenas pela classe DDDatabase
	* @param PDOStatement $o_PDOStatment
	*/
	public function setData(PDOStatement $o_PDOStatment)
	{
		$this-&gt;o_PDOStatment = $o_PDOStatment;
	}

	/**
	* Retorna o numero de linhas geradas na consulta SQL
	* @throws DDDException
	* @return integer
	*/
	public function getNRows()
	{
		if(!is_a($this-&gt;o_PDOStatment,'PDOStatement'))
			throw new DDDException('Nothing to return');

		return $this-&gt;o_PDOStatment-&gt;rowCount();
	}

	/**
	* Retorma o numero de colunas geradas na consulta SQL
	* @return integer
	* @throws DDDException
	*/
	public function getNCols()
	{
		if(!is_a($this-&gt;o_PDOStatment,'PDOStatement'))
			throw new DDDException('Nothing to return');

		return $this-&gt;o_PDOStatment-&gt;columnCount();
	}
}
</pre>
<h3><strong>4º Passo &#8211; Implementando a classe principal</strong></h3>
<p>A classe principal será responsavel por administrar as conexões e as requisições feitas por consultas SQL</p>
<pre class="brush: php; title: ; notranslate">
class DDDatabase
{
	private $v_connections;
	private $v_database;

	/**
	* Estabele conexão com o gerenciador de banco de dados
	* @param string $st_database - Alias definido pelo desenvolvedor para uma conexão
	* @param DDConnectSettings $o_DDCSettings - Objeto contendo as configurações de uma conexão
	* @throws DDDException
	*/
	public function setConnectSettings($st_database, DDConnectSettings $o_DDCSettings)
	{
		$v_database[$st_database] = $o_DDCSettings;

		$st_dbname = $o_DDCSettings-&gt;getDatabase();

		switch($o_DDCSettings-&gt;getApplication())
		{
			case DDConnectSettings::MYSQL:
				$st_dsn = &quot;mysql:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::PGSQL:
				$st_dsn = &quot;pgsql:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::MSSQL:
				$st_dsn = &quot;mssql:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::ORACLE:
				$st_dsn = &quot;oci:dbname=$st_dbname&quot;;
			break;

			case DDConnectSettings::SQLite:
				$st_dsn = &quot;sqlite:$st_dbname&quot;;
			break;

			default:
				throw new DDDException('Invalid drive');
			break;
		}

		$st_host = $o_DDCSettings-&gt;getHost();
		$st_username = $o_DDCSettings-&gt;getUser();
		$st_password = $o_DDCSettings-&gt;getPassword();
		$in_port = $o_DDCSettings-&gt;getPort();

		try
		{
			if(isset($st_host))
			{
				$st_dsn .= &quot;;host=$st_host&quot;;
				if(isset($in_port))
					$st_dsn .= &quot;;port=$in_port&quot;;
			}

			if(isset($st_username) &amp;&amp; isset($st_password))
			{
				$this-&gt;v_connections[$st_database] = new PDO($st_dsn, $st_username, $st_password );
			}
			else
			{
				$this-&gt;v_connections[$st_database] = new PDO($st_dsn);
			}	

			$this-&gt;v_connections[$st_database]-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		}
		catch (PDOException $e)
		{
			throw new DDDException($e-&gt;getMessage());
		}
	}

	/**
	* Retorna um objeto contendo os dados das configurações de uma conexão
	* @param string $st_database - Alias defindo pelo desenvolvedor para a conexão em questão
	*/
	public function getConnectSettings($st_database)
	{
		return $this-&gt;v_database[$st_database];
	}

	/**
	* Executa uma consulta SQL, retornando uma instância da classe DDData
	* @param string $st_database - Alias da conexão que desenvolvedor deseja usar
	* @param  string $st_query - Consulta SQL
	* @return DDData
	* @throws DDDException
	*/
	public function execQuery($st_database,$st_query)
	{
		try
		{
			$v_row = $this-&gt;v_connections[$st_database]-&gt;query($st_query);
			$o_DDData = new DDData();
			$o_DDData-&gt;setData($v_row);
		}
		catch (PDOException $e)
		{
			throw new DDDException($e-&gt;getMessage());
		}
		return $o_DDData;
	}
}
</pre>
<h3><strong>5º Passo &#8211; Exemplo de como usar a classe</strong></h3>
<pre class="brush: php; title: ; notranslate">
//Setando as configurações da conexão
$o_dbconfig = new DDConnectSettings();
$o_dbconfig-&gt;setApplication(DDConnectSettings::PGSQL);
$o_dbconfig-&gt;setHost('localhost');
$o_dbconfig-&gt;setUser('xxx');
$o_dbconfig-&gt;setPassword('xxx');
$o_dbconfig-&gt;setDatabase('digitaldev');
$o_dbconfig-&gt;setPort(5432);

//Instanciando a classe de banco
$o_db = new DDDatabase();
$o_db-&gt;setConnectSettings('ddev', $o_dbconfig);
$st_query = &quot;SELECT * FROM control.tbl_usuario&quot;;
$o_data = $o_db-&gt;execQuery('ddev', $st_query);

//imprimindo dados
var_dump($o_data-&gt;getData(DDData::OBJECT));

//imprimindo numero de linhas
echo 'Linhas = '.$o_data-&gt;getNRows();

//imprimindo numero de colunas
echo 'Colunas = '.$o_data-&gt;getNCols();
</pre>
<p>Faça download de um outro exemplo de uso, dessa com SQLite, clicando <a href="http://digitaldev.com.br/downloads/DDDatabase_SQLite.zip">aqui</a>.</p>
<p>Apesar de poder ser usada na maioria das interações com banco de dados em uma aplicação PHP, essa classe ainda não possui métodos que permitem controle de transições. Fica a encargo dos desenvolvedores continuar a implementação de acordo com as necessidades de suas aplicações.</p>
<p>Quem quiser usar a classe, pode fazer o download da mesma clicando <a href="http://digitaldev.com.br/downloads/DDDatabase.zip">aqui</a>.</p>
<p>Qualquer dúvida, usem a área de respostas abaixo do post.</p>
<p><strong>Artigos relacionados</strong><br />
<a href="http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/">Classe, encapsulamento, herança, composição e agregação</a><br />
<a href="http://www.digitaldev.com.br/2011/07/03/o-que-e-php-e-qual-e-sua-historia/">O que é PHP e qual é sua historia?</a><br />
<a href="http://www.digitaldev.com.br/2011/09/21/instalando-o-ambiente-de-desenvolvimento-php-php-5-3-x-apache-eclipse/">Instalando o ambiente de desenvolvimento PHP (PHP 5.3.x + Apache + Eclipse)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/10/22/construindo-uma-classe-em-php-para-conexao-com-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalando e configurando o Zend Framework</title>
		<link>http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/</link>
		<comments>http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 02:40:57 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[FrameWorks]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=379</guid>
		<description><![CDATA[O Zend Framework (também conhecido como ZF) é um framework para aplicações Web de código aberto, orientado a objeto, implementado em PHP 5 e licenciado como New BSD License. Este framework foi desenvolvido com o objetivo de simplificar o desenvolvimento Web enquanto promove as melhores práticas na comunidade de desenvolvedores PHP. O Zend foi fundado &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/" data-text="Instalando e configurando o Zend Framework" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/zf-logo-mark.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/zf-logo-mark.jpg" alt="" title="zf-logo-mark" width="500" height="265" class="aligncenter size-full wp-image-380" style="border: 0px;" /></a></p>
<p>O Zend Framework (também conhecido como ZF) é um framework para aplicações Web de código aberto, orientado a objeto, implementado em PHP 5 e licenciado como <a href="http://pt.wikipedia.org/wiki/Licen%C3%A7a_BSD" target="_blank">New BSD License</a>. Este framework foi desenvolvido com o objetivo de simplificar o desenvolvimento Web enquanto promove as melhores práticas na comunidade de desenvolvedores PHP.</p>
<p>O Zend foi fundado pelos contribuidores do núcleo PHP <a href="http://pt.wikipedia.org/wiki/Zeev_Suraski" target="_blank">Zeev Suraski</a> e <a href="http://pt.wikipedia.org/wiki/Andi_Gutmans" target="_blank">Andi Gutmans</a>, a junção do nome dos criadores deram origem ao nome do framework.<br />
<span id="more-379"></span></p>
<h3><strong>Requisitos</strong></h3>
<p>Antes de mais nada, você precisará de um ambiente de desenvolvimento PHP instalado e configurado, se você ainda cumpriu esse requisito <a href="http://www.digitaldev.com.br/2011/09/21/instalando-o-ambiente-de-desenvolvimento-php-php-5-3-x-apache-eclipse/" target="_blank">clique aqui</a>.</p>
<h3><strong>1 &#8211; Download de aquivos necessários</strong></h3>
<p><a name="downloads">&nbsp;</a><br />
<strong>Zend Framework 1.11.11 (56,3 MB) &#8211; </strong><a href="http://framework.zend.com/releases/ZendFramework-1.11.11/ZendFramework-1.11.11.zip" target="_blank"> Windows / Linux</a></p>
<p>Ao longo desse tutorial, também usarei dois outros programas para auxiliar na instalação e configuração do Zend Framework. Eles são o Notepad++ (famoso editor de texto) e o Winrar (compactador/descompactador de arquivos). Faça o download dos mesmos clicando nos links abaixo e depois efetue a instalação.</p>
<p><strong>Notepad++ (5,28 MB) – </strong><a href="http://download.tuxfamily.org/notepadplus/5.9.3/npp.5.9.3.Installer.exe" target="_blank">Windows</a><br />
<strong>Winrar (2,83 MB) – </strong><a href="http://www.rarlab.com/rar/wrar401br.exe" target="_blank">Windows 32 bits</a> / <a href="http://www.rarlab.com/rar/winrar-x64-401br.exe" target="_blank">Windows 64 bits</a></p>
<h3><strong>2 &#8211; Configurando o Apache</strong></h3>
<p>Em ambiente de desenvolvimento, será necessário configurar o apache para interpretar o arquivo <a href="http://httpd.apache.org/docs/2.2/pt-br/howto/htaccess.html" target="_blank">.htaccess</a>, mas não se preocupe com essas configurações em servidores Web na Internet, provavelmente as modificações na configuração já foram feitas pelo administrador do servidor.</p>
<p><strong>2.1</strong> &#8211; Abra o arquivo <strong>httpd.conf</strong> do apache usando o editor de texto <a href="#downloads">Notepad++</a>. Em uma instalação padrão no <strong>Windows 7</strong>, a localização do arquivo é <strong>C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf</strong>, já no <strong>Windows XP</strong>, ele está localizado em <strong>C:\Arquivos de programas\Apache2.2\conf\httpd.conf</strong>.</p>
<p><strong>2.2</strong> &#8211; Procure pela ocorrência do texto <strong>#LoadModule rewrite_module modules/mod_rewrite.so</strong> e substitua o mesmo por <strong>LoadModule rewrite_module modules/mod_rewrite.so</strong></p>
<p><strong>2.3</strong> &#8211; Procure pela ocorrência do texto <strong>Options FollowSymLinks</strong> e substitua por <strong>Options FollowSymLinks Includes</strong></p>
<p><strong>2.4</strong> &#8211; Procure pelas ocorrências (são duas) do texto Options <strong>AllowOverride None</strong> e substitua por <strong>AllowOverride All</strong></p>
<p><strong>2.5</strong> &#8211; Adicione o texto <strong>AccessFileName .htaccess</strong> no final do arquivo </p>
<p>2.6 &#8211; Reinicie o Apache usando o <strong>Monitor Apache Servers</strong> que fica acessível na barra de ferramentas ao lado do relógio. De um clique com o botão equerdo do mouse em seu ícone e escolha a opção <strong>restart</strong>.</p>
<p><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/php_6.jpg" alt="" title="php_6" width="360" height="273" class="aligncenter size-full wp-image-150" /></p>
<h3><strong>3 &#8211; Descompactando o Zend Framework</strong></h3>
<p>Use o programa <a href="#downloads">Winrar</a> para descompactar o arquivo do <em><strong>ZendFramework-1.11.11.zip</strong></em> (Zend Framework 1.11.11) que você acabou de efetuar download na raiz do disco (C:/).</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_1.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_1.jpg" alt="" title="ZendFramework_1" width="500" height="395" class="aligncenter size-full wp-image-398" /></a></p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_2.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_2.jpg" alt="" title="ZendFramework_2" width="500" height="425" class="aligncenter size-full wp-image-399" /></a></p>
<p>Com isso, o diretório <em><strong>C:/ZendFramework-1.11.11</strong></em> foi criado.</p>
<h3><strong>4 &#8211; Configurando os variáveis de ambiente do Windows</strong></h3>
<p>Depois de termos descompactado o Zend Framework na raiz do disco, iremos configurar o Windows para incluir o diretorio <strong>C:\ZendFramework-1.11.11\bin</strong> na variável de ambiente <strong>Path</strong>.</p>
<p><strong>4.1</strong> &#8211; Vá em Painel de <strong>Controle->Sistema->Configurações Avançadas->Aba Avançado->Variáveis de Ambiente</strong></p>
<p><strong>4.2</strong> &#8211; Na caixa <strong>Variáveis de Ambiente</strong>, procure pela variável <strong>Path</strong> e de um duplo clique na mesma, com isso uma caixa edição se abrirá. vá até o fim da mesma e adicione <strong>;C:\ZendFramework-1.11.11\bin</strong>.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_3.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_3.jpg" alt="" title="ZendFramework_3" width="500" height="587" class="aligncenter size-full wp-image-401" /></a></p>
<p><strong>4.3</strong> &#8211; Após essas modificações, reinicie o computador</p>
<h3><strong>5 &#8211; Criando um projeto de Teste</strong></h3>
<p><strong>5.1</strong> &#8211; No <strong>Windows 7</strong>, vá no menu Iniciar e digite <strong>cmd</strong> na caixa de busca, já no <strong>Windows XP</strong>, o comando <strong>cmd</strong> deve ser efetuado na caixa executar no menu Iniciar. Com isso, uma janela do programa <strong>cmd</strong> será apresentada.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_4.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_4.jpg" alt="" title="ZendFramework_4" width="409" height="119" class="aligncenter size-full wp-image-405" /></a></p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_51.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_51.jpg" alt="" title="ZendFramework_5" width="500" height="256" class="aligncenter size-full wp-image-406" /></a></p>
<p><strong>5.2</strong> &#8211; Dentro do programa <strong>cmd</strong>, digite <strong>cd C:\Program Files\Apache Software Foundation\Apache2.2\htdocs</strong> caso esteja no <strong>Windows 7</strong> ou <strong>cd C:\Arquivos de programas\Apache Software Foundation\Apache2.2\htdocs</strong> caso esteja no <strong>Windows XP</strong> e aperte <strong>Enter</strong>. </p>
<blockquote><p>Estou assumindo que você está usando as configurações padrões do apache, ou seja, que você não modificou o parametro <strong>DocumentRoot</strong> do arquivo <strong>httpd.conf</strong>. Caso contrário, você deverá usar o caminho do seu <strong>DocumentRoot</strong> no comando acima. Exemplo: Digite <strong>cd C:\www</strong> no programa <strong>cmd</strong> caso o seu <strong>DocumentRoot</strong> seja <strong>C:\www</strong></p></blockquote>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_6.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_6-e1318383841658.jpg" alt="" title="ZendFramework_6" width="500" height="247" class="aligncenter size-full wp-image-410" /></a></p>
<p><strong>5.3</strong> &#8211; Agora nós criaremos um projeto, para isso digite o comando <strong>zf create project digitadev</strong> e aperte <strong>Enter</strong><br />
<a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_7.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_7.jpg" alt="" title="ZendFramework_7" width="500" height="258" class="aligncenter size-full wp-image-411" /></a></p>
<p><strong>5.4</strong> &#8211; Antes de podermos efetuar os testes, precisaremos copiar a pasta <strong>C:\ZendFramework-1.11.11\library\Zend</strong> para <strong>C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\digitaldev\library</strong> caso esteja no <strong>Windows 7</strong> ou <strong>C:\Arquivos de programas\Apache Software Foundation\Apache2.2\htdocs\digitaldev\library</strong> caso esteja no <strong>Windows XP</strong>.</p>
<h3><strong>6 &#8211; Testando a configuração</strong></h3>
<p>6.1 &#8211; Abra o navegador web de sua preferencia e digite o seguinte endereço <strong>http://localhost/digitaldev/public</strong>. Se tudo ocorreu bem, o seu navegador mostrará uma página como a da imagem abaixo.</p>
<p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_8.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/10/ZendFramework_8.jpg" alt="" title="ZendFramework_8" width="500" height="389" class="aligncenter size-full wp-image-412" /></a></p>
<p>Aqui está o tutorial passo a passo para instalar o Zend Framework.<br />
Qualquer dúvida ou sugestão, usem a parte de respostas no final do post.</p>
<p><strong>Post relacionados</strong><br />
<a href="http://www.digitaldev.com.br/2011/07/03/o-que-e-php-e-qual-e-sua-historia/">O que é PHP e qual é sua historia?</a><br />
<a href="http://www.digitaldev.com.br/2011/09/21/instalando-o-ambiente-de-desenvolvimento-php-php-5-3-x-apache-eclipse/">Instalando o ambiente de desenvolvimento PHP (PHP 5.3.x + Apache + Eclipse)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/10/11/instalando-e-configurando-o-zend-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Classe, encapsulamento, herança, composição e agregação</title>
		<link>http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/</link>
		<comments>http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 23:54:18 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[C / C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Agregação]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Composição]]></category>
		<category><![CDATA[Construtores]]></category>
		<category><![CDATA[Destrutores]]></category>
		<category><![CDATA[Encapsulamento]]></category>
		<category><![CDATA[Herança]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programação Orientada a Objeto]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=279</guid>
		<description><![CDATA[Para um programa em uma linguagem qualquer ser orientado a objeto, ele tem que ser formado por classes, heranças, composições e agregações. A maioria das linguagens de programação hoje em dia suporta esse paradigma de desenvolvimento. Vamos então a alguns conceitos básicos sobre o assunto. Classes Uma classe é uma espécie de modelo de dados &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/" data-text="Classe, encapsulamento, herança, composição e agregação" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/oop.jpg"><img class="aligncenter size-full wp-image-338" style="border: 0px;" title="oop" src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/oop.jpg" alt="" width="187" height="235" /></a></p>
<p>Para um programa em uma linguagem qualquer ser orientado a objeto, ele tem que ser formado por classes, heranças, composições e agregações. A maioria das linguagens de programação hoje em dia suporta esse paradigma de desenvolvimento. Vamos então a alguns conceitos básicos sobre o assunto.<br />
<span id="more-279"></span></p>
<h3><strong>Classes</strong></h3>
<p>Uma classe é uma espécie de modelo de dados formado por atributos e métodos.</p>
<h5><strong>Atributos e métodos</strong></h5>
<p>Atributos são variáveis internas de uma classe. Por exemplo, se fôssemos criar uma classe para representar uma <strong>Pessoa</strong>, provavelmente as variáveis <strong>Nome</strong> e <strong>RG</strong> seriam alguns dos seus atributos.</p>
<p>Métodos são funções internas de uma classe. Por exemplo, se fossemos criar uma classe para representar uma <strong>Pessoa</strong>, provavelmente as funcionalidades <strong>definirNome</strong> e <strong>retornarNome</strong> seriam alguns dos seus métodos.</p>
<h5><strong>Construtores e destrutores de uma Classe</strong></h5>
<p>Construtores são métodos de inicialização de uma classe. Eles serão executados automaticamente assim que um objeto dessa classe for instanciado dentro do programa. Geralmente são usados para inicializar variáveis ou executar algum bloco de código necessário.</p>
<p>Destrutores exercem função parecida a do construtor. São executados automaticamente, mas somente quando o programa decidir que um objeto de uma determinada classe não será mais usado ou quando uma instrução de destruição (inserida pelo programador) for encontrada no código. Geralmente são usados para liberar recursos alocados pelo objeto durante a execução.</p>
<h5><strong>Exemplo de classe</strong></h5>
<p>Quando queremos construir uma classe para representar um <strong>ponto</strong> em um universo 2D (coordenadas x,y), devemos definir os atributos e os métodos para ela. Nesse caso, os atributos são valores numéricos de <strong>x</strong> e <strong>y</strong>, já os métodos são as funções internas que permitem definir e recuperar os valores de <strong>x</strong> e <strong>y</strong>.</p>
<p>Exemplo de classe <strong>Ponto</strong> implementada em linguagem de programação PHP</p>
<pre class="brush: php; title: ; notranslate">
class Ponto
{
    //atributos
    private $x;
    private $y;

    //construtor da classe
    function __construct($dx,$dy)
    {
        $this-&gt;x = $dx;
        $this-&gt;y = $dy;
    }

    //métodos
    public function definirX($dx)
    {
        $this-&gt;x = $dx;
    }

    public function retornarX()
    {
        return $this-&gt;x;
    }

    public function definirY($dy)
    {
        $this-&gt;y = $dy;
    }

    public function retornarY()
    {
        return $this-&gt;y;
    }

    //destrutor da classe
    function __destruct()
    {
    }
}
</pre>
<p>Exemplo da classe <strong>Ponto</strong> implementada em linguagem de programação C++</p>
<pre class="brush: cpp; title: ; notranslate">
class Ponto
{
    private:
        int x,y; //atributos

    public:

        //construtor da classe
        Ponto(int dx, int dy)
        {
            this-&gt;x = dx;
            this-&gt;y = dy;
        }

        //métodos
        void definirX(int dx)
        {
            this-&gt;x = dx;
        }

        int retornarX(void)
        {
            return this-&gt;x;
        }

        void definirY(int dy)
        {
            this-&gt;y = dy;
        }

        int retornarY(void)
        {
             return this-&gt;y;
        }

        //destrutor da classe
        ~Ponto(void)
        {
        }
}
</pre>
<h3><strong>Encapsulamento</strong></h3>
<p>O encapsulamento nos permite definir como os atributos e métodos de uma classe serão acessados. Para isso, existem limitadores quem permitem definir quem poderá acessar os tais.</p>
<p>Cada linguagem de programação possui os seus próprios limitadores acesso, mas os mais comuns são:<br />
público (<strong>public</strong>) &#8211; o método ou atributo pode ser acessado por qualquer classe.<br />
protegido (<strong>protected</strong>) &#8211; o método ou atributo pode ser acessado apenas pela própria classe ou classes herdeiras.<br />
privado (<strong>private</strong>) &#8211; o método ou atributo pode ser acessado apenas pela própria classe.</p>
<h3><strong>Herança</strong></h3>
<p>Uma herança permite que uma classe herde os métodos e atributos públicos e protegidos de uma outra classe. Com isso, a classe herdeira é chamada de classe filho e a classe herdada é chamada de classe pai.</p>
<h5><strong>Exemplo de herança</strong></h5>
<p>Definiremos uma classe <strong>Circulo</strong> representada em um universo 2D, a mesma terá como atributos as coordenas x e y que definem onde o seu <strong>ponto</strong> central está localizado e o seu ráio.</p>
<p>Classe <strong>Circulo</strong> implementada em linguagem de programação PHP</p>
<pre class="brush: php; title: ; notranslate">
class Circulo
{
    //atributos
    private $x;
    private $y;
    private $raio

    //construtor da classe
    function __construct()
    {
    }

    //métodos
    public function definirX($dx)
    {
        $this-&gt;x = $dx;
    }

    public function retornarX()
    {
        return $this-&gt;x;
    }

    public function definirY($dy)
    {
        $this-&gt;y = $dy;
    }

    public function retornarY()
    {
        return $this-&gt;y;
    }

    public function definirRaio($draio)
    {
        $this-&gt;raio = $draio;
    }

    public function retornarRaio()
    {
        return $this-&gt;raio;
    }

    //destrutor da classe
    function __destruct()
    {
    }

}
</pre>
<p>Classe <strong>Circulo</strong> implementada em linguagem de programação C++</p>
<pre class="brush: cpp; title: ; notranslate">
class Circulo
{
    //atributos
    private:
        int x, y, raio;

    public:

        //construtor da classe
        Circulo()
        {
        }

        //métodos
        void definirX(int dx)
        {
            this-&gt;x = dx;
        }

        int retornarX(void)
        {
            return this-&gt;x;
        }

        void definirY(int dy)
        {
            this-&gt;y = dy;
        }

        int retornarY(void)
        {
             return this-&gt;y;
        }

        void definirRaio(int draio)
        {
            this-&gt;raio = draio;
        }

        int retornarRaio()
        {
            return this-&gt;raio;
        }

        //destrutor da classe
        ~Circulo()
        {
        }
}
</pre>
<p>Agora, com base na classe <strong>Circulo</strong>, criaremos uma segunda classe chamada <strong>Bola</strong> (classe filho).</p>
<p>Classe <strong>Bola</strong> implementada em linguagem de programação PHP</p>
<pre class="brush: php; title: ; notranslate">
class Bola extends Circulo
{
    //atributo
    private $cor;

    //construtor da classe
    function __construct()
    {
        //chamando o construtor da classe pai (Circulo)
        parent::__construct();
    }

    //métodos
    public function definirCor($dcor)
    {
        $this-&gt;cor = $dcor;
    }

    public function retornarCor($dcor)
    {
        return $this-&gt;cor;
    }

    //destrutor da classe
    function __destruct()
    {
        //chamando o destrutor da classe pai (Circulo)
        parent::__destruct();
    }

}
</pre>
<p>Classe <strong>Bola</strong> implementada em linguagem de programação C++</p>
<pre class="brush: cpp; title: ; notranslate">
class Bola : public Circulo
{
    //atributo
    private:
        char* cor;

    public:
        //construtor da classe
        Bola()
        {
        }

        //métodos
        void definirCor(char* dcor)
        {
            this-&gt;cor = new char[(sizeof(dcor) / sizeof(char))];
            strcpy(this-&gt;cor,dcor);
        }

        char* retornarCor()
        {
            return this-&gt;cor;
        }

        //destrutor da classe
        ~Bola()
        {
            if(this-&gt;cor)
                delete this-&gt;cor;
        }
}
</pre>
<p>Com isso, todos os métodos da classe pai estarão acessíveis pela classe filho. Veja o exemplo no código abaixo.</p>
<p>Linguagem de programação PHP</p>
<pre class="brush: php; title: ; notranslate">
    $bola= new Bola();

    //métodos da classe circulo herdados pela classe bola
    $bola-&gt;definirX(10);
    $bola-&gt;definirY(15);
    $bola-&gt;definirRaio(10);

    //método da própria classe bola
    $bola-&gt;definirCor(&quot;Azul&quot;);
</pre>
<p>Linguagem de programação C++</p>
<pre class="brush: cpp; title: ; notranslate">
    Bola *bola;
    bola = new Bola();

    //métodos da classe circulo herdados pela classe bola
    bola-&gt;definirX(10);
    bola-&gt;definirY(15);
    bola-&gt;definirRaio(10);

    //método da própria classe bola
    bola-&gt;definirCor(&quot;Azul&quot;);
</pre>
<h3><strong>Composição</strong></h3>
<p>Uma composição acontece quando uma <strong>classe A</strong> tem instanciada dentro dela um objeto (ou lista de objetos) de uma outra <strong>classe B</strong>, quando a <strong>classe A</strong> for destruída, os objetos da <strong>classe B</strong> instanciados dentro da <strong>classe A</strong> também serão destruídos.</p>
<p>Pensando sobre a definição de composição acima, um bom exemplo para esclarecer essa associação é construir uma classe para representar o nosso <strong>Universo 2D</strong> com <strong>20 coordenada possíveis no eixo x</strong> e <strong>20 coordenada possíveis no eixo y</strong>.</p>
<p>Classe <strong>Universo</strong> implementada em linguagem de programação PHP</p>
<pre class="brush: php; title: ; notranslate">
class Universo
{
    private $pontos[20][20];

    //construtor da classe
    function __construct()
    {
        for($x = 0; $x &lt; 20 ; $x++ )
        {
            for($y = 0 ; $y &lt; 20 ; $y++)
                $this-&gt;pontos[$x][$y] = new Ponto($x,$y);
        }
    }

    public function retornarPonto($x ,$y)
    {
        return $this-&gt;pontos[$x][$y];
    }

    //destrutor da classe
    function __destruct()
    {
    }

};
</pre>
<p>Classe <strong>Universo</strong> implementada em linguagem de programação C++</p>
<pre class="brush: cpp; title: ; notranslate">
class Universo
{
    private:
        Ponto* pontos[20][20];

    public:
        //construtor da classe
        Universo()
        {
            for(int x = 0; x &lt; 20 ; x++ )
            {
                for(int y = 0 ; y &lt; 20 ; y++)
                    this-&gt;pontos[x][y] = new Ponto(x,y);
            }
        }

        Ponto* retornarPonto(int x, int y)
        {
            return this-&gt;pontos[x][y];
        }

        //destrutor da classe
        ~Universo()
        {
        }
};
</pre>
<p>Com o código acima, é fácil visualizar que se o universo for destruído, todos os pontos pertencentes a ele também serão destruídos.</p>
<h3><strong>Agregação</strong></h3>
<p>Uma Agregação acontece quando uma <strong>classe A</strong> agrega dentro dela um objeto (ou lista de objetos) de uma outra <strong>classe B</strong>, quando a <strong>classe A</strong> for destruída, o objeto da <strong>classe B</strong> permanece intacto, ou seja, os objetos contidos podem existir sem serem parte do objeto que os contém.</p>
<p>Para demonstrar como funciona uma agregação, iremos fazer algumas modificações na classe <strong>Circulo</strong></p>
<p>Classe <strong>Circulo</strong> implementada em linguagem de programação PHP</p>
<pre class="brush: php; title: ; notranslate">
class Circulo
{
    //atributos
    private $ponto;
    private $raio

    //construtor da classe
    function __construct()
    {
    }

    //métodos
    public function definirPonto(Ponto $ponto)
    {
        $this-&gt;ponto = $ponto;
    }

    public function retornarPonto()
    {
        return $this-&gt;ponto;
    }

    public function definirRaio($draio)
    {
        $this-&gt;raio = $draio;
    }

    public function retornarRaio()
    {
        return $this-&gt;raio;
    }

    //destrutor da classe
    function __destruct()
    {
    }
}
</pre>
<p>Classe <strong>Circulo</strong> implementada em linguagem de programação C++</p>
<pre class="brush: cpp; title: ; notranslate">
class Circulo
{
    //atributos
    private:
        Ponto* ponto;
        int raio;

    public:
        //construtor da classe
        Circulo()
        {
        }

        //métodos
        Ponto* retornarPonto(void)
        {
            return this-&gt;ponto;
        }

        void definirPonto(Ponto* ponto)
        {
            this-&gt;ponto = ponto;
        }

        void definirRaio(int draio)
        {
            this-&gt;raio = draio;
        }

        int retornarRaio()
        {
            return this-&gt;raio;
        }

        //destrutor da classe
        ~Circulo()
        {
        }
}
</pre>
<p>Finalmente, usando a classe <strong>Universo</strong> e a classe <strong>Circulo</strong>, poderemos dar um exemplo real de agregação.<br />
Agregaremos um objeto classe <strong>Ponto</strong> pertencente ao Universo 2D dentro de uma instância da classe <strong>Circulo</strong></p>
<p>Linguagem de programação PHP</p>
<pre class="brush: php; title: ; notranslate">
    //instanciando os objetos
    $universo = new Universo();
    $circulo = new Circulo();

    //Configurando o raio e as coordenadas do ponto central do circulo
    $circulo-&gt;definirRaio(5);
    $circulo-&gt;definirPonto($universo-&gt;retornarPonto(10,10));
</pre>
<p>Linguagem de programação C++</p>
<pre class="brush: cpp; title: ; notranslate">
    //definindo as variáveis
    Universo* universo;
    Circulo* circulo;

    //instanciando os objetos
    universo = new Universo();
    circulo = new Circulo();

    //Configurando o raio e as coordenadas do ponto central do circulo
    circulo-&gt;definirRaio(5);
    circulo-&gt;definirPonto(universo-&gt;retornarPonto(10,10));
</pre>
<p>Aqui está uma breve introdução à OOP (Object-oriented programming ou Programação Orientada a Objeto).<br />
Qualquer dúvida ou sugestão, usem a parte de respostas no final do post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/09/27/classe-encapsulamento-heranca-composicao-e-agregacao/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQL Injection, como evitar esse tipo de ataque em páginas PHP</title>
		<link>http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/</link>
		<comments>http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 20:56:51 +0000</pubDate>
		<dc:creator>Tarcísio</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Injeção SQL]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Injection]]></category>

		<guid isPermaLink="false">http://www.digitaldev.com.br/?p=225</guid>
		<description><![CDATA[O que é SQL Injection? O SQL Injection, ou injeção de SQL, é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. O SQL Injection ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da &#8230; </p><p><a class="more-link block-button" href="http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/">Continue lendo &#187;</a>]]></description>
			<content:encoded><![CDATA[<div>
				<div style="float: left;"><fb:like href="http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/" action="Curtir" show_faces="true" layout="button_count"></fb:like></div>
				<div style="float: left;"><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/" data-text="SQL Injection, como evitar esse tipo de ataque em páginas PHP" data-count="horizontal" data-via="digitaldevBR"></a></div>
				<div style="float: left;"><g:plusone href="http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/" data-size="standard" count="true" size="medium"></g:plusone></div>
			</div><br/><p><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/SQL-Injection-Attack.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/SQL-Injection-Attack.jpg" alt="" title="SQL-Injection-Attack" width="450" height="313" class="aligncenter size-full wp-image-226" style="border: 0px;"/></a></p>
<p><strong>O que é SQL Injection?</strong></p>
<p>O SQL Injection, ou injeção de SQL, é um tipo de ameaça de segurança que se aproveita de falhas em sistemas que interagem com bases de dados via SQL. O SQL Injection ocorre quando o atacante consegue inserir uma série de instruções SQL dentro de uma consulta (query) através da manipulação das entrada de dados de uma aplicação.<br />
<span id="more-225"></span><br />
No caso do PHP, o SQL Injection geralmente ocorre em páginas de formulários que possuam falhas. Através disso, o atacante poderá burlar sistemas de senhas ou apagar componentes da estrutura do banco de dados (tabelas, databases, registros, esquemas e outros).</p>
<p><strong>Exemplo &#8211; Formulário de login</strong></p>
<p>Para demonstrar como o ataque acontece, vou usar um formulário simples de login.<br />
<div id="attachment_236" class="wp-caption aligncenter" style="width: 329px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_11.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_11.jpg" alt="" title="form_login_1" width="319" height="203" class="aligncenter size-full wp-image-253" /></a><p class="wp-caption-text">Formulário de Login</p></div></p>
<p>A imagem abaixo mostra um exemplo clássico de um código PHP e uma consulta SQL responsáveis por efetuar uma busca de usuários no banco de dados.<br />
<div id="attachment_237" class="wp-caption aligncenter" style="width: 491px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_2.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_2.jpg" alt="" title="form_login_2" width="481" height="320" class="size-full wp-image-237" /></a><p class="wp-caption-text">Código PHP e consulta SQL do formulário de login</p></div></p>
<p>Agora, imagine que eu escreva o código <em><strong> &#8216; OR 1=1 OR &#8216; &#8216;=&#8217; </strong></em> no campo de Usuário do formulário de login e uma senha qualquer.<br />
<div id="attachment_294" class="wp-caption aligncenter" style="width: 329px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub1.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub1.jpg" alt="" title="sub1" width="319" height="206" class="size-full wp-image-294" /></a><p class="wp-caption-text">Formulário de Login - Imagem 1</p></div></p>
<p>A consulta SQL no código PHP ficaria assim<br />
<div id="attachment_295" class="wp-caption aligncenter" style="width: 492px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub2.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub2.jpg" alt="" title="sub2" width="482" height="274" class="size-full wp-image-295" /></a><p class="wp-caption-text">Código PHP e consulta SQL do formulário de login</p></div></p>
<p>Pensando um pouco sobre a consulta SQL resultante mostrada na imagem acima. O que você acha que aconteceria se ela fosse executada?<br />
Ela simplesmente retornaria todos os usuários do banco, o resultado dela seria exatamente igual à</p>
<blockquote><p><strong>SELECT usu_in_id, usu_st_nome, usu_st_login, usu_st_email FROM control.tbl_usuario</strong></p></blockquote>
<p>e o atacante teria acesso ao sistema.</p>
<p>Imagine então que o o atacante seja um pouco mais malicioso, ao invés de entrar no sistema, ele queira apagar a tabela de usuários. Então ele só teria que escrever <strong> &#8216;; DELETE FROM tbl_usuario; SELECT * FROM tbl_usuario WHERE &#8216; &#8216;=&#8217; </strong> no campo de <strong>Usuário</strong> e então a consulta resultante ficaria<br />
<div id="attachment_296" class="wp-caption aligncenter" style="width: 870px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub3.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub3.jpg" alt="" title="sub3" width="860" height="276" class="size-full wp-image-296" /></a><p class="wp-caption-text">Código PHP e consulta SQL do formulário de login</p></div></p>
<p>Dividi a consulta resultante da imagem acima em três outras consultas para facilitar a visualização<br />
<div id="attachment_297" class="wp-caption aligncenter" style="width: 870px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub4.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/sub4.jpg" alt="" title="sub4" width="860" height="276" class="size-full wp-image-297" /></a><p class="wp-caption-text">Código PHP e consulta SQL do formulário de login</p></div></p>
<p><strong>Como evitar esse tipo de ataque em páginas escritas em PHP</strong></p>
<p>Olhando o exemplo do formulário de login acima, você consegue chegar a uma solução do problema?<br />
Se você pensou em substituir o caractere <strong>&#8216;</strong> por um outro qualquer, está no caminho certo.</p>
<p>O jeito mais simples é usar a função nativa do PHP <strong><a href="http://www.php.net/manual/pt_BR/function.addslashes.php" target="_blank">addslashes($str)</a></strong> para substituir o caractere <strong>&#8216;</strong> por <strong>\&#8217;</strong> vindos de campos de texto do formulário. Isso deixaria o nosso código do formulário de login assim<br />
<div id="attachment_260" class="wp-caption aligncenter" style="width: 427px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_7.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_7.jpg" alt="" title="form_login_7" width="417" height="304" class="aligncenter size-full wp-image-261" /></a><p class="wp-caption-text">Código PHP e consulta SQL do formulário de login</p></div><br />
Com isso, a tentativa de injetar o código SQL <em><strong>&#8216; OR 1=1 OR &#8221;=&#8217;</strong></em> resultaria em<br />
<div id="attachment_262" class="wp-caption aligncenter" style="width: 427px"><a href="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_8.jpg"><img src="http://www.digitaldev.com.br/wp-content/uploads/2011/09/form_login_8.jpg" alt="" title="form_login_8" width="417" height="304" class="size-full wp-image-262" /></a><p class="wp-caption-text">Código PHP e consulta SQL do formulário de login</p></div></p>
<p>O Problema de usar a função<strong><a href="http://www.php.net/manual/pt_BR/function.addslashes.php" target="_blank">addslashes($str)</a></strong> é que você não poderá esquecer de usá-la para nenhum campo de texto do formulário, ou seja, se o seu formulário possuir 50 campos de texto, você terá que filtrar todos eles.</p>
<p>Existe uma maneira de fazer com que o interpretador PHP filtre automaticamente todos os campos de formulários, substituindo o caractere <strong>&#8216;</strong> por <strong>\&#8217;</strong>. Assim, não será mais necessário usar a função <strong><a href="http://www.php.net/manual/pt_BR/function.addslashes.php" target="_blank">addslashes($str)</a></strong>.</p>
<p>Para filtrar automaticamente os campos de formulários, substitua <strong>magic_quotes_gpc = Off</strong> por <strong>magic_quotes_gpc = On</strong> no arquivo <strong>php.ini</strong> (arquivo de configuração do interpretador PHP).</p>
<p><strong>Com esses cuidados, o problema de segurança está resolvido?</strong><br />
Não. Ainda precisamos tomar cuidado com os campos numéricos dos formulários.</p>
<p>Eu não vou entrar muito nesse assunto, mas meu conselho é sempre verificar se os dados vindos de campos numéricos são realmente numéricos usando a função<a href="http://www.php.net/is_numeric" target="_blank" target="_blank"> <strong>is_numeric($var)</strong></a></p>
<p>if(is_numeric($in_idade))<br />
{<br />
    //executa o código<br />
}</p>
<p>Essas são as dicas que e tenho para dar sobre como se proteger de ataques do tipo SQL Injection. Espero ter ajudado vocês.</p>
<p>Qualquer dúvida ou sugestão, usem a área de respostas no final do post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.digitaldev.com.br/2011/09/22/sql-injection-como-evitar-esse-tipo-de-ataque-em-paginas-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

