<?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>Boteco Digital &#187; PHP</title>
	<atom:link href="http://www.botecodigital.info/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.botecodigital.info</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 18:36: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>Criando gráficos legais com pChart 2.0</title>
		<link>http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/</link>
		<comments>http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 01:48:52 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[graficos]]></category>
		<category><![CDATA[imagens]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1742</guid>
		<description><![CDATA[&#8220;Uma imagem diz mais que mil palavras&#8221;, se isso é verdade é muito discutível, mas com certeza um gráfico facilita bastante a assimilação de uma boa quantidade de dados. Gráficos são importantes com certeza(os administradores adoram) e agregam bastante a um sistema. Até pouco tempo a única biblioteca de gráficos que eu conhecia utilizava Flash e era bem complicada de mexer, a Fusion Charts, mas a alguns meses descobri uma biblioteca bem mais interessante a pChart que gera gráficos muito [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Uma imagem diz mais que mil palavras&#8221;, se isso é verdade é muito discutível, mas com certeza um gráfico facilita bastante a assimilação de uma boa quantidade de dados. Gráficos são importantes com certeza(os administradores adoram) e agregam bastante a um sistema.</p>
<p>Até pouco tempo a única biblioteca de gráficos que <b>eu</b> conhecia utilizava <em>Flash</em> e era bem complicada de mexer, a <a href="http://www.fusioncharts.com/">Fusion Charts</a>, mas a alguns meses descobri uma biblioteca bem mais interessante a <a href="http://www.pchart.net/">pChart</a> que gera gráficos muito bonitos e de forma bem fácil. Então vamos parar de enrolação e vamos colocar a mão na massa. </p>
<p>Primeiro é claro vamos <a href="http://www.pchart.net/download">baixar o pChart</a>. No zip vem vários arquivos, muitos de exemplos e etc. Só nos  interessa as pastas class, que contém as classes <em>PHP</em> propriamente ditas, fontes com fontes diferenciadas para os rótulos dos gráficos, e palettes com cores predefinidas.</p>
<h5>Gráfico em barra</h5>
<pre class="brush: php; title: ; notranslate">
include(&quot;pChart/class/pData.class.php&quot;);
include(&quot;pChart/class/pImage.class.php&quot;);

$data = new pData();
$data-&gt;addPoints( array( 10 , 20 , 30 , 40 , 30 , 20 , 10 , -10 , -20 , -30 ) , &quot;Valores A&quot; );
$data-&gt;addPoints( array( &quot;Janeiro&quot; , &quot;Fevereiro&quot; , &quot;Março&quot; , &quot;Abril&quot; , &quot;Maio&quot; , &quot;Junho&quot; , &quot;Julho&quot; , &quot;Agosto&quot; , &quot;Setembro&quot; , &quot;Outubro&quot; ) , &quot;Meses&quot; ); 

$data-&gt;setAbscissa(&quot;Meses&quot;);
$data-&gt;setAxisName(0,&quot;Hits&quot;); 

$myPicture = new pImage( 700 , 230 , $data );
$myPicture-&gt;drawRectangle( 0 , 0 , 699 , 229 , array( &quot;R&quot;=&gt;0 , &quot;G&quot;=&gt;0 , &quot;B&quot;=&gt;0 ) ); 

$myPicture-&gt;setFontProperties( array( &quot;FontName&quot;=&gt;&quot;pChart/fonts/pf_arma_five.ttf&quot; , &quot;FontSize&quot;=&gt;6 ) ); 

$myPicture-&gt;setGraphArea(60,40,650,200); 

$scaleSettings = array( &quot;GridR&quot;=&gt;200 , &quot;GridG&quot;=&gt;200 , &quot;GridB&quot;=&gt;200 , &quot;CycleBackground&quot;=&gt;TRUE );
$myPicture-&gt;drawScale($scaleSettings); 

$myPicture-&gt;drawLegend( 580 , 12 , array( &quot;Style&quot;=&gt;LEGEND_NOBORDER , &quot;Mode&quot;=&gt;LEGEND_HORIZONTAL ) ); 

$myPicture-&gt;drawBarChart(); 

$myPicture-&gt;autoOutput('barra.png');
</pre>
<p>Nas linhas 1 e 2 incluímos os arquivos da classes <strong>pData</strong> e <strong>pImage</strong> que iremos utilizar.</p>
<p>Na linha 4 instanciamos um objeto <strong>pData</strong> que é o objeto que representa os dados de nosso gráfico é por ele que adicionaremos os valores no gráfico.</p>
<p>Na linha 5 adicionamos os valores das barras através do método <strong>addPoints</strong> , os valores são adicionados no 1º parâmetro em forma de array e o 2º parâmetro é o rotulo desta série de dados, o <strong>pChart</strong> aceita gráficos com vários séries ou seja várias barras por  intervalo do eixo X.</p>
<p>Na linha 6 adicionamos mais valores, mas estes serão os rótulos que estarão no eixo X(iremos configurar isso na linha 9) então ele deve ter o mesmo número de valores no array dos valores das barras.</p>
<p>Na linha 8 configuramos a serie &#8220;Meses&#8221; como rótulos do eixo X. Na linha 9 definimos o nome do eixo X.</p>
<p>Neste momento já definimos os dados do nosso gráfico agora devemos construir nossa imagem para isso criamos uma instância da classe <strong>pImage</strong> e recebe como parâmetro as dimensões da imagem, no caso a imagem terá 700px de largura e 230px de largura, e passamos também o nosso objeto  que representa os dados do gráfico <strong>$data</strong>.</p>
<p>Na linha 12  utilizamos o método <strong>drawRectangle</strong> para desenhar um retangulo com borda preta ao redor da imagem para delimitar a borda.</p>
<p>Na linha 14 definimos a fonte através do método <strong>setFontProperties</strong> repare que para <em>FontName</em> se esta apontando para um arquivo  da pasta fonts, se deseja utilizar outra fonte para os rótulos do gráfico basta colocar um novo ttf e especificar o caminho neste método, e também podemos definir o tamanho da fonte através do <em>FontSize</em>.</p>
<p>Na linha 16 utilizamos o método <strong>setGraphArea</strong> defimos onde nosso gráfico será desenhado na imagem, lembrando a imagem que iremos  gerar terá 700&#215;230 mas é dentro dela que iremos desenha o gráfico de barras e devemos informar os pontos x,y inicial e x,y final como se estivéssemos desenhado um retângulo.</p>
<p>Na linha 18 definimos as propriedades da escala, que serão utilizadas para desenha-la na linha 20 com o método <strong>drawScale</strong>. A escala é a área que serão desenhadas as barras, os valores GridR, GridG e GridB são os valores de cores das linha que serão desenhadas no fundo e CycleBackground  é para mostrar as linhas de escala.</p>
<p>Na linha 21 desenhamos a legenda do gráfico.</p>
<p>Na linha 23 utilizamos o método <strong>drawBarChart</strong> para desenhar o gráfico propriamente dito, baseado nas configurações feitas anteriormente.</p>
<p>Na linha 25 geramos a imagem do gráfico para isso utilizamos <strong>autoOutput</strong> ela irá gerenciar automaticamente se a imagem deve  ser enviada para o navegador ou ser salva. Mas podemos obrigar o gráfico ser salvo utilizando o método <strong>render</strong>.</p>
<p>Veja o gráfico gerado:</p>
<div style="text-align:center">
<img src="http://www.botecodigital.info/exemplos/pchart/barras.php" alt="Gráfico em barra" />
</div>
<p></p>
<h3>Gráfico em pizza</h3>
<pre class="brush: php; title: ; notranslate">
include(&quot;pChart/class/pData.class.php&quot;);
include(&quot;pChart/class/pPie.class.php&quot;);
include(&quot;pChart/class/pDraw.class.php&quot;);
include(&quot;pChart/class/pImage.class.php&quot;);

$data = new pData();   

$data-&gt;addPoints(array(10,20,30),&quot;Placar&quot;);
$data-&gt;addPoints(array(&quot;A&quot;,&quot;B&quot;,&quot;C&quot;),&quot;Label&quot;);
$data-&gt;setAbscissa(&quot;Label&quot;); 

$myPicture = new pImage(500,300,$data);
$myPicture-&gt;drawRectangle( 0 , 0 , 499 , 299 , array( &quot;R&quot;=&gt;0 , &quot;G&quot;=&gt;0 , &quot;B&quot;=&gt;0 ) );
$myPicture-&gt;setFontProperties( array( &quot;FontName&quot;=&gt;&quot;pChart/fonts/verdana.ttf&quot; , &quot;FontSize&quot;=&gt;18 ) ); 

$PieChart = new pPie($myPicture,$data);
$PieChart-&gt;draw3DPie( 150 , 160 , array( &quot;DrawLabels&quot;=&gt;TRUE , &quot;Border&quot;=&gt;TRUE ) );
$PieChart-&gt;drawPieLegend( 450 , 50 , array( &quot;Style&quot;=&gt;LEGEND_NOBORDER , &quot;Mode&quot;=&gt;LEGEND_VERTICAL ) );
$myPicture-&gt;autoOutput();
</pre>
<p>Para criar um gráfico em pizza utilizamos basicamente os mesmos códigos para criar o objeto de dados <strong>pData</strong> e a imagem <strong>pImage</strong>. </p>
<p>Mas necessitamos criar um objeto <strong>pPie</strong> que é nosso gráfico em pizza, ele recebe como parâmetro do construtor o nosso objeto de imagem e de dados(linha 16).</p>
<p>Na linha 17 desenhamos nosso gráfico em pizza com o método <strong>draw3DPie</strong> que recebe os 2 primeiros parâmetros são a posição do centro do gráfico na imagem. O 3º parâmetro é um array com as opções do gráfico, no caso especificamos que será mostrado os labels no gráfico e que ele terá bordar.</p>
<p>Na linha 18 desenhamos a legenda do gráfico em pizza. Os dois primeiros parâmetros são a posição na imagem e o array contém as opções, no caso, sem bordar e a legenda na horizontal.</p>
<p>Veja como o gráfico ficou:</p>
<div style="text-align:center">
<img src="http://www.botecodigital.info/exemplos/pchart/pizza.php" alt="Gráfico em barra" />
</div>
<p></p>
<h3>Gráfico em linha</h3>
<pre class="brush: php; title: ; notranslate">
include(&quot;pChart/class/pData.class.php&quot;);
include(&quot;pChart/class/pDraw.class.php&quot;);
include(&quot;pChart/class/pImage.class.php&quot;);

$data = new pData();
$data-&gt;addPoints( array( 10 , 20 , 30 , 40 , 30 , 20 ) , &quot;Server A&quot; );
$data-&gt;addPoints( array( &quot;Janeiro&quot; , &quot;Fevereiro&quot; , &quot;Março&quot; , &quot;Abril&quot; , &quot;Maio&quot; , &quot;Junho&quot; ) , &quot;Meses&quot; ); 

$data-&gt;setAbscissa(&quot;Meses&quot;);
$data-&gt;setAxisName(0,&quot;Hits&quot;); 

$myPicture = new pImage(700,230,$data); 

$myPicture-&gt;drawRectangle( 0 , 0 , 699 , 229 , array( &quot;R&quot;=&gt;0 , &quot;G&quot;=&gt;0 , &quot;B&quot;=&gt;0 ) ); 

$myPicture-&gt;setFontProperties( array( &quot;FontName&quot;=&gt;&quot;pChart/fonts/pf_arma_five.ttf&quot; , &quot;FontSize&quot;=&gt;6 ) ); 

$myPicture-&gt;setGraphArea(60,40,650,200); 

$scaleSettings = array( &quot;GridR&quot;=&gt;200 , &quot;GridG&quot;=&gt;200 , &quot;GridB&quot;=&gt;200 , &quot;CycleBackground&quot;=&gt;TRUE );
$myPicture-&gt;drawScale($scaleSettings); 

$myPicture-&gt;drawLegend( 580 , 12 , array( &quot;Style&quot;=&gt;LEGEND_NOBORDER , &quot;Mode&quot;=&gt;LEGEND_HORIZONTAL ) ); 

$myPicture-&gt;drawLineChart(); 

$myPicture-&gt;autoOutput();
</pre>
<p>O gráfico em linha é praticamente igual ao gráfico em barra basta alterar a linha 25 para desenhar com o método <strong>drawLineChart</strong>.</p>
<p>Veja um exemplo do gráfico gerado abaixo:</p>
<div style="text-align:center">
<img src="http://www.botecodigital.info/exemplos/pchart/linha.php" alt="Gráfico em barra" />
</div>
<p>Bom esse é o básico da biblioteca pChart ela é muito completa permitindo vários outros tipos de gráficos como <strong> Barcode</strong>, <strong>Bubble chart</strong>, <strong> Plot chart</strong>, <strong> Polar and radars</strong>, <strong>Progress bars</strong>, <strong>Surface chart</strong>.</p>
<p>Confira a documentação e os exemplos que vem junto com a biblioteca você vai se surpreender!</p>
<p>Era isso até mais e obrigado pelos peixes!</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Trocando dados utilizando JSON" title="Trocando dados utilizando JSON" /></a> <a href="http://www.botecodigital.info/jquery/trocando-dados-utilizando-json/" rel="bookmark" class="crp_title">Trocando dados utilizando JSON</a></li><li><a href="http://www.botecodigital.info/css/font-face-utilizando-fontes-alem-do-basico/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/11/css3.jpg" class="crp_thumb wp-post-image" alt="Font-Face, utilizando fontes além do básico!" title="Font-Face, utilizando fontes além do básico!" /></a> <a href="http://www.botecodigital.info/css/font-face-utilizando-fontes-alem-do-basico/" rel="bookmark" class="crp_title">Font-Face, utilizando fontes além do básico!</a></li><li><a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Menu Sanfona com JQuery" title="Menu Sanfona com JQuery" /></a> <a href="http://www.botecodigital.info/jquery/menu-sanfona-com-jquery/" rel="bookmark" class="crp_title">Menu Sanfona com JQuery</a></li><li><a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/cakephp.png" class="crp_thumb wp-post-image" alt="CakePHP – Validando um formlário com Model sem Controller" title="CakePHP – Validando um formlário com Model sem Controller" /></a> <a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark" class="crp_title">CakePHP – Validando um formlário com Model sem Controller</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Protegendo arquivos de download com login</title>
		<link>http://www.botecodigital.info/php/protegendo-arquivos-de-download-com-login/</link>
		<comments>http://www.botecodigital.info/php/protegendo-arquivos-de-download-com-login/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 20:03:39 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[login]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1637</guid>
		<description><![CDATA[Em algum momento necessitamos disponibilizar um arquivo para download somente para usuários cadastrados em nosso site. E como sabemos, simplesmente colocar estes arquivos em um pasta que possa ser acessado por URL do site não é uma ideia muito segura, pois mesmo se você disponibilizar o link de download somente para seu usuário logado, nada impede de uma outra pessoa “adivinhar” o caminho de download. Um usuário pode acessar diretamente a pasta de downloads e se seu diretório não conter [...]]]></description>
			<content:encoded><![CDATA[<p>Em algum momento necessitamos disponibilizar um arquivo para download somente para usuários cadastrados em nosso site. E como sabemos, simplesmente colocar estes arquivos em um pasta que possa ser acessado por URL do site não é uma ideia muito segura, pois mesmo se você disponibilizar o link de download somente para seu usuário logado, nada impede de uma outra pessoa “adivinhar” o caminho de download. Um usuário pode acessar diretamente a pasta de downloads e se seu diretório não conter um arquivo <em>index</em> ou o servidor apache não estiver configurado para não listar os arquivos(a maioria lista) o usuário verá seus arquivos, mesmo se não for possível listar os arquivos, o usuário mal intencionado pode ainda ir tentando nomes de arquivos por força bruta até acertar. Se o arquivo estiver dentro da pasta publica do apache ele pode ser acessado e baixado pelo navegador, você pode dificultar bastante, mas se o usuário descobrir o nome ele pode baixar.</p>
<p>Para remediar isso podemos colocar os arquivos de download fora da pasta de arquivos publicos do apache, sendo assim não acessíveis via URL diretamente, mas nos possibilitando criar um  script de download que verifique se o usuário esta logado ou se tem permissão de baixar, se estiver leia o arquivo do sistema de arquivo e envie para download para o usuário.</p>
<p>Para nosso exemplo iremos utilizar a seguinte estrutura de diretórios:</p>
<ul>
<li>public_html
<ul>
<li>index.php</li>
<li>login.php</li>
<li>logout.php</li>
<li>download.php</li>
</ul>
</li>
<li>downloads
<ul>
<li>putty.exe</li>
</ul>
</li>
</ul>
<p>Como você deve saber, na maioria das hospedagens os arquivos visíveis do nosso site  são colocados na pata public_html ou www . Sendo assim os arquivos da pasta downloads não esta publicada na web mas nossos scripts podem acessá-los via sistema de arquivos do servidor.</p>
<p>Antes de vermos o arquivo download.php que é o que realmente importa, vamos ver os arquivos de login, logut e index, que são bem simples e servem somente para este exemplo, se você quiser um <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/">exemplo de sistema de login pode ver em outro post</a>.</p>
<h6>index.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
  session_start();
?&gt;&lt;html&gt;
  &lt;head&gt;
      &lt;meta charset=&quot;UTF-8&quot;&gt;
      &lt;title&gt;Teste protegendo download autenticado&lt;/title&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;?php if ( $_SESSION['logado'] == &quot;true&quot; ){ ?&gt;
	&lt;p&gt;Você está logado&lt;/p&gt;
	&lt;a href=&quot;logout.php&quot;&gt;logout&lt;/a&gt;
    &lt;?php }else{ ?&gt;
	Você &lt;strong&gt;não&lt;/strong&gt; está logado!!!
	&lt;a href=&quot;login.php&quot;&gt;login&lt;/a&gt;
    &lt;?php } ?&gt;

  &lt;a href=&quot;download.php?download=putty.exe&quot;&gt;Download putty.exe&lt;/a&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p></p>
<h6>login.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
  session_start();

  $_SESSION['logado'] = 'true';

  header('location: index.php');
?&gt;
</pre>
<p></p>
<h6>logout.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
  session_start();

  unset($_SESSION['logado']);

  header('location: index.php');
?&gt;
</pre>
<p>Os arquivos acima são bem simples, acredito que não necessite de maiores explicações. Então vamos ao que interessa:</p>
<h6>download.php</h6>
<pre class="brush: php; title: ; notranslate">
&lt;?php
session_start();

if( $_SESSION['logado'] == 'true' ){

	$download = $_GET['download'];
	if( is_file( '/home/boteco/downloads/'.$download ) ){
		$filename = '/home/boteco/downloads/'.$download;

		$finfo = finfo_open(FILEINFO_MIME_TYPE);
		$type = finfo_file($finfo, $filename);
		header('Content-type: '.$type);
		header('Content-Disposition: attachment; filename=&quot;'.$download.'&quot;');

		readfile($filename);
	}else{
		echo &quot;arquivo nao encontrado&quot;;
	}

}else{
	echo &quot;Você não estaa logado. Faça o login para efetuar o download.&quot;;
}

?&gt;
</pre>
<p>Na linha 2 chamamos a função <em>session_start()</em> para podermos ler e gravar informação na sessão.</p>
<p>Na linha 4 testamos se o usuário que acessou esta logado na sessão, se o usuário pode fazer o download.</p>
<p>Na linha 6 pegamos o nome do arquivo que recebemos via parâmetro <em>GET</em> da URL, como vimos no arquivo <em>index.php</em> na linha 18 para fazer o download chamamos <em>download.php?download=putty.exe</em> então queremos baixar o arquivo <em>putty.exe</em>.</p>
<p>Na linha 7 verificamos se o arquivo que recebemos por parâmetro existe e é um arquivo, você deve ter notado que utilizamos o caminho absoluto da pasta de download e concatenamos com o nome  do arquivo recebido. </p>
<p>Na linha 8 armazenamos o nome absoluto do arquivo em uma variável para facilitar a manipulação.</p>
<p>Na linha 10  criamos um recurso fileinfo, para ser utilizado para ler o mime-type do arquivo.</p>
<p>Linha 11 lemos o MIME-TYPE do arquivo e armazenamos em uma variável, necessitamos pegar o MIME-TYPE do arquivo pois o nosso script de download possui o MIME-TYPE <strong>text/x-php</strong> e o comportamento do navegador para este MIME-<br />
TYPE é mostrá-lo e não baixá-lo, se deixarmos o MIME em <strong>text/x-php</strong> e jogarmos o contudo do arquivo para o navegador, veremos o código binário do programa, ou seja, um monte de caracteres estranhos.</p>
<p>Na linha 12 modificamos o MIME do nosso script para o MIME lido do arquivo.</p>
<p>Na linha 13 forçamos o arquivo ser baixado com o nome recebido por parâmetro, lembrando, se não forçarmos ele irá utilizar o nome do script o que não seria algo legal <img src='http://www.botecodigital.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   .</p>
<p>Na linha 15 utilizamos a função <em>redfile</em> que lê um arquivo e exibe ele na tela, como já modificamos o header do arquivo para um outro MIME e para forçar o download o arquivo será lido do sistema de arquivo e enviado para o usuário.</p>
<p><strong>OBS:</strong> Só lembrando, a função <em>finfo_open</em> só está disponível no <strong>PHP >= 5.3.0</strong>, se você utilizar uma versão anterior pode utilizar <em>mime_content_type</em> mas lembre-se de verificar se ela está disponível na sua hospedagem, na minha por exemplo não está e não estou com vontade de me incomodar com eles, fiquei somente com o teste local.</p>
<p>Bom era isso pessoal. </p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Exemplo de autenticação em PHP utilizando sessão- Parte 2" title="Exemplo de autenticação em PHP utilizando sessão- Parte 2" /></a> <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark" class="crp_title">Exemplo de autenticação em PHP utilizando sessão- Parte 2</a></li><li><a href="http://www.botecodigital.info/php/urls-amigaveis/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="URLs amigáveis" title="URLs amigáveis" /></a> <a href="http://www.botecodigital.info/php/urls-amigaveis/" rel="bookmark" class="crp_title">URLs amigáveis</a></li><li><a href="http://www.botecodigital.info/php/listando-arquivos-de-um-diretorio-em-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Listando arquivos de um diretório em PHP" title="Listando arquivos de um diretório em PHP" /></a> <a href="http://www.botecodigital.info/php/listando-arquivos-de-um-diretorio-em-php/" rel="bookmark" class="crp_title">Listando arquivos de um diretório em PHP</a></li><li><a href="http://www.botecodigital.info/php/criando-um-captcha-em-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Criando um CAPTCHA em PHP" title="Criando um CAPTCHA em PHP" /></a> <a href="http://www.botecodigital.info/php/criando-um-captcha-em-php/" rel="bookmark" class="crp_title">Criando um CAPTCHA em PHP</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/protegendo-arquivos-de-download-com-login/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TchêLinux Uruguaiana</title>
		<link>http://www.botecodigital.info/php/tchelinux-uruguaiana/</link>
		<comments>http://www.botecodigital.info/php/tchelinux-uruguaiana/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 15:47:22 +0000</pubDate>
		<dc:creator>Thiago Finardi</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[tchelinux]]></category>
		<category><![CDATA[uruguaiana]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1576</guid>
		<description><![CDATA[É com grande satisfação que anunciamos o 1º Seminário de Software Livre TcheLinux Uruguaiana. O TcheLinux é um grupo de voluntários que desde 2006 trabalha na divulgação do Software Livre no estado do Rio Grande do Sul, através de palestras e workshops gratuitos para estudantes e demais interessados. O evento será realizado na Escola SENAC de Uruguaiana nos dias 16 e 17 de Setembro de 2011 (sexta e Sábado). As inscrições estão abertas: http://tchelinux.uruguaianatech.info/ Confira as listas das palestras aqui: http://tchelinux.org/site/doku.php?id=evento_uruguaiana_2011 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>É com grande satisfação que anunciamos o 1º Seminário de Software Livre TcheLinux Uruguaiana.</strong></p>
<p>O <strong>TcheLinux</strong> é um grupo de voluntários que desde 2006 trabalha na divulgação do Software Livre no estado do Rio Grande do Sul, através de palestras e workshops gratuitos para estudantes e demais interessados.</p>
<p>O evento será realizado na Escola SENAC de Uruguaiana nos dias 16 e 17 de Setembro de 2011 (sexta e Sábado).</p>
<p>As inscrições estão abertas: <a href="http://tchelinux.uruguaianatech.info/">http://tchelinux.uruguaianatech.info/</a></p>
<p>Confira as listas das palestras aqui: <a href="http://tchelinux.org/site/doku.php?id=evento_uruguaiana_2011">http://tchelinux.org/site/doku.php?id=evento_uruguaiana_2011</a></p>
<p>A entrada no evento é gratuita, aos interessados em certificado é solicitado a doação de 2Kg de alimentos.</p>
<p>Não perca esta oportunidade.</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/linux/4%c2%ba-seminario-de-software-livre-tchelinux-pelotas/" rel="bookmark"><img width="39" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/tchelinux_p.png" class="crp_thumb wp-post-image" alt="4º Seminário de Software Livre TcheLinux Pelotas" title="4º Seminário de Software Livre TcheLinux Pelotas" /></a> <a href="http://www.botecodigital.info/linux/4%c2%ba-seminario-de-software-livre-tchelinux-pelotas/" rel="bookmark" class="crp_title">4º Seminário de Software Livre TcheLinux Pelotas</a></li><li><a href="http://www.botecodigital.info/php/1%c2%ba-uruguaianatech/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/11/Cuia11.png" class="crp_thumb wp-post-image" alt="1º UruguaianaTech" title="1º UruguaianaTech" /></a> <a href="http://www.botecodigital.info/php/1%c2%ba-uruguaianatech/" rel="bookmark" class="crp_title">1º UruguaianaTech</a></li><li><a href="http://www.botecodigital.info/noticias/uruguaianatech-%e2%80%93-capacitando-profissionais/" rel="bookmark"><img width="50" height="33" src="http://www.botecodigital.info/wp-content/uploads/2011/11/uruguaianaTECH_.jpg" class="crp_thumb wp-post-image" alt="UruguaianaTECH – Capacitando profissionais" title="UruguaianaTECH – Capacitando profissionais" /></a> <a href="http://www.botecodigital.info/noticias/uruguaianatech-%e2%80%93-capacitando-profissionais/" rel="bookmark" class="crp_title">UruguaianaTECH – Capacitando profissionais</a></li><li><a href="http://www.botecodigital.info/noticias/2%c2%ba-uruguaianatech/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/11/Cuia11.png" class="crp_thumb wp-post-image" alt="2º UruguaianaTech" title="2º UruguaianaTech" /></a> <a href="http://www.botecodigital.info/noticias/2%c2%ba-uruguaianatech/" rel="bookmark" class="crp_title">2º UruguaianaTech</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/tchelinux-uruguaiana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AuthComponent autenticação com CakePHP</title>
		<link>http://www.botecodigital.info/php/authcomponent-autenticacao-com-cakephp/</link>
		<comments>http://www.botecodigital.info/php/authcomponent-autenticacao-com-cakephp/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 19:31:37 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[autenticacao]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1415</guid>
		<description><![CDATA[Uma coisa bastante comum e e chata de fazer é em sistemas web/site é a área restrita. Verificar dados, criptografar, redirecionar, etc. Bom para quem utiliza o CakePHP podemos utilizar o AuthComponent para facilitar todo este trabalho. Para começar precisamos de uma tabela no banco de dados que irá armazenar nossos usuários que deve ter pelo menos os campos de usuário e senha,que será armazenada no formato sha256 e necessitará ser do tipo CHAR(64). A tabela abaixo deve servir! Criamos [...]]]></description>
			<content:encoded><![CDATA[<p>Uma coisa bastante comum e e chata de fazer é em sistemas web/site é a área restrita. Verificar dados, criptografar,  redirecionar, etc. Bom para quem utiliza o <em>CakePHP</em> podemos utilizar o <em>AuthComponent</em> para facilitar todo este trabalho.</p>
<p>Para começar precisamos de uma tabela no banco de dados que irá armazenar nossos usuários que deve ter pelo menos os campos  de usuário e senha,que será armazenada no formato sha256 e necessitará ser do tipo <em>CHAR(64)</em>. A tabela abaixo deve servir!</p>
<pre class="brush: sql; title: ; notranslate">
CREATE TABLE usuarios (
 id int(11) NOT NULL auto_increment,
 nome varchar(255) NOT NULL,
 login varchar(255) NOT NULL,
 senha char(64) NOT NULL,
 PRIMARY KEY  (`id`)
)
</pre>
<p>Criamos então o  Model Usuario</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Usuario extends AppModel {
 var $name = 'Usuario';
}
?&gt;
</pre>
<p>Vamos então agora inserir o <em>AuthComponent</em> em <em>/app/app_controller.php</em>  para podermos utilizá-lo em qualquer <em>controller</em> e fazer as configurações necessárias. </p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class AppController extends Controller{
	var $components = array('Auth');

   function beforeFilter(){
        if( isset( $this-&gt;params['admin']) ){
		$this-&gt;layout = 'admin';
        }

	//permitir todas as viwes que não sao administrativas
        if (!isset($this-&gt;params['admin'])) {
            $this-&gt;Auth-&gt;allowedActions = array('*');
        } 

	//configuração da autenticação
	Security::setHash('sha256');
	$this-&gt;Auth-&gt;userModel = 'Usuario';
	$this-&gt;Auth-&gt;fields = array('password' =&gt; 'senha','username' =&gt; 'login');
	$this-&gt;Auth-&gt;authError = 'Área Restrita! Efetue login!'; // Mensagem ao entrar em area restrita
 	$this-&gt;Auth-&gt;loginError = 'Nome de usuario ou senha não conferem!'; // Mensagem quando não se autenticar
 	$this-&gt;Auth-&gt;logoutRedirect = array('action' =&gt; 'login', 'controller' =&gt; 'usuarios','admin'=&gt;1);
 	$this-&gt;Auth-&gt;loginRedirect = array('action' =&gt; 'index', 'controller' =&gt; 'home','admin'=&gt;1);
    }
}
?&gt;
</pre>
<p>Na linha 3 temos inserimos o <em>AuthComponent</em>.</p>
<p>Na linha 5 declaramos o método <em>beforefilter</em> que é um método que é executado antes de qualquer método de nossos </em>controllers</em> permitindo que as configurações de autenticação sejam sempre executadas antes da lógica de nossos <em>controllers</em>.</p>
<p>Nas linhas 6, 7 e 8 testamos se estamos em uma área administrativa, através do <em>Routing.admin</em> configurado no <em>core.php</em> se for mudamos o template para o administrativo.</p>
<p>Por padrão o <em>AuthComponent</em> protege todas os <em>actions</em> dos <em>controllers</em> então precisamos determinar quais estão liberados então nas linhas 11,12 e 13 verificamos se não estamos em uma área administrativa, ou seja não precisamos de autenticação e liberamos o acesso as <em>actions</em> não administrativas. <strong>Para liberar actions especifico basta colocar  $this->Auth->allow(&#8216;action1&#8242;,&#8217;action2&#8242;,&#8217;action3&#8242;&#8230;);</strong> </p>
<p>Na linha 16 configuramos o <em>AuthComponent</em> para utilizar sha256 como algoritmo de <em>hash</em> para criptografar a senha. É importante ressaltar que para criptografar a senha ele utiliza o conteúdo do <em>Security.salt</em>, então a senha armazenada no banco de dados será diferente para cada <em>Security.salt</em>. Uma dica para ver qual é o hash basta submeter o formulário de login com o debug de sql que ele irá mostrá-lo.</p>
<p>Na linha 17 configuramos para utilizar o <em>model</em> Usuario que criamos e consequentemente a tabela usuarios.</p>
<p>Na linha 18 configuramos o <em>Authcomponent</em> para utilizar os campos login e senha da tabela.</p>
<p>Na linha 19 configuramos a mensagem de erro caso entre em uma área restrita.</p>
<p>Na linha 20 configuramos a mensagem de erro caso o login e senha sejam errados.</p>
<p>Na linha 21 configuramos a página para qual devemos redirecionar o usuário após ele realizar o <em>logout</em>.</p>
<p>Na linha 22 configuramos a página para qual iremos redirecionar o usuário após ele realizar o <em>login</em> com sucesso.</p>
<p>Agora podemos criar  o nosso <em>usuarios_controller.php</em></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class UsuariosController extends AppController {
var $name = 'Usuarios';
public function admin_login() {
        $this-&gt;layout = 'login';
}
function logout(){
	 $this-&gt;redirect($this-&gt;Auth-&gt;logout());
}
function admin_add() {
	if (!empty($this-&gt;data)) {
		$this-&gt;Administrador-&gt;create();
		$this-&gt;data['Usuario']['senha'] = $this-&gt;Auth-&gt;hashPasswords($this-&gt;data['Usuario']['senha']);
		if ($this-&gt;Administrador-&gt;save($this-&gt;data)) {
			$this-&gt;Session-&gt;setFlash(__('O Usuário foi salvo', true));
			$this-&gt;redirect(array('action' =&gt; 'index'));
		} else {
			$this-&gt;Session-&gt;setFlash(__('O Usuário não foi salvo.Tente novamente.', true));
		}
	}
}
}
?&gt;
</pre>
<p>No <em>usuarios_controller.php</em> não precisamos fazer muita coisa, o <em>AuthComponent</em> já fornece os códigos de <em>login</em>, basta para nós declará-lo, para o <em>logout</em> basta chamar <em>$this->Auth->logout</em> que faz o logout e retorna a URL que é o caminho para onde o usuário deve ir após efetuar <em>logout</em>.</p>
<p>Para adicionar e editar o usuário devemos criptografar a senha, que é feito com o método <em>$this->Auth->hashPasswords($senha);</em> como vista na linha 13, lembrando que o código de retorno deste método muda conforme a configuração do <em>Security.salt</em>.</p>
<p>Agora vamos ao formulário de <em>login</em> que é bastante simples em <em>/app/views/usuarios/login.ctp</em>.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo $session-&gt;flash('auth'); ?&gt;

&lt;h2&gt;Entrar&lt;/h2&gt;
&lt;?php
echo $form-&gt;create('Usuario' , array('action' =&gt; 'login'));
echo $form-&gt;input('login');
echo $form-&gt;input('senha',array('type'=&gt;'password'));
echo $form-&gt;end('LOGAR');
?&gt;
</pre>
<p>Esse é um pequeno exemplo o <em>AuthComponent</em> espero que ajude! Basta agora colocar o resto dos métodos do CRUD e seguir fazendo seu sistema administrativo.</p>
<p>[EDIT 2011-05-30]<br />
Se você quiser liberar páginas especificas(controller e action) coloque o código baixo no app_controller especificando qual <strong>controller</strong> e <strong>action</strong> você quer liberar:</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;Auth-&gt;allow(array('controller'=&gt;'action'));
</pre>
<p>[/EDIT]</p>
<p>Paz e prosperidade!</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/cakephp.png" class="crp_thumb wp-post-image" alt="CakePHP – Validando um formlário com Model sem Controller" title="CakePHP – Validando um formlário com Model sem Controller" /></a> <a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark" class="crp_title">CakePHP – Validando um formlário com Model sem Controller</a></li><li><a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Exemplo de autenticação em PHP utilizando sessão- Parte 1" title="Exemplo de autenticação em PHP utilizando sessão- Parte 1" /></a> <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/" rel="bookmark" class="crp_title">Exemplo de autenticação em PHP utilizando sessão- Parte 1</a></li><li><a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Exemplo de autenticação em PHP utilizando sessão- Parte 2" title="Exemplo de autenticação em PHP utilizando sessão- Parte 2" /></a> <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark" class="crp_title">Exemplo de autenticação em PHP utilizando sessão- Parte 2</a></li><li><a href="http://www.botecodigital.info/php/pdo-php-data-object-trocar-de-banco-de-dados-ja-nao-e-dor-de-cabeca/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="PDO &#8211; PHP Data Object &#8211; Trocar de banco de dados já não é dor de cabeça" title="PDO &#8211; PHP Data Object &#8211; Trocar de banco de dados já não é dor de cabeça" /></a> <a href="http://www.botecodigital.info/php/pdo-php-data-object-trocar-de-banco-de-dados-ja-nao-e-dor-de-cabeca/" rel="bookmark" class="crp_title">PDO &#8211; PHP Data Object &#8211; Trocar de banco de dados já não é dor de cabeça</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/authcomponent-autenticacao-com-cakephp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Instalando LAMP no Ubuntu</title>
		<link>http://www.botecodigital.info/php/instalando-lamp-no-ubuntu/</link>
		<comments>http://www.botecodigital.info/php/instalando-lamp-no-ubuntu/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 18:21:11 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[servidor]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1387</guid>
		<description><![CDATA[Para para começar vamos logo dizendo que LAMP é uma abreviação para os seguintes software Linux, Apache, MySQL e PHP que juntos formam o ambiente que necessitamos para desenvolver e hospedar nossos sites. 1. Instalar o MySQL Durante a instalação a senha do usuário root do MySQL será pedida. 2. Instalar o Apache 2 Depois instalado verifique se esta funcionando acesse http://localhost se aparecer um &#8220;It works!&#8221; está funcionando. 3. Instalar o PHP 5 Não se esqueça de instalar também [...]]]></description>
			<content:encoded><![CDATA[<p>Para para começar vamos logo dizendo que LAMP é uma abreviação para os seguintes software <strong>Linux</strong>, <strong>Apache</strong>, <strong>MySQL</strong> e <strong>PHP</strong> que juntos formam o ambiente que necessitamos para desenvolver e hospedar nossos sites.</p>
<h3>1. Instalar o MySQL</h3>
<pre class="brush: plain; title: ; notranslate">
sudo aptitude install mysql-server mysql-client
</pre>
<p>Durante a instalação a senha do usuário root do MySQL será pedida.</p>
<h3>2. Instalar o Apache 2</h3>
<pre class="brush: plain; title: ; notranslate">
sudo aptitude install apache2
</pre>
<p>Depois instalado verifique se esta funcionando acesse <em>http://localhost</em> se aparecer um &#8220;It works!&#8221; está funcionando.</p>
<h3>3. Instalar o PHP 5</h3>
<pre class="brush: plain; title: ; notranslate">
sudo aptitude install php5 libapache2-mod-php5
</pre>
<p>Não se esqueça de instalar também o modulo PHP do MySQL.</p>
<pre class="brush: plain; title: ; notranslate">
 apt-get install php5-mysql
</pre>
<p>Bom já temos o básico agora. É só reiniciar o Apache que deve estar tudo funcionando.</p>
<pre class="brush: plain; title: ; notranslate">
/etc/init.d/apache2 restart
</pre>
<h3>4. Habilitando o mod_rewrite</h3>
<p>O <strong>mod_rewrite</strong> é utilizado por vários CMS, Framework e etc. Então é sempre uma boa idéia habilitá-lo. Para você que não sabe o que é o <strong>mod_rewrite</strong> veja o post sobre <a href="http://www.botecodigital.info/php/urls-amigaveis/">URLs amigáveis</a></p>
<pre class="brush: plain; title: ; notranslate">
a2enmod rewrite
</pre>
<p>E altere o seguinte trecho de código no arquivo <em>/etc/apache2/sites-enabled/000-default</em>:</p>
<pre class="brush: plain; title: ; notranslate">
        &lt;Directory /var/www/&gt;
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        &lt;/Directory&gt;
</pre>
<p>por:</p>
<pre class="brush: plain; title: ; notranslate">
        &lt;Directory /var/www/&gt;
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        &lt;/Directory&gt;
</pre>
<p>Agora reinicie o Apache e tome uma cerveja! T++</p>
<p>[UPDATE]<br />
Pessoal para quem precisar usar o PostgreSQL (LAPP?):</p>
<pre class="brush: plain; title: ; notranslate">
 apt-get install php5-pgsql
</pre>
<p>[/UPDATE]</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/outros/recuperando-a-senha-de-root-do-mysql/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/09/mysql_logo.png" class="crp_thumb wp-post-image" alt="Recuperando a senha de root  do MySQL" title="Recuperando a senha de root  do MySQL" /></a> <a href="http://www.botecodigital.info/outros/recuperando-a-senha-de-root-do-mysql/" rel="bookmark" class="crp_title">Recuperando a senha de root  do MySQL</a></li><li><a href="http://www.botecodigital.info/php/urls-amigaveis/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="URLs amigáveis" title="URLs amigáveis" /></a> <a href="http://www.botecodigital.info/php/urls-amigaveis/" rel="bookmark" class="crp_title">URLs amigáveis</a></li><li><a href="http://www.botecodigital.info/linux/instalando-intel-wifi-5100-no-debian/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/06/linux.png" class="crp_thumb wp-post-image" alt="Instalando Intel WiFi 5100 no Debian" title="Instalando Intel WiFi 5100 no Debian" /></a> <a href="http://www.botecodigital.info/linux/instalando-intel-wifi-5100-no-debian/" rel="bookmark" class="crp_title">Instalando Intel WiFi 5100 no Debian</a></li><li><a href="http://www.botecodigital.info/linux/instalar-o-player-clementine-no-ubuntu/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/12/clementine-icon-256-150x150.png" class="crp_thumb wp-post-image" alt="Instalar o player Clementine no Ubuntu" title="Instalar o player Clementine no Ubuntu" /></a> <a href="http://www.botecodigital.info/linux/instalar-o-player-clementine-no-ubuntu/" rel="bookmark" class="crp_title">Instalar o player Clementine no Ubuntu</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/instalando-lamp-no-ubuntu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Manipulando imagens com WideImage</title>
		<link>http://www.botecodigital.info/php/manipulando-imagens-com-wideimage/</link>
		<comments>http://www.botecodigital.info/php/manipulando-imagens-com-wideimage/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 17:10:40 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[redimensionar imagens]]></category>
		<category><![CDATA[wideimage]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1372</guid>
		<description><![CDATA[No post Redimensionando imagens com PHP mostrei como redimensionar uma imagem utilizando a biblioteca GD calculando a altura proporcional, esta semana tive que redimensionar uma imagem para caber em uma div de largura e altura fixa. Confesso que estava passando trabalho até que achei a classe WideImage que além de redimensionar fornece várias funcionalidades como marca d&#8217;água e recorte. Para começar baixe a classe em WideImage, ela irá estar na pasta lib, eu costumo renomear esta pasta para wideimage e [...]]]></description>
			<content:encoded><![CDATA[<p>No post <a href="http://www.botecodigital.info/php/redimensionando-imagens-com-php">Redimensionando imagens com PHP</a> mostrei como redimensionar uma imagem utilizando a biblioteca GD calculando a altura proporcional, esta semana tive que redimensionar uma imagem para caber em uma <em>div</em> de largura e altura fixa. Confesso que estava passando trabalho até que achei a classe <a href="http://wideimage.sourceforge.net/" target="_blank">WideImage</a> que além de redimensionar fornece várias funcionalidades como marca d&#8217;água e recorte.</p>
<p>Para começar baixe a classe em <a href="http://wideimage.sourceforge.net/download/" target="_blank">WideImage</a>, ela irá estar na pasta <em>lib</em>, eu costumo renomear esta pasta para wideimage e copiá-la para o diretório que irei utilizá-la.</p>
<h5>Redimensionando Imagem</h5>
<p>Vamos então ao exemplo de redimensionamento e mostrar a nova imagem no navegador:</p>
<pre class="brush: php; title: ; notranslate">
require( &quot;wideimage/WideImage.php&quot;);

$image = WideImage::load(&quot;img/imagem1.png&quot;);

$nova_img = $image-&gt;resize(400, 300);

$nova_img-&gt;output('jpg', 90);
</pre>
<p><a href="http://www.botecodigital.info/exemplos/wideimage/img/imagem1.png">Imagem Original</a> | <a href="http://www.botecodigital.info/exemplos/wideimage/redimensionar.php">Exemplo resize</a></p>
<p>Na linha 1 carregamos o arquivo da classe.</p>
<p>Na linha 3 lemos a imagem, aqui esta uma das coisas legais desta classe que ela aceita não somente ler um imagem armazenada no servidor como também aceita uma a partir de uma URL como <em>http://wwww.botecodigital.info/imagem/logo.png</em>, ou também vindo de um formulário com o método <em>$img = WideImage::loadFromUpload(&#8216;mynameimg&#8217;); </em>. A Classe WideImage suporta os seguintes formatos: GIF, PNG, JPG, GD, GD2, WBMP, XBM, XPM.</p>
<p>Na linha 5  redimensionamos a imagem para caber em 400&#215;300, e geramos uma nova imagem armazenada na variável <em>$nova_imagem</em>.</p>
<p>O método <em>resize</em> pode aceitar um terceiro parâmetro, o padrão é <em>&#8216;inside&#8217;</em> que faz com que a imagem fique com no máximo(no nosso exemplo) 500 de largura e 400 de altura, mantendo a proporção. Com o valor <em>&#8216;outside&#8217;</em> ela será maior que 500&#215;400, mantendo a proporção. Com o valor <em>&#8216;fill&#8217;</em> irá redimensionar  para o tamanho fornecido sem se importar em manter a proporção.</p>
<p>Na linha 7 pegamos a nova imagem redimensionada e exibimos no navegador no formato <em>jpg</em>, com a qualidade de 90.</p>
<p>Também podemos salvar a imagem em disco com o método <em>$img->saveToFile(&#8216;imagem.jpg&#8217;, 90);</em>, lembrando que devemos ter permissão de escrita no diretório em que queremos salvar.</p>
<h5>Marca D&#8217;agua(<em>watermark</em>)</h5>
<p>A classe  WideImage  também permite inserir uma imagem dentro de outra, fazendo o efeito de marca D&#8217;Água. Vejamos o exemplo:</p>
<pre class="brush: php; title: ; notranslate">
require( &quot;wideimage/WideImage.php&quot;);

$image = WideImage::load(&quot;img/imagem1.png&quot;);
$marca = WideImage::load(&quot;img/marca-boteco.png&quot;);

$nova_img = $image-&gt;merge($marca,'right','bottom');

$nova_img-&gt;output('jpg', 90);
</pre>
<p><a href="http://www.botecodigital.info/exemplos/wideimage/img/imagem1.png">Imagem Original</a>| <a href="http://www.botecodigital.info/exemplos/wideimage/marca.php">Exemplo Merge</a></p>
<p>Na linha 1 como vimos carregamos a classe, na linha 3 carregamos a imagem e na linha 4 carregamos a imagem da marca.</p>
<p>Na linha 6 chamamos o método <em>merge</em> da imagem principal e passamos por parâmetro a imagem de marca. Os dois seguinte parâmetro seguinte informam a posição(x e y respectivamente) em que a marca irá ser inserida, eles aceitam tanto valores em <em>pixels</em> como as posições <em>left</em>, <em>right</em>, <em>top</em> e <em>bottom</em>. Também é possível fazer uma combinação dos valores <em>left</em>, <em>right</em>, <em>top</em> e <em>bottom</em> com pixels, como por exemplo <em>&#8216;right-50&#8242;</em> que posicionaria a marca 50px do canto direito da imagem, ou <em>&#8216;bottom-20&#8242;</em> que posicionaria a marca 20px da parte inferior da imagem.</p>
<p>No método <em>merge</em> também é possível passar um quarto parâmetro que seria o <em>alpha</em>.</p>
<h5>Recortando (<em>crop</em>) </h5>
<p>Vamos ver um exemplo de recorte de uma imagem:</p>
<pre class="brush: php; title: ; notranslate">
require( &quot;wideimage/WideImage.php&quot;);

$image = WideImage::load(&quot;img/imagem1.png&quot;);

$nova_img = $image-&gt;crop(250,250,400,400);

$nova_img-&gt;output('jpg', 90);
</pre>
<p><a href="http://www.botecodigital.info/exemplos/wideimage/img/imagem1.png">Imagem Original</a> | <a href="http://www.botecodigital.info/exemplos/wideimage/crop.php">Exemplo Crop</a></p>
<p>Na linha 5 é chamado o método <em>crop</em> que aceita 4 parâmetros, os dois primeiros são os pontos x e y a partir de onde a imagem será recortada, e o terceiro e o quarto parâmetro são respectivamente a largura e altura da imagem, ou seja, a imagem gerada pelo exemplo acima terá o tamanho de 400&#215;400, que seria a área do ponto 250&#215;250 até o ponto 750&#215;750 da imagem original.</p>
<p>Como no método <em>merge</em> o método <em>crop</em> também aceita como valores <em>left</em>,  <em>right</em>, <em>top</em> e <em>bottom</em>.</p>
<p>Bom esse é o básico da classe <em>WideImage</em> ela possue vários <a href="http://wideimage.sourceforge.net/documentation/manipulating-images/" target="_blank">outros recurso que vale a pena da uma olhada</a>. </p>
<p>Até mais e obrigado pelos peixes <img src='http://www.botecodigital.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/redimensionando-imagens-com-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Redimensionando imagens com PHP" title="Redimensionando imagens com PHP" /></a> <a href="http://www.botecodigital.info/php/redimensionando-imagens-com-php/" rel="bookmark" class="crp_title">Redimensionando imagens com PHP</a></li><li><a href="http://www.botecodigital.info/php/criando-um-captcha-em-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Criando um CAPTCHA em PHP" title="Criando um CAPTCHA em PHP" /></a> <a href="http://www.botecodigital.info/php/criando-um-captcha-em-php/" rel="bookmark" class="crp_title">Criando um CAPTCHA em PHP</a></li><li><a href="http://www.botecodigital.info/linux/redimensionando-imagens-em-lotebatch-process-com-gimp/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/07/gimp-150x150.png" class="crp_thumb wp-post-image" alt="Redimensionando imagens em lote(Batch Process) com Gimp" title="Redimensionando imagens em lote(Batch Process) com Gimp" /></a> <a href="http://www.botecodigital.info/linux/redimensionando-imagens-em-lotebatch-process-com-gimp/" rel="bookmark" class="crp_title">Redimensionando imagens em lote(Batch Process) com Gimp</a></li><li><a href="http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2011/11/icone-de-clip-art-graficos_412359-150x150.jpg" class="crp_thumb wp-post-image" alt="Criando gráficos legais com pChart 2.0" title="Criando gráficos legais com pChart 2.0" /></a> <a href="http://www.botecodigital.info/php/criando-graficos-legais-com-pchart-2-0/" rel="bookmark" class="crp_title">Criando gráficos legais com pChart 2.0</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/manipulando-imagens-com-wideimage/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>CakePHP 1.3 sem banco de dados</title>
		<link>http://www.botecodigital.info/php/cakephp-1-3-sem-banco-de-dados/</link>
		<comments>http://www.botecodigital.info/php/cakephp-1-3-sem-banco-de-dados/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 19:50:00 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1366</guid>
		<description><![CDATA[Tenho desenvolvido alguns sites recentemente que não possuem banco de dados, mas possuem formulários que devem ser enviados por e-mail que necessitam de validação mais ou menos como vimos no post CakePHP – Validando um formlário com Model sem Controller. Como devem saber se não configurar uma conexão no CakePHP 1.3 ele dá erro então a solução é criar uma fonte de dados que não acessa nada, somente fica conectada. Primeiro vamos definir o DATABASE_CONFIG, então edite o arquivo app/config/database.php [...]]]></description>
			<content:encoded><![CDATA[<p>Tenho desenvolvido alguns sites recentemente que não possuem banco de dados, mas possuem formulários que devem ser enviados por e-mail que necessitam de validação mais ou menos como vimos no post <a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/">CakePHP – Validando um formlário com Model sem Controller</a>.</p>
<p>Como devem saber se não configurar uma conexão no CakePHP 1.3 ele dá erro então a solução é criar uma fonte de dados que não acessa nada, somente fica conectada.</p>
<p>Primeiro vamos definir o <em>DATABASE_CONFIG</em>, então edite o arquivo <em>app/config/database.php</em></p>
<pre class="brush: php; title: ; notranslate">
class DATABASE_CONFIG {

    public $default = array('driver' =&gt; 'fantasma');

}
</pre>
<p>Agora vamos criar o driver dbo fantasma em <em>app/models/datasources/dbo_fantasma.php</em></p>
<pre class="brush: php; title: ; notranslate">
class DboFantasma extends DataSource {

    public function isConnected() {
        return true;
    }

}
</pre>
<p>Simples não!</p>
<p>t++</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/cakephp.png" class="crp_thumb wp-post-image" alt="CakePHP – Validando um formlário com Model sem Controller" title="CakePHP – Validando um formlário com Model sem Controller" /></a> <a href="http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/" rel="bookmark" class="crp_title">CakePHP – Validando um formlário com Model sem Controller</a></li><li><a href="http://www.botecodigital.info/php/authcomponent-autenticacao-com-cakephp/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/cakephp.png" class="crp_thumb wp-post-image" alt="AuthComponent autenticação com CakePHP" title="AuthComponent autenticação com CakePHP" /></a> <a href="http://www.botecodigital.info/php/authcomponent-autenticacao-com-cakephp/" rel="bookmark" class="crp_title">AuthComponent autenticação com CakePHP</a></li><li><a href="http://www.botecodigital.info/php/framework-cakephp/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Framework CakePHP" title="Framework CakePHP" /></a> <a href="http://www.botecodigital.info/php/framework-cakephp/" rel="bookmark" class="crp_title">Framework CakePHP</a></li><li><a href="http://www.botecodigital.info/java/conectando-java-com-hsqldb/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/10/java3.png" class="crp_thumb wp-post-image" alt="Conectando Java com HSQLDB" title="Conectando Java com HSQLDB" /></a> <a href="http://www.botecodigital.info/java/conectando-java-com-hsqldb/" rel="bookmark" class="crp_title">Conectando Java com HSQLDB</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/cakephp-1-3-sem-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP – Validando um formlário com Model sem Controller</title>
		<link>http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/</link>
		<comments>http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 13:36:02 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[validar dados]]></category>
		<category><![CDATA[view]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=1169</guid>
		<description><![CDATA[Muitas vezes precisamos criar um formulário de contato ou qualquer outro formulário que não será gravado no banco e sim enviado para um e-mail ou coisa parecida. Nestes casos também é interessante validar os campos e nada melhor do que utilizar a validação do próprio CakePHP. Para isso precisaremos criar um Model para o formulário. Para o exemplo criaremos um formulário simples de contato com nome, e-mail, telefone e mensagem. /app/models/contato.php Na Model acima não temos nada que alguém que [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas vezes precisamos criar um formulário de contato ou qualquer outro formulário que não será gravado no banco e sim enviado para um e-mail ou coisa parecida. Nestes casos também é interessante validar os campos e nada melhor do que utilizar a validação do próprio CakePHP.</p>
<p>Para isso precisaremos criar um Model para o formulário. Para o exemplo criaremos um formulário simples de contato com nome, e-mail, telefone e mensagem.</p>
<p><strong>/app/models/contato.php</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Contato extends AppModel {
	public $useTable = false;
	public $validate = array(
		'nome' =&gt; array(
				'rule' =&gt; 'notempty',
			  	'message' =&gt; &quot;O nome deve ser preenchido&quot;,
		),
		'email' =&gt; array(
				'rule' =&gt; array('email'),
				'message' =&gt; &quot;O e-mail deve ser preenchido&quot;,
		),
	   	'mensagem' =&gt; array(
				'rule' =&gt; 'notempty',
				'message' =&gt; &quot;A mensagem deve ser preenchida&quot;,
		)
	);
}
?&gt;
</pre>
<p>Na Model acima não temos nada que alguém que já lide com o CakePHP não conheça, o que devemos observar é a linha 3 <em>$useTable=false</em> que informa que este Model não está associado a uma tabela do banco de dados.</p>
<p>Vamos agora a criação de nosso formulário(view).</p>
<p><strong>/app/view/home/contato.ctp (por exemplo)</strong></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php echo $form-&gt;create('Contato',array('url'=&gt;'/contato'))?&gt;

	&lt;?php echo $form-&gt;input('nome',array('label'=&gt;'Nome:'))?&gt;

	&lt;?php echo $form-&gt;input('email',array('label'=&gt;'E-mail:'))?&gt;

	&lt;?php echo $form-&gt;input('telefone',array('label'=&gt;'Telefone:'))?&gt;

  	&lt;?php echo $form-&gt;textarea('mensagem',array('cols'=&gt;'40','rows'=&gt;'3') )?&gt;

&lt;?php echo $form-&gt;end('Enviar'); ?&gt;
</pre>
<p>Também nenhuma novidade, só devemos ressaltar a linha1 onde estamos utilizando o Model <em>Contato</em> para o formulário.</p>
<p>Vamos agora para o <em>action</em> do <em>controller</em> onde iremos validar os campos.</p>
<p><strong>/app/controller/home.ctp</strong></p>
<pre class="brush: php; title: ; notranslate">
…
var $uses = array('Contato');
...
function faleconosco() {
	if( $this-&gt;data){
		$erros =&quot;&quot;;
		$this-&gt;Contato-&gt;set($this-&gt;data);
		if ( $this-&gt;Contato-&gt;validates() ) {
			//envia o e-mail ou faz qualquer outra coisa com os dados
		}else{
			foreach( $this-&gt;Contato-&gt;invalidFields() as $e){
				$erros .= $e.&quot;&lt;br /&gt;&quot;;
			}
		$this-&gt;Session-&gt;setFlash($erros);
	}
}
</pre>
<p>Bom esta parte vale uma pequena explicação!</p>
<p>Na linha 2 declaramos que iremos utilizar no <em>controller</em> o Model Contato. </p>
<p>Na linha 5 verificamos se foi enviado algum dado pelo formulário, na linha 6 inicializamos uma variável para armazenar os erros encontrados no formulário. Na linha 7 configuramos o Model contato com os dados vindo do formulário.</p>
<p>Na linha 8 utilizamos o método <em><strong>validates()</strong></em> que verifica os dados conforme as regras estipuladas no Model e retorna <em>true</em> não houver erro e <em>false</em> se alguma das regras não foi satisfeita.</p>
<p>Na linha 11 estamos no bloco onde alguma regra não foi satisfeita então devemos listas para o usuário. O método que nos devolve esta lista de erros é o <em><strong>invalidFields()</strong></em> que retorna um <em>array</em> com as mensagem estipuladas no Model. Percorremos este <em>array</em> concatenamos estas mensagens na variável <em>$erros</em> e na linha 14 salvamos na sessão para ser mostrada na view.</p>
<p>Bom era isso pessoal</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/cakephp-1-3-sem-banco-de-dados/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/cakephp.png" class="crp_thumb wp-post-image" alt="CakePHP 1.3 sem banco de dados" title="CakePHP 1.3 sem banco de dados" /></a> <a href="http://www.botecodigital.info/php/cakephp-1-3-sem-banco-de-dados/" rel="bookmark" class="crp_title">CakePHP 1.3 sem banco de dados</a></li><li><a href="http://www.botecodigital.info/php/enviando-email-com-phpmailer/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Enviando email com PHPmailer" title="Enviando email com PHPmailer" /></a> <a href="http://www.botecodigital.info/php/enviando-email-com-phpmailer/" rel="bookmark" class="crp_title">Enviando email com PHPmailer</a></li><li><a href="http://www.botecodigital.info/php/authcomponent-autenticacao-com-cakephp/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/08/cakephp.png" class="crp_thumb wp-post-image" alt="AuthComponent autenticação com CakePHP" title="AuthComponent autenticação com CakePHP" /></a> <a href="http://www.botecodigital.info/php/authcomponent-autenticacao-com-cakephp/" rel="bookmark" class="crp_title">AuthComponent autenticação com CakePHP</a></li><li><a href="http://www.botecodigital.info/jquery/validando-formularios-com-jquery-plugin-validation/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Validando formulários com JQuery-Plugin-Validation" title="Validando formulários com JQuery-Plugin-Validation" /></a> <a href="http://www.botecodigital.info/jquery/validando-formularios-com-jquery-plugin-validation/" rel="bookmark" class="crp_title">Validando formulários com JQuery-Plugin-Validation</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/cakephp-%e2%80%93-validando-um-formlario-com-model-sem-controller/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando um CAPTCHA em PHP</title>
		<link>http://www.botecodigital.info/php/criando-um-captcha-em-php/</link>
		<comments>http://www.botecodigital.info/php/criando-um-captcha-em-php/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 20:12:11 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=946</guid>
		<description><![CDATA[Um problema comum para quem fornece um formulário de contato ou disponibiliza algum sistema de comentário em um site é o aumento de spam enviados por bots(robos) que lêem os campos do formulário e enviam as informações de spam via POST. Uma maneira muito comum de se proteger deste tipo de ataque é diferenciar se quem está enviando as informações é uma pessoa ou um bot. Isso pode ser feito criando um código que seja de fácil leitura para o [...]]]></description>
			<content:encoded><![CDATA[<p>Um problema comum para quem fornece um formulário de contato ou disponibiliza algum sistema de comentário em um site é o aumento de spam enviados por bots(robos) que lêem os campos do formulário e enviam as informações de spam via POST.</p>
<p>Uma maneira muito comum de se proteger deste tipo de ataque é diferenciar se quem está enviando as informações é uma pessoa ou um bot. Isso pode ser feito criando um código que seja de fácil leitura para o usuário humano e difícil para máquinas e pedir para o usuário digitar este código junto com as outras informações do formulário.</p>
<p>Este sistema é muito comum hoje em dia e recebe o nome de CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Humans Apart ou Teste Público Totalmente Automatizado para Diferenciar Humanos de Computadores) e vamos agora apreender com fazer um simples.</p>
<p>Começaremos criando uma imagem com um fundo um pouco bagunçado, quanto mais bagunçado melhor, isso dificulta a leitura por bots.</p>
<div style="text-align: center;"><img class="aligncenter size-full wp-image-948" title="fundocaptch" src="http://www.botecodigital.info/wp-content/uploads/2010/03/fundocaptch.png" alt="" width="230" height="50" /></div>
<p>O CAPTCHA vai funcionar da seguinte forma, vamos gerar um código baseado na hora do sistema e armazená-lo em uma sessão, após isso iremos criar uma imagem com o fundo que criamos acima e escrever o nosso código gerado sobre ele.</p>
<p>Vamos então aos código</p>
<pre class="brush: php; title: ; notranslate">
session_start();

$codigoCaptcha = substr(md5( time() ) ,0,9);

$_SESSION['captcha'] = $codigoCaptcha;

$imagemCaptcha = imagecreatefrompng(&quot;fundocaptch.png&quot;);

$fonteCaptcha = imageloadfont(&quot;anonymous.gdf&quot;);

$corCaptcha = imagecolorallocate($imagemCaptcha,255,0,0);

imagestring($imagemCaptcha,$fonteCaptcha,15,5,$codigoCaptcha,$corCaptcha);

header(&quot;Content-type: image/png&quot;);

imagepng($imagemCaptcha);

imagedestroy($imagemCaptcha);
</pre>
<p>Na linha 3 geramos nosso código “aleatório” começamos pegando o <em>timestamp</em> através da função <a href="”http://www.php.net/manual/pt_BR/function.time.php”" target="”_blank”">time</a> e aplicamos sobre ele a função <a href="http://www.php.net/manual/pt_BR/function.md5.php“" target="”_blank”">md5</a> deste código <em>md5</em> pegamos os 9 primeiros caracteres(se você quiser pode pegar mais ou menos) através da função  <a href="http://br.php.net/manual/pt_BR/function.substr.php" target="”_blank”">substr</a>.</p>
<p>Na linha 5 salvamo nosso código na sessão para que possamos compará-lo mais tarde.</p>
<p>Na linha 7 criamos uma imagem a partir da imagem de fundo que criamos.</p>
<p>Na linha 9 carregamos uma fonte através da função <a href="http://www.php.net/manual/pt_BR/function.imageloadfont.php" target="_blank"> imageloadfont</a> que carrega define a fonte que será utilizada para escrever nosso código de <strong>captcha</strong> na imagem criada na linha 7.</p>
<p>Na linha 11 utilizamos a função <a href="http://www.php.net/manual/pt_BR/function.imagecolorallocate.php" target="_blank">imagecolorallocate</a> para gerar uma cor para o código que iremos inserir na imagem.</p>
<p>Na linha 13 utilizamos a função <a href="http://www.php.net/manual/pt_BR/function.imagecolorallocate.php" target="_blank">imagestring</a> para &#8220;desenhar&#8221; o código gerado na linha 3 na imagem criada na linha 8, utilizando a fonte definida na linha 9.</p>
<p>Na linha 15 mudamos o cabeçalho do arquivo para ele ser um arquivo do tipo imagem no formato png, isso faz com que o navegador mostre a imagem e não o código binarios em forma de texto.</p>
<p>Na linha 17 enviamos a imagem gerada para o navegador. Na linha 19 desalocamos o espaço utilizado pela imagem criada.</p>
<p>Para utilizar o captcha precisamos de um formulário e dentro dele exibiremos a nossa imagem através da <em>tag</em> <strong>IMG</strong> e também precisaremos de um campo para o usuário inserir o código captcha.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;form action=&quot;valida.php&quot; method=&quot;post&quot;&gt;
    &lt;img src=&quot;captcha.php&quot; alt=&quot;código captcha&quot; /&gt;

    &lt;label for=&quot;captcha&quot;&gt;Digite o código&lt;/label&gt;
&lt;input id=&quot;captcha&quot; name=&quot;captcha&quot; type=&quot;text&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;Enviar&quot; /&gt;
&lt;/form&gt;
</pre>
<p>Agora basta compara o valor passado por POST no input <strong>captcha</strong> com o valor armazenada em sessão.</p>
<pre class="brush: php; title: ; notranslate">
if( $_SESSION['captcha'] == $_POST['captcha']){
        echo &quot;&lt;h1&gt;Ok - Código Correto&lt;/h1&gt;&quot;;
    }else{
        echo &quot;&lt;h1&gt;Erro - Código digitado errado&lt;/h1&gt;&quot;;
    }
</pre>
<p><a href="http://www.botecodigital.info/exemplos/captcha/form.php" target="_blank">Aqui você pode visializar o exemplo</a></p>
<p><a href="http://www.botecodigital.info/exemplos/captcha/captcha.zip">Download do exemplo</a>.</p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/redimensionando-imagens-com-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Redimensionando imagens com PHP" title="Redimensionando imagens com PHP" /></a> <a href="http://www.botecodigital.info/php/redimensionando-imagens-com-php/" rel="bookmark" class="crp_title">Redimensionando imagens com PHP</a></li><li><a href="http://www.botecodigital.info/php/listando-arquivos-de-um-diretorio-em-php/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Listando arquivos de um diretório em PHP" title="Listando arquivos de um diretório em PHP" /></a> <a href="http://www.botecodigital.info/php/listando-arquivos-de-um-diretorio-em-php/" rel="bookmark" class="crp_title">Listando arquivos de um diretório em PHP</a></li><li><a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Exemplo de autenticação em PHP utilizando sessão- Parte 1" title="Exemplo de autenticação em PHP utilizando sessão- Parte 1" /></a> <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/" rel="bookmark" class="crp_title">Exemplo de autenticação em PHP utilizando sessão- Parte 1</a></li><li><a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Exemplo de autenticação em PHP utilizando sessão- Parte 2" title="Exemplo de autenticação em PHP utilizando sessão- Parte 2" /></a> <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-2/" rel="bookmark" class="crp_title">Exemplo de autenticação em PHP utilizando sessão- Parte 2</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/criando-um-captcha-em-php/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>PDO &#8211; PHP Data Object &#8211; Trocar de banco de dados já não é dor de cabeça</title>
		<link>http://www.botecodigital.info/php/pdo-php-data-object-trocar-de-banco-de-dados-ja-nao-e-dor-de-cabeca/</link>
		<comments>http://www.botecodigital.info/php/pdo-php-data-object-trocar-de-banco-de-dados-ja-nao-e-dor-de-cabeca/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 16:25:50 +0000</pubDate>
		<dc:creator>Rodrigo Aramburu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[pdo]]></category>

		<guid isPermaLink="false">http://www.botecodigital.info/?p=925</guid>
		<description><![CDATA[Se você desenvolve com PHP há algum tempo e necessitou trocar de banco de dados sabe que o PHP pode causar um certo problema, pois possui funções com nomes diferentes para conectar a banco de dados diferentes. O que muitas vezes inviabiliza o processo. Aqueles que já trabalharam com Java sabem que existe algo chamado JDBC que resolve este problema, fornecendo uma camada de abstração de dados através de interfaces, bastando carregar o driver correto e utilizar sempre os mesmos [...]]]></description>
			<content:encoded><![CDATA[<p>Se você desenvolve com PHP há algum tempo e necessitou trocar de banco de dados sabe que o PHP pode causar um certo problema, pois possui funções com nomes diferentes para conectar a banco de dados diferentes. O que muitas vezes inviabiliza o processo.</p>
<p>Aqueles que já trabalharam com Java sabem que existe algo chamado JDBC que resolve este problema, fornecendo uma camada de abstração de dados através de interfaces, bastando carregar o driver correto e utilizar sempre os mesmos métodos para acessar qualquer banco de dados.</p>
<p>Para os desavisados o PHP possui, desde a versão 5, algo parecido que se chama <strong>PDO &#8211; PHP Data Objects</strong>, permitindo o acesso a vários bancos de dados chamando sempre as mesmas funções.</p>
<p>Os drivers PDOs devem ser carregados pelo módulo PHP então temos que habilita-los e isso é feito dentro do arquivo <em>php.ini</em>.</p>
<pre class="brush: plain; title: ; notranslate">
extension=pdo.so
extension=pdo_mysql.so
extension=pdo_pgsql.so
extension=pdo_sqlite.so
</pre>
<p>Normalmente não temos acesso ao arquivo <em>php.ini</em> pois contratamos um serviço de hospedagem, então para ver os drivers que estão habilitados na hospedagem  que contratamos devemos executar o código abaixo:</p>
<pre class="brush: php; title: ; notranslate">
foreach(PDO::getAvailableDrivers() as $driver){
    echo $driver.'&lt;br /&gt;';
}
</pre>
<p>Como o próprio nome do recurso &#8220;PHP Data <strong>Objects</strong>&#8221; a conexão e a manipulação dos dados é feita utilizando <a href="http://www.botecodigital.info/php/classes-em-php/">uma classe do PHP</a> chamada  <strong>PDO</strong> &#8211; que deve ser instanciado com as informações de conexão ao banco.</p>
<p>Exemplo:</p>
<pre class="brush: php; title: ; notranslate">

$conn = new PDO('mysql:host=localhost;port=3306;dbname=teste', 'root', '123456');
</pre>
<p>Como podemos notar o construtor do objeto <strong>PDO</strong> aceita três parâmetros, o primeiro é uma string contendo o driver a ser utilizado <strong>mysql</strong>, o local onde o banco esta rodando <strong>localhost</strong>, a porta que o banco esta escutando <strong>3306</strong> e o nome do banco de dados <strong>teste</strong>. O segundo parâmetro é o usuário de acesso ao banco de dados e o terceiro é a senha de acesso.</p>
<p>A partir de agora podemos utilizar o objeto armazenado em <em>$conn </em> para manipular os dados no banco de dados.</p>
<p>Como sabemos quando estamos trabalhando com banco de dados  vários erros podem acontecer como o banco de dados estar indisponível entre outra coisas. O <strong>PDO</strong> pode ser configurado para gerar <a href="http://imasters.uol.com.br/artigo/4451/php/tratamento_de_excecoes_no_php_5/">exceção</a> quando algum erro destes ocorrem sendo capturados com um bloco try{&#8230;}catch(){&#8230;} sendo lançada a exceção <strong>PDOException</strong>.</p>
<p>Abaixo um exemplo de inserção utilizando a classe PDO:</p>
<pre class="brush: php; title: ; notranslate">
try{

    //instancia o objeto PDO, conectando com o banco mysql
    $conn = new PDO('mysql:host=localhost;port=3306;dbname=teste', 'root', '123456');

    //configurando para utilizar exceções
    $conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //executa as instruções SQL
    $conn-&gt;exec(&quot;INSERT INTO usuarios (login,senha,nome) VALUES ('rodrigo', '123456', 'rodrigo')&quot;);
    $conn-&gt;exec(&quot;INSERT INTO usuarios (login,senha,nome) VALUES ('thiago', '654321', 'Thiago')&quot;);
    $conn-&gt;exec(&quot;INSERT INTO usuarios (login,senha,nome) VALUES ('maria', '654123', 'Maria')&quot;);

    //fecha a conexão
    $conn = null;
}catch (PDOException $i){
        //se houver exceção, exibe
        print &quot;Erro: &lt;code&gt;&quot; . $i-&gt;getMessage() . &quot;&lt;/code&gt;&quot;;
}
?&gt;
</pre>
<p>Como vemos nas linha 10,11,12 utilizamos o método <em>exec</em> para executar comando SQL no banco de dados.</p>
<p>Agora  veremos como  consultar utilizando a classe PDO:</p>
<pre class="brush: php; title: ; notranslate">
try{
        //instancia o objeto PDO, conectando com o banco mysql
    $conn = new PDO('mysql:host=localhost;port=3306;dbname=teste', 'root', '123456');
    //configurando para utilizar exceções
    $conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //executa a instrução de consulta
    $result = $conn-&gt;query(&quot;SELECT senha,login FROM usuarios&quot;);
    if($result){
                //percorre os resultados via o laço foreach
                foreach($result as $linha){
                        //exibe o resultado
                        print $linha['login'] . &quot; - &quot; . $linha['senha'] . &quot;&lt;br&gt;\n&quot;;
                }

        }
    //fecha a conexão
    $conn = null;
}catch (PDOException $i){
        //se houver exceção, exibe
        print &quot;Erro: &lt;code&gt;&quot; . $i-&gt;getMessage() . &quot;&lt;/code&gt;&quot;;
}
</pre>
<p>Como vimos para executar uma consulta utilizanos a função <strong>query</strong> que retorna um objeto de resposta <a href="http://www.php.net/manual/pt_BR/class.pdostatement.php" target="_blank"><strong>PDOStatement </strong></a> que pode ser percorrido utilizando um laço <em>foreach</em>(linha 11).</p>
<p>Também é possível percorrer um objeto <strong>PDOStatement</strong> utilizando o método <strong>fetch</strong> dele tratar cada linha da consulta como um objeto.</p>
<p>Exemplo:</p>
<pre class="brush: php; title: ; notranslate">
try{
        //instancia o objeto PDO, conectando com o banco mysql
    $conn = new PDO('mysql:host=localhost;port=3306;dbname=teste', 'root', '123456');

    //configurando para utilizar exceções
    $conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //executa a instrução de consulta
    $result = $conn-&gt;query(&quot;SELECT login, senha FROM usuarios&quot;);

    if($result){
                //percorre os resultados via o fetch()
                while ($linha = $result-&gt;fetch(PDO::FETCH_OBJ)){
                        //exibe resultado
                        print $linha-&gt;login . &quot; - &quot; . $linha-&gt;senha . &quot;&lt;br&gt;\n&quot;;
                }

        }

    //fecha a conexão
    $conn = null;
}catch (PDOException $i){
        //se houver exceção, exibe
        print &quot;Erro: &lt;code&gt;&quot; . $i-&gt;getMessage() . &quot;&lt;/code&gt;&quot;;
}
?&gt;
</pre>
<p>Na linha  13 chamamos o método fetch que recebe a constante <strong>PDO::FETCH_OBJ</strong> que é responsável por definir que o retorno será um objeto. Também podemos passar as constantes <strong>PDO::FETCH_ASSOC</strong> que retorna um array com os indices sendo os nomes das colunas da consulta e <strong>PDO::FETCH_NUM</strong> que retorna um array com os indices numéricos.</p>
<p>Outra funcionalidade interessante que ameniza muitos erros é os famosos  do <strong>prepared statements</strong>. Veja o exemplo abaixo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
try{

    //instancia o objeto PDO, conectando com o banco mysql
    $conn = new PDO('mysql:host=localhost;port=3306;dbname=teste', 'root', '');

    //configurando para utilizar exceções
    $conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	//prepara a consulta
	$result = $conn-&gt;prepare(&quot;INSERT INTO usuarios (login,senha,nome) VALUES (?, ?, ?)&quot;) ;

	//insere os valores nas ?
    $valores = array('rodrigo', '123456', 'rodrigo');

	//executa o comando SQL
    $result-&gt;execute($valores);

    //fecha a conexão
    $conn = null;
}catch (PDOException $i){
        //se houver exceção, exibe
        print &quot;Erro: &lt;code&gt;&quot; . $i-&gt;getMessage() . &quot;&lt;/code&gt;&quot;;
}
?&gt;
</pre>
<p>Com o uso dos <strong>prepared statements</strong> não precisamos ficar nos preocupando em concatenar várias variaveis, ou nos preocuparmos com escape de aspas e tudo mais, basta colocar os valores no array que será passado por parâmetro para o método <strong>execute</strong>.</p>
<p>Espero que tenham gostado. Para mais infomações consulte a <a href="http://www.php.net/manual/pt_BR/book.pdo.php" target="_blank">documentação da classe PDO</a></p>
<div id="crp_related"><h4>Posts Relacionados:</h4><ul><li><a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/04/php.png" class="crp_thumb wp-post-image" alt="Exemplo de autenticação em PHP utilizando sessão- Parte 1" title="Exemplo de autenticação em PHP utilizando sessão- Parte 1" /></a> <a href="http://www.botecodigital.info/php/exemplo-de-autenticacao-parte-1/" rel="bookmark" class="crp_title">Exemplo de autenticação em PHP utilizando sessão- Parte 1</a></li><li><a href="http://www.botecodigital.info/outros/recuperando-a-senha-de-root-do-mysql/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/09/mysql_logo.png" class="crp_thumb wp-post-image" alt="Recuperando a senha de root  do MySQL" title="Recuperando a senha de root  do MySQL" /></a> <a href="http://www.botecodigital.info/outros/recuperando-a-senha-de-root-do-mysql/" rel="bookmark" class="crp_title">Recuperando a senha de root  do MySQL</a></li><li><a href="http://www.botecodigital.info/jquery/carregando-um-combobox-com-ajax-com-jquery/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2010/05/jquery.png" class="crp_thumb wp-post-image" alt="Carregando um ComboBox com AJAX com JQuery" title="Carregando um ComboBox com AJAX com JQuery" /></a> <a href="http://www.botecodigital.info/jquery/carregando-um-combobox-com-ajax-com-jquery/" rel="bookmark" class="crp_title">Carregando um ComboBox com AJAX com JQuery</a></li><li><a href="http://www.botecodigital.info/java/conectando-java-com-hsqldb/" rel="bookmark"><img width="50" height="50" src="http://www.botecodigital.info/wp-content/uploads/2009/10/java3.png" class="crp_thumb wp-post-image" alt="Conectando Java com HSQLDB" title="Conectando Java com HSQLDB" /></a> <a href="http://www.botecodigital.info/java/conectando-java-com-hsqldb/" rel="bookmark" class="crp_title">Conectando Java com HSQLDB</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://www.botecodigital.info/php/pdo-php-data-object-trocar-de-banco-de-dados-ja-nao-e-dor-de-cabeca/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

