<?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>CrisDev - Cristian Medeiros &#187; PHP</title>
	<atom:link href="http://crisdev.eti.br/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://crisdev.eti.br</link>
	<description>Desenvolvedor Web</description>
	<lastBuildDate>Wed, 01 Sep 2010 02:12:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Frameworks e você. Por que é importante conhecer um framework?</title>
		<link>http://crisdev.eti.br/frameworks-e-voce-por-que-e-importante-conhecer-um-framework.html</link>
		<comments>http://crisdev.eti.br/frameworks-e-voce-por-que-e-importante-conhecer-um-framework.html#comments</comments>
		<pubDate>Wed, 01 Sep 2010 02:12:25 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=94</guid>
		<description><![CDATA[As pessoas que me conhecem sabem o que penso sobre frameworks, acho que são ferramentas boas, porém restritas que limitam o poder de criação do desenvolvedor. As vezes se tem uma idéia, uma solução, excelente, porém por uma limitação do framwork ou dos métodos disponíveis, a implementação não fica la grande coisa.
No entanto, aqueles que [...]]]></description>
			<content:encoded><![CDATA[<p>As pessoas que me conhecem sabem o que penso sobre frameworks, acho que são ferramentas boas, porém restritas que limitam o poder de criação do desenvolvedor. As vezes se tem uma idéia, uma solução, excelente, porém por uma limitação do framwork ou dos métodos disponíveis, a implementação não fica la grande coisa.</p>
<p>No entanto, aqueles que acompanham o PHP a algum tempo, sabe o que os frameworks fizeram pela linguagem. &#8220;Padrão&#8221; de código só para começar, além de difundir técnicas de desenvolvimento mais modernas, além dos design patterns mais comuns: MVC, singleton e factory.</p>
<p>E por que você deve conhecer um framework? Porque o mercado exige. Simples assim. Recentemente procurei um desenvolvedor para um projeto freelancer, recebi inumeros curriculos, todos eles apontando um ou mais frameworks de PHP, com varíos níveis diferentes de domínio. O interessante disso foi ouvir comentários como: &#8220;Eu uso o Cake, porque é mais rápido, não precisa ficar criando varias classezinhas, ele já faz tudo&#8221; ou &#8220;Eu faço com Zend, pois já estou acostumado&#8221;. Todos os selecionados, sem exceção, não cogitaram a possibilidade de desenvolver o projeto sem um framework.</p>
<p>Claro que isso não exime você de conhecer profundamente a linguagem, e sua arquitetura, porém, o que o mercado tem aceito como um bom programador PHP é aquele que usa e domina um framework comercial.</p>
<p>Só para constar, eu prefiro minhas &#8220;classezinhas&#8221;.</p>
<p>E você o que acha desse tema?</p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/frameworks-e-voce-por-que-e-importante-conhecer-um-framework.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDO e MySQL com UTF-8</title>
		<link>http://crisdev.eti.br/pdo-e-mysql-com-utf-8.html</link>
		<comments>http://crisdev.eti.br/pdo-e-mysql-com-utf-8.html#comments</comments>
		<pubDate>Thu, 13 Nov 2008 11:49:31 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[pdo]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=47</guid>
		<description><![CDATA[Se voc&#234; esta usando PDO, esta tendo dificuldades com UTF-8 no seu MySQL, mesmo com tudo setado para UTF-8, voc&#234; pode tentar isso:
$pdo = new PDO(
&#160;&#160;&#160; &#8216;mysql:host=localhost;dbname=nomedobanco&#8217;,
&#160;&#160;&#160; &#34;user&#34;,
&#160;&#160;&#160; &#34;pass&#34;,
&#160;&#160;&#160; array(PDO::MYSQL_ATTR_INIT_COMMAND =&#62; &#34;SET NAMES utf8&#34;));
&#160;
O &#250;ltimo parametro do construtor do PDO &#233; um array com as op&#231;&#245;es espec&#237;ficas do driver, no caso, do driver od MySQL. [...]]]></description>
			<content:encoded><![CDATA[<p>Se voc&ecirc; esta usando PDO, esta tendo dificuldades com UTF-8 no seu MySQL, mesmo com tudo setado para UTF-8, voc&ecirc; pode tentar isso:</p>
<p>$pdo = new PDO(<br />
&nbsp;&nbsp;&nbsp; &#8216;mysql:host=localhost;dbname=nomedobanco&#8217;,<br />
&nbsp;&nbsp;&nbsp; &quot;user&quot;,<br />
&nbsp;&nbsp;&nbsp; &quot;pass&quot;,<br />
&nbsp;&nbsp;&nbsp; array(PDO::MYSQL_ATTR_INIT_COMMAND =&gt; &quot;SET NAMES utf8&quot;));</p>
<p>&nbsp;</p>
<p>O &uacute;ltimo parametro do construtor do PDO &eacute; um array com as op&ccedil;&otilde;es espec&iacute;ficas do driver, no caso, do driver od MySQL. Este parametro &eacute; alimentado no velho estilo &quot;array&quot; chave=&gt;valor. </p>
<p>Observem que o parametro (PDO::MYSQL_ATTR_INIT_COMMAND) n&atilde;o se trata de uma configura&ccedil;&atilde;o de charset, mas sim de um comando que &eacute; executado todas as vezes que voc&ecirc; conecta no banco. Neste caso, todas as vezes que ele se conecta no banco, ele executa a query &quot;SET NAMES utf8&quot; (acho que &eacute; espec&iacute;fica do MySQL) que diz para o MySQL utilizar UTF-8 como charset para nossa conex&atilde;o.</p>
<p>Para saber mais:</p>
<ul>
<li><a href="http://crisdev.eti.br/pdo-e-bean-no-php.html">PDO e BEAN no PHP</a></li>
<li><a target="_blank" href="http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html" onclick="urchinTracker('/outgoing/dev.mysql.com/doc/refman/5.0/en/charset-connection.html?referer=');">MySQL &ldquo;Connection Character Sets and Collation&rdquo; documentation</a></li>
<li><a target="_blank" href="http://www.php.net/manual/en/pdo.construct.php" onclick="urchinTracker('/outgoing/www.php.net/manual/en/pdo.construct.php?referer=');">PDO constructor documentation</a></li>
<li><a target="_blank" href="http://www.php.net/manual/en/ref.pdo-mysql.php" onclick="urchinTracker('/outgoing/www.php.net/manual/en/ref.pdo-mysql.php?referer=');">PDO MySQL driver documentation</a></li>
</ul>
<p>
Fonte:<br />
<a target="_blank" href="http://www.laszlo.nu/post/34159352/how-to-use-utf-8-with-mysql-and-php-data-objects-pdo" onclick="urchinTracker('/outgoing/www.laszlo.nu/post/34159352/how-to-use-utf-8-with-mysql-and-php-data-objects-pdo?referer=');">http://www.laszlo.nu/post/34159352/how-to-use-utf-8-with-mysql-and-php-data-objects-pdo</a></p>
<p>Tags BlogBlogs: <a href="http://blogblogs.com.br/tag/php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php?referer=');">php</a>, <a href="http://blogblogs.com.br/tag/pdo" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/pdo?referer=');">pdo</a>, <a href="http://blogblogs.com.br/tag/mysql" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/mysql?referer=');">mysql</a>, <a href="http://blogblogs.com.br/tag/utf8" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/utf8?referer=');">utf8</a>, <a href="http://blogblogs.com.br/tag/unicode" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/unicode?referer=');">unicode</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/pdo-e-mysql-com-utf-8.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP &#8211; Criando e tratando exceptions</title>
		<link>http://crisdev.eti.br/php-criando-e-tratando-exceptions.html</link>
		<comments>http://crisdev.eti.br/php-criando-e-tratando-exceptions.html#comments</comments>
		<pubDate>Fri, 07 Nov 2008 17:36:24 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=42</guid>
		<description><![CDATA[&#160;
N&#227;o &#233; novidade, mas vale o registro. O PHP 5, possui uma funcionalidade bem interessante, similar a outras linguagens orientadas a objeto, Exce&#231;&#227;o. Quando algo altera o fluxo de execu&#231;&#227;o do sistema ele dispara uma Exce&#231;&#227;o. Uma exce&#231;&#227;o pode ser disparada ou capturada, depende do que voc&#234; pretende. Voc&#234; pode customizar um s&#233;rie de tratamentos [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>N&atilde;o &eacute; novidade, mas vale o registro. O PHP 5, possui uma funcionalidade bem interessante, similar a outras linguagens orientadas a objeto, Exce&ccedil;&atilde;o. Quando algo altera o fluxo de execu&ccedil;&atilde;o do sistema ele dispara uma Exce&ccedil;&atilde;o. Uma exce&ccedil;&atilde;o pode ser disparada ou capturada, depende do que voc&ecirc; pretende. Voc&ecirc; pode customizar um s&eacute;rie de tratamentos de erros que ir&atilde;o facilitar o desenvolvimento do seu sistema, com essa custimiza&ccedil;&atilde;o voc&ecirc; pode saber exatamente o que est&aacute; sendo tratado e se algo fugir desse controle &eacute; algo anormal e fica mais facil a rastreabilidade.</p>
<p>Dentro de uma exce&ccedil;&atilde;o, voc&ecirc; pode disparar um log, ou um alert, ou registrar algo no banco, &eacute; um fluxo de erro sob controle.</p>
<p>Eu costumo tratar as exce&ccedil;&otilde;es para tudo, campo em branco, tipo de dado inv&aacute;lido, e-mail inv&aacute;lido, ou se alguma f&oacute;rmula n&atilde;o foi validada. Para isso uso um conjunto de classes que constituem as mensagens e os testes para que as exce&ccedil;&otilde;es sejam disparadas:</p>
<p>Uma classe Main para controlar as requisi&ccedil;&otilde;es de Exception:</p>
<h2>MainException.php:</h2>
<p>&lt;?PHP <br />
&nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp; * Declara&ccedil;&atilde;o da classe para tratamento de erros <br />
&nbsp;&nbsp;&nbsp; * A classe deve ser extendida da classe Exception do PHP<br />
&nbsp;&nbsp;&nbsp; * Ela ir&aacute; realizar a sobrescrita da classe Exception do PHP <br />
&nbsp;&nbsp;&nbsp; */ <br />
&nbsp;&nbsp;&nbsp; class MainException extends Exception { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Fa&ccedil;o a declara&ccedil;&atilde;o das vari&aacute;vis que vou utilizar no corpo da classe <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private&nbsp;&nbsp;&nbsp; $cod&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private&nbsp;&nbsp;&nbsp; $msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &quot;&quot;; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private&nbsp;&nbsp;&nbsp; $erromsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &quot;&quot;; </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * Aqui fa&ccedil;o a declara&ccedil;&atilde;o do m&eacute;todo construtor de classe <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * Esse m&eacute;todo recebe os seguintes parametros: <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * @param $cod &#8211; C&oacute;digo de erro <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * @param $msg &#8211; Uma mensagem de erro personalizada <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * @param $erromsg &#8211; Uma mensagem de erro padr&atilde;o<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */ </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public function __construct( $cod = 0 , $msg = &quot;&quot; , $erromsg = &quot;&quot; ) { <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Sobreescrevo as propiedades da classe passando os parametros <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;cod = $cod; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;msg = &quot;Ocorreu um erro n&atilde;o identificado&quot;; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;erromsg = $erromsg; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Aqui eu chamo o construtor da classe pai&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; parent::__construct( $this-&gt;msg , $this-&gt;cod );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * Este m&eacute;todo ir&aacute; salvar nossos erros em um log <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */ <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public function _Log() { </p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Define o arquivo que ser&aacute; criado ou gravado caso exista, o nome do arquivo ir&aacute; ser o nome da classe<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $log = __CLASS__ . &quot;_log_&quot; . date(&quot;dmY&quot;) . &quot;txt&quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Se n&atilde;o existe arquivo, cria <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if( !file_exists($log)){ <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $msg = &quot;/************************************************** &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * Arquivo de log &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * ClassName: &quot; . __CLASS__ . &quot; &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; * Data Cria&ccedil;&atilde;o: &quot; . date(&quot;d/m/Y H:i&quot;) . &quot; &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot; *************************************************/ &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $msg = &quot;&quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Abre o arquivo <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($fp = fopen( $txt , &quot;a+&quot;)) { <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Arquivo <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $msg .=&nbsp;&nbsp;&nbsp; __CLASS__ . &quot; hora: &quot;.date(&quot;H:i&quot;) . &quot; &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;Erro [ {$this-&gt;cod} ]: linha ( {$this-&gt;line} ) &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;{$this-&gt;msg} &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;{$this-&gt;erromsg} &quot; . <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &quot;; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Grava <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fwrite($fp, $msg); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fclose($fp); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; } <br />
?&gt;</p>
<p>A classe abaixo estende MainException e a customiza para Exce&ccedil;&otilde;es de texto:</p>
<h2>textException.php:</h2>
<p>&lt;?PHP <br />
/** <br />
&nbsp;* Esta classe &eacute; respons&aacute;vel por disparar exce&ccedil;&otilde;es relacionadas a texto <br />
&nbsp;*/ <br />
&nbsp;class textException extends MainException { <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public function __construct(&nbsp; ) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sobrescrita do construtor de MainException, com os valores que queremos <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent::__construct( 1, &quot;Tipo de caracter inv&aacute;lido&quot;, PHPSELF); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;_Log(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;} <br />
?&gt;</p>
<p>A classe abaixo faz a verifica&ccedil;&atilde;o do texto e dispara a exce&ccedil;&atilde;o:</p>
<h2>verificaTexto.php:</h2>
<p>&lt;?PHP <br />
&nbsp;<br />
class verificaTexto <br />
{ <br />
&nbsp;&nbsp;&nbsp; public function __construct($texto) <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!is_int($texto)) <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo $texto; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new textException(); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
} <br />
&nbsp;<br />
?&gt;</p>
<p>A classe abaixo faz o teste para n&uacute;meros e caso falhe, dispara MainException, ou seja sem customizar o tipo de exce&ccedil;&atilde;o que ser&aacute; disparada, ent&atilde;o ir&aacute; enviar a mensagem padr&atilde;o:</p>
<h2>verificaValor.php:</h2>
<p>&lt;?PHP <br />
&nbsp;<br />
class verificaValor <br />
{ <br />
&nbsp;&nbsp;&nbsp; public function __construct($val) <br />
&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if($val == 1) <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo $val; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new MainException(); <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;<br />
} <br />
&nbsp;<br />
?&gt;</p>
<p>Apenas para teste:</p>
<p>&lt;?PHP <br />
&nbsp;<br />
include (&quot;autoload.php&quot;); <br />
&nbsp;<br />
try <br />
{ <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; //$b = new verificaTexto(1); <br />
&nbsp;&nbsp;&nbsp; $b1 = new verificaValor(1123); <br />
&nbsp;<br />
} <br />
Catch(textException $te) <br />
{ <br />
&nbsp;&nbsp;&nbsp; echo $te-&gt;getMessage(); <br />
} <br />
catch(Exception $e) <br />
{ <br />
&nbsp;&nbsp;&nbsp; echo $e-&gt;getMessage(); <br />
} <br />
&nbsp;<br />
&nbsp;<br />
?&gt;</p>
<p>E o autoload se algu&eacute;m quiser:</p>
<p>&lt;?PHP <br />
&nbsp;<br />
function __autoload($class_name) { <br />
&nbsp;&nbsp;&nbsp; require_once $class_name . &#8216;.php&#8217;; <br />
} <br />
&nbsp;<br />
?&gt;</p>
<p>Como podem ver, a classe MainException &eacute; que faz todo o trabalho, nela temos o m&eacute;todo principal que realiza o disparo das exceptions, em textException, sobrespcrevemos a classe MainException e fazemos ela se comportar como queremos para disparar apenas uma mensagem de erro para textos.</p>
<p>Ainda existe a possibilidade de disparar uma Exception gen&eacute;rica, caso nosso tratamento n&atilde;o seja para textos. Se observarem com calma ver&atilde;o que se trata apenas de sobrescritas de m&eacute;todos algo que seria perfeitamente poss&iacute;vel sem Exception, por&eacute;m desta forma temos mais controle (fora a elegancia do c&oacute;digo).</p>
<p>Bom &eacute; isso, qualquer d&uacute;vida comentem.</p>
<p>Para saber mais:</p>
<ul>
<li>Exceptions no manual: <a href="http://www.php.net/manual/en/language.exceptions.php" target="_blank" onclick="urchinTracker('/outgoing/www.php.net/manual/en/language.exceptions.php?referer=');">http://www.php.net/manual/en/language.exceptions.php</a></li>
<li>Classe MainException original de Jos&eacute; Roberto Gomes da Silva: <a href="http://www.plugmasters.com.br/sys/materias/914/1/Exception-com-php" target="_blank" onclick="urchinTracker('/outgoing/www.plugmasters.com.br/sys/materias/914/1/Exception-com-php?referer=');">http://www.plugmasters.com.br/sys/materias/914/1/Exception-com-php</a></li>
</ul>
<p>Tags BlogBlogs: <a href="http://blogblogs.com.br/tag/php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php?referer=');">php</a>, <a href="http://blogblogs.com.br/tag/exception" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/exception?referer=');">exception</a>, <a href="http://blogblogs.com.br/tag/oo" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/oo?referer=');">oo</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/php-criando-e-tratando-exceptions.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Conference 2008</title>
		<link>http://crisdev.eti.br/php-conference-2008.html</link>
		<comments>http://crisdev.eti.br/php-conference-2008.html#comments</comments>
		<pubDate>Fri, 22 Aug 2008 13:33:55 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[geral]]></category>
		<category><![CDATA[conaphp]]></category>
		<category><![CDATA[php conference]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=32</guid>
		<description><![CDATA[O PHP Conference deste ano ir&#225; se chamar CONAPHP (Congresso Nacional de PHP) e ser&#225; abrigado pelo CONISLI.
Diferente do ano passado, o evento ser&#225; realizado em S&#227;o Paulo (ainda bem, porque Osasco &#233; longe demais) na faculdade FIAP que fica na Av. Lins de Vasconcelos, 1264, bairro Aclima&#231;&#227;o, nos dias 18 e 19 de outubro. [...]]]></description>
			<content:encoded><![CDATA[<p>O PHP Conference deste ano ir&aacute; se chamar CONAPHP (Congresso Nacional de PHP) e ser&aacute; abrigado pelo CONISLI.</p>
<p>Diferente do ano passado, o evento ser&aacute; realizado em S&atilde;o Paulo (ainda bem, porque Osasco &eacute; longe demais) na faculdade FIAP que fica na Av. Lins de Vasconcelos, 1264, bairro Aclima&ccedil;&atilde;o, nos dias 18 e 19 de outubro. Os valores v&atilde;o (iam) de R$ 30,00 &agrave; R$ 100,00 se voc&ecirc; deixar para o &uacute;ltimo dia.</p>
<p>Mais uma vez, como no ano passado, a programa&ccedil;&atilde;o das palestras ainda n&atilde;o foi divulgada (pelo menos n&atilde;o at&eacute; a data deste post), e quem esteve esperando para ver se valia a pena ir ao evento pelo conte&uacute;do, n&atilde;o poder&aacute; mais aproveitar o pre&ccedil;o de abertura, ou seja, os organizadores apostam que todos d&ecirc;em um tiro no escuro para se inscrever em um evento que n&atilde;o se sabe a program&ccedil;&atilde;o&#8230; well wathever&#8230;</p>
<p>As palestras internacionais j&aacute; est&atilde;o definidas, teremos Andrei Zmievski, que falar&aacute; sobre o Unicode do PHP6 (exatamente a mesma coisa que o Lucas Smith veio falar ano passado) e o meu bom amigo <a href="http://www.cesarodas.com/" target="_blank" onclick="urchinTracker('/outgoing/www.cesarodas.com/?referer=');">Cesar Rodas</a> que ir&aacute; falar sobre <a href="http://code.google.com/soc/2008/wordpress/appinfo.html?csaid=A6F49B7AFCE27E6E" target="_blank" onclick="urchinTracker('/outgoing/code.google.com/soc/2008/wordpress/appinfo.html?csaid=A6F49B7AFCE27E6E&amp;referer=');">seu projeto&nbsp; no GSoC2008 para o worpress</a>.</p>
<p>N&atilde;o alimento grande expectativa para esse evento&#8230; mas vamos aguardar, talvez a organiza&ccedil;&atilde;o venha com alguma surpresa<br />
&nbsp;</p>
<p>Tags BlogBlogs: <a href="http://blogblogs.com.br/tag/php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php?referer=');">php</a>, <a href="http://blogblogs.com.br/tag/conaphp" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/conaphp?referer=');">conaphp</a>, <a href="http://blogblogs.com.br/tag/php+conference" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php+conference?referer=');">php conference</a>, <a href="http://blogblogs.com.br/tag/conisli" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/conisli?referer=');">conisli</a></p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/php-conference-2008.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Era uma vez&#8230;</title>
		<link>http://crisdev.eti.br/era-uma-vez.html</link>
		<comments>http://crisdev.eti.br/era-uma-vez.html#comments</comments>
		<pubDate>Fri, 08 Aug 2008 12:26:06 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=29</guid>
		<description><![CDATA[&#160;
Hoje, chega ao fim a vers&#227;o 4 do PHP, foram 4 longos anos desde o lan&#231;amento da vers&#227;o 5 e agora encerrada oficialmente.
Para aqueles que veem isso com um certo temor, n&#227;o se preocupem, o PHP5 n&#227;o &#233; um bicho de 7 cabe&#231;as e as melhorias implementadas nele n&#227;o ser&#227;o dificil de serem absorvidas pelos [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Hoje, chega ao fim a vers&atilde;o 4 do PHP, foram 4 longos anos desde o lan&ccedil;amento da vers&atilde;o 5 e agora encerrada oficialmente.</p>
<p>Para aqueles que veem isso com um certo temor, n&atilde;o se preocupem, o PHP5 n&atilde;o &eacute; um bicho de 7 cabe&ccedil;as e as melhorias implementadas nele n&atilde;o ser&atilde;o dificil de serem absorvidas pelos novatos&#8230; a diferen&ccedil;a estar&aacute; apenas na orienta&ccedil;&atilde;o a objetos.</p>
<p>&nbsp;</p>
<p>Tags BlogBlogs: <a href="http://blogblogs.com.br/tag/php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php?referer=');">php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/era-uma-vez.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webservice com WSDL no PHP</title>
		<link>http://crisdev.eti.br/webservice-com-wsdl-no-php.html</link>
		<comments>http://crisdev.eti.br/webservice-com-wsdl-no-php.html#comments</comments>
		<pubDate>Mon, 02 Jun 2008 14:49:43 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[wsdl]]></category>
		<category><![CDATA[wsdl com php]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=14</guid>
		<description><![CDATA[&#160;
Criar Webservices no PHP &#233; uma tarefa realtivamente simples, a grande dificuldade esta em gerar WSDL&#180;s. Isso acontece porque apesar do PHP5 trazer grandes funcionalidades nesse campo, ele n&#227;o gera o WSDL. Para ajudar, criar WSDL&#180;s &#233; extremamente complexo, com todas as suas varia&#231;&#245;es e op&#231;&#245;es.
Quando disposnibilizamos um webservice para a plataforma PHP &#233; facil [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Criar Webservices no PHP &eacute; uma tarefa realtivamente simples, a grande dificuldade esta em gerar WSDL&acute;s. Isso acontece porque apesar do PHP5 trazer grandes funcionalidades nesse campo, ele n&atilde;o gera o WSDL. Para ajudar, criar WSDL&acute;s &eacute; extremamente complexo, com todas as suas varia&ccedil;&otilde;es e op&ccedil;&otilde;es.</p>
<p>Quando disposnibilizamos um webservice para a plataforma PHP &eacute; facil e muito r&aacute;pido de ser feito, apenas algumas linhas de c&oacute;digo para o server e para o client s&atilde;o suficientes para realizar a transa&ccedil;&atilde;o.</p>
<p><strong>Exemplo1:</strong></p>
<p><em>server.php</em>:</p>
<p>&lt;?php</p>
<p>&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp; /*<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * Fun&ccedil;&atilde;o utilizada para autenticar o usu&aacute;rio na rede.<br />
&nbsp;&nbsp;&nbsp; &nbsp; */<br />
&nbsp;&nbsp;&nbsp; function Auth($login, $senha){<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp; if(trim($login) == NULL){<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp; $dbconn = pg_connect(&quot;host=10.0.0.1 port=5432 dbname=database user=master password=master&quot;);<br />
&nbsp;&nbsp;&nbsp; &nbsp; $query = &quot;select count(*) from usuarios where login=&#8217;&quot;.$login.&quot;&#8217; and pass=&#8217;&quot;.$senha.&quot;&#8217;&quot;;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp; $result =&nbsp; pg_query($dbconn, $query);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp; return $row[0]; // retorna 1 se validar, retorna 0 se n&atilde;o validar<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp; <br />
&nbsp; <br />
&nbsp; $server = new SoapServer(null, array(&#8217;uri&#8217; =&gt; &#8216;http://auth.localhost.com.br/ws_auth/&#8217;)); // cria o ambiente para servir o webservice</p>
<p>&nbsp; $server-&gt;addFunction(&quot;Auth&quot;); // adiciona a fun&ccedil;&atilde;o de autentica&ccedil;&atilde;o ao escopo</p>
<p>&nbsp; $server-&gt;handle();</p>
<p>&nbsp; <br />
?&gt;<br />
&nbsp;</p>
<p><em>cliente.php:</em></p>
<p>&lt;?php</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* Cria uma instancia do webservice<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p>&nbsp;&nbsp;&nbsp; $client = new SoapClient(null,array(<br />
&nbsp;&nbsp;&nbsp; &#8216;location&#8217; =&gt; &#8216;http://auth.localhost.com.br/ws_auth/server.php&#8217;,<br />
&nbsp;&nbsp;&nbsp; &#8216;uri&#8217; =&gt; &#8216;http://auth.localhost.com.br/ws_auth/&#8217;,<br />
&nbsp;&nbsp;&nbsp; &#8216;trace&#8217; =&gt; 1));</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Para charmar a autentica&ccedil;&atilde;o deve-se passar o login e a senha que ser quer validar como segue<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * $result = $client-&gt;Auth(&#8217;login&#8217;,&#8217;senha&#8217;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $result = $client-&gt;Auth(&#8217;usuario&#8217;,&#8217;senha&#8217;);<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* resultado da autentica&ccedil;&atilde;o<br />
&nbsp;&nbsp;&nbsp; &nbsp;*<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; print_r($result);<br />
&nbsp; <br />
?&gt;<br />
&nbsp;</p>
<p>E pronto, muito simples n&atilde;o? O problema &eacute; que esse tipo de webservice n&atilde;o &eacute; processado por outras plataformas por n&atilde;o gerar WSDL. Plataformas como .NET, JAVA e RUBY precisa de um WSDL para seguir o modelo do objeto que ser&aacute; gerado. Para resolver isso, voc&ecirc; pode criar um WSDL seguindo as especifica&ccedil;&otilde;es do W3C (<a target="_blank" href="http://www.w3.org/TR/wsdl" onclick="urchinTracker('/outgoing/www.w3.org/TR/wsdl?referer=');">http://www.w3.org/TR/wsdl</a>) ou usar alguma classe de terceiro.</p>
<p>Temos:</p>
<ul>
<li>NuSOAP (http://sourceforge.net/projects/nusoap/)</li>
<li>PEAR::SOAP</li>
<li>Ctrx_SOAP_AutoDiscover ( <a href="http://crtx.org/index.php?area=Main&amp;page=CrtxSoapAutoDiscover" target="_blank" onclick="urchinTracker('/outgoing/crtx.org/index.php?area=Main_amp_page=CrtxSoapAutoDiscover&amp;referer=');">http://crtx.org/index.php?area=Main&amp;page=CrtxSoapAutoDiscover</a>)</li>
<li>Webservice Helper tool (<a href="http://www.jool.nl/new/index.php?file_id=1" target="_blank" onclick="urchinTracker('/outgoing/www.jool.nl/new/index.php?file_id=1&amp;referer=');">http://www.jool.nl/new/index.php?file_id=1</a>)</li>
<li>WSDL_Gen (<a href="http://www.schlossnagle.org/%7Egeorge/php/WSDL_Gen.tgz" target="_blank" onclick="urchinTracker('/outgoing/www.schlossnagle.org/_7Egeorge/php/WSDL_Gen.tgz?referer=');">http://www.schlossnagle.org/~george/php/WSDL_Gen.tgz</a>)</li>
</ul>
<p>Eu j&aacute; trabalhei com NuSOAP mas deixei de lado, pois ela possui um nome que entra em conflito com uma fun&ccedil;&atilde;o nativa do PHP, e para evitar dores de cabe&ccedil;a na distribui&ccedil;&atilde;o eu resolvi optar por outra classe. Eu escolhi a Webservice Helper tool, por sua facilidade de uso. Todas as classes acima s&atilde;o utilizadas em ambiente de produ&ccedil;&atilde;o, basta escolher a que se adeque melhor ao seu uso.</p>
<p>A Webservice Helper tool consegue criar WSDL com PHP de uma maneira muito f&aacute;cil e direta. Basicamente se escreve uma classe, adiciona essa classe ao escopo e pronto, o WSDL est&aacute; pronto para usar, n&atilde;o vou por um exemplo completo aqui para n&atilde;o ficar com o post muito longo, caso tenha alguma d&uacute;vida me mande um e-mail. A classe &eacute; bem explicada e possui um exemplo muito bom. Voc&ecirc; pode baixa-la <a href="arqs/wshelper1_5.zip">aqui</a>.</p>
<p>&nbsp;<p>Tags BlogBlogs: <a href="http://blogblogs.com.br/tag/php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php?referer=');">php</a>, <a href="http://blogblogs.com.br/tag/wsdl+no+php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/wsdl+no+php?referer=');">wsdl no php</a>, <a href="http://blogblogs.com.br/tag/wsdl" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/wsdl?referer=');">wsdl</a>, <a href="http://blogblogs.com.br/tag/webservice" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/webservice?referer=');">webservice</a>, <a href="http://blogblogs.com.br/tag/webservice+com+php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/webservice+com+php?referer=');">webservice com php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/webservice-com-wsdl-no-php.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>O que é programação?</title>
		<link>http://crisdev.eti.br/o-que-e-programacao.html</link>
		<comments>http://crisdev.eti.br/o-que-e-programacao.html#comments</comments>
		<pubDate>Mon, 02 Jun 2008 13:44:15 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=10</guid>
		<description><![CDATA[&#160;
&#34;Programming is about expressing complex ideas in the simplest way possible. It&#8217;s important to eliminate all unnecessary clutter, polishing and honing until code is as clear as possible.&#34; &#8211; Noel Darlow (http://michaelkimsal.com/blog/php-groovy-and-language-evolution/)

De acordo.
]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>&quot;Programming is about expressing complex ideas in the simplest way possible. It&rsquo;s important to eliminate all unnecessary clutter, polishing and honing until code is as clear as possible.&quot; &#8211; <cite>Noel Darlow (<a href="http://michaelkimsal.com/blog/php-groovy-and-language-evolution/" onclick="urchinTracker('/outgoing/michaelkimsal.com/blog/php-groovy-and-language-evolution/?referer=');">http://michaelkimsal.com/blog/php-groovy-and-language-evolution/</a>)<br />
</cite></p>
<p>De acordo.</p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/o-que-e-programacao.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passar sessões entre subdomínos</title>
		<link>http://crisdev.eti.br/passar-sessoes-entre-subdominos.html</link>
		<comments>http://crisdev.eti.br/passar-sessoes-entre-subdominos.html#comments</comments>
		<pubDate>Fri, 02 May 2008 21:03:04 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[conf]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=8</guid>
		<description><![CDATA[Me questionaram sobre isso recentemente, como recuperar uma sessão em um subdomínio. Temos duas soluções:
Alterar o php.ini :
session.cookie_domain = .meudominio.com.br
Porém isso nem sempre é possível, para tanto podemos setar a configuração direto dentro do nosso php:
Antes do session_start() e antes de qualquer cookie:
ini_set(&#8221;session.cookie_domain&#8221;, &#8220;.meudominio.com.br&#8221;);
Pronto, bem simples.
]]></description>
			<content:encoded><![CDATA[<p>Me questionaram sobre isso recentemente, como recuperar uma sessão em um subdomínio. Temos duas soluções:</p>
<p>Alterar o php.ini :</p>
<p>session.cookie_domain = .meudominio.com.br</p>
<p>Porém isso nem sempre é possível, para tanto podemos setar a configuração direto dentro do nosso php:</p>
<p>Antes do session_start() e antes de qualquer cookie:</p>
<p>ini_set(&#8221;session.cookie_domain&#8221;, &#8220;.meudominio.com.br&#8221;);</p>
<p>Pronto, bem simples.</p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/passar-sessoes-entre-subdominos.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PDO e BEAN no PHP</title>
		<link>http://crisdev.eti.br/pdo-e-bean-no-php.html</link>
		<comments>http://crisdev.eti.br/pdo-e-bean-no-php.html#comments</comments>
		<pubDate>Fri, 02 May 2008 19:53:47 +0000</pubDate>
		<dc:creator>cristianmedeiros</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[pdo]]></category>

		<guid isPermaLink="false">http://crisdev.eti.br/?p=6</guid>
		<description><![CDATA[PDO é uma extensão nativa no PHP a partir dar versão 5.1, com ela conseguimos trabalhar com diversos bancos de dados sem precisar alterar as as querys feitas (claro que devemos usar SQL ANSI para isso). Para os acostumados com ADODB ou MDB2, o PDO é um facilitador e tanto, pois é nativo do PHP [...]]]></description>
			<content:encoded><![CDATA[<p>PDO é uma extensão nativa no PHP a partir dar versão 5.1, com ela conseguimos trabalhar com diversos bancos de dados sem precisar alterar as as querys feitas (claro que devemos usar SQL ANSI para isso). Para os acostumados com ADODB ou MDB2, o PDO é um facilitador e tanto, pois é nativo do PHP e trabalha a uma velocidade muito superior à essas duas classes.</p>
<p>Implementa cache de query em nível de código (o mesmo que o bind do oracle) e permite uma flexibilidade na manipulação dos resultados tanto como arrays ou objetos.</p>
<p>Por se tratar de uma feature relativamente nova, ela não esta completamente finalizada pelo time do PHP e algumas funções estão disponíveis apenas no cvs.</p>
<p>Um pequeno exemplo de como utilizar o PDO:</p>
<p><code> </code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="urchinTracker('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p6code6'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p66"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p6code6"><pre class="php" style="font-family:monospace;">prepare(&quot;select contenttype, imagedata from images where id=?&quot;);
  $stmt-&amp;gt;execute(array($_GET['id']));
  $stmt-&amp;gt;bindColumn(1, $type, PDO::PARAM_STR, 256);
  $stmt-&amp;gt;bindColumn(2, $lob, PDO::PARAM_LOB);
  $stmt-&amp;gt;fetch(PDO::FETCH_BOUND);
&nbsp;
  header(&quot;Content-Type: $type&quot;);
?&amp;gt;</pre></td></tr></table></div>

<p>Eu tenho utilizado PDO com grande sucesso em meus projetos e cada vez mais me acostumo a utiliza-la no lugar de ADODB/MDB2, tenho trabalhado 100% orientado a objetos no padrão BEAN igual ao do java (gosto de manter os dados protegidos dentro do meu código).</p>
<p>Abaixo um pequeno exemplo de como utilizao PDO em meus projetos. O código está comentado, porém se surgirem dúvidas me mande um e-mail ou comente abaixo que eu dou uma força.</p>
<h2>Conexao.php:</h2>
<p><code> </code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="urchinTracker('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p6code7'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p67"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p6code7"><pre class="php" style="font-family:monospace;">persistencia = true; }
  }
&nbsp;
  public function getConnection(){
    try{
      $this-&amp;gt;con = new PDO(
          $this-&amp;gt;dbType.&quot;:host=&quot;.$this-&amp;gt;host.&quot;;
          dbname=&quot;.$this-&amp;gt;db,$this-&amp;gt;user,
          $this-&amp;gt;pass,
          array(PDO::ATTR_PERSISTENT=&amp;gt; $this-&amp;gt;persistencia)
          );
&nbsp;
      /*ESTA PROPRIEDADE INDICA COMO O PDO VAI RETORNAR OS
        ERROS SQL NO MODO PDO::ERRMODE_WARNING O RETORNO DO
        ERRO É IGUAL AO QUE VEMOS SEM A UTILIZAÇÃO DO PDO*/
    $this-&amp;gt;con-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
      return $this-&amp;gt;con;
    }catch(PDOException $ex){
      echo &quot;ERRO:&quot;.$ex-&amp;gt;getMessage();
    }
  }
&nbsp;
  public function Close(){
    if($this-&amp;gt;con != NULL){
      $this-&amp;gt;con = NULL;
    }
  }
}
?&amp;gt;</pre></td></tr></table></div>

<h2>cliente.php:</h2>
<p><code> </code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="urchinTracker('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p6code8'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p68"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code" id="p6code8"><pre class="php" style="font-family:monospace;">id_cliente = $id_cliente;
  }
&nbsp;
  public function getIdCliente(){
    return $this-&amp;gt;id_cliente;
  }
&nbsp;
  public function setEmail($email){
    $this-&amp;gt;email = $email;
  }
&nbsp;
  public function getEmail(){
    return $this-&amp;gt;email;
  }
&nbsp;
  public function setTelefone($telefone){
    $this-&amp;gt;telefone = $telefone;
  }
&nbsp;
  public function getTelefone(){
    return $this-&amp;gt;telefone;
  }
}
?&amp;gt;</pre></td></tr></table></div>

<h2>clienteModel.php:</h2>
<p><code> </code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="urchinTracker('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p6code9'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p69"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
</pre></td><td class="code" id="p6code9"><pre class="php" style="font-family:monospace;">con = Conexao::getConnection();
  }  
&nbsp;
  public function Insert($cliente){
    $query = &quot;insert into cliente (id_cliente, nome, email, telefone)
	          values (:id_cliente,:nome,:email,:telefone)&quot;;
    try{
      $stmt = $this-&amp;gt;con-&amp;gt;prepare($query);
      $stmt-&amp;gt;bindValue(':id_cliente',$cliente-&amp;gt;getIdCliente());
      $stmt-&amp;gt;bindValue(':nome',$cliente-&amp;gt;getNome());
      $stmt-&amp;gt;bindValue(':email',$cliente-&amp;gt;getEmail());
      $stmt-&amp;gt;bindValue(':telefone',$cliente-&amp;gt;getTelefone());
      return $stmt-&amp;gt;execute();
    }catch(PDOException $ex){
      echo $ex-&amp;gt;getMessage();
    }
  }
&nbsp;
  public function Update($cliente){
    $query = &quot;update users set nome=:nome, email=:email,
	          telefone=:telefone where id_cliente=:id_cliente&quot;;
    try{
      $stmt = $this-&amp;gt;con-&amp;gt;prepare($query);
      $stmt-&amp;gt;bindValue(':nome',$user-&amp;gt;getNome());
      $stmt-&amp;gt;bindValue(':email',$user-&amp;gt;getEmail());
      $stmt-&amp;gt;bindValue(':telefone',$user-&amp;gt;getTelefone());
      $stmt-&amp;gt;bindValue(':id_cliente',$user-&amp;gt;getIdCliente());
      $stmt-&amp;gt;execute();
    }catch(PDOException $ex){
      echo $ex-&amp;gt;getMessage();
    }
  }
&nbsp;
  public function Select($query = NULL){
&nbsp;
    if(trim($query) == NULL){
      $query = &quot;select * from clientes&quot;;
      try{
        $stmt = $this-&amp;gt;con-&amp;gt;prepare($query);
        $stmt-&amp;gt;execute();
&nbsp;
        /*
          ESSE AQUI É O PULO DO GATO: fetchObject(nome_da_classe)
          COM fetchObject COLOCAMOS O RETORNO DO BANCO DE DADOS EM
		  UMA CLASSE COM O NOME ESPECIFICADO NO PARAMETRO
          NO ARQUIVO EM QUE UTILIZAMOS A CONSULTA, TEMOS UM INCLUDE
		  DO ARQUIVO cliente.php QUE POSSUI A DEFINIÇÃO
          DA CLASSE cliente. LOGO, QUANDO A QUERY FOR EXECUTADA,
		  TEREMOS COMO RETORNO UMA CLASSE cliente COM TODOS OS
          ATRIBUTOS PREENCHIDOS PODENDO UTILIZAR OS SET´S E GET´S AUTOMATICAMENTE.
        */
&nbsp;
        $stmt-&amp;gt;fetchObject('cliente');
&nbsp;
      }catch(PDOException $ex){
        echo $ex-&amp;gt;getMessage();
      }
    }else{
      try{
        $stmt = $this-&amp;gt;con-&amp;gt;prepare($query);
        $stmt-&amp;gt;setFetchMode(PDO::FETCH_CLASS, 'cliente');
        $stmt-&amp;gt;execute();
&nbsp;
        /*
          AQUI TEMOS UMA IMPLEMENTAÇÃO DIFERENTE, NÃO TEMOS COMO GARANTIR QUE
		  A QUERY PASSADA RETORNARÁ EXATAMENTE OS ATRIBUTOS DA CLASSE cliente,
		  PORTANTO, SETAMOS O RETORNO PARA A CLASSE cliente, SE O RESULTADO
		  PREENCHER OS ATRIBUTOS, TEREMOS UMA CLASSE cliente COM OS
		  ATRIBUTOS PREENCHIDOS E PODENDO SER MANIPULADA PELOS GET´S E SET´S
		  CASO NÃO, ELE RETORNA UMA CLASSE ONDE OS DADOS PODEM SER
		  ACESSADOS COMO ATRIBUTOS.
        */
&nbsp;
      return $users = $stmt-&amp;gt;fetch(PDO::FETCH_CLASS);  
&nbsp;
      }catch(PDOException $ex){
        echo $ex-&amp;gt;getMessage();
      }
    }
  }
}
?&amp;gt;</pre></td></tr></table></div>

<h2>operacao.php:</h2>
<p><code> </code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="urchinTracker('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p6code10'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p610"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p6code10"><pre class="php" style="font-family:monospace;">clienteValid();
&nbsp;
  //CONSULTA
&nbsp;
  $query = &quot;select * from cliente where id_cliente=&quot;.$_REQUEST['cliente'];
  $cliente = $clienteModel-&amp;gt;Select($query);
&nbsp;
  echo $cliente-&amp;gt;getNome();
  echo $cliente-&amp;gt;getEmail();
&nbsp;
  //ATUALIZAÇÃO
&nbsp;
  $cliente-&amp;gt;setIdCliente($cliente-&amp;gt;getIdCliente());
  $cliente-&amp;gt;setNome($cliente-&amp;gt;getNome());
  $cliente-&amp;gt;setEmail($cliente-&amp;gt;getEmail());
  $cliente-&amp;gt;setTelefone($_REQUEST['telefone']);
&nbsp;
  $clienteModel-&amp;gt;Update($cliente);
&nbsp;
  //INSERT
&nbsp;
  $cliente-&amp;gt;setNome($_REQUEST['nome']);
  $cliente-&amp;gt;setEmail($_REQUEST['email']);
  $cliente-&amp;gt;setTelefone($_REQUEST['telefone']);
&nbsp;
  $clienteModel-&amp;gt;Insert($cliente);
?&amp;gt;</pre></td></tr></table></div>

<p>Este código é bem simples, mas é o que tenho utilizado, ele vêm evoluindo com o tmepo, e para minhas necessidades é bem eficiente. O PDO2 está por vir e promente melhorar muito toda essa interface e suporte a outra bancos.</p>
<p>Algumas referências que me ajudaram a entender a utilização do PDO:</p>
<ul>
<li><a href="http://www.htmlstaff.org/ver.php?id=8117" target="_blank" onclick="urchinTracker('/outgoing/www.htmlstaff.org/ver.php?id=8117&amp;referer=');">http://www.htmlstaff.org/ver.php?id=8117</a></li>
<li><a href="http://www.htmlstaff.org/ver.php?id=9527" target="_blank" onclick="urchinTracker('/outgoing/www.htmlstaff.org/ver.php?id=9527&amp;referer=');">http://www.htmlstaff.org/ver.php?id=9527</a></li>
<li><a href="http://php.net/pdo" target="_blank" onclick="urchinTracker('/outgoing/php.net/pdo?referer=');">http://php.net/pdo</a></li>
</ul>
<p>Qualquer sugestão me mande, ainda estou aprendendo a trabalhar com PDO.</p>
<h2>Edit</h2>
<p>Conforme as observações do Dimas Gomez, acertei o código exibido e aproveito para disponibilizar os fontes <a href="arqs/pdobean.zip">aqui</a>.</p>
<p>Quanto ao erro &#8220;could not find driver&#8221; você pode deve habilitar o driver para seu banco de dados em seu php.ini. Como fazer isso está bem descrito no manual do php em http://php.net/pdo.</p>
<p>Tags BlogBlogs: <a href="http://blogblogs.com.br/tag/php" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php?referer=');">php</a>, <a href="http://blogblogs.com.br/tag/pdo" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/pdo?referer=');">pdo</a>, <a href="http://blogblogs.com.br/tag/php5" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/php5?referer=');">php5</a>, <a href="http://blogblogs.com.br/tag/oo" rel="external" target="_Blank" onclick="urchinTracker('/outgoing/blogblogs.com.br/tag/oo?referer=');">oo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://crisdev.eti.br/pdo-e-bean-no-php.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
