quarta-feira, 14 de março de 2012

Sempre tem um plano B




Direto da orelha de um livro de um amigo dali. :-)

"Quando em mim, assim de pronto, me refaço em cada canto
Mas só abro a boca estalada no espaço do escuro
Invento um muro, mudo o quando do norte
E cubro na letra a face do fim.

A farsa da morte é o pó.
A farsa do medo é o sim.

Me acho embaixo de um quando
Olhando de lado procurando um tato
Uma mesma ideia falada lá trás
Quando dizia que o tempo era questão de um agora.

Mas o mesmo virou do avesso
Bem ali no vidro de um carro
Escorrendo devagar no olho atento
Como se algo fosse a espera de um onde.

Da farsa há o traço de tragédia contada
Onde ali no meio descubro a brecha
Um pedaço de onda pra lá do então
Ponto de vista, miolo do oco.

Surge o som que recorre
Como um meio de passo
Um jeito de andar, travessia do ali
Onde me acho quieto em visto de alerta...

...a espera de um estado de ritmo!"

Acesso a banco de dados em PHP: algumas diferenças entre os métodos estruturado e orientado a objetos

O PHP é uma linguagem de programação híbrida que tanto pode funcionar orientado a objetos quando de modo estruturado.

Tenho me dedicado nos últimos ao desenvolvimento de alguns scripts para tratamento identificação de nomes na base de dados de docentes, alunos e funcionários da USP. Problema crítico, dado que a quantidade de pessoas no banco chega próximo a 1milhão e, como meu objetivo é identificar de modo automático o nome do autor de um artigo e sua localização dentro da USP, a tarefa se torna de uma escala considerável.

Semana passada, montei um pequeno script, que reproduzo logo a seguir, para buscar no banco de dados a ocorrência de nomes idênticos a um arquivo base em CSV que eu tinha a minha disposição. Esse arquivo em CSV foi gerado com outro script que montei, que pega o nome de todos os autores de um artigo, identifica aqueles que são da USP e cria linhas separadas para cada um deles. Muito, bem, com esse arquivo na mão montei o script abaixo para consulta no banco de dados:

    $consulta = 'SELECT CODPES FROM tudo t WHERE t.NOMPES =\''.$nomecompleto.'\' LIMIT 0,1';
    $resultado = $mysqli->query($consulta);   
    if ($resultado->fetch_row())
        list($codigopessoa) = $resultado->fetch_row();
       



Até aí, normal. Quando comecei a rodar na consulta a base de nomes, um erro interessante apareceu, indicando ser na linha do comando fetch_row() acima listado: Fatal error: Call to a member function query() on a non-object.
 
Até então, não tinha visto esse erro no acesso a um banco de dados. O código estava correto e retornava o resultado até um determinado número de registros de meu arquivo CSV, sendo que acima desse número o script simplesmente parava de funcionar. Eu estava usando a conexão orientada a objetos, a partir da classe mysqli para acesso ao banco.

Checando em alguns fórums, achei uma recomendação que dizia utilizar o modo estruturado para acesso ao banco, dado que isso teria um outro efeito no modo de gerenciamento de conexões, evitando esse tipo de erro em um conjunto massivo de dados. Bingo. Mudei o script acima para esse aqui e funcionou:

$consulta = 'SELECT CODPES FROM tudo t WHERE t.NOMPES =\''.$nomecompleto.'\' LIMIT 0,1';
    $resultado = mysql_query($consulta,$mysqli);

    while ($row = mysql_fetch_assoc($resultado)) { ....}


Conclusão: os métodos de acesso não são diferentes, em termos de comportamento, apenas por uma questão de serem estruturados ou orientado a objetos. Eles são diferentes enquanto modo de gerenciamento de conexão, podendo resultar em erros de acesso ao banco quando utilizados de modo massivo.