Abstração de SGBD no PHP – PEAR::MDB2
Em 26/10/2009 by acalbuquerque
categorizado em Destaques, PHP, Tecnologia
As conexões com um banco de dados SQL estão presentes em quase 100% das páginas que utilizam algum tipo de BD, mas o grande problema é que nem sempre quem escreve esses scripts sabem fazê-las de forma segura e sustentável.
Pensando nisso, um grupo de programadores do *PEAR decidiu criar um package (uma classe) que melhorasse as conexões SQL e ao mesmo tempo fosse compatível e fácil de ser usado em diversos tipos de bancos de dados, assim surgiu o package PEAR::DB que evoluiu para o PEAR::MDB2.
Se você utiliza uma versão do PHP5+ ou um servidor recente, é muito provável que já tenha tanto o PEAR como o pacote MDB2 instalados. Caso não, pesquise no google como instalar o pear e a mdb2, pois existem muitos resultados falando já sobre isso.
*PEAR é um repositório de packages (classes) PHP criado e mantido por centenas de programadores, com o intuito de criar e melhorar a usabilidade do PHP. Eles disponibilizam diversos pacotes que estão em constantes melhorias e cada qual com uma utilidade mais incrível que o outro.
Tamanhas são as utilidades dos pacotes PEAR que as versões mais novas do PHP já são distribuídas com o PEAR e seus pacotes mais usados já instalados.
Mais informações no site www.pear.php.net
- Conexão
A primeira coisa a se observar, é que para podermos usar um package da PEAR é necessário dar um include no arquivo principal deste, no nosso caso, devemos adicionar o arquivo MDB2.php no início de tudo (não é necessária a especificação do caminho):
require_once('MDB2.php');
- Declaração da DSN
Feito isso, devemos nos conectar ao banco de dados. As conexões dos packages da PEAR (DB e MDB2) seguem uma sintaxe um pouco diferente da comumente utilizada pelos famosos mysql_connect, ou pg_connect, etc. Começando por uma DSN, que é uma string que possui uma forma especifica de declaração, englobando os dados da conexão:
phptype://usuario:password@host/database
onde:
phptype = Tipo de DB{
fbsql: FrontBase
ibase: InterBase
mssql: Microsoft SQL Server
mysql: MySQL
mysqli: MySQL Improved
oci8 : Oracle 7/8/9
pgsql: PostgreSQL
querysim: QuerySim
sqlite: SQLite
}
usuario = nome de usuário
password = senha
host = host
database = nome do DB
- Conectando
Declarada a DSN, falta chamar o método de conexão, existem três:
- connect : Era mais usado no package PEAR:biggrin.gifB, mas caiu em desuso com o MDB2 (mas preservado).
- singleton : É usado para evitar que se sejam criadas duas conexões com a mesma DSN. Caso já haja alguma, ele retonará um erro.
- factory : É o mais utilizado e recomendado para a maioria das tarefas
*obs: Para chamá-los devemos precedê-los de MDB2:: e usar como argumento a DSN:
$con =& MDB2::factory($dsn);
ATENÇÃO!
Para que o uso do MDB2 funcione corretamente é necessário o uso de um objeto-referência do objeto original em vez de uma cópia:
- $con =& MDB2::factory($dsn);
e NÃO
- $con = MDB2::factory($dsn);
- Recuperando dados
Para recuperarmos dados da DB (SELECT, SHOW, EXPLAIN, etc) utilizamos o método query().
Ele deve ser chamado através do objeto da conexão:
$result =& $con->query($sql_query);
Será retornado um handler para o resultado, e através dele podem ser usados outros métodos (atente novamente para o uso de referências – &).
$result =& $con->query('SELECT * FROM table WHERE column=1');
//ou
$select = 'SELECT * FROM table WHERE column=1';
$result =& $con->query($select);
Número de linhas Retornadas
Para verificar o número de linhas retornadas devemos usar o método numRows() do objeto-resultado.
$rows = $result->numRows();
Retirando dados do objeto-resultado
Após realizada a query, devemos chamar outro método caso desejemos usar os dados retornados: o fetchRow().
Este método aceita como parâmetro a forma como o resultado deve ser retornado, existem três tipos:
- MDB2_FETCHMODE_ORDERED
Modo padrão, retorna uma array em que cada chave numérica corresponde á coluna mais á esquerda, em ordem crescente e começando pelo 0.
$row =& $result->fetchRow(MDB2_FETCHMODE_ORDERED); //Resultado: Array ( [0] => Valor1 [1] => 1 [2] => Valor3 )
- MDB2_FETCHMODE_ASSOC
Esse modo retorna uma array em que cada chave é o nome da coluna correspondente.
$row =& $result->fetchRow(MDB2_FETCHMODE_ASSOC); //Resultado: Array ( [coluna1] => Valor1 [coluna2] => 1 [coluna3] => Valor3 )
- MDB2_FETCHMODE_OBJECT
-Esse modo retorna um objeto em que cada coluna é tratada como um atributo.
$row =& $result->fetchRow(MDB2_FETCHMODE_OBJECT); //Resultado: stdClass Object ( [coluna1] => Valor1 [coluna2] => 1 [coluna3] => Valor3 )
Alternativamente podemos configurar um FETCHMODE padrão para a conexão com que vamos trabalhar através do método setFetchMode(). Feito isso, caso chamemos, por exemplo, um fetchRow() (sem argumento), a forma retornada seria a indicada nesse método.
$con->setFetchMode(MDB2_FETCHMODE_ORDERED); // ou $con->setFetchMode(MDB2_FETCHMODE_ASSOC); //ou $con->setFetchMode(MDB2_FETCHMODE_OBJECT);
- Método fetchAll()
Esse método retorna uma array bidimensional contendo todas as linhas do objeto-resultado.
$row =& $result->fetchAll(MDB2_FETCHMODE_ASSOC); //resultado Array ( [0] => Array ( [coluna1] => Valor1 [coluna2] => 1 [coluna3] => Valor3 ) [1] => Array ( [coluna1] => V1 [coluna2] => 2 [coluna3] => V3 ) )
Uma maneira mais rápida e prática e fazer isso tudo seria o uso do método queryAll() = query()+fetchAll()
$row =& $con->queryAll("SELECT * FROM test", MDB2_FETCHMODE_ASSOC);
Executando Query´s
Para executar query de manipulação de dados (INSERT, UPDATE, DELETE), não deve ser o usado o método query() e sim o exec()
Esse método retornará um erro caso seja usado com queries que não sejam DMQs, como SELECT.
$sql ="INSERT INTO test(coluna1, coluna2, coluna3) VALUES ('v_col1', 3, 'v_col3')"
$nrows =& $con->exec($sql);
Tratamento de erros
Para evitar problemas tanto no código como de segurança, deve-se sempre fazer uma verificação se a ação não resultou em um erro, para tanto usamos o método PEAR::isError($objeto->resultado).
Verificado que existe um erro, podemos obter a mensagem enviada pelo MDB2 através do método getMessage()
$result =& $cnt->query("SELECT * FROM tabela_inexistente");
if(PEAR::isError($result)) { die($result->getMessage()); }
Referências:
Oficial da PEAR: www.pear.php.net/manual/en/package.database.mdb2.php
CODESCHMIE: codeschmie.de/archives/127-MDB2-Cheatsheet.html
phpied http://www.phpied.com/
Qualidade de código PHP – xDebug
Em 14/09/2009 by acalbuquerque
categorizado em PHP, Tecnologia
Como o processo de desenvolvimento de software é sujeito a erros, a atividade de teste é fundamental para se obter produtos com garantia de qualidade. Portanto, é importante que você tenha antes de qualquer coisa, essa afirmação anterior como regra a ser seguida.
Fazer o debug de aplicações PHP sempre foi um grande problema. Utilizar echo e var_dump não é a melhor maneira, além de não ser nada elegante. Existe uma forma de realizar o debug de aplicações PHP de forma mais correta e útil. Esta forma é usando-se a extensão chamada xdebug.
O que é isso?
O Xdebug é uma extensão para PHP que como o próprio nome sugere, serve para auxiliar no debug de scripts PHP.
O que isso faz?
O Xdebug vai mostrar diversas informações importantes sobre o erro. O Xdebug adiciona várias opções ao php, uma delas é refazer o var_dump.
Como Instalar?
O meu ambiente de testes é o Ubuntu 9.04, porém se você é usuário Windows o mais fácil é fazer o download de um arquivo dll no site e salvá-lo no diretório ext do PHP.
Para usuários Linux, a melhor maneira é fazer a instalação usando o comando pecl:
$ sudo apt-get install php5-dev php-pear
$ sudo pecl install xdebug
No meu caso o xdebug ficou em:
/usr/lib/php5/20060613+lfs/xdebug.so
Para que o php considere o uso da extensão, o arquivo de inicialização php.ini deve ser editado
sudo gedit /etc/php5/apache2/php.ini
acrescente no fim do arquivo:
zend_extension=”/usr/lib/php5/20060613+lfs/xdebug.so”
Ou para windows: zend_extension_ts=”c:/xampp/php/ext/php_xdebug.dll”
Após isso, adicione as configurações do xdebug:
xdebug.default_enable = On
xdebug.collect_includes = On
xdebug.collect_params = On
xdebug.collect_return = On
xdebug.collect_vars = On
E agora basta reiniciar o apache:
sudo /etc/init.d/apache2 restart
- Novo var_dump
Quando a extensão está ativa, o comando var_dump mostra informações mais detalhadas das variáveis. Para testar é só executar o var_dump passando como parâmetro qualquer variável ou objeto do script. ex:
<?php $dados = array( 'um' => 'uma string', 'dois' => array( 'two.one' => array( 'two.one.zero' => 210, 'two.one.one' => array( 'two.one.one.zero' => 3.141592564, 'two.one.one.one' => 2.7, ), ), ), 'tres' => $t, 'quatro' => range(0, 5), ); var_dump( $dados ); ?>
Proteção de memória
É possível configurar o Xdebug para proteger o servidor em caso de um loop infinito, que poderia consumir muitos recursos. Por default o Xdebug configura para 100 iterações. Para modificar esta características devese adicionar a seguinte linha no php.ini e depois reinicie o apache:
xdebug.max_nesting_level=10
Assim, o programa abaixo vai invocar a função loop_infinito() somente dez vezes e depois irá gerar um erro:

- Coletando mais informações
Para que o Xdebug possa coletar mais informações sobre os erros é possível configurá-lo para capturar as variáveis globais como POST, GET, FILES, etc. Para isso é só adicionar as linhas abaixo no php.ini e depois reinicie o apache:
;; //Capturar as variáveis globais
xdebug.dump.GET=*
xdebug.dump.POST=*
xdebug.dump.COOKIE=*
xdebug.dump.ENV=*
xdebug.dump.FILES=*
xdebug.dump.REQUEST=*
xdebug.dump.SERVER=*
xdebug.dump.SESSION=*
ps: O *( lê-se coringa) pode ser substituído pelo nome da variável que se deseja capturar.
Testes
Quantas funções foram invocadas no script?
<?php echo xdebug_get_function_count(); ?>
Quanto tempo demorou a execução?
<?php
for($i=0;$i<1000000;$i++) {
$j = $i;
}
echo "Tempo de execução=". xdebug_time_index();
?>
Quanta memória utilizou?
<?php
echo "Memória: ", xdebug_memory_usage(), " bytes\n\n";
for($i=0;$i<1000000;$i++) {
$j = $i;
}
echo "Máximo de Memória usada: ", xdebug_peak_memory_usage(), " bytes\n";
?>
Trace da aplicação
Para acompanhar o fluxo da aplicação é preciso adicionar as linhas abaixo no php.ini e depois reinicie o apache:
xdebug.auto_trace=1
xdebug.trace_output_dir=/tmp
xdebug.trace_options=1
xdebug.trace_format = 0
Desta forma será criado um arquivo no /tmp chamado trace.??? para cada script PHP que for executado. Neste arquivo estará descrito cada comando executado, variáveis criadas, etc. Assim facilita a visualização do fluxo do script e eventuais erros.
Profiling
Profiling é uma maneira de visualizar quais partes do código do script estão demorando mais para executar. O Xdebug precisa ser configurado para poder gerar estas estatísticas. Para isso deve-se adicionar as linhas no php.ini e depois reinicie o apache:
xdebug.profiler_enable = 1
xdebug.extended_info = 0
xdebug.remote_enable = 0
xdebug.profiler_output_dir=/tmp
Após a execução de um script é gerado um arquivo no /tmp com as estatísticas de execução. Para analisarmos estas estatísticas podese usar uma ferramenta gráfica de cache profiling como kcachegrind(para Linux), WinCacheGrind(para windows) ou a ferramenta web Webgrind.
Enfim, existem outras funcionalidades que podem ser somadas e usadas com o xDebug, mas isso fica para um próximo post.
Referências:
http://code.google.com/p/webgrind/
Cheat Sheet´s de Linguagens de Programação
Em 25/07/2009 by acalbuquerque
categorizado em MySQL, PHP, Tecnologia
Para finalizar a longa sequência de post´s com Cheat Sheet´s, segue este que será o mais completo de todos com várias LP´s e vários Cheat sheet´s de cada uma.
- Expressões Regulares (standart)

É um guia para os padrões de expressões regulares, e não é específica a um único idioma.
Esta é a segunda versão do Cheat Sheet. A versão anterior podem ser encontrados em http://migre.me/4azQ.
- Apache Mod_Rewrite

Trata-se de uma folha de referência, para a listagem flags, regras e condições de sobrescrita. Além de listar as variáveis do servidor por expressão regular e vários exemplos de regras comuns.
O mod_rewrite Cheat Sheet é distribuído sob a Creative Commons License (Attribution, Non-Commercial, Share Alike).
- Python Cheat Sheet´s

Trata-se de uma folha de referência para a linguagem de programação Python e seus métodos, funções e sintaxe e é distribuído sob a Creative Commons License (Attribution, Non-Commercial, Share Alike).
Muito boa!
- PHP Cheat Sheet´s

Trata-se de uma folha de referência para a linguagem de programação PHP e seus métodos, funções e sintaxe e é distribuído sob a Creative Commons License (Attribution, Non-Commercial, Share Alike).
Muito boa!
- MySQL Cheat Sheet´s
Funções no MySQL
Muitos desenvolvedores desconhecem que o MySQL possui um enorme número de funções built-in, para fazer tudo a partir de expressão regular com base em comparações de string. As laterais da Cheat Sheet, lista funções MySQL(nota: algumas das mais raras e menos utilizadas funções não foram incluídas devido ao espaço).
Tipos de Dados MySQL
O MySQL permite que muitos tipos de dados para as colunas e é muito fácil esquecer que existem restrições sobre estes tipos de dados. Isto é especialmente importante quando se trata de validação – muitos desenvolvedores não verificam o comprimento dos dados antes de inseri-lo em uma tabela. Esta seção lista os tipos de dados disponíveis e suas limitações.
![]()
Funções MySQL no PHP
O PHP tem o driver do MySQL e é utilizado pela maioria dos desenvolvedores PHP para conectar-se e consultar um banco de dados MySQL. Esta seção contém a lista das funções disponíveis no PHP para conectar-se e gerir um banco de dados MySQL.
- Outras
Download aqui!
Download aqui!
Download aqui!
Download aqui!
WordPress Cheat Sheet´s Help Reference
Em 25/07/2009 by acalbuquerque
categorizado em Destaques, JS/HTML, PHP, Tecnologia
O WordPress Help Sheet é o mais útil guia se você for um programador de temas para o WP. É um guia de referência rápida para as mais comuns sintaxes utilizadas no WP. Apenas os mais necessários e mais comuns trechos estão incluídos, clique aqui para baixar o pdf.
Já aqueles que criam temas WordPress regularmente, WPCandy criou uma avançada ferramenta de ajuda. Contém os codigos mais utilizados para temas que requerem funcionalidades adicionais. Qualquer criador de temas profissionais deveria ter este guia na mão clique aqui para baixar o pdf.
E para finalizar, segue uma checklist para desenvolvimento de temas WP. A lista abrange tópicos gerais (como informação e imagens), componentes do blog (como feeds RSS), timestamps, bem como a categoria de página navegação.
São no total 9 itens:
- General
- Stylesheets
- Browser Compatibility
- Pages
- Styled Everything?
- Standard CSS Classes
- Validate
- WordPress Code
- Blog Elements
Clique aqui para fazer o download da WP Theme Check-List.
Detectar acesso mobile com PHP
Em 14/07/2009 by acalbuquerque
categorizado em Destaques, PHP, Tecnologia
Uma das coisas que estão em alta no momento, é o acesso via celular e smartphones.
Sites criam subdomínios e novos layouts para os acessos via mobile e divulgam o novo endereço para acesso.
Porém e se a URL oficial, que é bem mais divulgada e conhecida, for acessada?
O usuário verá o site oficial e não o mobile certo?
Correto!
Sabendo disso, um grupo de programadores PHP desenvolveu uma biblioteca open-source e bastante eficaz chamada de “Detect Mobile Browsers“ que pode ser baixada clicando aqui ou acessando o site www.detectmobilebrowsers.mobi .
Além disso ela é muito fácil de ser utilizada, pois você pode definir uma página para cada tipo de plataforma e navegador utilizado pelos celulares e smartphones, ou definir uma página padrão para o acesso via todos os dispositivos móveis.
E Pásmem-se!!! Estão sentados??? Mas sentados mesmo ?? Ok… ela também pode definir até mesmo um redirecionamento específico para as plataformas e navegadores comuns em desktops e notebooks.
A biblioteca suporta 8 parametros, ordenadamente são eles:
* iPhone e Ipods – Endereço completo(incluindo http://) ou para o redirecionamento único deixe TRUE ou para não redirecionar deixe FALSE
* Android – Endereço completo(incluindo http://) ou para o redirecionamento único deixe TRUE ou para não redirecionar deixe FALSE
* Opera Mini – Endereço completo(incluindo http://) ou para o redirecionamento único deixe TRUE ou para não redirecionar deixe FALSE
* Blackberry - Endereço completo(incluindo http://) ou para o redirecionamento único deixe TRUE ou para não redirecionar deixe FALSE
* Palm - Endereço completo(incluindo http://) ou para o redirecionamento único deixe TRUE ou para não redirecionar deixe FALSE
* Windows Mobile -Endereço completo(incluindo http://) ou para o redirecionamento único deixe TRUE ou para não redirecionar deixe FALSE
* Mobile Redirect URL – Endereço completo do redirecionamento único (incluindo http://) da página .
* Desktop Redirect URL – Endereço completo(incluindo http://) ou para o redirecionamento único deixe TRUE ou para não redirecionar deixe FALSE
Sem mais enrolation, segue abaixo exemplo de uso:
< ?
// Faz o include do arquivo da Classe PHP
include('mobile_device_detect.php');
// Redireciona todos os acessos via Celular e Smartphone
// para o endereço mobile e os acessos via desktop
// colocamos 'false', para ele carregar está página normalmente.
mobile_device_detect(true,true,true,true,true,true,'http://',false);
?>
Novo release PHP 5.3 antecipa mudanças do PHP 6
Em 27/05/2009 by acalbuquerque
categorizado em Destaques, PHP, Tecnologia
Foi lançado mais um novo candidato release da versão 5.3.0 do PHP. Trata-se do PHP 5.3.0 RC 2 lançado no início do mês.
Essa é a segunda versão candidata e já traz algumas das novas mudanças que o famigerado PHP 6 vai possuir.
Dois recursos que estão presentes na primeira versão de testes do PHP 5.3(PHP 5.3.0 RC 1) continuam sendo aprimorados e com esse segundo canditade, há suporte aos namespaces, enclosures, internacionalização (através da nova extensão intl), manipulação de arquivos phar, suporte melhorado ao SQLite, mysqld e MySQL. Além de possui também várias melhorias de performance e que agora é reservada para o uso da linguagem as palavras “namespace”, “goto” e o nome da classe “clousure”.
A definição do Namespace faz o seguinte:
Todos os nomes de classes e funções dentro são automaticamente prefixadas com o nome do namespace. Em namespace, nomes locais sempre tem precedência sobre nomes globais. Muitos arquivos podem ser usados no mesmo namespace. A declaração do comando namespace precisa ser o primeiro comando no arquivo.
A única exceção é o comando “declare” que pode ser usado antes. Este recurso resolve o problema encontrado principalmente no desenvolvimento de frameworks de desenvolvimento, onde os nomes das classes eram monstruosos para resolver possíveis conflitos de nomes.(*em breve farei um post sobre isso)
Driver nativo MySQL
Nas versões anteriores da linguagem PHP, as interações geralmente ocorriam por meio da biblioteca cliente libmysql. Ela tinha os próprios parâmetros. Agora o driver é o mysqlnd, interno e otimizado para o engine Zend. Um código menor – e, principalmente, mais ágil – garante melhor acoplamento com o banco de dados. Outro ponto é que esse driver agora respeita os parâmetros de memória estabelecidos na configuração do PHP.
*ps: Para acompanhar todas as mudanças, acesse as notas de upgrade.
Emezeta PHP Card Reference
Em 04/05/2009 by acalbuquerque
categorizado em PHP, Tecnologia
Há algum tempo eu possuo essa cartilha de referência de comandos em PHP. É bastante útil nas horas em que você não tem o google disponível.

Elaborada por José Román, estudante de engenharia da computação pela Universidad de La Laguna. Possui uma licensa aberta, com a opção de se fazer uma pequena doação e pode ser baixado em 2 formatos: PDF e PNG.
Para mais informações acesse o site emezeta.
Expressões regulares em PHP
Em 05/03/2009 by acalbuquerque
categorizado em PHP, Tecnologia
As Expressões Regulares são uma potente ferramenta que nos permite contrastar um texto com um padrão de busca. Essa tarefa é fundamental em alguns programas e em outros pode facilitar incrivelmente seu trabalho.
O PHP nos permite dois tipos principais de funções para expressões regulares: as do tipo ereg (Expressões Regulares POSIX) e as do tipo preg (Compatíveis com Perl). São muito similares, mas o segundo modo é mais potente.
Alex Barros do site Boozox.net escreveu um simples manual mas muito completo para aqueles que queiram aprender Expressões Regulares e aplicá-las em PHP. Em Português, você pode aprender também alguma coisa com o livro do Aurélio.









