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 
Desenvolvedor Web, especialista em criação de interfaces ricas. Tenho uma proposta de desenvolver projetos de qualidade, dentro dos padrões Web standards, sempre prezando a usabilidade e acessibilidade, promovendo uma experiência bastante agradável ao usuário final.
O Blog é recente?
Parabéns pelo post, show de bola a dica!
Sim, é recente.. Tem menos de 1 mês. Inscreva-se no Feed e acompanhe as atualizações
Obrigado pelo comentário.
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!
Que legal, Jackson! Que bom que o post te ajudou…
Quando terminar o jogo de cartas, manda o link
Boa sorte e vlw pelo comentário!
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
Deixe um Comentário