<?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>Meio Código &#187; PHP</title>
	<atom:link href="http://www.meiocodigo.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.meiocodigo.com</link>
	<description>A peça que faltava para seu código.</description>
	<lastBuildDate>Sat, 14 Jan 2012 18:44:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Unique validation rule in CakePHP 1.2</title>
		<link>http://www.meiocodigo.com/2008/10/18/unique-validation-rule-in-cakephp-12/</link>
		<comments>http://www.meiocodigo.com/2008/10/18/unique-validation-rule-in-cakephp-12/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 11:46:49 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[unique]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/?p=192</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/10/18/unique-validation-rule-in-cakephp-12/' addthis:title='Unique validation rule in CakePHP 1.2 '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>In this post I will show an example of how apply the unique validation rule in CakePHP 1.2. It&#8217;s very important to do in some cases, like saving users. You must make sure that the username is unique in your system. Lets see how it works: var $validate = array( &#039;username&#039; =&#62; array( &#039;rule&#039; =&#62; [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/10/18/unique-validation-rule-in-cakephp-12/' addthis:title='Unique validation rule in CakePHP 1.2 ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/10/18/unique-validation-rule-in-cakephp-12/' addthis:title='Unique validation rule in CakePHP 1.2 '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>In this post I will show an example of how apply the unique validation rule in CakePHP 1.2. It&#8217;s very important to do in some cases, like saving users. You must make sure that the username is unique in your system. Lets see how it works:</p>

<p><pre class="brush: php">
var $validate = array(
    &#039;username&#039; =&gt; array(
        &#039;rule&#039; =&gt; array(&#039;isUnique&#039;),
        &#039;message&#039; =&gt; &#039;Username already in use.&#039;
    )
);
</pre></p>

<p>I wrote a custom function to validate it, but thanks to <a href="http://www.amillet.net">Dia</a> now I know the built-in validation rule.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/10/18/unique-validation-rule-in-cakephp-12/' addthis:title='Unique validation rule in CakePHP 1.2 ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/10/18/unique-validation-rule-in-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Pretty Truncate String Function in PHP (substr replacement)</title>
		<link>http://www.meiocodigo.com/2008/10/14/pretty-truncate-string-function-in-php-substr-replacement/</link>
		<comments>http://www.meiocodigo.com/2008/10/14/pretty-truncate-string-function-in-php-substr-replacement/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 18:33:45 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[limit]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[truncate]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/?p=153</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/10/14/pretty-truncate-string-function-in-php-substr-replacement/' addthis:title='Pretty Truncate String Function in PHP (substr replacement) '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>In this post, I&#8217;ll show you a function to make truncate a string. I could simply use the substr function, but it&#8217;s not that good since I can break the string in the middle of a word. So I decided to write another function to do this job. It takes 4 parameters: the string you [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/10/14/pretty-truncate-string-function-in-php-substr-replacement/' addthis:title='Pretty Truncate String Function in PHP (substr replacement) ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/10/14/pretty-truncate-string-function-in-php-substr-replacement/' addthis:title='Pretty Truncate String Function in PHP (substr replacement) '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>In this post, I&#8217;ll show you a function to make truncate a string. I could simply use the substr function, but it&#8217;s not that good since I can break the string in the middle of a word. So I decided to write another function to do this job. It takes 4 parameters: the string you want to truncate, the length you want, the end pattern (defaults to &#8216;&#8230;&#8217;) and the string encoding (defaults to UTF-8). I need the encoding because substr may split in the middle of a character, if it is multi-byte, so I use the <a href="http://br.php.net/manual/en/function.mb-substr.php">mb_substr function</a>.</p>

<h2>Examples</h2>

<p><pre class="brush: php">
echo limit(&#039;this is just a test&#039;,10);// will print &#039;this is...&#039;
echo limit(&#039;this is just a test&#039;,30);// will print &#039;this is just a test&#039;
echo limit(&#039;thisIsJustABigWord&#039;,10);// will print &#039;thisIsJust...&#039;
</pre></p>

<p>Notice that in the first case, the string will be trucated in the middle of a word(&#8216;just&#8217;), so this word was removed also. In the second case, the string is smaller then the max size I specified, so it&#8217;s returned as it is. I the third case, the string is just a big word, bigger then the max size, so the word is breaked because this is the only solution i have.</p>

<h2>Code</h2>

<p><pre class="brush: php">
function limit($string,$length,$end=&#039;...&#039;,$encoding=null){
    if(!$encoding) $encoding = &#039;UTF-8&#039;;
    $string = trim($string);
    $len = mb_strlen($string,$encoding);
    if($len &amp;lt;= $length) return $string;
    else {
        $return = mb_substr($string,0,$length,$encoding);
        return (preg_match(&#039;/^(.&lt;em&gt;[^\s])\s+[^\s]&lt;/em&gt;$/&#039;, $return, $matches) ? $matches[1] : $return).$end;
    }
}
</pre></p>

<p>In the code, I firstly remove the spaces in the start and end of the string, then I get the lenght of my string, if it&#8217;s lower then what I want, return the string itself, otherwise, return the truncated with the end pattern.</p>

<p>Hope it helps.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/10/14/pretty-truncate-string-function-in-php-substr-replacement/' addthis:title='Pretty Truncate String Function in PHP (substr replacement) ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/10/14/pretty-truncate-string-function-in-php-substr-replacement/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MeioUpload Behavior 1.0.1 released!</title>
		<link>http://www.meiocodigo.com/2008/10/12/meioupload-behavior-10-released/</link>
		<comments>http://www.meiocodigo.com/2008/10/12/meioupload-behavior-10-released/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 22:40:46 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Behavior]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/?p=135</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/10/12/meioupload-behavior-10-released/' addthis:title='MeioUpload Behavior 1.0.1 released! '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>I am glad to show you the MeioUpload Behavior 1.0.1. An improved Upload Behavior for CakePHP 1.2. It makes file uploads as simple as defining a variable. See the docs. Features Accepts custom directory for files to be uploaded; Validates the file extension and mime-type due to the behavior configuration; Validates the max file size; [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/10/12/meioupload-behavior-10-released/' addthis:title='MeioUpload Behavior 1.0.1 released! ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/10/12/meioupload-behavior-10-released/' addthis:title='MeioUpload Behavior 1.0.1 released! '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>I am glad to show you the <a href="http://www.meiocodigo.com/projects/meioupload">MeioUpload Behavior 1.0.1</a>. An improved Upload Behavior for CakePHP 1.2. It makes file uploads as simple as defining a variable.</p>

<p><a href="http://www.meiocodigo.com/projects/meioupload">See the docs.</a></p>

<h3>Features</h3>

<ul>
    <li>Accepts custom directory for files to be uploaded;</li>
    <li>Validates the file extension and mime-type due to the behavior configuration;</li>
    <li>Validates the max file size;</li>
    <li>Allow custom validation rules;</li>
    <li>Allow as many thumbnails formats as you want;</li>
    <li>Allow more then one field to be uploadable, with custom options per field;</li>
    <li>Stores the directory, filesize, and mime-type in the database if the table has these fields;</li>
    <li>Allow the use of default files and deleting files without deleting the entire record;</li>
    <li>Delete files when the record is deleted or updated with a new file;</li>
    <li>Also works in the $model->saveAll method.</li>
</ul>

<h3>Changelog</h3>

<h4>v1.0.1</h4>

<ul>
    <li>Fixed a bug in the create folder method;</li>
    <li>Now you can use the $validate var of the model to apply the changes to default validation rules;</li>
    <li>Changed the my_array_merge function, now it&#8217;s part of the behavior, name arrayMerge;</li>
    <li>Allow use of {DS}, {model} and {field} constants in directory name and fields names;</li>
    <li>Fixed a bug with the replacement of the default names.</li>
</ul>

<h4>v1.0</h4>

<ul>
    <li>Initial release</li>
</ul>

<p>Any bugs, features suggestions, and english errors, please tell me.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/10/12/meioupload-behavior-10-released/' addthis:title='MeioUpload Behavior 1.0.1 released! ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/10/12/meioupload-behavior-10-released/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Setar flag no lugar de excluir registro do banco com CakePHP</title>
		<link>http://www.meiocodigo.com/2008/09/30/setar-flag-no-lugar-de-excluir-registro-do-banco-com-cakephp/</link>
		<comments>http://www.meiocodigo.com/2008/09/30/setar-flag-no-lugar-de-excluir-registro-do-banco-com-cakephp/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 22:59:52 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Behavior]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/?p=101</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/09/30/setar-flag-no-lugar-de-excluir-registro-do-banco-com-cakephp/' addthis:title='Setar flag no lugar de excluir registro do banco com CakePHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Uma boa prática de programação é setar uma flag indicando que um registro foi excluido, e não simplesmente excluir o registro do banco. Por exemplo, se eu tenho um produto, que está relacionado em vários pedidos, e eu simplesmente excluo o produto, todos os pedidos que referenciam ele serão inconsistentes. Se em troca de excluir [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/09/30/setar-flag-no-lugar-de-excluir-registro-do-banco-com-cakephp/' addthis:title='Setar flag no lugar de excluir registro do banco com CakePHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/09/30/setar-flag-no-lugar-de-excluir-registro-do-banco-com-cakephp/' addthis:title='Setar flag no lugar de excluir registro do banco com CakePHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Uma boa prática de programação é setar uma flag indicando que um registro foi excluido, e não simplesmente excluir o registro do banco. Por exemplo, se eu tenho um produto, que está relacionado em vários pedidos, e eu simplesmente excluo o produto, todos os pedidos que referenciam ele serão inconsistentes. Se em troca de excluir o registro do produto, eu simplesmente setar uma flag no registro indicando que ele foi excluído, eu não perderei mais essa consistência. Para excluir o produto de id 5, seria algo como:</p>

<p><pre class="syntax-highlight:php">mysql_query("UPDATE produtos SET deleted = true WHERE id = 5");</pre></p>

<p>E para listar os produtos, poderia ser algo como:</p>

<p><pre class="syntax-highlight:php">mysql_query("SELECT * FROM produtos WHERE NOT deleted;");</pre></p>

<p>Percebam que para transferir isso para o CakePHP, basta alterar dois métodos, o index, adicionando a condição, e o delete, substituindo o $this->Produto->del() por um save. Mas o <a href="http://www.marianoiglesias.com.ar/">Mariano Iglesias</a> do <a href="http://cake-syrup.sourceforge.net/">Cake Syrup</a> desenvolveu um behavior que nos economiza muito trabalho. É o <a href="http://cake-syrup.sourceforge.net/ingredients/soft-deletable-behavior/">SoftDeletable</a>. Com ele, a tarefa se resume a uma simples configuração no model no qual se deseja aplicar o uso da flag.</p>

<p><pre class="syntax-highlight:php">var $actsAs = array('SoftDeletable');</pre></p>

<p>Para isso, basta criar o campo deleted na sua tabela e adicionar o arquivo do behavior, disponível no site citado, na pasta de behaviors do seu projeto.</p>

<p>O único problema que eu encontrei nesse behavior é que ao chamar a função $this->Model->del($id), o beforeDelete do behavior é acionado, atualizando o campo da flag deleted para true e retornando false, o que impede que o registro seja realmente excluído do banco. Com isso a tentativa de salvar retorna falso, indicando erroneamente que não obteve sucesso.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/09/30/setar-flag-no-lugar-de-excluir-registro-do-banco-com-cakephp/' addthis:title='Setar flag no lugar de excluir registro do banco com CakePHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/09/30/setar-flag-no-lugar-de-excluir-registro-do-banco-com-cakephp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Validar relacionamento belongsTo no CakePHP</title>
		<link>http://www.meiocodigo.com/2008/09/28/validar-relacionamento-belongsto-no-cakephp/</link>
		<comments>http://www.meiocodigo.com/2008/09/28/validar-relacionamento-belongsto-no-cakephp/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 14:39:42 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Validação]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/?p=59</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/09/28/validar-relacionamento-belongsto-no-cakephp/' addthis:title='Validar relacionamento belongsTo no CakePHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Uma prática que eu acho bastante interessante é verificar se realmente um registro existe no banco antes de associá-lo a outro. Por exemplo, suponha que se têm dois models: /app/models/pessoa.php class Pessoa extends AppModel { var $name = "Pessoa"; } /app/models/aluno.php class Aluno extends AppModel { var $name = "Aluno"; var $belongsTo = array( 'Pessoa' [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/09/28/validar-relacionamento-belongsto-no-cakephp/' addthis:title='Validar relacionamento belongsTo no CakePHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/09/28/validar-relacionamento-belongsto-no-cakephp/' addthis:title='Validar relacionamento belongsTo no CakePHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Uma prática que eu acho bastante interessante é verificar se realmente um registro existe no banco antes de associá-lo a outro. Por exemplo, suponha que se têm dois models:
<pre class="syntax-highlight:php">
/app/models/pessoa.php
class Pessoa extends AppModel {
    var $name = "Pessoa";
}</p>

<p>/app/models/aluno.php
class Aluno extends AppModel {
    var $name = "Aluno";
    var $belongsTo = array(
        'Pessoa' => array(
            'className' => 'Pessoa',
            'foreignKey' => 'pessoa_id'
        )
    );
}
</pre>
Eu quero que sempre que eu adicionar um aluno, o sistema valide se a pessoa a qual eu estou associando este aluno esteja cadastrada no banco. Ou seja, quero garantir que o aluno estará vinculado a uma pessoa válida.</p>

<p>Para isso eu criei uma função de validação que coloquei no meu app_model.php. Veja:
<pre class="syntax-highlight:php">
function checkBelongsTo($data, $relationName){
    $field = $this->belongsTo[$relationName]['foreignKey'];
    $search[$this->{$relationName}->primaryKey] = $data[$field];
    return $this->{$relationName}->find('count',array('conditions' => $search));
}
</pre>
Vamos analisar o código. A primeira linha da função determina qual o campo que irá conter a <em>foreign key</em>, no nosso caso pessoa_id. A segunda linha gera um array de condições no formato:
<pre class="syntax-highlight:php">
Array[primaryKey => valor]
</pre>
Onde <em>primaryKey</em> é obtido diretamente do model associado, e <em>valor</em> é o id do registro ao qual se quer fazer a relação. Na terceira linha é feita uma busca ao banco para saber quantos registros existem que satisfaçam essa condição, o que, obedecendo a condição de que a chave primária deve ser única, irá retornar 0 ou 1. O resultado desta consulta será o retorno da função.
Feito isso, basta adicionar a condição de validação ao model:
<pre class="syntax-highlight:php">
/app/models/aluno.php
class Aluno extends AppModel {
    var $name = "Aluno";
    var $validate = array(
        'pessoa_id' => array(
            'rule' => array('checkBelongsTo','Pessoa'),
            'message' => 'Pessoa inexistente.'
        );
    );
    var $belongsTo = array(
        'Pessoa' => array(
            'className' => 'Pessoa',
            'foreignKey' => 'pessoa_id'
        )
    );
}
</pre>
Perceba que eu adicionei a regra de validação checkBelongsTo passando como parametro o nome do relacionamento entre aluno e pessoa.</p>

<p>Espero ter sido claro. Qualquer dúvida comente.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/09/28/validar-relacionamento-belongsto-no-cakephp/' addthis:title='Validar relacionamento belongsTo no CakePHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/09/28/validar-relacionamento-belongsto-no-cakephp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Prepared Statements e CakePHP</title>
		<link>http://www.meiocodigo.com/2008/09/26/pepared-statements-e-cakephp/</link>
		<comments>http://www.meiocodigo.com/2008/09/26/pepared-statements-e-cakephp/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 13:17:56 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[prepared statements]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[sql injection]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/?p=37</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/09/26/pepared-statements-e-cakephp/' addthis:title='Prepared Statements e CakePHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Precisei montar uma SQL &#8220;na mão&#8221; usando o CakePHP pois ela era muito complexa. Mas me bateu a preocupação com o famoso SQL injection. Então me lembrei das minhas aulas de Programação Orientada a Objetos em que o professor falou que em java existia um método de uso de SQL chamado de prepared statement. O [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/09/26/pepared-statements-e-cakephp/' addthis:title='Prepared Statements e CakePHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/09/26/pepared-statements-e-cakephp/' addthis:title='Prepared Statements e CakePHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Precisei montar uma SQL &#8220;na mão&#8221; usando o CakePHP pois ela era muito complexa. Mas me bateu a preocupação com o famoso SQL injection. Então me lembrei das minhas aulas de Programação Orientada a Objetos em que o professor falou que em java existia um método de uso de SQL chamado de prepared statement. O qual você monta a SQL colocando &#8216;?&#8217; onde serão colocados parâmetros que serão passado para a SQL. Mas ele me mostrou como fazer isso em Java, então fui em busca de uma solução parecida em CakePHP e encontrei. Vou postar um exemplo simples que logicamente poderia ser feito usando a abstração de banco do cake:
<pre class="brush: php">$query = &quot;SELECT nome FROM pessoa WHERE id = ? AND cpf = ?&quot;;
$values = array($this-&gt;params[&#039;named&#039;][&#039;pessoa_id&#039;],$this-&gt;params[&#039;named&#039;][&#039;cpf&#039;]);
$this-&gt;Pessoa-&gt;query($query,$values);</pre>
Veja que eu passei dois parâmetros para o método query do model: o meu SQL com duas &#8216;?&#8217; e um array com dois objetos que irão substituir as duas &#8216;?&#8217; do SQL. Veja que a ordem de substituição é a natural, ou seja, o primeiro item do array substitui a primeira &#8216;?&#8217; do SQL e assim sucessivamente.</p>

<p>É recomendado o uso dos prepared statements sempre que tiver que criar consultas com SQL e que precisem de parâmetros.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/09/26/pepared-statements-e-cakephp/' addthis:title='Prepared Statements e CakePHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/09/26/pepared-statements-e-cakephp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Função simples para testar tempo de execução em PHP</title>
		<link>http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/</link>
		<comments>http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 14:14:27 +0000</pubDate>
		<dc:creator>fabiomcosta</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[tempo]]></category>
		<category><![CDATA[time]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/' addthis:title='Função simples para testar tempo de execução em PHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Vou ser bem objetivo neste post. Mostrarei uma função bastante simples para que rapidamente você verifique o tempo de execução de seus scripts PHP. Após mostrar a função, exemplo de uso e resultado, explicarei o fucionamento da função. function getTime(){ static $tempo; list($usec, $sec) = explode(" ",microtime()); if( $tempo == NULL ){ $tempo = ((float)$usec [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/' addthis:title='Função simples para testar tempo de execução em PHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/' addthis:title='Função simples para testar tempo de execução em PHP '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Vou ser bem objetivo neste post.
Mostrarei uma função bastante simples para que rapidamente você verifique o tempo de execução de seus scripts PHP. Após mostrar a função, exemplo de uso e resultado, explicarei o fucionamento da função.
<pre class="syntax-highlight:php">
function getTime(){
    static $tempo;
    list($usec, $sec) = explode(" ",microtime());
    if( $tempo == NULL ){
        $tempo = ((float)$usec + (float)$sec);
    }
    else{
        echo 'Tempo (segundos): '.(((float)$usec + (float)$sec)-$tempo).'';
    }
}</pre>
Esta função funciona no PHP 4 e 5. No PHP 5 foi adicionado um parâmetro a esta função, que serve como uma flag para que o retorno da função seja float ou não (<a href="http://br.php.net/manual/pt_BR/function.microtime.php" title="Função microtime" target="_blank">documentação do PHP para a função microtime</a>).
Então uma forma de escrever esta função somente para PHP 5 seria:
<pre class="syntax-highlight:php">
function getTime(){
    static $tempo;
    if( $tempo == NULL ){
        $tempo = microtime(true);
    }
    else{
        echo 'Tempo (segundos): '.(microtime(true)-$tempo).'';
    }
}</pre>
Fica mais elegante porém só funciona para a versão 5 do PHP.
Vou mostrar agora um exemplo de como usá-la para que vocês vejam a simplicidade de uso.
<pre class="syntax-highlight:php">
getTime();</p>

<p>$testeIteracao = 0;
for($i=0;$i&lt;1000000;$i++){
    $testeIteracao++;
}</p>

<p>getTime();</pre>
No código acima o resultado aqui na minha máquina foi:
<pre class="syntax-highlight:php">
Tempo (segundos): 0.19565415382385</pre>
Ou seja o PHP levou 195,65 milissegundos para executar este <em>loop</em>.</p>

<p>Como vimos, no código de exemplo, a função é chamada uma vez antes do código a ser testado e outra vez depois do código.
Na primeira chamada a variável estática &#8220;$tempo&#8221; é declarada e possui valor &#8220;NULL&#8221; e por isso obedece ao &#8220;if( $tempo == NULL )&#8221; e recebe o valor da função &#8220;microtime()&#8221;.
Na segunda chamada a variável &#8220;$tempo&#8221;, por ser estática, já possui um valor que é o tempo que foi armazenado na primeira chamada. Então entramos no &#8220;else&#8221; que subtrai o valor de uma nova chamada da função &#8220;microtime()&#8221; com o valor de &#8220;$tempo&#8221; e imprime esse valor. Dessa forma obtemos o tempo que levou da primeira chamada de &#8220;getTime()&#8221; até a segunda, ou seja o tempo de execução do código que está entre as duas chamadas da função.</p>

<p>As variáveis estáticas em classes, são variáveis que podem ser acessadas mesmo sem se ter um instância de um objeto daquela classe (<a href="http://br.php.net/manual/pt_BR/language.oop5.static.php" title="Palavra-chave Static" target="_blank">Palavra-chave &#8216;static&#8217; em classes</a>). Porém no caso de uma variável estática em uma função este valor é mantido entre as chamadas da função, sendo mantido em seu escopo, por isso aconteceu o que foi mostrado.</p>

<p>Espero que tenham gostado, Abraço e até o próximo post.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/' addthis:title='Função simples para testar tempo de execução em PHP ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/08/06/funcao-simples-para-testar-tempo-de-execucao-em-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP &#8211; Herança de Helper</title>
		<link>http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/</link>
		<comments>http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 17:03:04 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Helper]]></category>
		<category><![CDATA[Herança]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/' addthis:title='CakePHP &#8211; Herança de Helper '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Ultimamente tenho utilizado o Framework CakePHP, e uma dúvida que me surgiu esses dias foi como um Helper herdar de outro helper. Por exemplo, criei um helper MyTimeHelper que herda do TimeHelper, e adicionei um método que sobrescreve o format. Entretanto, me ocorria um problema que o script não conseguia encontrar o TimeHelper, por ele [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/' addthis:title='CakePHP &#8211; Herança de Helper ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/' addthis:title='CakePHP &#8211; Herança de Helper '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Ultimamente tenho utilizado o Framework <a href="http://www.cakephp.com">CakePHP</a>, e uma dúvida que me surgiu esses dias foi como um Helper herdar de outro helper. Por exemplo, criei um helper MyTimeHelper que herda do TimeHelper, e adicionei um método que sobrescreve o format. Entretanto, me ocorria um problema que o script não conseguia encontrar o TimeHelper, por ele não ter sido invocado pelo core do cake. Então eu adicionei a linha App::import(&#8216;Helper&#8217;,'Time&#8217;); no início da definição do MyTimeHelper e o problema foi resolvido. Então o codigo fica assim:</p>

<p><pre class="syntax-highlight:php">
App::import('Helper', 'Time');</p>

<p>class MyTimeHelper extends TimeHelper {
...
}
</pre></p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/' addthis:title='CakePHP &#8211; Herança de Helper ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/06/02/cakephp-heranca-de-helper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Evitando múltiplos posts com session</title>
		<link>http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/</link>
		<comments>http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 20:52:51 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Session]]></category>
		<category><![CDATA[Validação]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/' addthis:title='Evitando múltiplos posts com session '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Muitos desenvolvedores já se depararam com a situação de que usuários impacientes enviam formulários dezenas de vezes, e isso realmente incomoda, pois aparecem vários registros idênticos. Uma forma de solucionar tal problema seria usando session. No momento do envio, salva algo que identifique(que chamarei de identidade) o formulário na SESSION, e sempre que for enviar [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/' addthis:title='Evitando múltiplos posts com session ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/' addthis:title='Evitando múltiplos posts com session '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Muitos desenvolvedores já se depararam com a situação de que usuários impacientes enviam formulários dezenas de vezes, e isso realmente incomoda, pois aparecem vários registros idênticos.</p>

<p>Uma forma de solucionar tal problema seria usando session. No momento do envio, salva algo que identifique(que chamarei de identidade) o formulário na SESSION, e sempre que for enviar algo, verifica se a identidade da session bate com a do fomulário enviado, se bater, o sistema impede que o formulário seja enviado novamente.</p>

<p>No caso de formulários de e-mail, eu particularmente uso como identidade a mensagem do e-mail criptografada por md5, visto que reduz significativamente o tamanho do que será guardado na session.</p>

<p>Bom, vamos aos códigos:
<pre class="brush: php">session_start();
$md5Mensagem = md5($_POST[&#039;mensagem&#039;]);
if(isset($_SESSION[&#039;md5Mensagem&#039;] &amp;amp;&amp;amp; $md5Mensagem == $_SESSION[&#039;md5Mensagem&#039;]){
echo &#039;Esta mensagem já foi enviada&#039;;
} else {
if(ENVIA_MENSAGEM){
$_SESSION[&#039;md5Mensagem&#039;] = $md5Mensagem;
echo &#039;Mensagem enviada com sucesso&#039;;
} else echo &#039;Mensagem não foi enviada&#039;;
}</pre>
O código acima está bem simplificado, eu encapsulei o processo de enviar a mensagem (função mail, gravar no banco, ou qualquer outro método) por fugir do escopo deste post.</p>

<p>O código verifica se existe algum md5Mensagem na session, e se ele é igual ao md5 da mensagem enviada, se sim, ele informa que a mensagem já foi enviada, se não, o sistema tenta fazer o envio, se der certo ele salva o md5 na session, se não, ele apenas informa que não deu certo.</p>

<p>Bom, é isso, qualquer dúvida, postem comentários que responderemos.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/' addthis:title='Evitando múltiplos posts com session ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/03/10/evitando-multiplos-posts-com-session/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mensagens de Erro com Session em PHP (serialize)</title>
		<link>http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/</link>
		<comments>http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:49:48 +0000</pubDate>
		<dc:creator>vbmendes</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Session]]></category>
		<category><![CDATA[Validação]]></category>

		<guid isPermaLink="false">http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/' addthis:title='Mensagens de Erro com Session em PHP (serialize) '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>Pra quem pensa que a variável global SESSION é apenas para autenticação de usuários, aqui vai mais uma. O objetivo principal da SESSION, assim como dos COOKIES é enviar variáveis calculadas em uma página para outra página. Irei apresentar aqui um sistema simples de mensagens de erro e confirmação com o uso da SESSION. Primeiramente [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/' addthis:title='Mensagens de Erro com Session em PHP (serialize) ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/' addthis:title='Mensagens de Erro com Session em PHP (serialize) '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div><p>Pra quem pensa que a variável global SESSION é apenas para autenticação de usuários, aqui vai mais uma. O objetivo principal da SESSION, assim como dos COOKIES é enviar variáveis calculadas em uma página para outra página.</p>

<p>Irei apresentar aqui um sistema simples de mensagens de erro e confirmação com o uso da SESSION.</p>

<p>Primeiramente vou apresentar uma classe que eu usei para armazenar as mensagens:</p>

<p><pre class="brush: php">
&lt;?
class Mensagem {
    public static $ERRO=1,$SUCESSO=2;

    private $mensagem;
    private $tipo;

    public function __construct($mensagem,$tipo){
        $this-&gt;mensagem = $mensagem;
        $this-&gt;tipo = $tipo;
    }

    public function getMensagem(){
        return $this-&gt;mensagem;
    }

    public function getTipo(){
        return $this-&gt;tipo;
    }

    public static function tipoToString($tipo){
        if($tipo == 1) return &#039;erro&#039;;
        else if($tipo == 2) return &#039;sucesso&#039;;
    }
}
?&gt;
</pre></p>

<p>Pra quem já mexe com orientação a objetos, a classe acima é simples. Uma classe com 2 variáveis estáticas($ERRO e $SUCESSO) que seriam os tipos de mensagens, uso isso mais para definir o CSS que irá acompanhar a mensagem. Tem duas variáveis, uma para a mensagem em si, e outra para o tipo da mensagem, um construtor que define as variáveis, e funções para obter os valores das variáveis.</p>

<p>O uso é simples, vamos ver um caso abaixo:</p>

<p>Temos a página de formulário simplificada (form.php) da seguinte forma:</p>

<p><pre class="brush: php">
&lt;?
if(isset($_SESSION[&#039;mensagens&#039;])){
    $mensagens = unserialize($_SESSION[&#039;mensagens&#039;]);
    unset($_SESSION[&#039;mensagens&#039;]);
} else {
    $mensagens = array();
}

if(isset($_SESSION[&#039;pessoa&#039;])){
    $pessoa = unserialize($_SESSION[&#039;pessoa&#039;]);
    unset($_SESSION[&#039;pessoa&#039;];
} else {
    $pessoa = new Pessoa();
}

?&gt;&lt;/p&gt;

&lt;ul class=&quot;mensagens&quot;&gt;
    &lt;?= foreach($mensagens as $mensagem): ?&gt;
    &lt;li&gt;&lt;p class=&quot;&lt;?=Mensagem::tipoToString($mensagem-&gt;getTipo())?&gt;&quot;&gt;&lt;?=$mensagem-&gt;getMensagem()?&gt;&lt;/p&gt;  &lt;/li&gt;
    &lt;? endforeach; ?&gt;
&lt;/ul&gt;

&lt;form action=&quot;insert.php&quot; method=&quot;post&quot;&gt;
    &lt;input name=&quot;nome&quot; value=&quot;&lt;?=$pessoa-&gt;getNome()?&gt;&quot; type=&quot;text&quot; /&gt;
    &lt;input name=&quot;idade&quot; value=&quot;&lt;?=$pessoa-&gt;getIdade()?&gt;&quot; type=&quot;text&quot; /&gt;
    &lt;input type=&quot;submit&quot; /&gt;
&lt;/form&gt;

&lt;p&gt;</pre></p>

<p>No código acima, criamos um formulário solicitando nome e idade. As primeiras linhas são código PHP, atente para a função <strong>unserialize</strong>, ela desserializa os dados que vieram da SESSION, visto que a mesma não suporta objetos. Pegamos da SESSION as mensagens, e apagamos da SESSION para que a mensagem só apareça uma vez. Fazemos o mesmo com um objeto do tipo pessoa, o qual armazena os dados que já foram enviados previamente, evitando que o usuário preencha o formulário novamente.</p>

<p>Abaixo vem uma lista, com todas as mensagens que estavam na SESSION. Atente para a função tipoToString, da classe mensagem, que eu criei apenas para definir o atributo <em>class</em> do parágrafo da mensagem.</p>

<p>Em seguida vem o formulário pegando todos os <em>values</em> do objeto pessoa que estava na SESSION.</p>

<p>Abixo teremos o script que irá processar este formulário (submit.php):</p>

<p><pre class="brush: php">
&lt;?

$nome = $_POST[&#039;nome&#039;];
$idade = $_POST[&#039;idade&#039;];

$pessoa = new Pessoa();

if(!$nome) $mensagens[] = new Mensagem(&quot;O nome não foi informado&quot;,Mensagem::$ERRO);
else $pessoa-&gt;setNome($nome);

if(!is_numeric($idade)) $mensagens[] = new Mensagem(&quot;A idade deve ser um número!&quot;,Mensagem::$ERRO);
else $pessoa-&gt;setIdade($idade);

if(count($mensagens)){
    $_SESSION[&#039;mensagens&#039;] = serialize($mensagens);
    $_SESSION[&#039;pessoa&#039;] = serialize($pessoa);
    header(&quot;Location: form.php&quot;);
}

if(cadastra no banco){
    $mensagens[] = new Mensagem(&quot;Pessoa cadastrada com sucesso!&quot;,Mensagem::$SUCESSO);
} else {
    $mensagens[] = new Mensagem(&quot;Ocorreu um erro durante o cadastramento da pessoa!&quot;,Mensagem::$ERRO);
}

header(&quot;Location: form.php&quot;);

?&gt;
</pre></p>

<p>No código acima, pegamos os dados do formulário através do POST e verificamos se os dados validam de acordo com algumas regras, caso contrário colocamos, em um array de mensagens, uma mensagem de erro. Depois de feita a validação, verificamos se existem mensagens de erro, caso positivo, serializamos as mensagens e a pessoa que possui alguns dados já cadastrados e colocamos na SESSION, fazendo o redirecionamento para o formulário, de forma que o usuário possa retificar seus erros.</p>

<p>Caso tudo ocorra dentro do normal, armazenamos uma mensagem de sucesso na SESSION, e redirecionamos para o formulário, para que o usuário efetue novo cadastro. Poderia redirecionar para a lista de cadastrados, ou qualquer outro lugar, contanto que o script tenha os códigos que lessem a mensagem de sucesso, mas para simplificar o meu post, eu criei apenas duas páginas.</p>

<p>Espero que isso ajude, e qualquer dúvida, comenta.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/' addthis:title='Mensagens de Erro com Session em PHP (serialize) ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.meiocodigo.com/2008/02/11/mensagens-de-erro-com-session-em-php-serialize/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

