<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2151093074366495693</id><updated>2011-11-27T13:44:52.438-02:00</updated><category term='linux'/><category term='fpnews'/><category term='regular_expression'/><category term='javascript'/><category term='dolar'/><category term='mysql'/><category term='constantes'/><category term='php'/><category term='tempestade areia ribeirão_preto'/><category term='ajax'/><category term='development'/><category term='programming'/><category term='php_ide'/><category term='cotacao'/><category term='fancy urls'/><category term='text_editors'/><category term='regexp'/><category term='zend php c# wince'/><category term='bash'/><category term='programação'/><category term='batista'/><category term='pibbebedouro'/><category term='desenvolvimento'/><category term='sql'/><category term='shell'/><category term='software'/><category term='vídeo'/><category term='expressão_regular'/><category term='checklist'/><category term='imagem'/><category term='php delphiForPHP desenvolvimento delphi'/><category term='image'/><category term='gd'/><category term='json'/><category term='urls amigáveis'/><title type='text'>tmp.blg</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-6118666460246775092</id><published>2010-07-11T11:51:00.002-03:00</published><updated>2010-07-11T11:52:09.393-03:00</updated><title type='text'>Tratamento de erros no upload</title><content type='html'>Olá pessoal,&lt;br /&gt;&lt;br /&gt;esse mês eu estava trabalhando na construção de um módulo que fará uploads de arquivos para o site http://br.especiais.yahoo.com/fanzone/. O módulo estava funcionando muito bem, até que o time de QA encontrou um bug muito interessante!&lt;br /&gt;No nosso caso, nossos servidores estavam configurados para aceitar arquivos de até 150MB. Pois a tester resolveu enviar um arquivo de 200MB para ver no que dava. Dito e feito, o módulo simplesmente falhou e retornava em branco. Perceba que o módulo não enviava nenhum tipo de mensagem de erro, estou falando daquelas mensagens que o usuário até assusta quando vê!&lt;br /&gt;Como a nossa idéia era tratar o erro de forma amigável, a nossa equipe foi atrás de uma solução para mostrar ao usuário que o arquivo que estava sendo enviado, era muito maior que o que o servidor suportava.&lt;br /&gt;Para aqueles que tem um browser com javascript, foi fácil. Como estamos utilizando o &lt;a href="http://developer.yahoo.com/yui/uploader/"&gt;YUI Uploader&lt;/a&gt;, apenas conferimos a propriedade size provida pelo método fileSelect. Claro que o back-end passou o valor suportado pelo server para o JS. Mas o que fazer se o usuário tem um browser com JS desabilitado ou que não suporta JS?&lt;br /&gt;&lt;br /&gt;Nesse caso, reduzimos o tamanho permitido para upload, pois poderíamos testar mais facilmente:&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[php.ini]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;post_max_size = 2M&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;upload_max_filesize = 2M&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;(depois de alterar o php.ini, não se esqueça de reiniciar o apache)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ao tentar enviar um arquivo maior que 2MB, recebemos a seguinte mensagem de erro:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;PHP Warning:  POST Content-Length of 2202010 bytes exceeds the limit of 2097152 bytes in Unknown on line 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois de pensar um pouco, chegamos à seguinte solução com o PHP:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;// If we have a POST request with _POST and _FILES array empty,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;//we have either an error in the request or a file that is bigger than the server can handle&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;if($_SERVER['REQUEST_METHOD'] == 'POST' &amp;amp;&amp;amp; empty($_POST) &amp;amp;&amp;amp; empty($_FILES)){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;//get the size that the server can handle&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;$max = ini_get('post_max_size');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;//check if the content_length is bigger than the size the server can handle&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;if($_SERVER['CONTENT_LENGTH'] &gt; $max){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $this-&gt;returnError('The file you are trying to upload is bigger than the allowed');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $this-&gt;returnError("There's an issue with the request");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Perceba que testamos se o $_POST e $_FILES estão vazios. É isso que estava ocorrendo quando o usuário enviava um arquivo muito grande. Como o arquivo &lt;a href="http://php.net"&gt;PHP&lt;/a&gt; em questão sempre deveria receber um arquivo via método POST, pudemos fazer esse teste. Se no seu caso, o formulário pode ser enviado com um arquivo sendo opcional, então essa solução pode não ser boa pra você.&lt;br /&gt;&lt;br /&gt;Bom... sei que à primeira vista parece ser um problema simples que nem merece a nossa atenção, mas se você quer realmente prover uma boa experiência aos usuários, é bom capturar essa situação e devolver uma mensagem adequada.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post! (quando será?!?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-6118666460246775092?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/6118666460246775092/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=6118666460246775092' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/6118666460246775092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/6118666460246775092'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2010/07/tratamento-de-erros-no-upload.html' title='Tratamento de erros no upload'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-7632251700947413248</id><published>2009-10-22T22:23:00.012-02:00</published><updated>2009-10-22T22:50:21.864-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='checklist'/><title type='text'>Site checklist - 10 itens importantes</title><content type='html'>Nossa, quase dois anos depois eu volto a postar alguma coisa!&lt;br /&gt;O importante é não parar :)&lt;br /&gt;&lt;br /&gt;Onde estou trabalhando (&lt;a href="http://www.cit.com.br/"&gt;Ci&amp;amp;T&lt;/a&gt;, projeto &lt;a href="http://www.yahoo.com.br/"&gt;Yahoo!&lt;/a&gt;), tenho me preocupado muito com a performance dos sites lançados, uma vez que serão divulgados nas frontpage do Yahoo! pelo mundo, portanto, reuni uma lista de 10 itens importantes para o lançamento de um site que se preze.&lt;br /&gt;&lt;br /&gt;A idéia aqui é mais levantar os itens interessantes do que mostrar o como fazer. Talvez esse seja uma assunto para outros posts. Também devido ao meu background de Engenheiro de Software, posso deixar escapar algum importante item que um Engenheiro de Interfaces poderia levantar. Qualquer coisa, deixa um comentário.&lt;br /&gt;Certamente há itens para serem descritos, mas pra não ficar chato, vamos com dez itens mesmo.&lt;br /&gt;&lt;br /&gt;A lista estará numerada, mas isso não significa que devemos executar os itens nessa ordem.&lt;br /&gt;&lt;br /&gt;Vamos à lista:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1) Tratamento de erros: &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Página 404 com links para páginas existentes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Um site que não possui essa característica poderá perder potenciais visitantes que por um motivo ou outro seguiu um link antigo e que não existe mais no site.&lt;br /&gt;Seria muito bom uma página 404 inteligente que analisa a página incorreta e tenta oferecer links relevantes. Pode-se, por exemplo, 'estudar' quais as páginas 404 que mais tentam ser acessadas e algum editor informar quais os links devem ser mostrados.&lt;br /&gt;Esse mesmo princípio pode ser aplicado à erros 403 (Forbidden) também.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2) Markup válido: &lt;/span&gt;&lt;span style="font-style: italic;font-size:130%;" &gt;Páginas são documentos [X]HMTL válidos&lt;/span&gt;&lt;br /&gt;Páginas que não são documentos válidos tem maior tendencia de não serem renderizadas consistentemente nos diferentes browsers e, provavelmente, será uma grande bagunça quando navegando de um dispositivo móvel.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3) Acessibilidade mínima:&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:130%;" &gt;&lt;span&gt;todos tem o direito de ver o seu site&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Vamos ver em sub-tópicos para melhor organização:&lt;br /&gt;a) O site deve ser renderizável em &lt;a href="http://pt.wikipedia.org/wiki/Internet_Explorer"&gt; IE 7&lt;/a&gt;, &lt;a href="http://pt.wikipedia.org/wiki/Internet_Explorer"&gt;IE 8&lt;/a&gt;, &lt;a href="http://pt-br.www.mozilla.com/pt-BR/firefox/"&gt;FF 3&lt;/a&gt;, &lt;a href="http://www.apple.com/safari/"&gt;Safari &lt;/a&gt;e &lt;a href="http://www.google.com.br/chrome"&gt;Chrome&lt;/a&gt; (&lt;a href="http://www.opera.com/"&gt;Opera&lt;/a&gt;?).&lt;br /&gt;b) Não se esqueça de testar no &lt;a href="http://www.windows.com.br/"&gt;Windows&lt;/a&gt;, &lt;a href="http://www.apple.com/br/macosx/"&gt;OSX &lt;/a&gt;e &lt;a href="http://www.linux.org/"&gt;Linux&lt;/a&gt;, pois podem apresentar diferenças quando seus browsers renderizam as páginas.&lt;br /&gt;c) O site deve ser utilizável em diferentes resoluções de tela.&lt;br /&gt;d) Se a fonte for alterada (principalmente aumentando...), o site ainda deve ser utilizável.&lt;br /&gt;e) E se o &lt;a href="http://www.w3schools.com/css"&gt;CSS&lt;/a&gt; for desabilitado? O site ainda é legível?&lt;br /&gt;f) E se o &lt;a href="http://www.w3schools.com/JS/"&gt;Javascript&lt;/a&gt; for &lt;a href="https://addons.mozilla.org/pt-BR/firefox/addon/722"&gt;desabilitado&lt;/a&gt;? Ainda é possível utilizar o site?&lt;br /&gt;Caso você deixe de implementar um dos itens acima, uma porcentagem de seus usuários podem experimentar uma fraca experiência ao acessar o seu site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;4) Web semântica: &lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;uma www mais organizada&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Para que seu site fique acima da média, procure ter uma descrição relevante e precisa no title, &lt;a href="http://www.w3schools.com/html/html_meta.asp"&gt;meta-description&lt;/a&gt; e &lt;a href="http://www.w3schools.com/html/html_meta.asp"&gt;meta-keywords&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;title&amp;gt;Checklist para lançamento de sites de grande volume de acesso&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta name="description" content="Pouco tempo após o lançamento de um site, seus criadores descobrem que alguns pontos essenciais foram esquecidos, isso pode ser facilmente evitado com a adoção de um checklist."&amp;gt;&lt;br /&gt;&amp;lt;meta name="keywords" content="minify, gzip, semantica, acessibilidade, favicon, cache, checklist"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sem essas 'simples' três tags, seu rank nos sistemas de busca será penalizado e muito. Um título relevante também melhora a experiência de uma usuário que incluirá a página em seu favoritos ou busque no histório sobre aquele site interessante que ele viu anteriormente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;5) Arquivo para crawlers: &lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-style: italic;"&gt;robos são seres insistentes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;É imprescindível para um site ser encontrado pelos mecanismos de busca. Para tanto, se faz necessário incluir um simples arquivo texto, chamado robots.txt, na raiz do site. Mesmo que seja o caso para orientá-lo a indexar todas as páginas do site:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;User-Agent: *&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Disallow:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se o arquivo robots.txt não existir no site, seu error log será entupido com mensagens de erro 404 do tipo 'robots.txt file not found', geradas por todos os &lt;a href="http://en.wikipedia.org/wiki/Web_crawler"&gt;crawlers &lt;/a&gt;de busca que tentarem acessar o arquivo não existente. Portanto, crie um simple arquivo robots.txt e seu servidor já será livrado de mais uma 'dor de cabeça'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;6) Favicon: &lt;/span&gt;&lt;span style="font-style: italic;"&gt;quem inventou isso hein?!?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://pt.wikipedia.org/wiki/Favicon"&gt;Favicon&lt;/a&gt;, diminuto de Favorites Icon, são aqueles pequenos ícones que poder ser visto à esquerda da barra de navegação. Seu valor é questionável, pois a maioria das pessoas nem presta atenção nele.&lt;br /&gt;Mas se você omitir o favicon, praticamente todo o visitante de seu site adicionará uma linha com '404 favicon.ico not found' no log do servidor.&lt;br /&gt;O efeito, é o mesmo do robots.txt descrito no item 5, porém muitas vezes ampliado, afinal, robots.txt apenas crawlers procurar mas favicon, praticamente todos os browsers o querem!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;7) JS e CSS em arquivos separados: &lt;/span&gt;&lt;span style="font-style: italic;"&gt;porque HTML, é HTML (!!!)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Não misture JS e CSS com HTML. Mova todo o código JS e CSS embutido no documento HTML para um arquivo separado, pois assim, o browser poderá fazer cache do conteúdo e quando for solicitar a página HTML, não precisará de fazer o download de todo o código JS e CSS novamente.&lt;br /&gt;Claro que pra toda regra há uma exceção. Nesse caso, se o seu código JS e/ou CSS for utilizado apenas em uma das páginas do site, não tem porque separar em um arquivo.&lt;br /&gt;Ao executar esse passo, você se beneficiará do passo seguinte:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;8) CSS e JS minificados:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;computadores não precisam de identação ou comentários&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Os arquivos CSS e JS devem ser reduzidos ao máximo que for permitido.&lt;br /&gt;Minificar é o ato de retirar todos os espaços em branco (espaço, quebra de linha e tab), comentários além de implementar outras técnicas como:&lt;br /&gt;&lt;br /&gt;- consolidação de CSS e JS:&lt;br /&gt;Todos os arquivos CSS serão agrupados em apenas um arquivo, bem como os arquivos JS.&lt;br /&gt;&lt;br /&gt;- refactoring do JS&lt;br /&gt;Variáveis serão renomeadas para ficarem menores. Por exemplo: showUserDetails e isModernBrowser se tornariam v1 e v2 respetivamente.&lt;br /&gt;&lt;br /&gt;Com os arquivos minificados e consolidados em apenas um arquivo JS e apenas um arquivo CSS, a quantidade de bytes sendo transferida reduz drasticamente e com apenas dois arquivos JS e CSS, poucas requisições HTTP terão de ser abertas para solicitar os arquivos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;9) Sprite de imagens:&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;não, não é de beber&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Uma coisa que as vezes passa desapercebido, é a quantidade de requisições HTTP quem site tem que fazer para carregar as 55 imagens que compões o site.&lt;br /&gt;Essas requisições tomam um tempo considerável do browser para receber todas as imagens.&lt;br /&gt;Para evitar esse problema, coloque todas as imagens em uma só e utilize CSS para posicioná-las.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;10) Cache no servidor: &lt;/span&gt;&lt;span style="font-style: italic;"&gt;de volta às páginas estáticas&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Muitas vezes nos gabamos de ter um site dinamico, mas a página principal (a que recebe todos os visitantes), não é atualizada muitas vezes num dia.&lt;br /&gt;As vezes, uma ou duas vezes por dia. Com isso em mente, pra que abrirmos conexão no banco para pegar sempre a mesma informação, processá-la e aprensentar 1.000 vezes num dia?&lt;br /&gt;Nesse caso, recomenda-se cachear pelo menos a index page, para que apenas quando for necessário, montaremos a página e a salvaremos de modo estático no servidor. Dessa maneira, o servidor web não ficará 'bloqueado' aguardo o processamento da página entregar o conteúdo.&lt;br /&gt;&lt;br /&gt;Se o seu projeto cobrir esses itens, posso dizer que ele está a frente de muitos outros!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fica assim então... a data do próximo post a DEUS pertence! :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-7632251700947413248?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/7632251700947413248/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=7632251700947413248' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/7632251700947413248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/7632251700947413248'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2009/10/site-checklist-10-itens-importantes.html' title='Site checklist - 10 itens importantes'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-6623238814766542666</id><published>2007-12-20T16:26:00.000-02:00</published><updated>2007-12-20T21:43:13.224-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='fancy urls'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='urls amigáveis'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>URLs Amigáveis com Apache e PHP</title><content type='html'>&lt;font face='arial' color='black' size='2'&gt;Nesse artigo veremos como implementar URL’s mais amigáveis para as pessoas acessarem nosso site, sem o “trauma” de ver “códigos esquisitos” na barra de endereço do browser.&lt;br/&gt;&lt;br /&gt;Outra motivação de implementarmos as URL’s amigáveis em nossos sites, é para sermos rastreáveis por spiders que normalmente ignoram arquivos com extensão que denotam programas que retornam conteúdo variável.&lt;br/&gt;&lt;br /&gt;Essa técnica que passaremos aqui ajuda a destacar nosso site em sites de busca como o Google ou Yahoo e é uma ferramenta da SEO (Search Engine Optimization).&lt;br/&gt;&lt;br /&gt;Se você não está entendendo direito o que estou dizendo vamos para um exemplo. Imagine que tenhamos um site que mostra artigos e informações sobre seus autores. Sem a utilização das URL’s amigáveis, poderíamos acessar um artigo da seguinte maneira:&lt;br/&gt;&lt;br /&gt;http://www.sitedeartigos.com.br/artigo.php?id=123&lt;br/&gt;&lt;br /&gt;Agora, utilizando a técnica que será passada por esse artigo, poderíamos acessar nosso site da seguinte maneira:&lt;br/&gt;&lt;br /&gt;http://www.sitedeartigos.com.br/artigo/123&lt;br/&gt;&lt;br /&gt;A URL acima é muito mais interessante de se ler do que a primeira URL informada. Creio que com esse simples exemplo, podemos entender qual o benefício que obteremos após aprendermos essa técnica.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuração do Apache&lt;/b&gt;&lt;br /&gt;Como tudo na nossa área de programação, há várias&lt;br /&gt;maneiras de se atingir um mesmo objetivo. Utilizarei uma técnica que desviará&lt;br /&gt;qualquer chamada para o arquivo index.php que será o nosso manipulador de&lt;br /&gt;requisições. Portanto, tudo passará pelo index.php e ele será o responsável por&lt;br /&gt;carregar os arquivos corretamente.&lt;br/&gt;&lt;br /&gt;A versão do Apache que estou utilizando é a 2.2.4.&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;1) Vá até o arquivo httpd.conf e descomente a linha&lt;br /&gt;# LoadModule rewrite_module modules/mod_rewrite.so&lt;br /&gt;Para descomentar, basta retirar o símbolo de cerquilha na frente da linha.&lt;br /&gt;Essa alteração nos permitirá manipular as requisições, redirecionando-as para o arquivo index.php&lt;br /&gt;&lt;br /&gt;2) Ainda no arquivo httpd.conf, localize a linha onde há a diretiva &amp;lt;Directory /&amp;gt; e garanta que tenha a seguinte linha dentro da diretiva: AllowOverride All.&lt;br /&gt;Essa alteração nos permitirá utilizar o arquivo&lt;br /&gt;.htaccess.&lt;br /&gt;&lt;br /&gt;3)Reinicie o serviço do Apache&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuração do arquivo .htaccess&lt;/b&gt;&lt;br /&gt;Para nosso exemplo, vamos assumir que o site será testado dentro do diretório thiagomp que por sua vez tem o diretório teste.&lt;br /&gt;Dentro do diretório teste ficará nossos arquivos PHP, inclusive o arquivo&lt;br /&gt;index.php.&lt;br /&gt;Portanto, nossa URL base seria http://localhost/thiagomp/teste.&lt;br /&gt;Para funcionar o esquema, crie um arquivo chamado .htaccess (repare que há um ponto antes do nome do arquivo...) com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;RewriteEngine on&lt;br /&gt;RewriteRule .* index.php&lt;br /&gt;php_flag magic_quotes_gpc off&lt;br /&gt;php_flag register_globals off&lt;br /&gt;&lt;br /&gt;Repare que ligamos o motor de reescrita com a primeira linha e depois implementamos a regra de redirecionamento. A regra é bem simples: qualquer coisa que for informada, deve ser redirecionada para o arquivo index.php.&lt;br /&gt;&lt;br /&gt;As outras duas opções nem seriam tão necessárias, mas são ótimas para garantir segurança e a sanidade de nossos códigos.&lt;br /&gt;&lt;br /&gt;O arquivo .htaccess deve ser salvo dentro do diretório teste.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Arquivos para o teste&lt;/b&gt;&lt;br /&gt;Abaixo será mostrado os arquivos utilizados para o testes com comentários. Tais arquivos foram testados com o PHP versão 5.2.4.&lt;br /&gt;&lt;br /&gt;artigo.php&lt;/font&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;&amp;lt;?php &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$idArtigo&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;isset(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parameter&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'id'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;])&amp;nbsp;?&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parameter&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'id'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]&amp;nbsp;:&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;0&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;if(empty(&lt;/font&gt;&lt;/code&gt;&lt;/span&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$idArtigo&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;)){ &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/code&gt;&lt;/span&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;&amp;lt;h2&amp;gt;Não&amp;nbsp;foi&amp;nbsp;selecionado&amp;nbsp;o&amp;nbsp;ID&amp;nbsp;do&amp;nbsp;artigo&amp;lt;/h2&amp;gt;&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;}else{ &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/code&gt;&lt;/span&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;&amp;lt;h2&amp;gt;Mostra&amp;nbsp;o&amp;nbsp;artigo&amp;nbsp;de&amp;nbsp;ID&amp;nbsp;$idArtigo&amp;lt;/h2&amp;gt;&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;}&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face='arial' color='black'&gt;autor.php&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;&amp;lt;?php &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$idAutor&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;isset(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parameter&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'id'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;])&amp;nbsp;?&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parameter&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'id'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]&amp;nbsp;:&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;0&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;if(empty(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$idAutor&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;)){ &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;&amp;lt;h2&amp;gt;Não&amp;nbsp;foi&amp;nbsp;selecionado&amp;nbsp;o&amp;nbsp;ID&amp;nbsp;do&amp;nbsp;autor&amp;lt;/h2&amp;gt;&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;}else{&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;&amp;lt;h2&amp;gt;Mostra&amp;nbsp;informações&amp;nbsp;do&amp;nbsp;autor&amp;nbsp;de&amp;nbsp;ID&amp;nbsp;$idAutor&amp;lt;/h2&amp;gt;&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;font face='courier' color='#007700'&gt;&lt;br /&gt;&lt;code&gt;}&lt;/code&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face='arial' color='black'&gt;naoencontrada.php&lt;/font&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;&amp;lt;?php &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;echo&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;&amp;lt;h2&amp;gt;Página&amp;nbsp;não&amp;nbsp;encontrada&amp;lt;/h2&amp;gt;&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;;&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face='arial' color='black'&gt;index.php&lt;/font&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;&amp;lt;?php &lt;/font&gt;&lt;/code&gt;&lt;font face='courier' color='#0000BB'&gt;&lt;br /&gt;&lt;/span&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;/** &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;Recupera&amp;nbsp;a&amp;nbsp;URL&amp;nbsp;solicitada&amp;nbsp;e&amp;nbsp;quebra&amp;nbsp;cada&amp;nbsp;parte&amp;nbsp;dela.&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;Portanto,&amp;nbsp;se&amp;nbsp;a&amp;nbsp;URL&amp;nbsp;for&amp;nbsp;algo&amp;nbsp;do&amp;nbsp;tipo&amp;nbsp;http://localhost/thiagomp/teste/artigo/10&amp;nbsp;obteremos&amp;nbsp;o&amp;nbsp;seguinte&amp;nbsp;array:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;array(5)&amp;nbsp;{ &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;[0]=&amp;gt;&amp;nbsp;&amp;nbsp;string(0)&amp;nbsp;&amp;quot;&amp;quot; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;[1]=&amp;gt;&amp;nbsp;&amp;nbsp;string(6)&amp;nbsp;&amp;quot;thiagomp&amp;quot;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;[2]=&amp;gt;&amp;nbsp;&amp;nbsp;string(12)&amp;nbsp;&amp;quot;teste&amp;quot; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;[3]=&amp;gt;&amp;nbsp;&amp;nbsp;string(6)&amp;nbsp;&amp;quot;artigo&amp;quot; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;[4]=&amp;gt;&amp;nbsp;&amp;nbsp;string(1)&amp;nbsp;&amp;quot;10&amp;quot; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;} &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;* &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*&amp;nbsp;Com&amp;nbsp;isso&amp;nbsp;poderíamos&amp;nbsp;convencionar&amp;nbsp;que&amp;nbsp;em&amp;nbsp;nosso&amp;nbsp;site,&amp;nbsp;tudo&amp;nbsp;o&amp;nbsp;que&amp;nbsp;vier&amp;nbsp;depois&amp;nbsp;da&amp;nbsp;URL&amp;nbsp;base,&amp;nbsp;primeiro&amp;nbsp;virá&amp;nbsp;o&amp;nbsp;nome&amp;nbsp;do&amp;nbsp;arquivo&amp;nbsp;que&amp;nbsp;vamos&amp;nbsp;invocar&amp;nbsp;e&amp;nbsp;depois&amp;nbsp;os&amp;nbsp;parametros,&amp;nbsp;sendo&amp;nbsp;que&amp;nbsp;primeiro&amp;nbsp;parametro&amp;nbsp;será&amp;nbsp;sempre&amp;nbsp;um&amp;nbsp;ID&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*/ &lt;/code&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parts&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;explode&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'/'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;,&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$_SERVER&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'REQUEST_URI'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]); &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;/** &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#FF8000'&gt;&amp;nbsp;*&amp;nbsp;Esse&amp;nbsp;trecho&amp;nbsp;testa&amp;nbsp;quantos&amp;nbsp;diretórios&amp;nbsp;há&amp;nbsp;na&amp;nbsp;URL&amp;nbsp;solicitada.&amp;nbsp;Dependendo&amp;nbsp;da&amp;nbsp;quantidade&amp;nbsp;de&amp;nbsp;diretórios&amp;nbsp;passados,&amp;nbsp;nosso&amp;nbsp;programa&amp;nbsp;ajustará&amp;nbsp;os&amp;nbsp;valores&amp;nbsp;que&amp;nbsp;serão&amp;nbsp;procurados&amp;nbsp;nas&amp;nbsp;páginas&amp;nbsp;invocadas&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;*/ &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#007700'&gt;if(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;count&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parts&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;)&amp;nbsp;==&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;5&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;){&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//&amp;nbsp;o&amp;nbsp;usuário&amp;nbsp;informou&amp;nbsp;uma&amp;nbsp;pagina&amp;nbsp;e&amp;nbsp;um&amp;nbsp;ID&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$params&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;array_slice&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parts&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;,&amp;nbsp;-&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;2&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;); &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$pagina&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$params&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;0&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$id&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$params&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;1&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;}elseif(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;count&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parts&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;)&amp;nbsp;==&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;4&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;){&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//o&amp;nbsp;usuário&amp;nbsp;informou&amp;nbsp;apenas&amp;nbsp;a&amp;nbsp;pagina&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$params&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;array_slice&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parts&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;,&amp;nbsp;-&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;1&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;); &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$pagina&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$params&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;0&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$id&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;0&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;}else{&lt;/font&gt;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//&amp;nbsp;nada&amp;nbsp;foi&amp;nbsp;informado &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$pagina&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;nenhuma&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$id&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;0&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;}&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;font color='#007700'&gt;switch&amp;nbsp;(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$pagina&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;){&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//seleciona&amp;nbsp;a&amp;nbsp;página &lt;/font&gt;&lt;/code&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#007700'&gt;case&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'artigo'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;:&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//&amp;nbsp;implementamos&amp;nbsp;o&amp;nbsp;que&amp;nbsp;queremos&amp;nbsp;fazer&amp;nbsp;quando&amp;nbsp;uma&amp;nbsp;determinada&amp;nbsp;página&amp;nbsp;for&amp;nbsp;encontrada...&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parameter&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;span color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'id'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$id&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;;&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//&amp;nbsp;configura&amp;nbsp;o&amp;nbsp;parametro&amp;nbsp;que&amp;nbsp;será&amp;nbsp;recuperado&amp;nbsp;na&amp;nbsp;$pagina.php&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#007700'&gt;include(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;$pagina.php&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;);&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//...&amp;nbsp;nesse&amp;nbsp;caso&amp;nbsp;vamos&amp;nbsp;incluir&amp;nbsp;o&amp;nbsp;arquivo&amp;nbsp;para&amp;nbsp;execução&lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;break; &lt;/font&gt;&lt;/code&gt;&lt;font color='#007700'&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&lt;/code&gt;&lt;/span&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'autor'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;span color='#007700'&gt;:&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//idem&amp;nbsp;ao&amp;nbsp;artigo &lt;/font&gt;&lt;/code&gt;&lt;span style='font-size: 10.0pt;font-family:"Courier New";color:#FF8000'&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/span&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$parameter&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;span color='#007700'&gt;[&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'id'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;]&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#0000BB'&gt;$id&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;; &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;font face='courier' color='#007700'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;include(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;&amp;quot;$pagina.php&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;); &lt;/font&gt;&lt;/code&gt;&lt;font face='courier' color='#007700'&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;default:&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#FF8000'&gt;//caso&amp;nbsp;a&amp;nbsp;página&amp;nbsp;solicitada&amp;nbsp;não&amp;nbsp;exista,&amp;nbsp;mostraremos&amp;nbsp;um&amp;nbsp;erro&lt;/font&gt;&lt;/code&gt;&lt;font face='courier' color='#FF8000'&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;/font&gt;&lt;code&gt;&lt;font color='#007700'&gt;include(&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#DD0000'&gt;'naoencontrada.php'&lt;/font&gt;&lt;/code&gt;&lt;code&gt;&lt;font color='#007700'&gt;); &lt;/font&gt;&lt;/code&gt;&lt;br /&gt;&lt;font color='#007700' face='courier'&gt;&lt;code&gt;} &lt;/code&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font face='arial' color='black' size='2'&gt;Depois de copiar os conteúdos e gravá-los em&lt;br /&gt;arquivos, basta efetuarmos um teste colocando no browser a URL http://localhost/thiagomp/teste/artigo/10&lt;br /&gt;&lt;br /&gt;Espero que esse artigo seja útil para lhe dar uma&lt;br /&gt;noção sobre o funcionamento das URL’s amigáveis. Com certeza é um exemplo muito&lt;br /&gt;simples, porém, para quem está iniciando, será muito bom para compreender o&lt;br /&gt;conceito e continuar o desenvolvimento dos conhecimentos nessa área.&lt;br /&gt;&lt;br /&gt;Caso algum erro ocorra com os arquivos ou tenha algo&lt;br /&gt;para acrescentar, fique a vontade de comentar.&lt;br /&gt;&lt;br /&gt;Até o próximo post.&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-6623238814766542666?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/6623238814766542666/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=6623238814766542666' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/6623238814766542666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/6623238814766542666'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/12/urls-amigveis-com-apache-e-php_20.html' title='URLs Amigáveis com Apache e PHP'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-5286478573510708546</id><published>2007-10-21T19:29:00.000-02:00</published><updated>2007-10-21T21:06:52.339-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tempestade areia ribeirão_preto'/><title type='text'>Tempestade de poeira</title><content type='html'>Hoje o post não é nada sobre Tecnologia.&lt;br /&gt;É para mostrar uma tempestade de poeira que chegou aqui em Ribeirão Preto.&lt;br /&gt;&lt;br /&gt;Vejam as fotos e o vídeo abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yAnt7I13Ml0/RxvGm9AX3BI/AAAAAAAAAAo/cEDi2K150nQ/s1600-h/DSC03608.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_yAnt7I13Ml0/RxvGm9AX3BI/AAAAAAAAAAo/cEDi2K150nQ/s320/DSC03608.JPG" alt="" id="BLOGGER_PHOTO_ID_5123907373577526290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_yAnt7I13Ml0/RxvGytAX3CI/AAAAAAAAAAw/dKimMk9FVZM/s1600-h/DSC03609.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_yAnt7I13Ml0/RxvGytAX3CI/AAAAAAAAAAw/dKimMk9FVZM/s320/DSC03609.JPG" alt="" id="BLOGGER_PHOTO_ID_5123907575440989218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/dNyjOT8GXFc"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/dNyjOT8GXFc" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-5286478573510708546?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/5286478573510708546/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=5286478573510708546' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/5286478573510708546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/5286478573510708546'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/10/tempestade-de-poeira.html' title='Tempestade de poeira'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yAnt7I13Ml0/RxvGm9AX3BI/AAAAAAAAAAo/cEDi2K150nQ/s72-c/DSC03608.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-5058646733872903723</id><published>2007-09-25T23:17:00.000-03:00</published><updated>2007-09-25T23:49:59.186-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Problema de acentuação com PHP e JSON</title><content type='html'>Hoje estava trabalhando em uma aplicação com &lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;AJAX&lt;/a&gt; e me deparei um com problema de acentuação no retorno de alguns dados via &lt;a href="http://www.json.org/json-pt.html"&gt;JSON&lt;/a&gt; do &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;.&lt;br /&gt;Se em algum campo tiver a palavra "Éramos", por exemplo, ao executar um encode (utilizei a &lt;a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198"&gt;Services_JSON&lt;/a&gt; provida pelo &lt;a href="http://pear.php.net/"&gt;PEAR&lt;/a&gt;), ele retornará algo como \u0072amos que será renderizado como "ramos".&lt;br /&gt;Depois de &lt;a href="http://www.google.com/"&gt;googlar&lt;/a&gt; sobre o assunto, descobri uma maneira de evitar esse problema.&lt;br /&gt;Considere que o código abaixo é um &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; que retorna dados no formato JSON&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;header&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Content-type: application/json charset=iso-8859-1'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/*&lt;br /&gt;* codigo para conexao no banco e enviar consulta&lt;br /&gt;* ...&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;while(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$row &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;fetch&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()){&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;array_walk&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$row&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'toUtf8'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$data&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;[] = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$row&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;/*&lt;br /&gt;* codigo para terminar de montar o array de retorno dos dados&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;require_once(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'JSON.php'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$json &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Services_JSON&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;echo &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$json&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;encode&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$returnValue&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;); &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// Instead of json_encode&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;function &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;toUtf8&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$item&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;) {&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$item &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;iconv&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"iso-8859-1"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"utf-8"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$item&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;O segredo está aqui:&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$item &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;iconv&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"iso-8859-1"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"utf-8"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$item&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O fato de converter todas strings para utf-8 utilizando a &lt;a href="http://www.php.net/manual/pt_BR/ref.iconv.php"&gt;iconv&lt;/a&gt;, garantiu que meus dados fossem renderizados corretamente.&lt;br /&gt;&lt;br /&gt;Por hoje é isso!&lt;br /&gt;Abraços.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-5058646733872903723?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/5058646733872903723/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=5058646733872903723' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/5058646733872903723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/5058646733872903723'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/09/hoje-estava-trabalhando-em-uma-aplicao.html' title='Problema de acentuação com PHP e JSON'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-8548236713865921994</id><published>2007-09-05T10:41:00.000-03:00</published><updated>2007-09-05T10:50:33.020-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>Desenvolvimento para Linux</title><content type='html'>Após longos seis meses volto a postar no blog!&lt;br /&gt;Não vou prometer nada, mas espero blogar mais.&lt;br /&gt;Fui questionado sobre quais as ferramentas para desenvolvimento de software desktop para Linux. Quem fez pergunta era um programador Delphi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0); font-family: arial;font-family:Tahoma,sans-serif;font-size:100%;"  &gt;Para quem trabalha com Delphi, existe o compilador &lt;a href="http://www.freepascal.org/"&gt;freepascal&lt;/a&gt; e &lt;a href="http://www.gnu-pascal.de/"&gt;GNU Pascal Compiler.&lt;/a&gt;&lt;br /&gt;Também tem o &lt;a href="http://www.lazarus.freepascal.org/"&gt;Lazarus&lt;/a&gt; que é uma IDE inspirada no &lt;a href="http://www.codegear.com/br/products/delphi"&gt;Delphi&lt;/a&gt;.&lt;br /&gt;Quem trabalha com Delphi normalmente utiliza o &lt;a href="http://www.firebirdsql.org/"&gt;Firebird&lt;/a&gt;. O Firebird também pode&lt;br /&gt;ser instalado no Linux.&lt;br /&gt;Também tem o &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; que é um banco de dados muito difundido e o &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; que é um banco menos difundido, porém poderoso.&lt;br /&gt;&lt;br /&gt;Agora, se você está realmente querendo mudar, &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt; é a melhor opção de desenvolvimento para Linux, na minha opinião.&lt;br /&gt;Tem um ótimo IDE free, o &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt;, que se conecta em praticamente todos os databases, graças a arquitetura do JDBC de Java.&lt;br /&gt;&lt;br /&gt;Outra ferramenta que vem ganhando bastante espaço em desenvolvimento desktop para Linux é o &lt;a href="http://gtk.php.net/"&gt;PHP-GTK&lt;/a&gt;. O &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: arial;font-family:Tahoma,sans-serif;font-size:100%;"  &gt;é&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-family: arial;font-family:Tahoma,sans-serif;font-size:100%;"  &gt; uma linguagem já muito utilizada para desenvolvimento web e com extensa gama de APIs para conexão nativa aos bancos de dados mais utilizados no mundo. Com essa extensão, ficou fácil o programador que já conhece PHP também desenvolver para desktop.&lt;br /&gt;&lt;br /&gt;Não poderia deixar de citar o &lt;a href="http://www.mono-project.com/"&gt;projeto MONO&lt;/a&gt;. Não o conheço muito, mas pelo que tenho lido, é uma ótima opção de desenvolvimento utilizando uma plataforma parecida com o &lt;a href="http://www.microsoft.com/net/"&gt;.NET da Microsoft&lt;/a&gt;. O &lt;a href="http://www.icsharpcode.net/OpenSource/SD/"&gt;Sharp Develop&lt;/a&gt; é uma ótima IDE gratuita.&lt;br /&gt;Seguindo essa linha, há o &lt;a href="http://www.realsoftware.com/"&gt;Real Basic&lt;/a&gt;, &lt;a href="http://hbasic.sourceforge.net/"&gt;HBasic&lt;/a&gt; e &lt;a href="http://gambas.sourceforge.net/"&gt;Gambas&lt;/a&gt;, para programadores Visual Basic.&lt;br /&gt;Certamente há mais opções como &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://trolltech.com/products/qt"&gt;QT&lt;/a&gt;, &lt;a href="http://www.open-std.org/jtc1/sc22/wg14/"&gt;C&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;, &lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt;, &lt;a href="http://www.tcl.tk/"&gt;Tcl/Tk &lt;/a&gt;, &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;, entre outras.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-8548236713865921994?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/8548236713865921994/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=8548236713865921994' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/8548236713865921994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/8548236713865921994'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/09/desenvolvimento-para-linux.html' title='Desenvolvimento para Linux'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-4175022289405636175</id><published>2007-03-01T08:18:00.000-03:00</published><updated>2007-03-01T09:00:05.992-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php delphiForPHP desenvolvimento delphi'/><title type='text'>Delphi for PHP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yAnt7I13Ml0/Rea3U-cwbnI/AAAAAAAAAAM/cubFpZf0fyg/s1600-h/NEWDelphiPHPScreen1.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_yAnt7I13Ml0/Rea3U-cwbnI/AAAAAAAAAAM/cubFpZf0fyg/s320/NEWDelphiPHPScreen1.gif" alt="" id="BLOGGER_PHOTO_ID_5036914804249357938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mais uma IDE para desenvolvimento disponível no mercado: &lt;a href="http://www.codegear.com/Products/Delphi/DelphiforPHP/tabid/237/Default.aspx"&gt;Delphi for PHP.&lt;/a&gt;&lt;br /&gt;A &lt;a href="http://www.codegear.com/"&gt;CodeGear&lt;/a&gt;, empresa criada pela &lt;a href="http://www.borland.com/"&gt;Borland&lt;/a&gt; para dar continuidade aos produtos para desenvolvedores, adaptou o seu produto para o desenvolvimento de &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt;. Eles já aceitam pedidos, mas entregarão o produto em março (não foi especificado o dia específico).&lt;br /&gt;Não encontrei nada do site informando se haverá alguma versão para avaliação do produto, mas já enviei um email para eles perguntando sobre isso.&lt;br /&gt;&lt;br /&gt;Fiquei muito feliz de saber dessa notícia, pois é uma empresa que desenvolve um produto amplamente conhecido como o &lt;a href="http://www.codegear.com/Products/Delphi/Delphi2007forWin32/tabid/236/Default.aspx"&gt;Delphi&lt;/a&gt; (entre outros...) e demonstra a força que PHP tem exercido no mundo dos desenvolvedores.&lt;br /&gt;A IDE foi devidamente adicionada a &lt;a href="http://tmpblg.blogspot.com/2007/01/editores-php.html"&gt;lista de editores de PHP&lt;/a&gt; que mantenho aqui no blog.&lt;br /&gt;&lt;br /&gt;A ferramenta tem um preço sugerido de US$ 249,00.&lt;br /&gt;Para os mais curiosos, existe um &lt;a href="http://dn.codegear.com/article/34069"&gt;vídeo&lt;/a&gt; para ver a ferramenta em ação.&lt;br /&gt;&lt;br /&gt;Abaixo mais um screeshot publicado no site da CodeGear.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_yAnt7I13Ml0/Rea76ucwboI/AAAAAAAAAAU/dbwEBGdJeP8/s1600-h/NEWDelphiPHPScreen2.gif"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_yAnt7I13Ml0/Rea76ucwboI/AAAAAAAAAAU/dbwEBGdJeP8/s320/NEWDelphiPHPScreen2.gif" alt="" id="BLOGGER_PHOTO_ID_5036919850835930754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Mais informações:&lt;br /&gt;&lt;a href="http://www.codegear.com/AboutUs/News/DelphiForPHP/tabid/239/Default.aspx"&gt;Notícia do lançamento do produto pela CodeGear&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(em inglês)&lt;br /&gt;&lt;/span&gt;&lt;a href="http://info.abril.com.br/aberto/infonews/022007/27022007-13.shl"&gt;Info online&lt;/a&gt; &lt;span style="font-style: italic;"&gt;(em português)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-4175022289405636175?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/4175022289405636175/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=4175022289405636175' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/4175022289405636175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/4175022289405636175'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/03/delphi-for-php.html' title='Delphi for PHP'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yAnt7I13Ml0/Rea3U-cwbnI/AAAAAAAAAAM/cubFpZf0fyg/s72-c/NEWDelphiPHPScreen1.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-1848813777843077599</id><published>2007-01-30T20:21:00.000-02:00</published><updated>2007-02-04T10:33:19.955-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zend php c# wince'/><title type='text'>Zend Studio 5.5 e outras coisas</title><content type='html'>Estava lendo o &lt;a href="http://blogs.zend.com/author/yossi/"&gt;blog do Yossi Leon&lt;/a&gt; (gerente de produto da &lt;a href="http://www.zend.com/"&gt;Zend Technologies&lt;/a&gt;) e encontrei uma &lt;a href="http://files.zend.com/videos/zend_studio_demo/"&gt;demonstração&lt;/a&gt; do &lt;a href="http://www.zend.com/products/zend_studio"&gt;Zend Studio 5.5&lt;/a&gt; feita por ele mesmo.&lt;br /&gt;O inglês dele não é dos melhores, mas não posso dizer nada, pois o meu &lt;span style="font-weight: bold;"&gt;ainda&lt;/span&gt; não é também!&lt;br /&gt;&lt;br /&gt;Esses dias estive trabalhando numa classe simples para gerar xml's, estou colocando comentários nela e espero divulgá-la no &lt;a href="http://www.phpclasses.org/"&gt;phpclasses.org&lt;/a&gt; assim que terminar. Quando for publicada eu posto uma mensagem aqui.&lt;br /&gt;&lt;br /&gt;Também estou trabalhando com C# desenvolvendo aplicativos para o &lt;a href="http://msdn.microsoft.com/embedded/windowsce/"&gt;Windows CE&lt;/a&gt;, num &lt;a href="http://www.ute.com/product_info.php?id=48"&gt;coletor de dados&lt;/a&gt; da &lt;a href="http://www.tecmedd.com.br/"&gt;empresa onde trabalho&lt;/a&gt;. Tem sido empolgante fazer progressos no desenvolvimento de aplicativos embarcados. Creio que profissionais desse tipo de software terão muito espaço, assim como os desenvolvedores de webaplicativos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-1848813777843077599?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/1848813777843077599/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=1848813777843077599' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/1848813777843077599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/1848813777843077599'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/zend-studio-55-e-outras-coisas.html' title='Zend Studio 5.5 e outras coisas'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-4857745053255933165</id><published>2007-01-30T08:45:00.000-02:00</published><updated>2007-01-30T08:50:04.755-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='batista'/><category scheme='http://www.blogger.com/atom/ns#' term='vídeo'/><category scheme='http://www.blogger.com/atom/ns#' term='pibbebedouro'/><category scheme='http://www.blogger.com/atom/ns#' term='fpnews'/><title type='text'>Juventude PIB Bebedouro</title><content type='html'>No fim de semana passado (dias 26, 27 e 28) fui a Bebedouro para visitar Família e amigos. Claro que não pude deixar de ir à PIB (Primeira Igreja Batista).&lt;br /&gt;O pessoal do FP 378 (nome do ministério Jovem da PIB) iniciou o FP News! Ficou muito divertido e o vídeo está disponibilizado aí abaixo.&lt;br /&gt;&lt;br /&gt;&lt;object height="280" width="400"&gt;&lt;param name="movie" value="http://www.youtube.com/p/FE6D2B0056B78E14" /&gt;&lt;embed src="http://www.youtube.com/p/FE6D2B0056B78E14" type="application/x-shockwave-flash" height="280" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Quanto as publicações técnicas, vou ver se faço uma outra postagem ainda hoje.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-4857745053255933165?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/4857745053255933165/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=4857745053255933165' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/4857745053255933165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/4857745053255933165'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/juventude-pib-bebedouro.html' title='Juventude PIB Bebedouro'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-2011920605013490329</id><published>2007-01-22T11:49:00.000-02:00</published><updated>2007-01-22T12:31:50.370-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='constantes'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>Constantes pré-definidas do PHP</title><content type='html'>O PHP fornece algumas constantes que podem ser de suma importancia para o desenvolvedor.&lt;br /&gt;Uma &lt;a href="http://www.php.net/manual/pt_BR/reserved.constants.php"&gt;lista&lt;/a&gt; de todas as constantes pode ser encontrada no &lt;a href="http://php.net/"&gt;site oficial do PHP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Abaixo uma lista de algumas constantes que considero importantes:&lt;br /&gt;&lt;br /&gt;&lt;tt class="constant"&gt;&lt;b&gt;DIRECTORY_SEPARATOR&lt;/b&gt; - &lt;/tt&gt;Dependendo do sistema operacional, as barras de seperação de diretório pode ser para frente (/) ou para trás (\), para não ter erro, utilize essa constante para informar o caminho de um arquivo.&lt;br /&gt;&lt;tt class="constant"&gt;&lt;b&gt;&lt;/b&gt;&lt;/tt&gt;&lt;br /&gt;&lt;tt class="constant"&gt;&lt;b&gt;PHP_EOL&lt;/b&gt;&lt;/tt&gt; - Dependendo do sistema operacional, a quebra de linha em um arquivo texto pode ser apenas um caracter de line feed (\n) ou uma combinação dos caracteres de carriage return mais line feed (\r\n). Com essa constante, você pode inserir quebras de linhas sem se preocupar em qual SO está sendo gerado o arquivo.&lt;br /&gt;&lt;br /&gt;&lt;tt class="constant"&gt;&lt;b&gt;M_PI&lt;/b&gt;&lt;/tt&gt; - Informa o &lt;a href="http://pt.wikipedia.org/wiki/Pi"&gt;número do PI&lt;/a&gt; (aquele número matemático, lembra?)&lt;br /&gt;&lt;br /&gt;Você também pode executar o código abaixo para ver todas as constantes definidas em seu ambiente e quais os valores de cada uma.&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;&amp;lt;?php&lt;br /&gt;print &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'&amp;lt;pre&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;print_r&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;get_defined_constants&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;());&lt;br /&gt;print &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'&amp;lt;/pre&amp;gt;'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;Parece que não, mas o conhecimento dessas constantes podem fazer uma grande diferença no desenvolvimento de seu webaplicativo.&lt;br /&gt;&lt;br /&gt;Até o próximo post.&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-2011920605013490329?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/2011920605013490329/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=2011920605013490329' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/2011920605013490329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/2011920605013490329'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/constantes-pr-definidas-do-php.html' title='Constantes pré-definidas do PHP'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-8316335120355103173</id><published>2007-01-16T22:04:00.000-02:00</published><updated>2007-01-18T21:30:37.483-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='regexp'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='regular_expression'/><category scheme='http://www.blogger.com/atom/ns#' term='expressão_regular'/><title type='text'>Expressões regulares no MySQL</title><content type='html'>&lt;a href="http://pt.wikipedia.org/wiki/Express%C3%A3o_regular"&gt;Expressões regulares&lt;/a&gt; é algo que de tempo em tempo temos que utilizar para obtermos um resultado adequado.&lt;br /&gt;Alguns dias atrás tive que procurar em uma base de dados &lt;a href="http://www.mysql.com"&gt;MySQL&lt;/a&gt; 4.1 clientes que tivessem pelo menos um email cadastrado corretamente. Na tabela, haviam duas colunas: email1 e email2.&lt;br /&gt;Para resolver esse problema, recorri a instrução &lt;a href="http://dev.mysql.com/doc/refman/4.1/pt/regexp.html"&gt;REGEXP&lt;/a&gt; e veja o que saiu:&lt;br /&gt;&lt;br /&gt;SELECT nome_do_cliente, email1, email2,&lt;br /&gt;    email1 REGEXP "^.*@[a-zA-Z0-9].*$" AS valido1,&lt;br /&gt;    email2 REGEXP "^.*@[a-zA-Z0-9].*$" AS valido2&lt;br /&gt;FROM clientes&lt;br /&gt;HAVING (valido1 = 1 OR valido2 = 1)&lt;br /&gt;&lt;br /&gt;Se o campo combinar com a expressão regular, então o SGBD retornará 1 (um),  se não combinar retornará 0 (zero). Por isso fiz o HAVING para poder utilizar os apelidos das ERs.&lt;br /&gt;&lt;br /&gt;Por hoje é só...&lt;br /&gt;&lt;br /&gt;Abraços  e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-8316335120355103173?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/8316335120355103173/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=8316335120355103173' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/8316335120355103173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/8316335120355103173'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/expresses-regulares-no-mysql.html' title='Expressões regulares no MySQL'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-5528239110977185050</id><published>2007-01-15T20:52:00.000-02:00</published><updated>2007-01-15T23:41:02.474-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>Minimizador de códigos javascript</title><content type='html'>Estou percebendo que postar mensagens todos os dias num blog é algo trabalhoso! Esses dias estive com ilustres visitas aqui em casa e acabei ficando sem tempo de postar.&lt;br /&gt;&lt;br /&gt;Hoje, em minhas "navegações perdidas" descobri o &lt;a href="http://www.crockford.com/javascript/jsmin.html"&gt;JSMIN&lt;/a&gt;. É um aplicativo interessante que pega o código javascript e retira um monte de caracteres desnecessários, reduzindo o tamanho do fonte a ser transferido ao cliente.&lt;br /&gt;&lt;br /&gt;Vejam um código Javascript antes de ser "minificado":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// is.js&lt;br /&gt;&lt;br /&gt;// (c) 2001 Douglas Crockford&lt;br /&gt;// 2001 June 3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// is&lt;br /&gt;&lt;br /&gt;// The -is- object is used to identify the browser.  Every browser edition&lt;br /&gt;// identifies itself, but there is no standard way of doing it, and some of&lt;br /&gt;// the identification is deceptive. This is because the authors of web&lt;br /&gt;// browsers are liars. For example, Microsoft's IE browsers claim to be&lt;br /&gt;// Mozilla 4. Netscape 6 claims to be version 5.&lt;br /&gt;&lt;br /&gt;var is = {&lt;br /&gt;  ie:      navigator.appName == 'Microsoft Internet Explorer',&lt;br /&gt;  java:    navigator.javaEnabled(),&lt;br /&gt;  ns:      navigator.appName == 'Netscape',&lt;br /&gt;  ua:      navigator.userAgent.toLowerCase(),&lt;br /&gt;  version: parseFloat(navigator.appVersion.substr(21)) ||&lt;br /&gt;           parseFloat(navigator.appVersion),&lt;br /&gt;  win:     navigator.platform == 'Win32'&lt;br /&gt;}&lt;br /&gt;is.mac = is.ua.indexOf('mac') &gt;= 0;&lt;br /&gt;if (is.ua.indexOf('opera') &gt;= 0) {&lt;br /&gt;  is.ie = is.ns = false;&lt;br /&gt;  is.opera = true;&lt;br /&gt;}&lt;br /&gt;if (is.ua.indexOf('gecko') &gt;= 0) {&lt;br /&gt;  is.ie = is.ns = false;&lt;br /&gt;  is.gecko = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tamanho total: 1004 bytes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora vejam depois de passar pelo JSMIN:&lt;br /&gt;&lt;br /&gt;var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}&lt;br /&gt;is.mac=is.ua.indexOf('mac')&gt;=0;if(is.ua.indexOf('opera')&gt;=0){is.ie=is.ns=false;is.opera=true;}&lt;br /&gt;if(is.ua.indexOf('gecko')&gt;=0){is.ie=is.ns=false;is.gecko=true;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tamanho total: 438 bytes&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Uma economia de 566 bytes... é uma diferença considerável para um script de exemplo. Para as nossas bibliotecas javascript com certeza fara uma diferença muito maior!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-5528239110977185050?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/5528239110977185050/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=5528239110977185050' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/5528239110977185050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/5528239110977185050'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/minimizador-de-cdigos-javascript.html' title='Minimizador de códigos javascript'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-7489680474775079124</id><published>2007-01-11T08:44:00.000-02:00</published><updated>2007-01-11T09:23:31.529-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>Shell script com PHP</title><content type='html'>Para os programadores PHP que trabalham com linux, é possível utilizar a linguagem para fazer os famigerados shel scripts! Muito mais legal do que utilizar o bash. :-)&lt;br /&gt;Para fazer isso, tente o seguinte:&lt;br /&gt;&lt;br /&gt;1 - Abra o vi/vim:&lt;br /&gt;$ vi teste.php&lt;br /&gt;&lt;br /&gt;2 - Escreva o seguinte código:&lt;br /&gt;#!/usr/bin/php -q&lt;br /&gt;&amp;lt;?php&lt;br /&gt;echo "Hello World!\n";&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;3 - Saia do vi/vim salvando o código digitado:&lt;br /&gt;[ESC][:][x] (Tecla ESC, depois, tecla dois pontos e por último,  tecla x minúsculo)&lt;br /&gt;&lt;br /&gt;4 - Coloque permissões de execução no arquivo:&lt;br /&gt;$ chmod 744 teste.php&lt;br /&gt;&lt;br /&gt;5 - Execute o fabuloso programa teste.php:&lt;br /&gt;$ ./teste.php&lt;br /&gt;&lt;br /&gt;6 - Você deverá ver a saída do programa:&lt;br /&gt;Hello World!&lt;br /&gt;&lt;br /&gt;Legal né?! Imagine agora você com toda a API do PHP disponível no shell! Imagine você fazendo acesso a banco de dados com a facilidade do PHP dentro do shell!!! Tudo de bom!&lt;br /&gt;Depois disso, dei adeus ao bom bash!&lt;br /&gt;&lt;br /&gt;Até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-7489680474775079124?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/7489680474775079124/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=7489680474775079124' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/7489680474775079124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/7489680474775079124'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/shell-script-com-php.html' title='Shell script com PHP'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-6763221808932224350</id><published>2007-01-09T21:53:00.001-02:00</published><updated>2007-01-10T00:13:07.811-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='cotacao'/><category scheme='http://www.blogger.com/atom/ns#' term='dolar'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>Cotação do dólar</title><content type='html'>Esses dias eu tive a necessidade de colocar num site a cotação do dólar do &lt;a href="http://www.estadao.com.br/"&gt;Estadão&lt;/a&gt;. Para resolver esse problema desenvolvi o seguinte script:&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;if(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$fp&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;fopen&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"http://www.estadao.com.br/economia/financas/&lt;br /&gt;cotacoes/resumo.htm" &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"r" &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Erro ao recuperar a cotação do dia" &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;''&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;while(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;feof&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$fp&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;fgets&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$fp&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;1024&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;fclose&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$fp&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;substr&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;strpos&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"&lt;!-- CAMBIO --&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$pos &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;strpos&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;substr&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;strpos&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;""&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$pos&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;));&lt;br /&gt;&lt;br /&gt;echo &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$conteudo&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Espero que possa lhe ajudar caso esteja precisando de algo parecido com isso!&lt;br /&gt;&lt;br /&gt;Ah! Hoje li a &lt;a href="http://bomdiabrasil.globo.com/Jornalismo/BDBR/0,,AA1413241-3682,00.html"&gt;notícia&lt;/a&gt; de que o &lt;a href="http://www.youtube.com/"&gt;youtube&lt;/a&gt; seria bloqueado por causa da &lt;a href="http://www.clubedascelebridades.com/danielacicarelli"&gt;Srta. Daniela Cicarelli&lt;/a&gt; que teve seus públicos atos devassos publicados em um site de grande público como o youtube... simplesmente lamentável. Mas a &lt;a href="http://g1.globo.com/Noticias/Tecnologia/0,,AA1413596-6174,00.html"&gt;decisão já foi revista&lt;/a&gt; e nós brasileiros podemos acessar o maior síte de vídeos do mundo.&lt;br /&gt;&lt;br /&gt;Até o próximo post.&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-6763221808932224350?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/6763221808932224350/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=6763221808932224350' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/6763221808932224350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/6763221808932224350'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/cotao-do-dlar_09.html' title='Cotação do dólar'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-645661556614410065</id><published>2007-01-08T20:15:00.001-02:00</published><updated>2008-04-10T23:41:18.005-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gd'/><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='imagem'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><title type='text'>imagecreatefrombmp</title><content type='html'>Eu já havia enviado essa mensagem por email à várias pessoas, porém, creio que seja uma informação útil para ficar registrada aqui no blog.&lt;br /&gt;&lt;br /&gt;Alguém já precisou de uma função &lt;span id="st" name="st" class="st"&gt;imagecreatefrombmp&lt;/span&gt;?&lt;br /&gt;Eu estava precisando de uma para pegar umas capas de livros que estavam&lt;br /&gt;nesse formato, porém a API do PHP não fornece tal função. Eu creio que o problema nem é a API do PHP mas sim a biblioteca GD que o PHP empacota.&lt;br /&gt;Na minha cruzada para resolver o problema, encontrei uma que faz o&lt;br /&gt;serviço de modo igual as funções da API do PHP.&lt;br /&gt;Vocês poderão encotrá-la  no seguinte endereço:&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.jpexs.com/php.html" target="_blank"&gt;http://www.jpexs.com/php.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Com certeza uma ótima ferramenta para se ter em mãos... quem sabe um&lt;br /&gt;dia você não vai precisar!&lt;br /&gt;&lt;br /&gt;Até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-645661556614410065?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/645661556614410065/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=645661556614410065' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/645661556614410065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/645661556614410065'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/enviei-essa-mensagem-j-por-email-para.html' title='imagecreatefrombmp'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-3055826996874671637</id><published>2007-01-06T11:45:00.005-02:00</published><updated>2008-06-30T13:04:27.628-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desenvolvimento'/><category scheme='http://www.blogger.com/atom/ns#' term='text_editors'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='programação'/><category scheme='http://www.blogger.com/atom/ns#' term='php_ide'/><title type='text'>Editores PHP</title><content type='html'>Faz algum tempo estou procurando uma IDE melhor para desenvolver meus projetos PHP.&lt;br /&gt;Principalmente uma ferramenta que forneça um debugador, pois essa característica realmente acelera a detecção de problemas em relação ao uso de echo's e var_dump's.&lt;br /&gt;Certamente nessa lista ainda falta editores. Se você souber de mais algum que eu não coloquei aqui, por favor, deixe um comentário.&lt;br /&gt;Abaixo segue uma lista dos editores que encontrei:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.editplus.com/"&gt;Edit Plus&lt;/a&gt; (windows | pago [possui trial] )&lt;/li&gt;&lt;li&gt;&lt;a href="http://tulip.solis.coop.br/us/index.php"&gt;Tulip&lt;/a&gt; (linux e windows | free e open source | feito com PHP-GTK)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.crimsoneditor.com/"&gt;Crimson Editor&lt;/a&gt; (windows | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.phpeclipse.net/"&gt;PHPEclipse&lt;/a&gt; (JVM - Java Virtual Machine | free e open source)&lt;a href="http://www.phpeclipse.net/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://notepad-plus.sourceforge.net/"&gt;Notepad++&lt;/a&gt; (windows | free e open source)&lt;a href="http://notepad-plus.sourceforge.net/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mpsoftware.org/"&gt;PHP Designer&lt;/a&gt; (windows | pago)&lt;a href="http://www.mpsoftware.dk/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pnotepad.org/"&gt;Programmer's Notepad&lt;/a&gt; (windows | free e open source)&lt;a href="http://www.pnotepad.org/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.zend.com/studio"&gt;Zend Studio&lt;/a&gt; (linux, windows, mac os x power | pago)&lt;a href="http://www.zend.com/studio"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.emeditor.com/"&gt;EmEditor&lt;/a&gt; (windows | pago, mas possui versão free)&lt;a href="http://www.emeditor.com/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ultraedit.com/"&gt;UltraEdit&lt;/a&gt; (windows | pago [possui trial])&lt;a href="http://www.ultraedit.com/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Vi"&gt;Vi&lt;/a&gt; (linux | free)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; (linux, ms-dos, windows, amiga, os/2, mac os, qnx e etc... | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.scintilla.org/SciTE.html"&gt;SciTE&lt;/a&gt; (linux e windows | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://kate.kde.org/"&gt;Kate&lt;/a&gt; (linux | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt; (JVM | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.zend.com/pdt"&gt;PHP Development Tool&lt;/a&gt; (JVM | free e open source, menos o debugger)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pspad.com/"&gt;PSPad&lt;/a&gt; (windows | free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.adobe.com/products/dreamweaver/"&gt;Dreamweaver&lt;/a&gt; (windows, mac | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gphpedit.org/"&gt;gPHPEdit&lt;/a&gt; (linux | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.barebones.com/products/textwrangler/"&gt;TextWrangler&lt;/a&gt; (mac os x | free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blumentals.net/rapidphp/"&gt;Rapid PHP&lt;/a&gt; (windows | pago [possui trial])&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.skti.org/"&gt;skEdit&lt;/a&gt; (mac os x | pago [possui trial])&lt;/li&gt;&lt;li&gt;&lt;a href="http://quanta.kdewebdev.org/"&gt;Quanta&lt;/a&gt; (linux | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.barebones.com/products/bbedit/"&gt;BBEditor&lt;/a&gt; (mac | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kate-editor.org/kwrite"&gt;Kwrite&lt;/a&gt; (linux | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://easyeclipse.org/site/distributions/php.html"&gt;EasyEclipse&lt;/a&gt; PHP (linux, mac, windows | empacota vários aplicativos que funcionam no Eclipse)&lt;/li&gt;&lt;li&gt;&lt;a href="http://bluefish.openoffice.nl/"&gt;Bluefish&lt;/a&gt; (linux | free e open source)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nusphere.com/products/phped.htm"&gt;PHPed&lt;/a&gt; (windows | pago [possui trial])&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.activestate.com/Products/Komodo/"&gt;Komodo&lt;/a&gt; (linux, solaris, mac os x, windows | pago [possui trial])&lt;/li&gt;&lt;li&gt;&lt;a href="http://superdownloads.uol.com.br/download/91/bredit/"&gt;BrEdit&lt;/a&gt; (windows | free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.inf.furb.br/%7Edemafra/"&gt;PHP Editor&lt;/a&gt; (windows | free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.pleskina.com/phpconstructor/"&gt;Davor's PHP Constructor&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.alleycode.com/"&gt;Alleycode&lt;/a&gt; (windows | free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.yessoftware.com/"&gt;CodeCharge Studio&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ankord.com/"&gt;PHP Expert Editor&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.c-point.com/php_editor.php"&gt;Antechinus PHP Editor&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://silveragesoftware.com/"&gt;HandyHTML Editor&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dzsoft.com/dzphp.htm"&gt;DzSoft PHP Editor&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jext.org/"&gt;Jext&lt;/a&gt; (JVM | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.fasthtml.com.br/"&gt;FastHTML&lt;/a&gt; (windows | free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.enginsite.com/php-editor.htm"&gt;EngInSite PHP Editor&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dynamic-html-editor.com/"&gt;Dynamic HTML Editor&lt;/a&gt; (windows | free e pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.top-systems.net/Top-PHP-Studio/"&gt;Top PHP Studio&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.waterproof.fr/products/PHPEdit/"&gt;PHPEdit&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.maguma.com/en/maguma-open-studio.html"&gt;Maguma Open Studio&lt;/a&gt; (windows | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.maguma.com/en/maguma-open-studio.html"&gt;TSW WebCoder&lt;/a&gt; (windows | pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xored.com/trustudio"&gt;TruStudio Foundation&lt;/a&gt; (JVM | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.chami.com/html-kit/"&gt;HTML Kit&lt;/a&gt; (windows | free e pago)&lt;/li&gt;&lt;li&gt;&lt;a href="http://hapedit.free.fr/"&gt;HAPEdit&lt;/a&gt; (windows | free)&lt;/li&gt;&lt;li&gt;&lt;a href="http://smultron.sourceforge.net/"&gt;Smultron&lt;/a&gt; (mac os x | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;emacs&lt;/a&gt; (linux e windows | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xemacs.org/"&gt;xemacs&lt;/a&gt; (linux, mac e windows | free e open source)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codegear.com/Products/Delphi/DelphiforPHP/tabid/237/Default.aspx"&gt;Delphi for PHP&lt;/a&gt; (windows | pago)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Encontrei os 50 primeiros editores, os demais foram sugestões dos comentários. Não testei todos, mas tem muito coisa boa aí no meio.&lt;br /&gt;Essa grande quantidade de editores mostra como a linguagem PHP é amplamente suportada por todo o mundo e nos garante (nós programadores PHP) opção de uma solução que mais se adeque às nossas necessidades.&lt;br /&gt;Outro fato interessante é a quantidade de sistemas operacionais que são suportados pelos editores, com isso, podemos escrever PHP em nosso S.O. preferido.&lt;br /&gt;&lt;br /&gt;Até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-3055826996874671637?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/3055826996874671637/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=3055826996874671637' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/3055826996874671637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/3055826996874671637'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/editores-php.html' title='Editores PHP'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2151093074366495693.post-7295658028054301276</id><published>2007-01-05T12:42:00.000-02:00</published><updated>2007-01-05T12:45:43.091-02:00</updated><title type='text'>Até que enfim!!!</title><content type='html'>Até que enfim tenho um blog!&lt;br /&gt;Meu nome é Thiago Melo de Paula, sou Desenvolvedor Web, Cristão (Batista) e Casado (muito bem casado!).&lt;br /&gt;Postarei aqui informações sobre o meu dia-a-dia no trabalho e outras coisas que acontem ao meu redor.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2151093074366495693-7295658028054301276?l=tmpblg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tmpblg.blogspot.com/feeds/7295658028054301276/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2151093074366495693&amp;postID=7295658028054301276' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/7295658028054301276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2151093074366495693/posts/default/7295658028054301276'/><link rel='alternate' type='text/html' href='http://tmpblg.blogspot.com/2007/01/at-que-enfim.html' title='Até que enfim!!!'/><author><name>Thiago Melo de Paula</name><uri>http://www.blogger.com/profile/12569827106502498651</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
