quarta-feira, 14 de março de 2012

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.

Nenhum comentário: