Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, Boa tarde!
Estou com uma dúvida e resolvi vir pedir ajuda a vocês.
Estou fazendo um cadastro de clientes, onde posso adicionar quantos e-mails e telefones quiser, já resolvi o lado do html e jquery, porém, não sei ao certo como trabalhar com o php e o mysql.
No php, estou testando usar dois Arrays com todos os e-mails e telefones, porém, como faço pra gravar no banco?
Alguém tem uma ideia de como posso fazer?
Você vai precisar de uma tabela exclusiva para armazenar os e-mails e outra para os telefones.
Daí em cada registro você relaciona com o ID do cliente, entendeu?
Então, eu tenho as 3 tabelas abaixo, onde na tabela cliente_telefone e cliente_email, eu faço referência ao registro do cliente no campo 'fk_cliente'. Está correto assim?
cliente.sql
CREATE TABLE IF NOT EXISTS `cliente` (
`id_cliente` int(11) NOT NULL AUTO_INCREMENT,
`tipo_cliente` enum('PF','PJ') NOT NULL DEFAULT 'PF',
`razao_nome` varchar(150) NOT NULL,
`cnpj` char(15) DEFAULT NULL,
`cpf` char(11) DEFAULT NULL,
`cep` char(8) NOT NULL,
`endereco` varchar(80) NOT NULL,
`numero` int(6) NOT NULL,
`complemento` varchar(20) DEFAULT NULL,
`bairro` varchar(30) NOT NULL,
`cidade` varchar(30) NOT NULL,
`fk_estado` char(2) NOT NULL,
`telefone` varchar(12) NOT NULL,
`responsavel` varchar(150) NOT NULL,
`data_inicial` date NOT NULL,
`observacoes` varchar(300) DEFAULT NULL,
PRIMARY KEY (`id_cliente`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
cliente_telefone.sql
CREATE TABLE IF NOT EXISTS `cliente_telefone` (
`id_telefone` int(11) NOT NULL AUTO_INCREMENT,
`fk_cliente` int(11) NOT NULL,
`telefone` varchar(60) NOT NULL,
`tipo` enum('1','2','3','4') NOT NULL DEFAULT '1',
PRIMARY KEY (`id_telefone`),
KEY `fk_cliente` (`fk_cliente`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
cliente_email.sql
CREATE TABLE IF NOT EXISTS `cliente_email` (
`id_email` int(11) NOT NULL AUTO_INCREMENT,
`fk_cliente` int(11) NOT NULL,
`email` varchar(60) NOT NULL,
PRIMARY KEY (`id_email`),
KEY `fk_cliente` (`fk_cliente`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;Eu excluria os campos:
id_email int(11) NOT NULL AUTO_INCREMENT,
e:
id_telefone int(11) NOT NULL AUTO_INCREMENT,
são desnecessários, pois se você trabalhar com chave composta(fk_cliente + telefone|email), nem vai usar eles.
Entendi, mas nesse caso, como faço a identificação da chave primaria? ou é desnecessário?
>
Entendi, mas nesse caso, como faço a identificação da chave primaria?
e você precisa fazer ?
Já fiz sistemas assim, e no caso é desnecessário você identificar cada linha de forma única, afinal, todas pertencem ao cliente, e a FK tá lá para isso.
Por isso que eu sugeri a exclusão dessas PKs.
Se ainda assim, você precisar, pode usar composta, como sugeri.
WHERE fk_cliente = 2 AND email = 'exemplo@provedor.com'
partindo do princípio de que seu cliente, não vai cadastrar emails e nem telefones repetidos, esse WHERE te leva sempre a um único registro.
O correto é fazer assim:
PRIMARY KEY (fk_cliente, telefone),
e excluir esse campo id_telefone.
A mesma coisa para a tabela de e-mails.
Olá pessoal.
William, realmente não há necessidade da chave primeira nem do ID, fiz da forma que recomendou e fica até mais pratico para entendimento. Valeu ;)
Só estou com um problema que é para o SELECT, estou usando INNER JOIN, mas não consigo recuperar todos os e-mails ou telefones de determinado usuário. só consigo recuperar o primeiro e-mail e o primeiro telefone.
o banco já está modelado ?
se estiver normalizado, você terá q percorrer cada array com um for(), e inserir na respectiva tabela.
TABLE telefone
id_usuario, telefone
TABLE email
id_usuario, email
Algo do tipo.