<?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>MXStudio &#187; PHP</title>
	<atom:link href="http://www.mxstudio.com.br/categoria/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mxstudio.com.br</link>
	<description>Macromedia e Adobe - Artigos, colunas, tutorias e muito mais...</description>
	<lastBuildDate>Sun, 29 Jan 2012 11:31:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Introdução aos Padrões de Projeto</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/php/introducao-aos-padroes-de-projeto/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/php/introducao-aos-padroes-de-projeto/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 14:41:19 +0000</pubDate>
		<dc:creator>Rafael Jaques</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[orientação a objetos]]></category>
		<category><![CDATA[padrões de projeto]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=6303</guid>
		<description><![CDATA[Salve, galera! Depois de tanto tempo sem dar as caras por aqui, consegui tempo pra voltar!Realmente o final de ano foi difícil, mas graças a Deus, terminei a faculdade e agora tenho mais tempo para me dedicar aos estudos que antes eram paralelos. Mas sem muita conversa, vamos direto ao que interessa: padrões de projeto. [...]]]></description>
			<content:encoded><![CDATA[<p>Salve, galera! Depois de tanto tempo sem dar as caras por aqui, consegui tempo pra voltar!Realmente o final de ano foi difícil, mas graças a Deus, terminei a faculdade e agora tenho mais tempo para me dedicar aos estudos que antes eram paralelos.</p>
<p>Mas sem muita conversa, vamos direto ao que interessa: padrões de projeto.</p>
<p>Hoje inicio uma série de alguns posts falando sobre os padrões de projeto mais úteis para programadores PHP e algumas aplicações práticas dos mesmos. Então vamos estudar juntos!</p>
<h2>Antes de começar&#8230;</h2>
<p>Para iniciar os seus estudos, antes de mais nada, você deve estar familiarizado com o PHP 5 (ou superior). Assumo que você já tenha fluência na linguagem. Também é necessário que você já tenha uma boa noção de Orientação a Objetos. Todos os padrões de projeto são feitos de forma orientada a objetos e os termos abordados são diretamente ligados a este paradigma. Caso você não conheça esta metodologia ou nunca tenha trabalhado com ela, sugiro alguns links para dar uma olhada:</p>
<ul>
<li><a href="http://www.hardware.com.br/artigos/programacao-orientada-objetos/" target="_blank">Programação Orientada a Objetos: uma introdução</a></li>
<li><a href="http://www.ccuec.unicamp.br/revista/infotec/artigos/leite_rahal.html" target="_blank">Programação Orientada ao Objeto: uma abordagem didática</a></li>
<li><a href="http://www.phpmg.com/artigos-dicas-e-tutoriais/tutorial-de-programacao-orientada-a-objetos-no-php" target="_blank">Tutorial de Programação Orientada a Objetos no PHP</a></li>
<li><a href="http://phpbrasil.com/artigo/m5fCUv6jPp18/php-orientado-a-objetos-para-quem-esta-comecando" target="_blank">PHP Orientado a Objetos: Para quem está começando</a></li>
</ul>
<h2>O que são e para que servem os Padrões de Projeto?</h2>
<p>O conceito de padrões de projeto foi originalmente concebido pelo arquiteto austríaco Christopher Alexander, em meados da década de 1970. O que levou Alexander a realizar este estudo foi o fato de que ele gostaria de descobrir se havia alguma regra que pudesse especificar quando uma construção é de boa ou de má qualidade.</p>
<p>A partir deste estudo, Alexander começou a levantar pontos que estavam presentes em construções boas e não estavam nas ruins e vice versa. Com estes dados em mãos ele começou a elaborar diversas propostas para a solução de problemas comuns dentro da engenharia e da arquitetura.</p>
<div>
<p><em>&#8220;Cada padrão descreve um problema que ocorre frequentemente em nosso ambiente e então descreve a essência da solução deste problema, de tal forma que você possa usar a mesma solução milhões de vezes, sem nunca utilizá-la da mesma forma.&#8221;</em> (Christopher Alexander &#8211; A Pattern Language)</p>
</div>
<p>Tendo isso em mente podemos afirmar que um padrão de projeto nada mais é do que uma forma prevista, estruturada e documentada de solucionar um dado problema que é bastante comum.</p>
<p>No início da década de 1990, a GoF (Gang of Four &#8211; Gangue dos Quatro), formada por Eric Gamma, Richard Helm, Ralph Johnson e John Vlissides percebeu que as técnicas publicas por Alexander iam muito além do objetivo de padronizar a criação arquitetônica. Era possível identificar padrões que iriam auxiliar na resolução dos problemas comumente encontrados durante o desenvolvimento de softwares. Lançaram então o <strong>Design Patterns: Elements of Reusable Object-Oriented Software</strong>, livro este que tornou-se a maior influência sobre a comunidade de desenvolvimento de softwares da época (e que perdura até hoje). Ao todo são citados 23 padrões, divididos em três categorias: criacionais, estruturais e comportamentais. Estas categorias serão explicadas mais adiante.</p>
<h3>Por que estudar Padrões de Projeto?</h3>
<p>Agora que você já sabe o que são os padrões de projeto, já deve estar procurando (se ainda não encontrou) motivos para estudá-los. Eis alguns bons motivos de porque você deve investir tempo de estudo nestes padrões:</p>
<ul>
<li>Reutiliza ao invés de redescobrir: todos os padrões já foram previamente testados e implementados em projetos que deram certo;</li>
<li>Otimiza a comunicação entre os desenvolvedores: unifica a língua que é falada entre os envolvidos no projeto, pois todos tem ciência dos termos empregados;</li>
<li>Facilita a análise: Quando você iniciar a análise já terá base e estará bem direcionado ao que implementar no seu projeto;</li>
<li>Proporciona alterações menos dolorosas: uma vez que existe uma padronização, as alterações tornam-se mais simples devido às estruturações do projeto;</li>
<li>Desestimula o uso de herança;</li>
<li>Aumenta a confiabilidade;</li>
<li>Reduz a complexidade do código;</li>
</ul>
<h2>Como dividem-se os padrões?</h2>
<p>Para uma melhor organização dos padrões apresentados, eles foram divididos conforme a aplicação de cada um. As três categorias distintas dos padrões de projeto são:</p>
<ul>
<li>Criacionais: Abstraem e escondem o processo de instanciação. O sistema torna-se independente da maneira como o objeto é composto, construido e representado.</li>
<li>Estruturais: Trabalham com a composição de classes e objetos, definindo a relação entre ambos.</li>
<li>Comportamentais: Definem como os objetos irão se comportar e padroniza a comunicação que haverá entre os objetos dentro da estrutura do projeto.</li>
</ul>
<h2>E agora?</h2>
<p>E agora, meus caros amigos, teremos que esperar pelo próximo post, onde vou começar a falar mais sobre os tipos de padrões, explicar melhor as divisões e dar um resumo de cada um.</p>
<p>Espero que esse post tenha servido para dar uma iluminada no conceito de Design Patterns que muitas vezes é bastante obscuro!</p>
<p>Aceito sugestões para as próximas postagens!</p>
<p>Um abraço a todos e fiquem com Deus!<br />
Rafael Jaques</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/php/introducao-aos-padroes-de-projeto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Orientado a Objetos no PHP</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/php/mysql-orientado-a-objetos-no-php/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/php/mysql-orientado-a-objetos-no-php/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 13:30:29 +0000</pubDate>
		<dc:creator>Wanderson R Silva</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=5736</guid>
		<description><![CDATA[O PHP 5 (que já não é novidade) chegou e trouxe consigo diversas melhorias no campo da orientação a objetos, veio recheado de classes que se mostram úteis em diversas situações. Entre tais classes está a MySQLi, que permite a interação com banco de dados MySQL de forma orientada a objetos. O que veremos aqui [...]]]></description>
			<content:encoded><![CDATA[<p>O PHP 5 (que já não é novidade) chegou e trouxe consigo diversas melhorias no campo da orientação a objetos, veio recheado de classes que se mostram úteis em diversas situações. Entre tais classes está a MySQLi, que permite a interação com banco de dados MySQL de forma orientada a objetos. O que veremos aqui é uma introdução ao uso dos recursos do MySQLi, que vai bem além do que será mostrado.</p>
<p>Para começar, uzaremos uma base de dados (banco de dados ou database, se preferir, dá na mesma) de exemplo como a abaixo (vou chamada de <em>usuarios</em>):</p>
<pre><strong>usuario                  senha                     email</strong>
fulano                   123456                    fulano@exemplo.com.br
beltrano                 asdfgh                    beltrano@exemplo.com.br
cicrano                  abcdef                    cicrano@exemplo.com.br</pre>
<p>Um exemplo simples da forma tradicional de uso seria:</p>
<pre>&lt;?php
// Acesso de usuário
$usuario = "fulano";
$senha = "123456";

// Conexão
$banco = mysql_connect("localhost", "usuario", "senha");
// Banco
mysql_select_db("teste", $banco);

// Query
$res = mysql_query("SELECT * FROM usuarios WHERE usuario='$usuario' AND senha='$senha'", $banco);

// Lendo o resultado
if($resultado = mysql_fetch_array($res)) {
// E aqui você continua...
}
?&gt;</pre>
<p>Alguma coisas mudam quando se faz este serviço usando MySQLi. O que é de se esperar: tudo começa na instanciação do objeto da classe, que faz logo a conexão com o banco e a disponibiliza. O construtor recebe diversos parâmetros, mas os que mostrarei são os quatro primeiros, que correspondem a servidor, usuario, senha e banco, as primeiras linhas do código anterior ficariam assim:</p>
<pre>&lt;?php
// Acesso de usuário
$usuario = "fulano";
$senha = "123456";

// Conexão e banco
$banco = new MySQLi("localhost", "usuario", "senha", "teste");</pre>
<p>Se os dados informados estiverem corretos, agora a variável $banco irá apontar para um objeto da classe MySQLi. Em seguida devemos chamar algum método da classe para continuar trabalhando, o equivalente à função mysql_query é o método MySQLi::query, que recebecomo parâmetro a string com o comando SQL e retorna um objeto MySQLi_Result no caso se um comando SELECT, SHOW, DESCRIBE ou EXPLAIN ou um booleano (TRUE ou FALSE) para os demais (como DELETE ou UPDATE). Então teremos:</p>
<p>// Query<br />
$res = $banco-&gt;query(&#8220;SELECT * FROM usuarios WHERE usuario=&#8217;$usuario&#8217;AND senha=&#8217;$senha&#8217;&#8221;);</p>
<p>Finalmente executamos a consulta, podemosentão varrer os resultados obtidos, para isso teremos em mãos os métodos (os mais comuns de serem usados) MySQLi_Result::fetch_array, MySQLi_Result::fetch_assoc, MySQLi_Result::fetch_row e MySQLi_Result::fetch_object. Para compatibilidade com o primeiro exemplo, vejamos com MySQLi_Result::fetch_assoc:</p>
<pre>// Lendo o resultado
if($ressultado = $res-&gt;fetch_assoc()) {
// E aqui você continua...
}
?&gt;</pre>
<p>Isso fez o serviço que queriamos de forma orientada a objetos, mas não necessariamente aumenta a segurança do código, algo que poderia fazer isso é o uso de Prepared Statement, que é possível de ser usado com MySQLi, mas este artigo se tornaria grande demais, por hora, vejamos o resultado final completo:</p>
<pre>&lt;?php
// Acesso de usuário
$usuario = "fulano";
$senha = "123456";

// Conexão e banco
$banco = new MySQLi("localhost", "usuario", "senha", "teste");

// Query
$res = $banco-&gt;query("SELECT * FROM usuarios WHERE usuario='$usuario'AND senha='$senha'");
<pre>// Lendo o resultado
if($ressultado = $res-&gt;fetch_assoc()) {
// E aqui você continua...
}
?&gt;</pre>
</pre>
<p>Para ter mais informações veja o manual do PHP: <a href="http://www.php.net/manual/en/book.mysqli.php" target="_blank">http://www.php.net/manual/en/book.mysqli.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/php/mysql-orientado-a-objetos-no-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diferença entre include() e require()</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/php/include-e-require/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/php/include-e-require/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 12:57:18 +0000</pubDate>
		<dc:creator>Douglas S.G</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[diferença]]></category>
		<category><![CDATA[fatal error]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[include_once]]></category>
		<category><![CDATA[once]]></category>
		<category><![CDATA[require]]></category>
		<category><![CDATA[require_once]]></category>
		<category><![CDATA[warning]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=4882</guid>
		<description><![CDATA[Veja a principal diferença entre eles.]]></description>
			<content:encoded><![CDATA[<p>Hoje vou explicar a principal diferença entre os comandos <em>include()</em> e<em> require()</em>, sem rodeios.</p>
<p>A instrução <strong>include()</strong> ao gerar um erro gera um <strong>Warning</strong>. Deixando que o restante do script continue rodando.</p>
<p>A instrução <strong>require()</strong> ao gerar um erro gera um <strong>Fatal Error</strong>. Desta forma todo o script depois está instrução será paralisado.</p>
<p>Então cada instrução tem o seu momento de ser adicionada, julgo da seguinte forma, se o arquivo é realmente importante use o require senão use o include.</p>
<p>Outras instruções também usadas são as<em> include_once()</em> e a<em> require_once()</em>.</p>
<p>Ambas agem da mesma forma que as duas primeiras porém só permitem a inclusão do mesmo script uma vez.</p>
<p>Espero que tenha sido o mais objetivo possível.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/php/include-e-require/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>API is.gd: Encurtando URLs com o PHP</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/php/api-is-gd-encurtando-urls-com-o-php/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/php/api-is-gd-encurtando-urls-com-o-php/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 11:57:59 +0000</pubDate>
		<dc:creator>Rafael Jaques</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[is.gd]]></category>
		<category><![CDATA[restfull]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=3976</guid>
		<description><![CDATA[Sobre o site O site is.gd é um encurtador de URLs. O serviço básico deles é pegar uma URL grande e transformá-la em pequena. Decidi começar com esse site porque é a API mais simples que eu encontrei. Sobre a API Documentação: http://is.gd/api_info.php Necessita registro: Não Limite de uso: Encurtamento de 1000 URLs/dia por IP [...]]]></description>
			<content:encoded><![CDATA[<h3>Sobre o site</h3>
<p>O site <a href="http://is.gd/" target="_blank">is.gd</a> é um encurtador de URLs. O serviço básico deles é pegar uma URL grande e  transformá-la em pequena.</p>
<p>Decidi começar com esse site porque é a API mais simples que eu encontrei.</p>
<h3>Sobre a API</h3>
<p><strong>Documentação:</strong> <a href="http://is.gd/api_info.php" target="_blank">http://is.gd/api_info.php</a><br />
<strong>Necessita registro:</strong> Não<br />
<strong>Limite de uso:</strong> Encurtamento de 1000 URLs/dia por IP<br />
<strong>Termos de uso:</strong> http://is.gd/terms.php</p>
<h3>Utilizando a API</h3>
<p>O uso do is.gd é muito simples: você envia uma URL e recebe outra. A  única limitação é quanto a URLs com mais de 2000 caracteres, o que não  deve ser um problema já que é muito raro de se ver isso.</p>
<p>Para a nossa experiência, decidi fazer uma classe para trabalhar com o  encurtamento de URLs. Para fins didáticos, não irei trabalhar com  métodos e propriedades privados (só um <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) e muito menos com padrões de  projeto.</p>
<p>A classe vai funcionar da seguinte maneira: instanciamos o objeto,  solicitamos o encurtamento da URL e depois trabalhamos com os dados  recebidos.</p>
<p>As propriedades que o nosso objeto deve ter serão as seguintes:<br />
<strong>url_original:</strong> URL original que foi passada para ser  encurtada.<br />
<strong>url_curta:</strong> URL curta retornada pelo servidor.<br />
<strong>erro:</strong> true ou false, indicando se houve erro durante a  tentativa de encurtar a URL.<br />
<strong>erro_msg:</strong> no caso de &#8216;erro&#8217; ser true, aqui fica a  mensagem de erro, caso contrário fica como NULL.</p>
<p>E os métodos que utilizaremos:<br />
<strong>encurtar:</strong> obviamente serve para encurtar a URL. <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
<strong>desencurtar:</strong> método &#8220;brinde&#8221; para desencurtar a URL,  por que na real a própria API não desencurta as URLs.</p>
<h3>Mão na massa</h3>
<p>O primeiro passo é montar o corpo da nossa classe. Optei por utilizar um  método de encurtar a URL para que o mesmo objeto possa ser utilizado  para encurtar várias URLs e também te dá a possibilidade de instanciar o  objeto apenas para desencurtar URLs.</p>
<p>Vou dar uma breve explicação do que há no código pois todo ele está  comentado. <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para fazer o encurtamento precisamos enviar a URL para a API através do  método GET.<br />
Por exemplo: http://is.gd/api.php?longurl=phpit.com.br</p>
<p>Desta requisição podem retornar duas coisas: o status 200 (OK) com a URL  encurtada ou o status 500 (Internal Server Error) com a mensagem de  erro.</p>
<p>O método <strong>encurtar</strong> preenche as propriedades da classe  com os dados pertinentes e retorna <strong>true</strong> para o caso de  ter ocorrido tudo bem e <strong>false</strong> para o caso de ter dado  problema.<br />
Já o método <strong>desencurtar</strong> apenas retorna a URL  desencurtada, sem mexer nas propriedades da classe. Pode também retornar  <strong>false</strong> para o caso de a URL ser inválida.</p>
<p>A seguir você tem a classe na versão comentada e na versão não  comentários.</p>
<p>Versão comentada:</p>
<blockquote>
<div><code> &lt;?php<br />
class isgd {</code></p>
<p>// Declara as propriedades que serão utilizadas<br />
public $url_original, $url_curta, $erro, $erro_msg = NULL;</p>
<p>// Este será nosso objeto cURL, o que utilizaremos para acessar a API<br />
private $curl;</p>
<p>// Nosso método construtor, que será executado quando a classe for instanciada<br />
public function __construct() {<br />
// Cria nosso objeto cURL<br />
$this-&gt;curl = curl_init();</p>
<p>// Configura o objeto para retornar os dados ao invés de imprimir na tela<br />
curl_setopt($this-&gt;curl, CURLOPT_RETURNTRANSFER, 1);<br />
/* Configura o objeto para responder a redirecionamentos<br />
É utilizado no método de desencurtar URLs, pois precisamos seguir até a URL final */<br />
curl_setopt($this-&gt;curl, CURLOPT_FOLLOWLOCATION, 1);<br />
}</p>
<p>// Método para encurtar a URL<br />
public function encurtar($url) {<br />
// Utilizamos esta função para codificar os caracteres especiais da URL<br />
$urlCodificada = rawurlencode($url);</p>
<p>// Esta é a URL que utilizaremos para acessar a API<br />
$urlApi = &#8217;http://is.gd/api.php?longurl=&#8217;.$urlCodificada;</p>
<p>// Configuramos a URL no cURL<br />
curl_setopt($this-&gt;curl, CURLOPT_URL, $urlApi);</p>
<p>// Executamos a requisição<br />
$retorno = curl_exec($this-&gt;curl);</p>
<p>// Recebemos os dados da execução<br />
$dados = curl_getinfo($this-&gt;curl);</p>
<p>// O http_code pode ser 200 (OK) e 500 (Internal Server Error)<br />
/* Junto com a verificação, é bom olhar também se a URL<br />
possui menos de 20 caracteres, já que o is.gd trabalha<br />
com no máximo 18. Isto ajuda a evitar error arbitrários. */<br />
if ($dados['http_code'] == 200 &amp;&amp; strlen($retorno) &lt; 20) {<br />
// Caso tenha ocorrido tudo bem, resetamos estas propriedades<br />
$this-&gt;erro = false;<br />
$this-&gt;erro_msg = NULL;<br />
$this-&gt;url_curta = $retorno;<br />
} else {<br />
// Caso tenha dado algum problema, colocamos os dados aqui<br />
$this-&gt;erro = true;<br />
$this-&gt;erro_msg = $retorno;<br />
$this-&gt;url_curta = NULL;<br />
}</p>
<p>// Colocamos a URL original no seu lugar<br />
$this-&gt;url_original = $url;</p>
<p>/* Por fim, para tornar mais fácil ainda, o retorno da função será<br />
true ou false dependendo do resultado que obtivemos no processo */<br />
return $this-&gt;erro;<br />
}</p>
<p>// Método para desencurtar a URL<br />
public function desencurtar($url) {<br />
// Primeiro verificamos se a URL é realmente is.gd<br />
if (substr($url, 0, 13) == &#8217;http://is.gd/&#8217; || substr($url, 0, 6) == &#8217;is.gd/&#8217;) {<br />
// Configuramos a URL no cURL<br />
curl_setopt($this-&gt;curl, CURLOPT_URL, $url);</p>
<p>// Executamos a requisição<br />
curl_exec($this-&gt;curl);</p>
<p>// Recebemos os dados da execução<br />
$dados = curl_getinfo($this-&gt;curl);</p>
<p>// Testamos se o status é 200 e se a URL retornada é diferente da desencurtada<br />
if ($dados['http_code'] == 200 &amp;&amp; $url != $dados['url']) {<br />
// Retornamos a URL desencurtada<br />
return $dados['url'];<br />
}<br />
}<br />
// Caso tenha dado algum problema no meio do caminho, retornamos false<br />
return false;<br />
}</p>
<p>}<br />
?&gt;</p>
</div>
</blockquote>
<div>Versão não comentada:</div>
<div>
<blockquote>
<div><code> &lt;?php</code></p>
<p>class isgd {</p>
<p>public $url_original, $url_curta, $erro, $erro_msg = NULL;<br />
private $curl;</p>
<p>public function __construct() {<br />
$this-&gt;curl = curl_init();</p>
<p>curl_setopt($this-&gt;curl, CURLOPT_RETURNTRANSFER, 1);<br />
curl_setopt($this-&gt;curl, CURLOPT_FOLLOWLOCATION, 1);<br />
}</p>
<p>public function encurtar($url) {<br />
$urlCodificada = rawurlencode($url);<br />
$urlApi = &#8217;http://is.gd/api.php?longurl=&#8217;.$urlCodificada;<br />
curl_setopt($this-&gt;curl, CURLOPT_URL, $urlApi);<br />
$retorno = curl_exec($this-&gt;curl);<br />
$dados = curl_getinfo($this-&gt;curl);</p>
<p>if ($dados['http_code'] == 200 &amp;&amp; strlen($retorno) &lt; 20) {<br />
$this-&gt;erro = false;<br />
$this-&gt;erro_msg = NULL;<br />
$this-&gt;url_curta = $retorno;<br />
} else {<br />
$this-&gt;erro = true;<br />
$this-&gt;erro_msg = $retorno;<br />
$this-&gt;url_curta = NULL;<br />
}</p>
<p>$this-&gt;url_original = $url;</p>
<p>return $this-&gt;erro;<br />
}</p>
<p>public function desencurtar($url) {<br />
if (substr($url, 0, 13) == &#8217;http://is.gd/&#8217; || substr($url, 0, 6) == &#8217;is.gd/&#8217;) {<br />
curl_setopt($this-&gt;curl, CURLOPT_URL, $url);<br />
curl_exec($this-&gt;curl);<br />
$dados = curl_getinfo($this-&gt;curl);<br />
if ($dados['http_code'] == 200 &amp;&amp; $url != $dados['url']) {<br />
return $dados['url'];<br />
}<br />
}<br />
return false;<br />
}</p>
<p>}</p>
<p>?&gt;</p>
</div>
</blockquote>
</div>
<div>
<h3>Utilização</h3>
</div>
<div>Para utilizar a classe é muito simples.</div>
<div><strong>Encurtando uma URL:</strong></div>
<div>
<blockquote>
<div><code> &lt;?php</code></p>
<p>$isgd = new isgd();</p>
<p>if ($isgd-&gt;encurtar(&#8216;http://phpit.com.br&#8217;)) {<br />
echo &#8217;URL encurtada: &#8217;;<br />
echo $isgd-&gt;url_curta;<br />
} else {<br />
echo $isgd-&gt;erro_msg;<br />
}</p>
<p>?&gt;</p>
</div>
</blockquote>
</div>
<div>Vale ressaltar que quando ocorrer tudo certo, teremos o objeto desta  forma:</div>
<blockquote>
<div>isgd Object<br />
(<br />
[url_original] =&gt; phpit.com.br<br />
[url_curta] =&gt; http://is.gd/9Q9kP<br />
[erro] =&gt;<br />
[erro_msg] =&gt;<br />
[curl:private] =&gt; Resource id #2<br />
)</div>
</blockquote>
<div>E quando houver erro teremos algo parecido com isso:</div>
<blockquote>
<div>isgd Object<br />
(<br />
[url_original] =&gt; [...] uma url muito longa aqui <img src='http://www.mxstudio.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  [...]<br />
[url_curta] =&gt;<br />
[erro] =&gt; 1<br />
[erro_msg] =&gt; Error: The URL entered was too long.<br />
[curl:private] =&gt; Resource id #2<br />
)</div>
</blockquote>
<div><strong>Desencurtando uma URL</strong></div>
<div>
<blockquote>
<div><code> &lt;?php</code></p>
<p>$isgd = new isgd();</p>
<p>$url = $isgd-&gt;desencurtar(&#8216;http://is.gd/9Q9kP&#8217;);</p>
<p>if ($url) {<br />
echo &#8217;URL encurtada: &#8217;;<br />
echo $url;<br />
} else {<br />
echo &#8217;Nao foi possivel desencurtar a URL.&#8217;;<br />
}</p>
<p>?&gt;</p>
</div>
</blockquote>
</div>
<div>
<h3>Conclusão</h3>
<p>Bom&#8230; Acho que pra primeira API explorada tivemos um trabalho bastante  interessante.<br />
Espero que você possa aproveitar (e entender, principalmente) esta  classe. Se você fizer melhorias nela, por favor, me mande pois eu  gostaria muito de ver!</p>
<p>Aguardo sugestões para as próximas APIs exploradas e quem quiser  contribuir com experiências, elas são sempre bem vindas.</p>
<p>Um abraço a todos e fiquem com Deus!</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/php/api-is-gd-encurtando-urls-com-o-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando uma enquete dinâmica – Parte final</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-final/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-final/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 15:28:39 +0000</pubDate>
		<dc:creator>Igor Carvalho</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[enquete]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=3043</guid>
		<description><![CDATA[Este é a página que vai mostrar o resultado da enquete &#60;?php //resultado.php include(&#39;conexao.php&#39;); $sql_pergunta = &#34;SELECT * FROM enq_perguntas ORDER BY id DESC LIMIT 1&#34;; $query_pergunta = mysql_query($sql_pergunta) or die(&#34;Erro: &#34;.mysql_error()); $dados_pergunta = mysql_fetch_array($query_pergunta); $sql_opcao = &#34;SELECT * FROM enq_opcao WHERE pergunta_fk = &#39;{$dados_pergunta[&#39;id&#39;]}&#39;&#34;; $sql_total = &#34;SELECT SUM(votos) AS total FROM enq_opcao WHERE pergunta_fk [...]]]></description>
			<content:encoded><![CDATA[<p>Este é a página que vai mostrar o resultado da enquete<br />
<code><br />
&lt;?php<br />
//resultado.php<br />
include(&#39;conexao.php&#39;);<br />
$sql_pergunta = &quot;SELECT * FROM enq_perguntas ORDER BY id DESC LIMIT 1&quot;;<br />
$query_pergunta = mysql_query($sql_pergunta) or die(&quot;Erro: &quot;.mysql_error());<br />
$dados_pergunta = mysql_fetch_array($query_pergunta);</p>
<p>$sql_opcao = &quot;SELECT * FROM enq_opcao WHERE pergunta_fk = &#39;{$dados_pergunta[&#39;id&#39;]}&#39;&quot;;<br />
$sql_total = &quot;SELECT SUM(votos) AS total FROM enq_opcao WHERE pergunta_fk = &#39;{$dados_pergunta[&#39;id&#39;]}&#39;&quot;;<br />
$query_opcao = mysql_query($sql_opcao);<br />
$query_total = mysql_query($sql_total);<br />
$total = mysql_fetch_array($query_total);<br />
while($opcao = mysql_fetch_array($query_opcao))<br />
{<br />
    $porc = $opcao[&#39;votos&#39;] / $total[&#39;total&#39;] * 100;<br />
    $porc_formt = number_format($porc,2,&#39;.&#39;,&#39;&#39;);<br />
    $porc_round = round($porc_formt);<br />
    echo utf8_decode($opcao[&#39;opcao&#39;]) .&quot; - {$porc_formt} %<br />\n";<br />
    $px = $porc_round == 0 ? 1 : $porc_round;<br />
    echo "
<div style='width:{$px}px;height:10px;background:red'></div>
<p>\n<br />";<br />
}<br />
?&gt;</p>
<p></code></p>
<p><a href="http://www.mxstudio.com.br/wp-content/uploads/2010/02/enquete.zip">Aqui</a> estão todos os arquivos usados na série </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-final/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Criando uma enquete dinâmica – Parte 5</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-5/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-5/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 15:27:25 +0000</pubDate>
		<dc:creator>Igor Carvalho</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[enquete]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=3041</guid>
		<description><![CDATA[Este é o arquivo que irá prover o formulario de votacao da enquete &#60;input type=&#34;radio&#34; name=&#34;enquete&#34; value=&#34;" /&#62;]]></description>
			<content:encoded><![CDATA[<p>Este é o arquivo que irá prover o formulario de votacao da enquete<br />
<code></p>
<form action="enquete.php" method="POST">
<p>    &lt;input type=&quot;radio&quot; name=&quot;enquete&quot; value=&quot;" /&gt;<label></label></p>
</form>
<p></code> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando uma enquete dinâmica – Parte 4</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-4/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-4/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 15:20:09 +0000</pubDate>
		<dc:creator>Igor Carvalho</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[enquete]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=3039</guid>
		<description><![CDATA[Eu gostaria de pedir desculpas aos usuários pois eu sumi, não dei continuidade a série, pois eu pc deu um problemão, e estou aqui de volta para terminá-la. &#60;?php //cadastra_opcao.php include(&#039;conexao.php&#039;); //print_r($_POST); //die(); if($_POST) { $opcao = $_POST[&#039;opcao&#039;]; $pergunta_id = $_POST[&#039;pergunta_id&#039;]; $sql = &#34;INSERT INTO enq_opcao(id,pergunta_fk,opcao,votos,addr) VALUES(null,&#039;{$pergunta_id}&#039;,&#039;{$opcao}&#039;,null,null)&#34;; $query = mysql_query($sql) or die(&#34;Erro: &#34;.mysql_error()); if($query) { [...]]]></description>
			<content:encoded><![CDATA[<p>Eu gostaria de pedir desculpas aos usuários pois eu sumi, não dei continuidade a série, pois eu pc deu um problemão, e estou aqui de volta para terminá-la.<br />
<code><br />
&lt;?php<br />
//cadastra_opcao.php<br />
include(&#039;conexao.php&#039;);<br />
//print_r($_POST);<br />
//die();<br />
if($_POST)<br />
{<br />
    $opcao = $_POST[&#039;opcao&#039;];<br />
    $pergunta_id = $_POST[&#039;pergunta_id&#039;];<br />
    $sql = &quot;INSERT INTO enq_opcao(id,pergunta_fk,opcao,votos,addr) VALUES(null,&#039;{$pergunta_id}&#039;,&#039;{$opcao}&#039;,null,null)&quot;;<br />
    $query = mysql_query($sql) or die(&quot;Erro: &quot;.mysql_error());<br />
    if($query)<br />
    {<br />
        echo &quot;<br />
if( confirm('Voce gostaria de cadastrar outra opcao?'))<br />
{<br />
window.location = 'enquete.php';<br />
}<br />
else<br />
{<br />
window.location = 'cadastra_opcao.php?pergunta={$pergunta_id}';<br />
}<br />
";<br />
    }<br />
}</p>
<p>?&gt;</p>
<p>        <title></title></p>
<p>    &lt;form action=&quot;" method="POST"&gt;<br />
            Opção: <br />
            &lt;input type=&quot;hidden&quot; name=&quot;pergunta_id&quot; value=&quot;" /&gt;</p></form>
<p></code> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criando uma enquete dinâmica – Parte 3</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-3/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-3/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 11:25:32 +0000</pubDate>
		<dc:creator>Igor Carvalho</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[enquete]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=2897</guid>
		<description><![CDATA[ol@, moçada, blzs? Hoje nós vamos criar a página que cadastra a pergunta &#60;?php //cadastra_pergunta.php include(&#039;conexao.php&#039;); if($_POST) { $pergunta = $_POST[&#039;pergunta&#039;]; $sql = &#34;INSERT INTO enq_perguntas(id,pergunta) VALUES(null,&#039;{$pergunta}&#039;)&#34;; $query = mysql_query($sql) or die(&#34;Erro: &#34;.mysql_error()); $id_pergunta = mysql_insert_id(); if($query) { echo &#34; if( confirm(\"Voce gostaria de cadastrar outra pergunta? Clica sim para cadastrar outra pergunta e cancelar [...]]]></description>
			<content:encoded><![CDATA[<p>ol@, moçada, blzs?</p>
<p>Hoje nós vamos criar a página que cadastra a pergunta<br />
<code><br />
&lt;?php<br />
//cadastra_pergunta.php<br />
include(&#039;conexao.php&#039;);<br />
if($_POST)<br />
{<br />
    $pergunta = $_POST[&#039;pergunta&#039;];<br />
    $sql = &quot;INSERT INTO enq_perguntas(id,pergunta) VALUES(null,&#039;{$pergunta}&#039;)&quot;;<br />
    $query = mysql_query($sql) or die(&quot;Erro: &quot;.mysql_error());<br />
    $id_pergunta = mysql_insert_id();<br />
    if($query)<br />
    {<br />
        echo &quot;<br />
if( confirm(\"Voce gostaria de cadastrar outra pergunta? Clica sim para cadastrar outra pergunta e cancelar para uma opção\"))<br />
{<br />
window.location = 'cadastra_pergunta.php';<br />
}<br />
else<br />
{<br />
window.location = 'cadastra_opcao.php?pergunta={$id_pergunta}';<br />
}<br />
";<br />
    }<br />
}</p>
<p>?&gt;</p>
<p>        <title></title></p>
<p>    &lt;form action=&quot;" method="POST"&gt;<br />
            Pergunta: </p></form>
<p></code></p>
<p>este e o link do primeiro artigo da serie<br />
<a href="http://www.mxstudio.com.br/dreamweaver/criando-uma-enquete-dinamica-parte-1/">http://www.mxstudio.com.br/dreamweaver/criando-uma-enquete-dinamica-parte-1/</a><br />
e este o do segundo artigo<br />
<a href="http://www.mxstudio.com.br/dreamweaver/criando-uma-enquete-dinamica-parte-2/">http://www.mxstudio.com.br/dreamweaver/criando-uma-enquete-dinamica-parte-2/</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-%e2%80%93-parte-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Criando uma enquete dinâmica &#8211; parte 2</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-parte-2/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-parte-2/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 20:53:29 +0000</pubDate>
		<dc:creator>Igor Carvalho</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[enquete]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=2760</guid>
		<description><![CDATA[ol@ moçada, nesta segunda parte vamos criar um arquivo de conexao ao banco de dados bem simples&#8230;. crie um novo arquivo php, e insira o código abaixo, mudando os valores das variaveis: &#60;?php $host = 'localhost'; $db = 'testes'; $user ='root'; $pass ='xxxx'; mysql_connect($host, $user, $pass) or die('Erro :'.mysql_error()); mysql_select_db($db) or die('Erro:'.mysql_error()); este e o [...]]]></description>
			<content:encoded><![CDATA[<p>ol@ moçada, nesta segunda parte vamos criar um arquivo de conexao ao banco de dados bem simples&#8230;.<br />
crie um novo arquivo php, e insira o código abaixo, mudando os valores das variaveis:<br />
<code><br />
&lt;?php<br />
$host = 'localhost';<br />
$db = 'testes';<br />
$user ='root';<br />
$pass ='xxxx';</p>
<p>mysql_connect($host, $user, $pass) or die('Erro :'.mysql_error());<br />
mysql_select_db($db) or die('Erro:'.mysql_error());</code></p>
<p>este e o primeiro artigo da serie&#8230;</p>
<p><a href="http://www.mxstudio.com.br/dreamweaver/criando-uma-enquete-dinamica-parte-1">http://www.mxstudio.com.br/dreamweaver/criando-uma-enquete-dinamica-parte-1</a>/ </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando uma enquete dinâmica &#8211; Parte 1</title>
		<link>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-parte-1/</link>
		<comments>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-parte-1/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 13:11:39 +0000</pubDate>
		<dc:creator>Igor Carvalho</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Dreamweaver]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[enquete]]></category>
		<category><![CDATA[mysq]]></category>

		<guid isPermaLink="false">http://www.mxstudio.com.br/?p=2729</guid>
		<description><![CDATA[Ol@ moçada, Nós vamos aprender a criar uma enquete dinâmica, com banco de dados. A primeira parte é bem simples, vamos apenas criar o banco de dados. Usaremos somente 2 tabelas&#8230;. A primeira é a de perguntas. Vá ao seu phpmyadmin, crie um banco de dados, ou use um ja existente, vá na aba &#8216;SQL&#8217;, [...]]]></description>
			<content:encoded><![CDATA[<p>Ol@ moçada,</p>
<p>Nós vamos aprender a criar uma enquete dinâmica, com banco de dados.<br />
A primeira parte é bem simples, vamos apenas criar o banco de dados. Usaremos somente 2 tabelas&#8230;.</p>
<p>A primeira é a de perguntas. Vá ao seu phpmyadmin, crie um banco de dados, ou use um ja existente, vá na aba &#8216;SQL&#8217;, insira este o seguinte script sql, e cliquei em executar</p>
<pre lang="sql">CREATE TABLE `enq_perguntas` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pergunta` varchar(250) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8</pre>
<p>a próxima tabela é a de opções</p>
<pre lang="sql">CREATE TABLE `enq_opcao` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT ' ',
`pergunta_fk` int(11) NOT NULL,
`opcao` varchar(250) CHARACTER SET utf8 NOT NULL,
`votos` int(6) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pergunta_fk` (`pergunta_fk`),
CONSTRAINT `enq_opcao_ibfk_1` FOREIGN KEY (`pergunta_fk`) REFERENCES `enq_perguntas` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_latvian_ci</pre>
<p><strong>NOTA:</strong><br />
Observe que ambas as tabelas sao do tipo innodb, ou seja, o proprio banco eh que fara as referencias dos indices. Quando uma pergunta for excluida, todas as suas opcoes tambem serao&#8230;se as tabelas forem do tipo myisam, isso tera que ser feito manualmente&#8230;. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mxstudio.com.br/desenvolvimento/dreamweaver/criando-uma-enquete-dinamica-parte-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

