Certo dia, um colega de trabalho me veio com a seguinte questão: Imagine que você esteja querendo fazer um sistema de cadastro de produtos para uma loja virtual, por exemplo. Além das informações comuns, que terão em todos os produtos (marca, preço, quantidade etc), você precisa colocar informações diferentes em cada produto. Por exemplo:

Produto 1

Produto: Notebook Marca: Dell Preço: 2.890,00 Processador: Intel Core 2 Duo T6600 Sistema Operacional: Windows 7 Memória RAM: 3GB (DDR2, PC5300) expansível até 4GB

Produto 2

Produto: Monitor LCD Marca: LG Preço: 465,00 Tamanho da tela: 18,5″ Resolução recomendada: 1360×768 pixels A60Hz Brilho: 200cd/m2 Contraste: DFC 30.000:1 Pudemos perceber que as 3 primeiras informações são preenchidas em todos os produtos, porém há uma grande quantidade de informações específicas, que podemos chamar de atributos, em cada tipo de produto.

Problemática

Como registrar os dados no banco de forma a permitir quantidade ilimitada de atributos?

Solução

A solução é simples: Basta você criar um Array com todos esses atributos (e respectivos valores) e, a partir dele, transformar tudo em uma String formatada utilizando a função serialize(). Veja o exemplo abaixo:

<?
$attr = array(
  'Processador' => 'Core 2 Duo',
  'Sistema Operacional' => 'Windows 7',
  'Memória RAM' => '3GB'
);

// Serializando os atributos
$string = serialize($attr);

// O resultado será: a:3:{s:11:"Processador";s:10:"Core 2 Duo";s:19:"Sistema Operacional";s:9:"Windows 7";s:9:"Memória RAM";s:3:"3GB";}
print $string
?>

Dessa forma você pode criar, no banco de dados, além dos campos principais citados anteriormente (nome, marca, modelo, preço, quantidade etc), apenas 1 campo chamado atributo que receberá essa string gerada pela função serialize(). Depois, para resgatar as informações, basta fazer o efeito inverso utilizando a função unserialize() e vc terá o Array novamente. Veja o exemplo:

<?
$string = 'a:3:{s:11:"Processador";s:10:"Core 2 Duo";s:19:"Sistema Operacional";s:9:"Windows 7";s:9:"Memória RAM";s:3:"3GB"}';

$attr = unserialize($string);
?>

 

Conclusão

Sempre que você precisar armazenar variáveis complexas, como essa de atributos, trabalhe com as funções serialize() e unserialize(). Elas serão a salvação para seu programa. Você não precisará criar 1 tabela para cada tipo de produto (haha) nem limitar a quantidade de informações do seu sistema. Provavelmente você já conhece e já trabalhou com essas funções… Mas, caso não conheça, espero ter ajudado Wink

Carlos Alan on qui, 29/04/2010 - 13:49

O Blog é recente?

Parabéns pelo post, show de bola a dica!

tregismoreira on qui, 29/04/2010 - 13:51

Sim, é recente.. Tem menos de 1 mês. Inscreva-se no Feed e acompanhe as atualizações Wink

Obrigado pelo comentário.

Jackson Malta on sex, 28/05/2010 - 13:48

Vlw Thiago.. To criando um jogo de cartas e utilizei uma ideia parecida, porém salvava tudo na mão e resgatava tudo na mão (na mão digo manualmente) e essa é a solução que eu precisava hehe.. parece que foi escrito pra mim esse POST. Vlw grande abraço!

tregismoreira on qua, 28/04/2010 - 13:51

Que legal, Jackson! Que bom que o post te ajudou…

Quando terminar o jogo de cartas, manda o link Smile

Boa sorte e vlw pelo comentário!

Jackson Malta on qua, 28/04/2010 - 13:52

Pode deixar.. é pessoal por gostar do jogo.. não sei se termino não hauhaua..

OBS: quando digo Manualmente no post quero dizer que criei uma função pra poder tratar esse tipo de Array. E é uma bagunça hauhauaha.. tava pensando se não ia ter problemas..

Mas uma vez foi bom ter passado aqui e lido essa dica.. vlw

CAPTCHA
Esta questão é para testar se você é um visitante humano e impedir submissões automatizadas spam.