Acesso a um registro completo ou a vários registros de uma tabela com Spoon

Veremos neste artigo como acessar vários registros de uma base de dados com as bibliotecas Spoon, utilizando o método getRecord() e getRecords().

Por Miguel Angel Alvarez - Tradução de Celeste Veiga


Publicado em: 17/11/11
Valorize este artigo:
Estamos dedicando uma serie de artigos para explicar a classe para o acesso à base de dados que nos oferecem as bibliotecas Spoon para PHP 5. Em capítulos anteriores do Manual de Spoon, explicamos como realizar uma conexão com uma base de dados e como efetuar uma consulta para obter um dado simples. Vimos, ademais, como parametrizar consultas SQL, que nos facilitará realizar sentenças personalizadas com variáveis sem ter que ir concatenando valores na sentença SQL.

Agora vamos nos dedicar a ver outros métodos um pouco mais avançados para o acesso à bases de dados, especificamente os métodos getRecord() e getRecords() que nos servem para acessar vários campos de um registro ou vários campos de vários registros. Em resumo, tudo o que realizamos habitualmente com sentenças SQL de tipo SELECT.

Recebendo um registro único

A função getRecord() de Spoon permite acessar um único registro de uma tabela. Retorna um array associativo de uma dimensão cujos índices são os nomes dos campos, que têm os valores armazenados neles.

Nota: Na realidade esta função não existiria em PHP de maneira nativa, pois quando acessamos um registro ao executar um SELECT, sempre retorna um conjunto de registros (embora o conjunto tenha um único elemento). No caso de Spoon esta função pode-nos facilitar um pouco a vida, porque nos encurta o acesso aos dados, já que retorna os dados do registro em um array.

O método getRecord() recebe a consulta que se deseja realizar, na qual se podem parametrizar diversos valores tal como vimos no método getVar().

$ssql = "select * from usuario where id_usuario=?";
$registro = $db->getRecord($ssql, 1);

Neste exemplo estamos recebendo os dados do usuário que tem identificador de usuario id_usuario=1 (O "?" é substituído pelo valor passado a getRecord() em seu segundo parâmetro).

O que obtemos na variável $registro é um array com todos os campos do usuário consultado. Se fizéssemos um dump com o método estático dump() da classe Spoon:

Spoon::dump($registro, false);

Obteríamos uma saída parecida com a seguinte:

array(4) {
["id_usuario"] => string(1) "1"
["nome_completo"] => string(20) "Miguel Angel Alvarez"
["email"] => string(26) "correo.miguel@desarrolloweb.com"
["password"] => string(6) "mm123456"
}

Nota: Logicamente, a saída dependerá dos campos que tenha nossa tabela de usuários. Mas o que você deve prestar atenção é que todos os valores do array são de tipo string, inclusive o identificador do usuário, que na tabela está definido como INT.

Vale dizer que, caso não se encontre nenhum registro na consulta, a função getRecord() retornaria null. Nós deveríamos tratar esse valor de retorno para nos assegurarmos de que não é null antes de acessar os campos do array associativo.

if($registro){
   echo "<p>O nome desse usuario era: " . $registro["nome_completo"];
   echo " e o email desse usuario: " . $registro["email"];
}else{
   echo "Não recibi nenhum registro!";
}

Recuperar vários registros simultaneamente

A função comentada na epígrafe anterior getRecord() retorna sempre um array de uma única dimensão. Ou seja, se a consulta a ser executada devolvera vários registros, somente entregaria a você um array de uma dimensão contendo o primeiro deles.

Entretanto, em seu dia-a-dia como desenvolvedor, provavelmente resulte mais habitual fazer consultas tradicionais, nas que você obtenha uma serie de registros. Para tanto você deve utilizar o método getRecords(), que retorna um array bidimensional, contendo vários registros.

Nota: Talvez você tenha percebido, mas as funções visões neste artigo, embora parecidas, se distinguem porque a que retorna um array bidimensional com vários registros termina com um "s". Leia-se getRecord() e getRecords().

$ssql = "select * from usuario";
$registro = $db->getRecords($ssql);

Neste exemplo obteríamos um array com 2 dimensões. O índice principal começa em zero e contem tantos elementos como registros encontrados. Em cada um deles teríamos cada um dos usuários de nossa tabela usuario.

O conteúdo de retorno terá uma forma parecida com esta:

array(2) {
[0] => array(4) {
["id_usuario"] => string(1) "1"
["nome_completo"] => string(20) "Miguel Angel Alvarez"
["email"] => string(26) "correo.miguel@desarrolloweb.com"
["password"] => string(6) "miguelito"
}
[1] => array(4) {
["id_usuario"] => string(1) "2"
["nome_completo"] => string(20) "Pepe Pedrales García"
["email"] => string(22) "pepe@desarrolloweb.com"
["password"] => string(9) "chavepepe"
}
}

Esse exemplo onde recuperamos vários registros se pode complicar tanto quanto desejemos, parametrizando dados na consulta e realizando operações típicas de base de dados como união de tabelas. Por exemplo, a seguir você pode ver algo um pouco mais elaborado.

$ssql = "select us.nome_completo, log.id_log_acesso_usuario, log.data, log.log from usuario as us inner join log_acesso_usuario as log on log.id_usuario=us.id_usuario where us.id_usuario=:id_usuario and log.data=:data";
$registro = $db->getRecords($ssql, array("id_usuario"=>1, "data"=>"2011-07-12"), "id_log_acesso_usuario");

Neste caso vemos como se utilizam dois parâmetros na consulta, enviados em um array passado como segundo parâmetro em getRecords(). Porém, ademais há um terceiro parâmetro que nos permite esta função especificamente que serve para alterar os identificadores principais do array principal.

Neste caso como terceiro parâmetro colocamos o valor "id_log_acesso_usuario", o que quer dizer que no identificador do primeiro array serão utilizados os valores dos registros que haja no campo "id_log_acesso_usuario". Isto pode servir para que, caso você queira acessar rapidamente determinados registros do array cujos identificadores você conhece, você não tenha que fazer uma nova busca dentro do array, mas sim utilizar esses identificadores que você já tem.

Para tentar esclarecer este último ponto, você pode ver o array que retornaria a chamada anterior a getRecords():

array(2) {
[2] => array(4) {
["nome_completo"] => string(20) "Miguel Angel Alvarez"
["id_log_acesso_usuario"] => string(1) "2"
["fecha"] => string(10) "2011-07-12"
["log"] => string(37) "Acesso nao permitido as 15:01 horas"
}
[4] => array(4) {
["nombre_completo"] => string(20) "Miguel Angel Alvarez"
["id_log_acesso_usuario"] => string(1) "4"
["data"] => string(10) "2011-07-12"
["log"] => string(34) "Acesso concedido as 19:18 horas"
}
}

Se você observar, no array principal há uns identificadores que não partem do zero, senão que se utilizam os valores que havia no campo "id_log_acesso_usuario" de nossa base de dados.

Até agora só vimos sentenças de seleção de dado, e por essa razão logo passaremos a outras operações sobre tabelas, como inserções ou atualizações. Não obstante, esperamos que o que foi explicado até o momento tenha dado uma visão interessante sobre as possibilidades da camada de abstração de base de dados das bibliotecas Spoon.






Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato