<?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>Blog do Beraldo &#187; Banco de Dados</title>
	<atom:link href="http://www.rberaldo.com.br/blog/category/banco-de-dados/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rberaldo.com.br/blog</link>
	<description>Programação, Música, Entretenimento e o que mais me vier à mente</description>
	<lastBuildDate>Mon, 06 Feb 2012 14:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>A extensão MySQLi do PHP</title>
		<link>http://www.rberaldo.com.br/blog/a-extensao-mysqli-do-php/</link>
		<comments>http://www.rberaldo.com.br/blog/a-extensao-mysqli-do-php/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 13:57:02 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[banco]]></category>
		<category><![CDATA[base]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[mysqli]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=431</guid>
		<description><![CDATA[O PHP possui a extensão MySQL nativamente desde o PHP 4. No PHP 5 foi adicionada a extensão MySQLi, que é uma versão mais completa e recente da antiga extensão MySQL. Além disso, a extensão MySQLi é totalmente orientada e objetos. Essa nova extensão também viabiliza o uso de novos recursos do MySQL, como Stored [...]]]></description>
			<content:encoded><![CDATA[<p>O PHP possui a extensão MySQL nativamente desde o PHP 4. No PHP 5 foi adicionada a extensão MySQLi, que é uma versão mais completa e recente da antiga extensão MySQL. Além disso, a extensão MySQLi é totalmente orientada e objetos. Essa nova extensão também viabiliza o uso de novos recursos do MySQL, como Stored Procedures ou Views.</p>
<p>A extensão MySQLi necessita do servidor MySQL 4.1 ou superior.</p>
<p>Vale lembrar que há boatos de que a extensão MySQL deixe de existir no PHP 6. Logo, seja isso verdade ou não, é preferível usar MySQLi.</p>
<p>Vou mostrar aqui a forma de se trabalhar com a extensão MySQLi.</p>
<p><span id="more-431"></span></p>
<p>Para realizar a conexão com a base de dados, basta isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$MySQLi</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'servidor'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'usuario'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'senha'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'nome_da_db'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$MySQLi</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'passwd'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Se a conexão for bem sucedida, $MySQLi será um objeto, que será usado para consultas posteriores e outras ações com a base de dados.</p>
<p>Para realizar uma consulta, por exemplo, basta usar o método query() e percorrer com fetch_assoc(), muito semelhante ao que se faz usando a extensão mysql:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$exec</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$MySQLi</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'select dados from tabela'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$f</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$exec</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$f</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A lista completa de propriedades e métodos da classe MySQLi pode ser encontrada no link abaixo:</p>
<p><a href="http://php.net/manual/pt_BR/book.mysqli.php" target="_blank" onclick="urchinTracker('/outgoing/php.net/manual/pt_BR/book.mysqli.php?referer=');">http://php.net/manual/pt_BR/book.mysqli.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/a-extensao-mysqli-do-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Inserindo Múltiplos Registros em Tabela de Banco de Dados</title>
		<link>http://www.rberaldo.com.br/blog/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/</link>
		<comments>http://www.rberaldo.com.br/blog/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 13:00:35 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[banco]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[inserir]]></category>
		<category><![CDATA[insert]]></category>
		<category><![CDATA[linhas]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[múltiplas]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[registros]]></category>
		<category><![CDATA[simultaneamente]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=397</guid>
		<description><![CDATA[Como inserir diversos registros simultaneamente em uma tabela de banco de dados]]></description>
			<content:encoded><![CDATA[<p>Muitos programadores costumam executar vários comandos INSERT quando pretendem inserir informações em uma tabela de banco de dados. Porém, quando os dados serão salvos na mesma tabela, não é necessário executar diversos comandos INSERT; apenas um é suficiente.</p>
<p>Por exemplo: em vez de executar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela<span style="color: #66cc66;">&#40;</span>numero<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela<span style="color: #66cc66;">&#40;</span>numero<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">...</span></pre></div></div>

<p>Poderíamos executar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tabela<span style="color: #66cc66;">&#40;</span>numero<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Vou mostrar uma maneira simples de se fazer isso dinamicamente, com quantidade indeterminada informações, que podem vir de qualquer tipo de fonte de dados.</p>
<p><span id="more-397"></span></p>
<p>Vamos considerar um array com números inteiros, de 1 a 10:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valores</span> <span style="color: #339933;">=</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para inserir isso num banco de dados, muitos fariam isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valores</span> <span style="color: #339933;">=</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$valores</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$DB</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'INSERT INTO tabela(numero) VALUES('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$valores</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Isso funciona. Mas é lento e sobrecarrega o servidor. Imaginem um array com 100 mil valores.</p>
<p>O correto é gerar a string SQL com todos os valores a serem inseridos, separados por vírgula, de forma a executar a consulta apenas uma vez.  Logo, podemos fazer isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$valores</span> <span style="color: #339933;">=</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'INSERT INTO tabela(numero) VALUES (%s)'</span><span style="color: #339933;">,</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'), ('</span> <span style="color: #339933;">,</span> <span style="color: #000088;">$valores</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$DB</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sql</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Se dermos um echo em $sql, teremos como saída:</p>
<pre>
INSERT INTO tabela(numero) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
</pre>
<p>Dessa forma só se executa a SQL uma vez, tornando a execução bem mais rápida.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/inserindo-multiplos-registros-em-tabela-de-banco-de-dados/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Segurança em Sistemas de Login: Proteção Contra SQL Injection</title>
		<link>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-protecao-contra-sql-injection/</link>
		<comments>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-protecao-contra-sql-injection/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 15:45:48 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[escape]]></category>
		<category><![CDATA[injection]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[magic]]></category>
		<category><![CDATA[magic_quotes]]></category>
		<category><![CDATA[mysql_real_escape_string]]></category>
		<category><![CDATA[pg_escape_string]]></category>
		<category><![CDATA[quotes]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[stripslashes]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=269</guid>
		<description><![CDATA[Dando continuação ao artigo sobre Segurança em Sistemas de login, hoje mostrarei como se defender de ataques por SQL Injection. Foco MySQL e PostgreSQL, os principais SGBDs gratuitos da atualidade.]]></description>
			<content:encoded><![CDATA[<p>Dando continuação ao artigo sobre Segurança em Sistemas de login, hoje mostrarei como se defender de ataques por SQL Injection. Foco MySQL e PostgreSQL, os principais SGBDs gratuitos da atualidade.</p>
<p>Caso não tenha visto a primeira parte do artigo, leia-a aqui:<br />
<a href="http://www.rberaldo.com.br/blog/2010/12/22/seguranca-em-sistemas-de-login-senhas-e-cookies/">Segurança em SIstemas de Login: Senhas e Cookies</a></p>
<p><span id="more-269"></span></p>
<h3>Sumário</h3>
<p><a href="#intro">1. Introdução</a><br />
<a href="#magic">2. Magic Quotes</a><br />
<a href="#solucoes">3. Soluções Especificas para cada SGBD</a><br />
<a href="#mysql">3.1. MySQL</a><br />
<a href="#postgre">3.2. PostgreSQL</a><br />
<a href="#exemplos">3.3. Exemplos de códigos para MySQL e PostgreSQL</a><br />
<a href="#apenas">4. Apenas Isso Não Basta</a><br />
<a href="#conclusao">5. Conclusão</a></p>
<h3><a name="intro">1. Introdução</a></h3>
<p>Neste segundo artigo sobre <b>segurança</b> em sistemas de login, abordarei formas de proteção contra <a href="http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Inje_C3_A7_C3_A3o_de_SQL?referer=');">SQL Injection</a>.</p>
<p>Existem muitas discussões na Internet, em listas de discussão e fóruns, sobre qual seria a função perfeita para impedir ataque por SQL Injection SQL Injection. Alguns programadores até criam funções que removem, por segurança, palavras-chave da linguagem SQL, como SELECT, DROP, DELETE. Isso pode até resolver, mas não podemos danificar a informação; se permitirmos que o usuário escreva informações em nosso site, devemos permitir-lhe escrever<br />
SELECT, DROP e DELETE também. Imagine, por exemplo, um fórum sobre programação: como poderíamos postar códigos SQL se o fórum removesse as palavras SELECT, DELETE etc? Logo, não podemos remover essas palavras.</p>
<p>A soluçãoo é muito simples! Sim, é simples, mesmo. Muitos querem complicar à toa, porém é muito simples: <strong>escapar caracteres especiais</strong>.</p>
<p>Esses caracteres especiais podem variar conforme o <a href="http://pt.wikipedia.org/wiki/Sistema_de_gerenciamento_de_banco_de_dados" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Sistema_de_gerenciamento_de_banco_de_dados?referer=');">SGBD</a> que se está utilizando. Normalmente são aspas simples e duplas, as quais delimitam strings em um comando SQL.</p>
<p>Vamos a um exemplo. Considere a SQL abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">$sql <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;SELECT id, nome, sobrenome FROM autores WHERE nome = '&quot;</span> <span style="color: #66cc66;">.</span> $nome <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;'
		AND sobrenome = '&quot;</span> <span style="color: #66cc66;">.</span> $sobrenome <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;'&quot;</span>;</pre></div></div>

<p>Supondo que $nome contenha <b>jo&#8217;sé</b>, e $sobrenome, <b>silva</b>, a SQL ficará assim:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> nome<span style="color: #66cc66;">,</span> sobrenome <span style="color: #993333; font-weight: bold;">FROM</span> autores <span style="color: #993333; font-weight: bold;">WHERE</span> nome <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'jo'</span>se<span style="color: #ff0000;">' AND sobrenome = '</span>silva<span style="color: #ff0000;">';</span></pre></div></div>

<p>Isso gera um erro de sintaxe, sem comprometer o banco de dados. Porém, se mantivermos $sobrenome e definirmos $nome com o valor <b>jo&#8217;; DROP TABLE autores ; &#8211;</b>, teremos:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> nome<span style="color: #66cc66;">,</span> sobrenome <span style="color: #993333; font-weight: bold;">FROM</span> autores <span style="color: #993333; font-weight: bold;">WHERE</span> nome <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'jo'</span>; <span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> autores ;
<span style="color: #808080; font-style: italic;">--'AND sobrenome = 'silva';</span></pre></div></div>

<p>Dessa forma, selecionam-se os registros com nome igual a &#8220;jo&#8221;, remove-se a tabela &#8220;autores&#8221; e considera-se <strong>&#8216; AND sobrenome = &#8216;silva&#8217;;</strong> como comentário. Isso caracteriza um ataque por SQL Injection.</p>
<h3><a name="magic">2. Magic Quotes</a></h3>
<p>Face aos possíveis grandes danos que SQL Injection pode causar, o PHP possui um mecanismo nativo automático para escapar caracteres especiais: o <em>magic quotes</em>. Porém, esse é um mecanismo genérico, que não pode ser aplicado a todos os SGBDs. Logo, não o utilize!</p>
<p>O próprio Manual do PHP não recomenda seu uso:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">There is no reason to use magic quotes because they are no longer a supported
part of PHP. However, they did exist and did help a few beginners blissfully
and unknowingly write better (more secure) code. But, when dealing with code
that relies upon this behavior it's better to update the code instead of
turning magic quotes on. So why did this feature exist? Simple, to help prevent
SQL Injection. Today developers are better aware of security and end up using
database specific escaping mechanisms and/or prepared statements instead of
relying upon features like magical quotes.</pre></div></div>

<p>Fonte: <a href="http://br3.php.net/manual/en/security.magicquotes.why.php" onclick="urchinTracker('/outgoing/br3.php.net/manual/en/security.magicquotes.why.php?referer=');">http://br3.php.net/manual/en/security.magicquotes.why.php</a></p>
<p>Como citado no trecho, é preferível adaptar seus códigos a fim de torná-los seguros e não vulneráveis a SQL Injection a habilitar o magic quotes. Portanto mantenha a diretiva <strong>magic_quotes_gpc</strong>, do , em <strong>off</strong>! Dê preferência a funções específicas para cada SGBD.</p>
<p>Leia o capítulo sobre Magic Quotes, do }Manual do PHP, no link abaixo:<br />
<a href="http://br3.php.net/manual/en/security.magicquotes.php" onclick="urchinTracker('/outgoing/br3.php.net/manual/en/security.magicquotes.php?referer=');">http://br3.php.net/manual/en/security.magicquotes.php</a></p>
<h3><a name="solucoes">3. Soluções Especificas para cada SGBD</a></h3>
<h3><a name="mysql">3.1. MySQL</a></h3>
<p>Vamos ao exemplo mais comum: MySQL: existe uma função específica do PHP para escapar caracteres especiais do MySQL: <a href="http://br3.php.net/manual/pt\_BR/function.mysql-real-escape-string.php" onclick="urchinTracker('/outgoing/br3.php.net/manual/pt_BR/function.mysql-real-escape-string.php?referer=');">mysql_real_escape_string</a>.</p>
<p>Ela deve ser usada com magic_quotes_gpc em off. Caso seu servidor mantenha essa diretiva ativa, <a href="http://php.net/manual/pt_BR/security.magicquotes.disabling.php" onclick="urchinTracker('/outgoing/php.net/manual/pt_BR/security.magicquotes.disabling.php?referer=');">desabilite-a por meio de htaccess</a> ou, caso isso não seja possível, certifique-se de usar <a href="http://php.net/manual/en/function.stripslashes.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.stripslashes.php?referer=');">stripslashes</a> antes de aplicar essa função. Veja o exemplo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">get_magic_quotes_gpc</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$name</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$name</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT * FROM users WHERE name=<span style="color: #006699; font-weight: bold;">$name</span>&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Esse trecho de código e outras dicas sobre prevenção de SQL Injection com MySQL podem ser vistas no link abaixo, do próprio Manual do MySQL:<br />
<a href="http://dev.mysql.com/tech-resources/articles/guide-to-php-security.html" onclick="urchinTracker('/outgoing/dev.mysql.com/tech-resources/articles/guide-to-php-security.html?referer=');">http://dev.mysql.com/tech-resources/articles/guide-to-php-security.html</a></p>
<h3><a name="postgre">3.2. PostgreSQL</a></h3>
<p>O escape de caracteres no PostgreSQL não é feito com barra invertida; é feito com aspas simples. Ou seja, addslashes não funcionaria aqui.</p>
<p>O PHP também tem uma função específica para escape de caracteres especiais para PostgreSQL: <a href="http://php.net/manual/en/function.pg-escape-string.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.pg-escape-string.php?referer=');">pg_escape_string</a>.</p>
<p>Mais informações sobre prevenção de SQL Injection em PostgreSQL podem ser vistas no link abaixo, do Wiki do PostgreSQL:<br />
<a href="http://wiki.postgresql.org/wiki/Sql_injection" onclick="urchinTracker('/outgoing/wiki.postgresql.org/wiki/Sql_injection?referer=');">http://wiki.postgresql.org/wiki/Sql_injection</a></p>
<h3><a name="exemplos">3.3. Exemplos de códigos para MySQL e PostgreSQL</a></h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'usuario'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'senha'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;There's no place like 127.0.0.1, the <span style="color: #000099; font-weight: bold;">\&quot;</span>localhost<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;String:	&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$str</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;MySQL:	&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Postgre:	&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">pg_escape_string</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>* Para usar mysql\_real\_escape\_string, é necessário uma conexão MySQL ativa.\\</p>
<p>Saída:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">String:	There's no place like 127.0.0.1, the &quot;localhost&quot;
MySQL:	There\'s no place like 127.0.0.1, the \&quot;localhost\&quot;
Postgre:	There''s no place like 127.0.0.1, the &quot;localhost&quot;</pre></div></div>

<h3><a name="apenas">4. Apenas Isso Não Basta</a></h3>
<p>Apenas escapar caracteres não é suficiente, uma vez que não existem apenas strings. Também temos dados numéricos, como inteiros, floats e outros tipos de ponto flutuante, que não são envolvidos por aspas em consultas SQL.</p>
<p>Considere a seguinte SQL:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">$sql <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;SELECT id, nome, sobrenome FROM autores WHERE id=&quot;</span> <span style="color: #66cc66;">.</span> $id;</pre></div></div>

<p>Se $id tiver o valor <strong>0; DROP TABLE autores; &#8211;</strong>, a SQL final será:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">SELECT id<span style="color: #339933;">,</span> nome<span style="color: #339933;">,</span> sobrenome FROM autores WHERE id<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> DROP TABLE autores<span style="color: #339933;">;</span> <span style="color: #339933;">--;</span></pre></div></div>

<p>Isso removeria a tabela &#8220;autores&#8221;.</p>
<p>A solução é, novamente, muito simples: basta fazer <a href="http://en.wikipedia.org/wiki/Cast_(computer_science)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Cast_computer_science?referer=');"><em>casting</em></a>, ou coerção, convertendo o parâmetro para um tipo numérico.</p>
<p>No exemplo acima, bastaria isto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">;</span></pre></div></div>

<p>O mesmo vale para float, double e os demais tipos de dados.</p>
<h3><a name="conclusao">5. Conclusão</a></h3>
<p>SQL Injection é um problema muito grave, que muitos programadores iniciantes deixam passar despercebido, principalmente por falta de conhecimento.</p>
<p>Apesar disso, sua prevenção é muito simples. Basta entender o funcionamento do ataque para saber como se defender dele.</p>
<p>Abraços,</p>
<p>Beraldo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-protecao-contra-sql-injection/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Segurança em sistemas de login: senhas e cookies</title>
		<link>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-senhas-e-cookies/</link>
		<comments>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-senhas-e-cookies/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 02:00:04 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[automático]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[criptografia]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[md-5]]></category>
		<category><![CDATA[md5]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[senha]]></category>
		<category><![CDATA[sha-1]]></category>
		<category><![CDATA[sha1]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=263</guid>
		<description><![CDATA[Neste tutorial abordarei maneiras de criptografar senhas para serem usadas em sistemas de login. Também mostrarei uma possível forma de salvá-las em cookies, a fim de viabilizar login automático, porém sem salvar a senha ou o hash dela no cookie.]]></description>
			<content:encoded><![CDATA[<p>Neste tutorial abordarei maneiras de criptografar senhas para serem usadas em sistemas de login. Também mostrarei uma possível forma de salvá-las em <em>cookies</em>, a fim de viabilizar login automático, porém sem salvar a senha ou o <em>hash</em> dela no <em>cookie</em>.</p>
<p>Na verdade, &#8220;<b>criptografia</b>&#8221; não é a palavra correta aqui. Na verdade usaremos <em><b>hashes</b></em>, que é uma forma de codificação unidirecional, ou seja, não há como, a partir de um <em><b>hash</b></em>, obter o dado original. Afinal, não temos para que saber a senha do usuário. <b>Criptografia</b> é uma forma de codificação usando chaves, de forma que é possível obter o dado original, desde que tenha-se a chave com a qual o dado foi codificado.</p>
<p><span id="more-263"></span></p>
<h2>Sumário</h2>
<p><a href="#encode">Codificando senhas para salvá-las no banco de dados</a><br />
<a href="#salt">Usando Salt Number</a><br />
<a href="#cookie">Salvando a senha em cookie de forma segura</a><br />
<a href="#conclusao">Conclusão</a></p>
<h3><a name="encode">Codificando senhas para salvá-las no banco de dados</a></h3>
<p>Nos exemplos aqui mostrados usarei a linguagem PHP, mas os conceitos podem ser usados com qualquer linguagem de programação.</p>
<p>Por incrível que possa parecer, há muitas pessoas que salvam senhas puras no banco de dados, sem qualquer tipo de criptografia! Isso é um crime! Se alguém tiver acesso ao banco de dados, todos os usuários do sistemas estarão em risco. As senhas devem ser salvas criptografadas ou, como no nosso caso, em <em><b>hashes</b></em>.</p>
<p>Normalmente usa-se o <a href="http://pt.wikipedia.org/wiki/MD5" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/MD5?referer=');">MD5</a>, que gera uma saída de 32 caracteres. Porém, toda segurança é pouca. Temos o <a href="http://pt.wikipedia.org/wiki/Sha1" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Sha1?referer=');">SHA-1</a>, que gera uma saída de 40 caracteres. A fim de evitar <a href="http://pt.wikipedia.org/wiki/Tabela_de_dispers%C3%A3o#Colis.C3.B5es" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Tabela_de_dispers_C3_A3o_Colis.C3.B5es?referer=');">colisões</a>, devemos dar preferência ao SHA-1, uma vez que ele gera mais possibilidades de saídas.</p>
<p>Mas também podemos unir as duas! Uma possibilidade é esta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> hashPasswd<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A função codifica com MD5 e depois codifica o resultado do MD5 com SHA-1. É uma segurança a mais, já que uma dicionário de senhas codificadas em SHA-1 provavelmente não contém <b>hashes</b> MD5 de senhas para serem testados.</p>
<p>Para ficar ainda mais seguro, você pode usar uma &#8220;<b>chave</b>&#8221; &#8211; não exatamente com o significado de uma chave de criptografia. Na verdade é uma string que concatenamos com a senha, a fim de gerar uma senha mais complexa:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'HASH_KEY'</span><span style="color: #339933;">,</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'chave secreta'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> hashPasswdWithKey<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$passwd</span> <span style="color: #339933;">.</span> HASH_KEY <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>HASH_KEY é uma constante com o <em>hash</em> MD5 de uma string. Prefira usar uma string relativamente complexa, com números e caracteres maiúsculos e minúsculos no lugar de &#8220;chave secreta&#8221;.</p>
<p>O <em>hash</em> retornado é o valor que deve ser salvo no banco de dados.</p>
<p>Quando o usuário efetuar login, com nome de usuário e senha, basta pegarmos a senha informada, codificá-la com a nossa função e compará-la com o valor salvo no banco de dados.</p>
<h3><a name="salt">Usando Salt Number</a></h3>
<p>O uso de <a href="http://en.wikipedia.org/wiki/Salt_(cryptography)" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Salt_cryptography?referer=');">Salt Number</a> dificulta a realização de ataques por brute force, uma vez que aumenta exponencialmente as possibilidades de hash para uma mesma palavra.</p>
<p>Os links abaixo explicam detalhadamente como funcionam os salt numbers:<br />
<a href="http://www.vivaolinux.com.br/artigo/Armazenamento-de-senhas-no-Linux/?pagina=7" onclick="urchinTracker('/outgoing/www.vivaolinux.com.br/artigo/Armazenamento-de-senhas-no-Linux/?pagina=7&amp;referer=');">http://www.vivaolinux.com.br/artigo/Armazenamento-de-senhas-no-Linux/?pagina=7</a><br />
<a href="http://gravatai.ulbra.tche.br/~elgio/senhas.html" onclick="urchinTracker('/outgoing/gravatai.ulbra.tche.br/_elgio/senhas.html?referer=');">http://gravatai.ulbra.tche.br/~elgio/senhas.html</a></p>
<p>O Salt Numbeer é semelhante à HASH_KEY, que criamos anteriormente. Porém, em vez de usarmos uma constante, criamos um código aleatório para cada usuário. Esse valor fica salvo no banco de dados e é concatenado à senha do usuário, da mesma forma que fizemos com a constante HASH_KEY.</p>
<p>Uma possível forma de gerar códigos aleatórios para o Salt Number em PHP é esta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Número de caracteres do Salt Number</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'SALT_SIZE'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">15</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Array com os 62 caracteres (a-z, A-Z, 0-9)</span>
<span style="color: #000088;">$amostra</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'a'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'z'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'A'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Z'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">range</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">9</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Embaralha o array</span>
<span style="color: #990000;">shuffle</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$amostra</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$index</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_rand</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$amostra</span><span style="color: #339933;">,</span> SALT_SIZE <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$salt</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> SALT_SIZE<span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$salt</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$amostra</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Assim, $salt contém o salt number gerado, para que seja usado na autenticação de um novo usuário recém-cadastrado.</p>
<h3><a name="cookie">Salvando a senha em cookie de forma segura</a></h3>
<p>A fim de permitirmos o <strong>login automático</strong>, muito comum em fóruns e lojas virtuais, precisamos usar <a href="http://pt.wikipedia.org/wiki/Cookie" onclick="urchinTracker('/outgoing/pt.wikipedia.org/wiki/Cookie?referer=');"><b>cookies</b></a>. Neles devem estar salvos os dados do usuário para autenticação no sistema.</p>
<p>Porém, não podemos colocar a senha do usuário no cookie. Mesmo que seja o hash da senha, pois fornecer acesso à hash salva no banco de dados é uma falha de segurança, já que ter um hash em mãos torna muito mais fácil um ataque por <em>brute force</em>. Por isso, vamos criar outro hash, baseado no hash da senha e no horário em que o usuário fez o último login.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'HASH_KEY'</span><span style="color: #339933;">,</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'chave secreta'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'HASH_PATTERN'</span><span style="color: #339933;">,</span> HASH_KEY <span style="color: #339933;">.</span> <span style="color: #0000ff;">'%d'</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'%s'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> hashForCookie<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$strHash</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span> HASH_PATTERN<span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$strHash</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Novamente temos a HASH_KEY, utilizada anteriormente. Criamos outra constante, a HASH_PATTERN, que é o padrão que será usado no hash. Aqui uso a chave (HASH_KEY), à qual são concatenados um &#8220;%d&#8221; e um &#8220;%s&#8221;, que serão substituídos pelo <em>timestamp</em> corrente e pelo hash da senha, respectivamente, usando sprintf(). A função retorna o SHA-1 da string final. </p>
<p>Essa função deve ser usada quando o usuário efetuar login. Assim que ele logar, salve no banco de dados (num campo diferente do da senha, claro) o hash gerado por <strong>hashForCookie</strong>. Esse é o dado que deverá ser salvo no cookie, além do nome do usuário, evitando salvar o hash da senha na máquina no usuário.</p>
<p>Para autenticar, verifique se o hash lido do cookie é o mesmo do salvo no banco de dados. Se for, autenticado, senão remova o cookie e solicite nome de usuário e senha. Assim que fizer login, gere o novo hash para o cookie, salvando-o no cookie, como citado anteriormente.</p>
<p>Uma forma simples de salvar esses dados num cookie usando PHP:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Beraldo'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hash</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'2f9a922f0401476cd7089c235d76de5bb61150b9'</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$dados</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'user'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'passwd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$hash</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">setcookie</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'nome_do_cookie'</span><span style="color: #339933;">,</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$dados</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">86400</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A função <a href="http://php.net/manual/en/function.serialize.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.serialize.php?referer=');">serialize</a> serializa um objeto, retornando uma representação em string do mesmo. O caminho oposto pode ser feito com <a href="http://php.net/manual/en/function.unserialize.php" onclick="urchinTracker('/outgoing/php.net/manual/en/function.unserialize.php?referer=');">unserialize</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cookie</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome_do_cookie'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dados</span> <span style="color: #339933;">=</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$cookie</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Assim, $dados é o array que definimos no código anterior.</p>
<h3><a name="conclusao">Conclusão</a></h3>
<p>Essas não são soluções finais para os dois casos apresentados. São apenas sugestões. É possível criar suas próprias funções, próprias criptografias etc.</p>
<p>O importante é procurar formas seguras de desenvolver sistemas.</p>
<p>Abraços,</p>
<p>Beraldo</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/seguranca-em-sistemas-de-login-senhas-e-cookies/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Problemas com codificação: acentos não interpretados</title>
		<link>http://www.rberaldo.com.br/blog/problemas-com-codificacao-acentos-nao-interpretados/</link>
		<comments>http://www.rberaldo.com.br/blog/problemas-com-codificacao-acentos-nao-interpretados/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:07:38 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[acentos]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[codificação]]></category>
		<category><![CDATA[collation]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=120</guid>
		<description><![CDATA[Um dúvida muito recorrente em fóruns concerne a erros com acentuação, quando palavras como "atenção" são exibidas como "aten??o". A solução é simples: padronizar as codificações de arquivos, do banco de dados e do HTML.]]></description>
			<content:encoded><![CDATA[<p>Um dúvida muito recorrente em fóruns concerne a erros com acentuação, quando palavras como &#8220;atenção&#8221; são exibidas como &#8220;aten??o&#8221;. A solução é simples: padronizar as codificações de arquivos, do banco de dados e do HTML.</p>
<p><span id="more-120"></span><br />
A melhor codificação a ser usada é a <a title="UTF-8" href="http://en.wikipedia.org/wiki/Utf-8" target="_blank" onclick="urchinTracker('/outgoing/en.wikipedia.org/wiki/Utf-8?referer=');">UTF-8</a>, que suporta diversos idiomas, e tem sido adotada como codificação padrão em diversas aplicações.</p>
<p>E importante manter todas as codificações iguais, ou seja, todas em UTF-8. Para um site, é preciso atentar para as seguintes codificações:</p>
<h3>Codificação do arquivo propriamente dito</h3>
<p>É a codificação do arquivo dentro do sistema operacional. Ela pode ser modificada por meio do seu editor de textos. Por exemplo:</p>
<p><em>Exemplo de alteração de codificação no editor Gedit</em><br />
<a href='http://img194.imageshack.us/i/encodegedit.png/' title="Clique para ampliar" onclick="urchinTracker('/outgoing/img194.imageshack.us/i/encodegedit.png/?referer=');"><img src='http://img194.imageshack.us/img194/3156/encodegedit.png' border='0' alt='Clique para ampliar'/></a><br />
</p>
<p><em>Exemplo de alteração de codificação no editor Eclipse</em><br />
<a href='http://img4.imageshack.us/i/encodeeclipse.png/' title="Clique para ampliar" onclick="urchinTracker('/outgoing/img4.imageshack.us/i/encodeeclipse.png/?referer=');"><img src='http://img4.imageshack.us/img4/9705/encodeeclipse.png' border='0' alt='Clique para ampliar'/></a></p>
<h3>Codificação do HTML</h3>
<p>A codificação do HTML é definida por meio de meta tag ou da função <a title="header()" href="http://www.php.net/manual/pt_BR/function.header.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/pt_BR/function.header.php?referer=');">header()</a>, do PHP.</p>
<p>Definição por meio de meta tag:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;</pre></div></div>

<p>Definição por meio da função header(), do PHP:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Content-Type: text/html; charset=utf-8'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>Codificação do banco de dados e das tabelas</h3>
<p>Se a sua aplicação usa um banco de dados, ele precisa, também, estar na codificação usada &#8211; UTF-8 no nosso caso. Ela é definida quando se criam o banco de dados e as tabelas. Por exemplo, com MySQL, podemos definir as codificação assim:</p>
<p>Codificação do banco de dados:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> bancodedados <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;</pre></div></div>

<p>Codificação das tabelas:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> tabela<span style="color: #66cc66;">&#40;</span>
	id <span style="color: #993333; font-weight: bold;">SMALLINT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> auto_incre3ment<span style="color: #66cc66;">,</span>
	nome <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	sobrenome <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;</pre></div></div>

<p>Assim, todos os campos do tipo string estarão na codificação utf8.</p>
<h3>Problemas persistentes</h3>
<p>Se você usava codificações diferentes, e, depois, modificou apenas a codificação do banco de dados, as acentuações, provavelmente, continuarão erradas. Não basta apenas mudar a codificação, nesse caso; será necessário passar os dados para outra tabela, que esteja, inicialmente, na codificação correta. É possível fazer essa transferência de dados por meio de apenas uma consulta. Para MySQWL, por exemplo, é possível usar um <a title="INSERT INTO...SELECT" href="http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-select-into-table.html" target="_blank" onclick="urchinTracker('/outgoing/dev.mysql.com/doc/refman/5.0/en/ansi-diff-select-into-table.html?referer=');">INSERT INTO&#8230; SELECT</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/problemas-com-codificacao-acentos-nao-interpretados/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Categorias e subcategorias: Exemplo de modelagem</title>
		<link>http://www.rberaldo.com.br/blog/categorias-e-subcategorias-exemplo-de-modelagem/</link>
		<comments>http://www.rberaldo.com.br/blog/categorias-e-subcategorias-exemplo-de-modelagem/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 20:47:01 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[categorias]]></category>
		<category><![CDATA[dados]]></category>
		<category><![CDATA[estrutura]]></category>
		<category><![CDATA[Modelagem]]></category>
		<category><![CDATA[subcategorias]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/?p=113</guid>
		<description><![CDATA[Um erro muito comum em modelagem de dados concerne a sistemas de categorias e subcategorias. Muitos não sabem como modelar o banco de dados, criam diversas tabelas e acabam complicando o que é simples. Mostrarei um forma muito simples de como armazenar essas informações num banco de dados e como exibi-las na tela, na forma de lista, técnica muito utilizada para construção de menus.]]></description>
			<content:encoded><![CDATA[<p>Um erro muito comum em modelagem de dados concerne a sistemas de categorias e subcategorias. Muitos não sabem como modelar o banco de dados, criam diversas tabelas e acabam complicando o que é simples.</p>
<p>Mostrarei um forma muito simples de como armazenar essas informações num banco de dados e como exibi-las na tela, na forma de lista, técnica muito utilizada para construção de menus.</p>
<p><span id="more-113"></span><br />
Vamos à modelagem, primeiramente.</p>
<p>Teremos apenas uma tabela. Esta é a estrutura dela:</p>
<p>(usarei MySQL neste artigo, mas a lógica da modelagem independe do SGBD usado)</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> categorias<span style="color: #66cc66;">&#40;</span>
	id <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
	id_pai <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	nome <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;</pre></div></div>

<p>Vamos popular a tabela da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> categorias<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span> id_pai<span style="color: #66cc66;">,</span> nome<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'A Empresa'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Sobre Nós'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Objetivos'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Objetivo dos nossos clientes'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Contato'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Produtos'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Obteremos a seguinte tabela:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mysql<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000000; font-weight: bold;">*</span> from categorias;
+----+--------+----------------------+
<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">id</span> <span style="color: #000000; font-weight: bold;">|</span> id_pai <span style="color: #000000; font-weight: bold;">|</span> nome                 <span style="color: #000000; font-weight: bold;">|</span>
+----+--------+----------------------+
<span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span>      <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">|</span> A Empresa            <span style="color: #000000; font-weight: bold;">|</span> 
<span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">2</span> <span style="color: #000000; font-weight: bold;">|</span>      <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> Sobre Nós           <span style="color: #000000; font-weight: bold;">|</span> 
<span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">3</span> <span style="color: #000000; font-weight: bold;">|</span>      <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> Objetivos            <span style="color: #000000; font-weight: bold;">|</span> 
<span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">4</span> <span style="color: #000000; font-weight: bold;">|</span>      <span style="color: #000000;">3</span> <span style="color: #000000; font-weight: bold;">|</span> Objetivo dos nossos  <span style="color: #000000; font-weight: bold;">|</span> 
<span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">5</span> <span style="color: #000000; font-weight: bold;">|</span>      <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">|</span> Contato              <span style="color: #000000; font-weight: bold;">|</span> 
<span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #000000;">6</span> <span style="color: #000000; font-weight: bold;">|</span>      <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">|</span> Produtos             <span style="color: #000000; font-weight: bold;">|</span> 
+----+--------+----------------------+
<span style="color: #000000;">6</span> rows <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">set</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">0</span>,00 sec<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Nessa estrutura, temos três seções principais: “A Empresa”, “Contato” e “Produtos”. As categorias “Sobre Nós” e “Objetivos” são subcategorias de “A Empresa”. E “Objetivos dos nossos clientes” é subcategoria de “Objetivos”, que, por sua vez, é subcategoria de “A Empresa”, como citado anteriormente.</p>
<p>Vamos fazer uma seleção dessas informações e colocá-las num arrray, como o exibido abaixo.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// array que conterá as categorias</span>
<span style="color: #000088;">$cats</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$mysqli</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'senha'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bancoDeDados'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'SELECT id, id_pai, nome FROM categorias'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$exec</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sql</span> <span style="color: #009900;">&#41;</span> or <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$f</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$exec</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch_object</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$f</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$f</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id_pai</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$f</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nome</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$i</span><span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Obteremos um array como o exibido abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'A Empresa'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Sobre Nós'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Objetivo'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Objetivos dos Nossos Clientes'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Contato'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cats</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Produtos'</span><span style="color: #339933;">;</span></pre></div></div>

<p>Note que o array não começou em zero. Os índices do array são os ID’s das categorias no banco de dados. Se começasse em zero, causaria conflito com o id_pai, que é zero para categorias principais.</p>
<p>Agora postarei uma função simples em PHP que montará o menu completo.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Função que monta o menu com as categorias e subcategorias.
 * @param id_pai ID da categoria pai cujas subcategorias serão buscadas.
 * @param ArrayCats Array com as categorias do menu.
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> montaMenu<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id_pai</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arrayCats</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// calcula o número de índices do array</span>
	<span style="color: #000088;">$catsSize</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$arrayCats</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;ul&gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$catsSize</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$arrayCats</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id_pai'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$id_pai</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;li&gt;&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$arrayCats</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// busca as subcategorias da categoria atual</span>
			montaMenu<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$arrayCats</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arrayCats</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;/li&gt;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;/ul&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Você pode usar duas variáveis globais, se quiser: o array das categorias e a variável $catsSize. Isso reduz o processamento, uma vez que a função count() seria chamada apenas uma vez. Porém, para projetos grandes, com diversos menus, essa prática não seria bem-vinda.</p>
<p>Para exibir o menu, basta chamar a função da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">montaMenu<span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cats</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ela começará buscando as categorias principais (id_pai = 0) e depois buscará por cada subcategoria.</p>
<p>Espero que o post tenha clareado a ideia de todos. Qualquer dúvida, basta deixar um comentário.</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/categorias-e-subcategorias-exemplo-de-modelagem/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Usando Campos Multivalorados</title>
		<link>http://www.rberaldo.com.br/blog/usando-campos-multivalorados/</link>
		<comments>http://www.rberaldo.com.br/blog/usando-campos-multivalorados/#comments</comments>
		<pubDate>Sat, 16 May 2009 02:12:00 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Modelagem]]></category>
		<category><![CDATA[Multivalorados]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/2009/05/15/usando-campos-multivalorados/</guid>
		<description><![CDATA[Um erro muito comum de modelagem de banco de dados ocorre ao se usar campos multivalorados, ou seja, campos que devem armazenar mais de um valor. Neste artigo é exibida uma solução simples e eficiente para esse problema.]]></description>
			<content:encoded><![CDATA[<p>Um erro muito comum de modelagem de banco de dados ocorre ao se usar campos multivalorados.</p>
<p>Para exemplificar, vamos usar um sistema de cadastro onde as pessoas informam as linguagens de programação que conhecem.</p>
<p>Muitas pessoas criariam uma tabela no banco de dados com esta estrutura:</p>
<p><span id="more-18"></span><br />
<strong>Tabela <em>pessoas</em></strong></p>
<pre>
ID	Nome	Linguagens
1	Gisele	PHP,Java,Shell Script,Ruby
2	Maria	C,C++,Shell Script,Lua
3	Ana		PHP,Ruby,Lua
</pre>
<p>Essa estrutura não é aconselhável. Imagine se precisar buscar pelas pessoas que conhecem PHP. Você terá de fazer uma consulta assim (para MySQL):</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> pessoa <span style="color: #993333; font-weight: bold;">FROM</span> pessoas <span style="color: #993333; font-weight: bold;">WHERE</span> linguagens <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'%PHP%'</span>;</pre></div></div>

<p>Aparentemente não é complicado, mas, para o processador, é pior fazer um Like que fazer uma comparação de igualdade.</p>
<p>Situação pior é a ação de editar o campo das linguagens. É necessário editar a string.</p>
<p>A solução é simples: criar relacionamento entre tabelas.</p>
<p>Criaremos trÊs tabelas: uma conterá os nomes das pessoas; outra, os nomes das linguagens; e, finalmente, a tabela que relaicionará as duas anteriores, associando a cada pessoa uma ou mais linguagens.</p>
<p>Tabela <em>pessoas</em></p>
<pre>
ID Nome
1  Ana
2  Gisele
3  Maria
</pre>
<p>Tabela <em>linguagens</em></p>
<pre>
ID Nome
1  PHP
2  C
3  Java
4  Ruby
</pre>
<p>Tabela <em>pessoas_linguagens</em></p>
<pre>
ID_PESSOA ID_LINGUAGEM
1         1
1         2
2         2
2         3
3         1
3         2
3         3
</pre>
<p>Esta última tabela é a responsável por relacionar cada pessoa às linguagens que conhece. Note que o ID da pessoa pode aparecer em quantos registros forem necessários, ou seja, nessa tabela não há chave primária.</p>
<p>Segundo a tabela, a pessoa 1 (Ana) conhece as linguagens 1 e 2 (PHP e C). A pessoa 2 (Gisele) conhece as linguagens 2 e 3 (C e Java). A pessoa 3 (Maria) conhece as linguagens 1, 2 e 3 (PHP, C e Java).</p>
<p>Com uma estrutura assim, é bem mais fácil editar valores, removê-los ou buscar pessoas que detêm determinado conhecimento.</p>
<p>Darei um exemplo, para MySQL, de como fazer um SELECT para mostrar as linguagens que cada pessoa conhece.</p>
<p>Usaremos esta estrutura de tabelas:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">### Tabela com os nomes das pessoas
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> pessoas<span style="color: #66cc66;">&#40;</span>
 id <span style="color: #993333; font-weight: bold;">SMALLINT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
 nome <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
 <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">TYPE</span> InnoDB <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;
&nbsp;
&nbsp;
### Tabela com <span style="color: #993333; font-weight: bold;">AS</span> linguagens
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> linguagens<span style="color: #66cc66;">&#40;</span>
 id <span style="color: #993333; font-weight: bold;">SMALLINT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
 nome <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
 <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">TYPE</span> InnoDB <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;
&nbsp;
&nbsp;
### Tabela para relacionar <span style="color: #993333; font-weight: bold;">AS</span> duas anteriores
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> pessoas_linguagens<span style="color: #66cc66;">&#40;</span>
 id_pessoa <span style="color: #993333; font-weight: bold;">SMALLINT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
 id_linguagem <span style="color: #993333; font-weight: bold;">SMALLINT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">TYPE</span> InnoDB <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;
&nbsp;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> pessoas <span style="color: #993333; font-weight: bold;">VALUES</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'João'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Maria'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'José'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Gisele'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Ana'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> linguagens <span style="color: #993333; font-weight: bold;">VALUES</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'PHP'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Java'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Lua'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'C'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'C++'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Shell Script'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Ruby'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> pessoas_linguagens <span style="color: #993333; font-weight: bold;">VALUES</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>A consulta SQL:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> p<span style="color: #66cc66;">.</span>nome <span style="color: #993333; font-weight: bold;">AS</span> pessoa <span style="color: #66cc66;">,</span> l<span style="color: #66cc66;">.</span>nome <span style="color: #993333; font-weight: bold;">AS</span> linguagem <span style="color: #993333; font-weight: bold;">FROM</span> pessoas <span style="color: #993333; font-weight: bold;">AS</span> p <span style="color: #993333; font-weight: bold;">JOIN</span> pessoas_linguagens <span style="color: #993333; font-weight: bold;">AS</span> pl <span style="color: #993333; font-weight: bold;">ON</span> pl<span style="color: #66cc66;">.</span>id_pessoa <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">JOIN</span> linguagens <span style="color: #993333; font-weight: bold;">AS</span> l <span style="color: #993333; font-weight: bold;">ON</span> l<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> pl<span style="color: #66cc66;">.</span>id_linguagem <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> p<span style="color: #66cc66;">.</span>nome <span style="color: #993333; font-weight: bold;">ASC</span>;</pre></div></div>

<p>Saída:<br />
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cmtOgeTqKJU/Sg4i2HOjl2I/AAAAAAAAAAM/vZOg20VhZMA/s1600-h/Captura_de_tela.png" onclick="urchinTracker('/outgoing/4.bp.blogspot.com/_cmtOgeTqKJU/Sg4i2HOjl2I/AAAAAAAAAAM/vZOg20VhZMA/s1600-h/Captura_de_tela.png?referer=');"><img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 179px; height: 281px;" src="http://4.bp.blogspot.com/_cmtOgeTqKJU/Sg4i2HOjl2I/AAAAAAAAAAM/vZOg20VhZMA/s320/Captura_de_tela.png" alt="" id="BLOGGER_PHOTO_ID_5336240921528997730" border="0" /></a></p>
<p>Da para melhorar essa estrutura, fazendo, por exemplo, integridade referencial (chave estrangeira). Mas não abordarei esse tema neste post.</p>
<p>Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/usando-campos-multivalorados/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Combo com as Cidades e Estados do Brasil Usando Ajax</title>
		<link>http://www.rberaldo.com.br/blog/combo-com-as-cidades-e-estados-do-brasil-usando-ajax/</link>
		<comments>http://www.rberaldo.com.br/blog/combo-com-as-cidades-e-estados-do-brasil-usando-ajax/#comments</comments>
		<pubDate>Thu, 07 May 2009 12:07:00 +0000</pubDate>
		<dc:creator>Beraldo</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[cidades]]></category>
		<category><![CDATA[cidades e estados]]></category>
		<category><![CDATA[estados]]></category>

		<guid isPermaLink="false">http://www.rberaldo.com.br/blog/2009/05/07/combo-com-as-cidades-e-estados-do-brasil-usando-ajax/</guid>
		<description><![CDATA[Combo (select, list, menu) com as cidades e estados do Brasil. Sistema feito usando Ajax.]]></description>
			<content:encoded><![CDATA[<p>Hoje postarei um script pronto.<br />Trata-se do famoso combo cidades/estados, usando Ajax, onde você seleciona o estado e aparecem suas respectivas cidades.</p>
<p><span id="more-14"></span>Muitos dos bancos de dados de cidades que encontrei na Internet não tinham acentuação. Porém, encontrei <a href="http://phpbrasil.com/scripts/script.php/id/2189" target="_blank" onclick="urchinTracker('/outgoing/phpbrasil.com/scripts/script.php/id/2189?referer=');">este script</a>, que satisfez a quase todas as minhas necessidades.</p>
<p>Fiz alguns ajustes no banco de dados, criei o arquivo de instalação e as funções PHP e JavaScript, para o funcionamento correto do sistema.</p>
<p>Desenvolvi para PHP 5, usando a extensão <strong>MySQLi</strong>.</p>
<p>Como o banco de dados é muito grande, não postarei o código.<br />O download pode ser feito aqui:<br /><a href="http://www.scriptbrasil.com.br/download/codigo/7194" target="_blank" onclick="urchinTracker('/outgoing/www.scriptbrasil.com.br/download/codigo/7194?referer=');">Link para download</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rberaldo.com.br/blog/combo-com-as-cidades-e-estados-do-brasil-usando-ajax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

