<?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>Roberson &#187; php</title>
	<atom:link href="http://www.roberson.com.br/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.roberson.com.br</link>
	<description>Blog sobre linguagens de programação e bancos de dados.</description>
	<lastBuildDate>Tue, 22 Nov 2011 16:27:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Validando dados inseridos no banco MySql &#8211; Parte 01</title>
		<link>http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01</link>
		<comments>http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01#comments</comments>
		<pubDate>Tue, 13 Apr 2010 20:44:16 +0000</pubDate>
		<dc:creator>Roberson Faria</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[estudos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tratamento de erros]]></category>
		<category><![CDATA[trigger]]></category>
		<category><![CDATA[valicações]]></category>

		<guid isPermaLink="false">http://www.roberson.com.br/?p=165</guid>
		<description><![CDATA[Neste post pretendo mostrar como fazer o tratamento dos dados inseridos e atualizados no banco de dados. A idéia inicial é que o próprio mysql verifique alguns tipos de dados antes de aceitar a inserção ou alteração dos dados.
Posts relacionados:<ol>
<li><a href='http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-%e2%80%93-parte-02' rel='bookmark' title='Validando dados inseridos no banco MySql – Parte 02'>Validando dados inseridos no banco MySql – Parte 02</a></li>
<li><a href='http://www.roberson.com.br/mysql/convertendo-campos-em-url-amigavel-pelo-mysql' rel='bookmark' title='Convertendo campos em url amigável pelo Mysql'>Convertendo campos em url amigável pelo Mysql</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Neste post pretendo mostrar como fazer o tratamento dos dados inseridos e atualizados no banco de dados. A idéia inicial é que o próprio mysql verifique alguns tipos de dados antes de aceitar a inserção ou alteração dos dados. Isso pode ser útil em empresas onde o DBA(Administrador de banco de dados) não é a mesma pessoa que vai programar o sistema, ou simplesmente quer garantir que todos os dados só entraram no banco se estiverem consistentes. Colocando as verificações diretamente no banco de dados, não dependemos do programa nos enviar dados já validados, não somos reféns do que vem da interface. Para o programador iremos retornar um erro &#8220;amigável&#8221; dizendo que o dado não foi inserido pois continha erro no campo X ou Y.</p>
<p>Para o exemplo estou disponibilizando para download <a title="Arquivos Exemplos MySql" href="http://www.roberson.com.br/wp-content/uploads/2010/04/exemplos-blog-roberson-mysql.zip" target="_self">aqui </a>o script para criação e população de um banco de dados teste (Schema testes_roberson), nos outros posts relacionados a banco de dados também irei utilizar essa base, conforme eu for modificando a base vou atualizando o script de criação e publicando uma notificação de atualização aqui mesmo no blog.</p>
<p>A validação que vou mostrar é bem simples, mas pode dar uma idéia de como criar validações mais completas (pretendo ir colocando aos poucos outras validações mais complexas). Neste exemplo vou mostrar como criar uma <em><strong>Trigger </strong></em>para validar <em>E-mail</em>.</p>
<p>Primeiro faça o <a title="Arquivos Exemplos MySql" href="http://www.roberson.com.br/wp-content/uploads/2010/04/exemplos-blog-roberson-mysql.zip" target="_self">download</a> do arquivo .zip onde você encontrará o arquivo testes_roberson.sql e o arquivo leiame.txt(algumas refências sobre o arquivo). Execute o arquivo sql em seu SGBD(Sistema Gerenciador de Banco de Dados), eu uso o MySQL Workbench Tools onde é possível administrar, interagir e modelar bases MySQL, mas pode utilizar qualquer SGBD de sua preferência.</p>
<p>Com o banco, tabelas e dados já criados agora vamos para a análise de possíveis validações que podemos fazer.</p>
<div id="attachment_168" class="wp-caption aligncenter" style="width: 439px"><a href="http://www.roberson.com.br/wp-content/umploads/2010/04/modelageTestesRoberson.png"><img class="size-full wp-image-168" title="Fig. 01 - Modelagem Data Base testes_roberson (schema)" src="http://www.roberson.com.br/wp-content/uploads/2010/04/modelagemTestesRoberson.png" alt="Fig. 01 - Modelagem Data Base testes_roberson (schema)" width="429" height="227" /></a><p class="wp-caption-text">Fig. 01 - Modelagem Data Base testes_roberson (schema)</p></div>
<p>Olhando as tabelas podemos concluir que:</p>
<ol>
<li>Trata-se de um banco simples (para estudos) de um cadastro de clientes.</li>
<li>Podemos criar uma rotina para validar CPF, E-mail e talvez ainda o CEP (validar se veio somente numeros e se são 8 caracteres)</li>
<li>Podemos criar tabelas de Cidades e Estados para evitar duplicidade de dados.</li>
</ol>
<p>Nosso objetivo neste post é criar uma<em> trigger</em> para validar e permitir somente e-mails válidos. Segue a baixo código para criação da<em> trigger</em>.</p>
<pre name="code" class="sql">-- Trigger DDL Statements
DELIMITER $$

-- Selecionamos o database desejado e criamos a trigger
-- Usando o BEFORE validamos o dado antes de inserir na tabela e AFTER depois de inserir na tabela
-- INSERT significa que a trigger será disparada quando ocorrer um INSERT na tabela, pode ser usado também o UPDATE e DELETE
USE `testes_roberson`$$CREATE DEFINER=`root`@`localhost` TRIGGER trgValidacaoEmail BEFORE INSERT ON clientes
  FOR EACH ROW BEGIN
    -- Verificamos se o NEW.Email (e-mail que está vindo no INSERT) é válido segundo a expressão regular usado com a função REGEXP
    IF (NOT EXISTS (SELECT NULL FROM Clientes WHERE  NEW.Email REGEXP '^[a-zA-Z0-9]{1}([\._a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){1,3}$')) THEN
        -- caso entre no IF disparamos um SELECT com nome de tabela inválido descrevendo o erro que será retornado.
        SELECT 0 FROM `Erro ao inserir dados! E-mail Inválido!` INTO @error;
    -- Fechamos o IF
    END IF;
  -- Fechamos a criação da trigger
  END$$</pre>
<p>Com isso a validação já deve estar funcionar. É possível prever uma pequena &#8220;gambiarra&#8221; (prefiro chamar de ajuste técnico) somente olhando esse script. Quando tentarmos inserir um e-mail inválido ele irá nos retornar o seguinte erro:</p>
<pre name="code" class="xml">Error Code: 1146
Table 'testes_roberson.Erro ao inserir dados! E-mail Inválido!' doesn't exist</pre>
<p>Este erro está nos dizendo que a tabela &#8216;Erro ao inserir dados! E-mail Inválido!&#8217; não existe nessa base de dados. Isso acontece devido ao fato de o nosso querido MySQL não ter nada expecífico para tratamento de erros ou de exceção (<em>Exception</em>). Isso realmente é muito triste, mas pelo menos estamos notificando ao usuário/programador que o dado não foi inserido e que o erro está no e-mail. Se tivermos a possibilidade de conversar com o programador ou programar uma rotina de tratamento de erros na própria linguagem que estiver sendo usada, esse mesmo erro pode ser exibido para o usuário. Para isso basta resgatar esse erro e passar ele por uma função que retire o inicio do erro &#8220;Error Code: 1146 &#8211; Table &#8216;testes_roberson.Erro ao inserir dados!&#8221; e o final do erro &#8220;&#8216; doesn&#8217;t exist&#8221;, com isso ficaremos somente com o erro que queremos <img src='http://www.roberson.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Reconheço que o erro retornado não é a melhor coisa do mundo, mas com algumas poucas linhas podemos deixar ele mais limpos, a baixo coloco um script PHP de como poderiamos tratar esse erro e mostrar para o cliente.</p>
<pre name="code" class="php">//trigger_email.php
// Função para tratamento dos erros
function tratarErrosMysql($numError, $error){
	//identificamos que o erro é no nome da tabela error 1146
	if($numError == '1146'){
		//executamos a decodificação de utf8 para que o erro não apresente problemas com os acentos.
		$error = utf8_decode($error);
		//retiramos o inicio e o fim do erro.
		$error = substr($error, 23 , -15);
		//retornamos o erro que veio do banco
		return $error;
	}else{
		//caso o erro não seja no nome da tabela(retorno de nossa trigger) retornamos o erro do mysql intacto
		return $error;
	}
}
// criamos a conexão com o banco de dados no nosso caso, MySql
$conn = mysqli_connect("localhost", "root", "","testes_roberson");  

//executamos nosso comando sql
$sql = "INSERT INTO Clientes SET Cpf = '05332754906', Nome='Teste', Sobrenome='Teste', Email='isso não é um email válido',sexo='M';"; // query (comando sql)
$result = mysqli_query($conn, $sql);
//verificamos se ouve algum erro
if(mysqli_error($conn)){
	// apresentamos o erro para o cliente;
	echo tratarErrosMysql(mysqli_errno($conn),mysqli_error($conn));
}</pre>
<p>Assim teremos o erro tratado, assim teremos uma base de dados bem mais consistente e livre de falhas de verificação na aplicação e erros dos usuários. E não esqueçam de criar uma <em>trigger </em>que valide o dado quando houver uma atualização <em>BEFORE UPDATE</em>.</p>
<p>Em próximos posts pretendo mostrar a validação de CPF usando <em>trigger </em>e <em>stored procedure</em>.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.roberson.com.br%2Fmysql%2Fvalidando-dados-inseridos-no-banco-mysql-parte-01&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script></div>
					<div style="float:left; width:50px; padding-left:10px;" class="really_simple_share_facebook_like_send">
					<fb:send href="http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01" font=""></fb:send>
					</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01" ></g:plusone>
				</div><div class="really_simple_share_email" style="width:px;">
					<a href="mailto:?subject=Validando dados inseridos no banco MySql &#8211; Parte 01&amp;body=Validando dados inseridos no banco MySql &#8211; Parte 01 - http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01"><img src="http://www.roberson.com.br/wp-content/plugins/really-simple-facebook-twitter-share-buttons/email.png" alt="Email" title="Email" /> </a> 
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Validando dados inseridos no banco MySql &#8211; Parte 01" data-url="http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p>Posts relacionados:<ol>
<li><a href='http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-%e2%80%93-parte-02' rel='bookmark' title='Validando dados inseridos no banco MySql – Parte 02'>Validando dados inseridos no banco MySql – Parte 02</a></li>
<li><a href='http://www.roberson.com.br/mysql/convertendo-campos-em-url-amigavel-pelo-mysql' rel='bookmark' title='Convertendo campos em url amigável pelo Mysql'>Convertendo campos em url amigável pelo Mysql</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Trabalhando com xml e mysql juntos.</title>
		<link>http://www.roberson.com.br/mysql/trabalhando-com-xml-e-mysql-juntos</link>
		<comments>http://www.roberson.com.br/mysql/trabalhando-com-xml-e-mysql-juntos#comments</comments>
		<pubDate>Thu, 10 Dec 2009 02:19:06 +0000</pubDate>
		<dc:creator>Roberson Faria</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.roberson.com.br/?p=78</guid>
		<description><![CDATA[Em muitos momentos no desenvolvimento de um sistema necessitamos trocar informações com outros sistemas (integração entre sistemas). Existem várias formas de conseguirmos essa troca de dados, sendo uma delas a troca de arquivos XML. Nesse post pretendo mostrar uma forma simples de transformar os dados do banco de dados (MySql) em arquivos xml. Vamos supor [...]
Posts relacionados:<ol>
<li><a href='http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01' rel='bookmark' title='Validando dados inseridos no banco MySql &#8211; Parte 01'>Validando dados inseridos no banco MySql &#8211; Parte 01</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Em muitos momentos no desenvolvimento de um sistema necessitamos trocar informações com outros sistemas (integração entre sistemas). Existem várias formas de conseguirmos essa troca de dados, sendo uma delas a troca de arquivos <a title="Wikipedia XML" href="&quot;http://pt.wikipedia.org/wiki/XML" target="_blank">XML</a>. Nesse post pretendo mostrar uma forma simples de transformar os dados do banco de dados (<a title="Site MySql" href="http://www.mysql.com/" target="_blank">MySql</a>) em arquivos xml.</p>
<p>Vamos supor uma estrutura de banco de dados assim:</p>
<pre name="code" class="sql">
--Criamos a base de dados (schema)
CREATE DATABASE IF NOT EXISTS mysql_xml;

--Selecionamos a base para usar
USE mysql_xml;

--Criamos a tabela, nesse exemplo para guardar dados de usuários
CREATE TABLE 'mysql_xml'.'usuarios' (
        'idUsuario' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
        'login' VARCHAR(45) NOT NULL,
        'senha' VARCHAR(45) NOT NULL,
        PRIMARY KEY ('idUsuario')
)ENGINE = InnoDB;

--Inserimos alguns dados na tabela
INSERT INTO usuarios VALUES ('', 'usuario1','senha1');
INSERT INTO usuarios VALUES ('', 'usuario2','senha2');
INSERT INTO usuarios VALUES ('', 'usuario3','senha3');
INSERT INTO usuarios VALUES ('', 'usuario4','senha4');
INSERT INTO usuarios VALUES ('', 'usuario5','senha5');
</pre>
<p>Com o banco/tabela populado podemos ir para o nosso script <a title="Site PHP" href="http://www.php.net/" target="_blank">PHP</a>.<br />
Abaixo vou demonstrar como o php pode pegar esses dados e utilizando a lib <a title="Manual SimpleXML" href="http://php.net/manual/en/book.simplexml.php" target="_blank">SimpleXML</a> do php, podemos transformar os dados em um arquivo xml.</p>
<pre name="code" class="php">
//mysql_xml.php
// criamos a conexao com o banco de dados no nosso caso, MySql
$conn = mysqli_connect("localhost", "root", "","mysql_xml");

//exacutamos nosso comando sql
$sql = "select * from usuarios"; // query (comando sql)
$result = mysqli_query($conn, $sql);

// criamos um objeto do tipo SimpleXMLElement
$xml = new SimpleXMLElement("&lt;resultset/&gt;");

// criamos um loop para recuperar todos os dados da tabela usuarios
// os dados sao retornados como um objeto
while ($dados = mysqli_fetch_object($result))
{
        // criamos um um novo node para abrigar as linhas
        $line = $xml-&gt;addChild("line");

        //No proximo loop adicionamos os nodes para cada um dos registros de cada linha
        foreach ( $dados as $colName =&gt; $value )
                $line-&gt;addChild($colName, $value);
}

// finalmente criamos o xml com todos os dados que estavam na tabela.
echo $xml-&gt;asXML();
</pre>
<p>Executando o arquivo acima temos o seguinte resultado.</p>
<pre name="code" class="xml">
<resultset>
<line>
		<idUsuario>1</idUsuario>
		<login>usuario1</login>
		<senha>senha1</senha>
	</line>
<line>
		<idUsuario>2</idUsuario>
		<login>usuario2</login>
		<senha>senha2</senha>
	</line>
<line>
		<idUsuario>3</idUsuario>
		<login>usuario3</login>
		<senha>senha3</senha>
	</line>
<line>
		<idUsuario>4</idUsuario>
		<login>usuario4</login>
		<senha>senha4</senha>
	</line>
<line>
		<idUsuario>5</idUsuario>
		<login>usuario5</login>
		<senha>senha5</senha>
	</line>
</resultset>
</pre>
<p>E é isso galera, simples assim, esses scripts foram baseados em um tutorial que li há algum tempo atrás, desde então venho utilizando essa maneira de gerar xml para exportação, integração, etc, em meus sistemas. Infelizmente não lembro e não encontrei a referência para o artigo que li, caso alguem ache ele, por favor me informe que atualizo aqui.</p>
<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;">
				<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.roberson.com.br%2Fmysql%2Ftrabalhando-com-xml-e-mysql-juntos&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe>
				</div>
					<div style="float:left; width:50px; padding-left:10px;" class="really_simple_share_facebook_like_send">
					<fb:send href="http://www.roberson.com.br/mysql/trabalhando-com-xml-e-mysql-juntos" font=""></fb:send>
					</div><div class="really_simple_share_google1" style="width:90px;">
					<g:plusone size="medium" href="http://www.roberson.com.br/mysql/trabalhando-com-xml-e-mysql-juntos" ></g:plusone>
				</div><div class="really_simple_share_email" style="width:px;">
					<a href="mailto:?subject=Trabalhando com xml e mysql juntos.&amp;body=Trabalhando com xml e mysql juntos. - http://www.roberson.com.br/mysql/trabalhando-com-xml-e-mysql-juntos"><img src="http://www.roberson.com.br/wp-content/plugins/really-simple-facebook-twitter-share-buttons/email.png" alt="Email" title="Email" /> </a> 
				</div><div class="really_simple_share_twitter" style="width:110px;">
					<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Trabalhando com xml e mysql juntos." data-url="http://www.roberson.com.br/mysql/trabalhando-com-xml-e-mysql-juntos" 
						data-via="" ></a> 
				</div></div>
		<div style="clear:both;"></div><p>Posts relacionados:<ol>
<li><a href='http://www.roberson.com.br/mysql/validando-dados-inseridos-no-banco-mysql-parte-01' rel='bookmark' title='Validando dados inseridos no banco MySql &#8211; Parte 01'>Validando dados inseridos no banco MySql &#8211; Parte 01</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.roberson.com.br/mysql/trabalhando-com-xml-e-mysql-juntos/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
  
