Ir ao conteúdo

Buscar dados do MYQSL?


leonine

Posts recomendados

  • Moderador
Postado

nao amigo, o valor do campo select é passado para o arquivo php que recebe os outros campos.

e por lá que você faz suas consultas de acordo com a id da localidade. ou seja digamos que seu recebeDados.php é quem recebe..

la você terá uma variavel $localidade = $_POST["localidade"]; pos o name do seu select sera localidade.

a partir disso.. na sua sql você fará toda aquela enorme consulta e no final colocará ... WHERE localidade = $localidade.

nao vai inserir nada.. apenas consultar. os inserts de localidade você faz separado.. pois tens uma tabela localidade onde nele contem a id de cada localidade. +- isso

Postado

Compreendo, mas meu objetivo é criar uma página que exiba todos os dados referentes a uma certa localidade incluindo os dados presentes nas 3 tabelas "parentes" (somente os registros relacionados àquela localidade). Por isso que te perguntei sobre o campo select, pois precisaria está limitando os dados publicados a cada registro da tabela pai, de forma que sejam exibidos quando um registro da tabela mestre for solicitado, assim como acontecem nas redes sociais: você abre sessão de um determinado registro (no caso das redes sociais, um usuário) e esse registro carrega todas as tabelas relacionadas a esse registro, e ainda você pode esta atualizando as tabelas e inserindo mais dados.

  • Moderador
Postado

bem, eu acho que você ainda nao entendeu o funcionamento da sua suas tabelas com seus respectivos relacionamentos e a funçao da criaçao da tabela espelho VIEW.

como explicado anteriormente.. quando você faz um insert você.. você insere dados nas tabelas de acordo com a localidade. quando você criou a view, você criou uma tabela que engloba todos os dados das tabelas. ou seja, você fez a consulta nas 3 e jogou os dados para um tabelao para facilitar a consulta.. justamente para nao ter que usar aquele codigo sql imenso.

como você ja tem aquela tabela espelho ... e nela você armazena também a ID de cada localidade registrada..

você so precisa fazer a consulta simples:

select * from tabelaEspelho where Id_localidade = $idLocalidade(variavel php responsavel por receber a localidade desejada)

é simples assim. eu testei e re testei aqui.. e funciona normalmente.

o que você quer basicamente ja esta criado e funcionando.. você precisa entender a logica do seu programa. abraço

Postado
bem, eu acho que você ainda nao entendeu o funcionamento da sua suas tabelas com seus respectivos relacionamentos e a funçao da criaçao da tabela espelho VIEW.

como explicado anteriormente.. quando você faz um insert você.. você insere dados nas tabelas de acordo com a localidade. quando você criou a view, você criou uma tabela que engloba todos os dados das tabelas. ou seja, você fez a consulta nas 3 e jogou os dados para um tabelao para facilitar a consulta.. justamente para nao ter que usar aquele codigo sql imenso.

como você ja tem aquela tabela espelho ... e nela você armazena também a ID de cada localidade registrada..

você so precisa fazer a consulta simples:

select * from tabelaEspelho where Id_localidade = $idLocalidade(variavel php responsavel por receber a localidade desejada)

é simples assim. eu testei e re testei aqui.. e funciona normalmente.

o que você quer basicamente ja esta criado e funcionando.. você precisa entender a logica do seu programa. abraço

Valeu diff!!! Sei que já estou te incomodando, peço até desculpas; mas, o que ainda não compreendi, é o processo de idexação dos dados; ou seja, como o sistema vai identificar que as imagens que estou fazendo UPLOAD serão destinadas a uma determinada localidade (porque serão vários registros ligados a uma única localidade)? Pelo que entendi, o que você me explicou é o processo de busca e exibição dos registros numa página de exibição. Minha dificuldade é no cadastramento de registros nas trabelas parentes.

  • Moderador
Postado

ah sim, desculpe eu tinha entendi o contrário.

bem as imagens você tem dois meios ... uma é armazenando diretamente dentro do banco de dados... mas isso pode onerar o banco.. tornando ele pesado e lento... o outro é você armazenar as imagens em um diretorio e usar o proprio "id" da linha da localidade pra identificar as fotos..

problema disso: assim você so pode armazenar uma foto por ID...

uma possivel solução... criar uma funçao em php onde automaticamente ele cria uma pasta com o nome igual ao ID da localidade.. e la dentro armazenar as imagens se forem mais do que uma... então jogar elas em um vetor..

ai é bem mais complicado...

confesso que nunca fiz um sistema que permita cadastrar mais do que uma imagem para cada coisa.. eu vou dar uma pesquisada melhor.. depois te digo... sugiro você pesquisar também

abraço

Postado

Diff, sobre armazenar as imagens; eu não tenho muito problema pois uso o banco de dados para guardar o nome da imagem e o php para indicar sua localização. Mas, muito obrigado pelas sugestões.

Sobre o modelo do banco dados que preciso é similar ao modelo que usam para criar sites de comércio virtual; no meu caso, as categorias receberiam o nome de localidades e os produtos, de imagens, comentários ou anuncios.

Por isso que no inicio eu apresentei aquele modelo de relacinamento em que as chaves extrangeiras estariam nas tabelas filhas de forma que quando for cadastrado uma imagem, comentario ou anuncio, seria indexado o ID da localidade desejada na chave extrangeira.

Quando for solicitado determinado registro, ele carregará todas as chaves extrangeiras cujo ID for igual ao registro solicitado.

Imagem de exemplo:

scaled.php?server=706&filename=32842271.png&res=medium

Aqui está modelo da relação de qual estou falando:

scaled.php?server=846&filename=semttulopkh.png&res=medium

Aqui, estão as tabelas:

____________________________________________________________

CREATE TABLE IF NOT EXISTS `localidades` (

`id_local` int(3) NOT NULL AUTO_INCREMENT,

`lcl_nome` varchar(30) NOT NULL,

`lcl_descrever` varchar(500) NOT NULL,

`lcl_fotoU` varchar(20) NOT NULL,

`lcl_fotoD` varchar(20) NOT NULL,

`lcl_fotoT` varchar(20) NOT NULL,

PRIMARY KEY (`id_local`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `local_anuncio` (

`id_anuncio` int(11) NOT NULL AUTO_INCREMENT,

`id_local` int(11) NOT NULL,

`anc_nome` varchar(30) NOT NULL,

`anc_descrever` varchar(500) NOT NULL,

`anc_foto` varchar(20) NOT NULL,

`anc_tel` varchar(15) NOT NULL,

`anc_valor` varchar(15) NOT NULL,

PRIMARY KEY (`id_anuncio`),

KEY `id_local` (`id_local`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `local_coment` (

`id_coment` int(3) NOT NULL AUTO_INCREMENT,

`id_local` int(11) NOT NULL,

`cmt_assunto` varchar(30) NOT NULL,

`cmt_data` date NOT NULL,

`cmt_email` varchar(50) NOT NULL,

`cmt_coment` varchar(11) NOT NULL,

PRIMARY KEY (`id_coment`),

KEY `id_local` (`id_local`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `local_galeria` (

`id_fto` int(3) NOT NULL,

`id_local` int(11) NOT NULL,

`fto_nome` varchar(30) NOT NULL,

`fto_descrever` varchar(500) NOT NULL,

`fto_foto` varchar(20) NOT NULL,

PRIMARY KEY (`id_fto`),

KEY `id_local` (`id_local`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;

-- Restrições para as tabelas dumpadas

--

--

-- Restrições para a tabela `local_anuncio`

--

ALTER TABLE `local_anuncio`

ADD CONSTRAINT `local_anuncio_ibfk_1` FOREIGN KEY (`id_local`) REFERENCES `localidades` (`id_local`) ON DELETE CASCADE ON UPDATE CASCADE;

--

-- Restrições para a tabela `local_coment`

--

ALTER TABLE `local_coment`

ADD CONSTRAINT `local_coment_ibfk_1` FOREIGN KEY (`id_local`) REFERENCES `localidades` (`id_local`) ON DELETE CASCADE ON UPDATE CASCADE;

--

-- Restrições para a tabela `local_galeria`

--

ALTER TABLE `local_galeria`

ADD CONSTRAINT `local_galeria_ibfk_1` FOREIGN KEY (`id_local`) REFERENCES `localidades` (`id_local`) ON DELETE CASCADE ON UPDATE CASCADE;

__________________________________________________________

Aproveitando: seguindo esse modelo é possível você criar pra mim uma view utilizando INNER JOIN (que exiba também os dados da tabela localidades) para que eu possar entender o código.

  • Moderador
Postado

bem, devo admitir que agora seu raciocinio foi quase 100% correto. só tem uma inconsistencia no seu banco. na tabela de galeria, sua chave primária nao esta como auto increment. isso vai causar erro quando tenter incluir dados. arrume isso que funcionará correto.

bom sobre a VIEW, vou lhe passar aqui eu testei e funciona 100%:

como é uma view, sua consulta para exibiçao de dados da tabela abaixo fica: SELECT * FROM VWlocal WHERE id_local = $id_local ( sendo que a variavel $id_local referes-se a id das localidades)

[COLOR="Purple"]CREATE VIEW [COLOR="Black"]VWlocal[/COLOR] AS[/COLOR]
[COLOR="Purple"]SELECT[/COLOR]
localidades.id_local, localidades.lcl_nome,
localidades.lcl_descrever, localidades.lcl_fotoU,
localidades.lcl_fotoD, localidades.lcl_fotoT,
local_anuncio.anc_nome, local_anuncio.anc_descrever,
local_anuncio.anc_foto, local_anuncio.anc_tel,
local_anuncio.anc_valor, local_coment.cmt_assunto,
local_coment.cmt_data, local_coment.cmt_email,
local_coment.cmt_coment, local_galeria.fto_nome,
local_galeria.fto_descrever, local_galeria.fto_foto
[COLOR="Purple"]FROM[/COLOR] localidades
[COLOR="Purple"]INNER JOIN[/COLOR] local_anuncio ON local_anuncio.id_local = localidades.id_local
[COLOR="Purple"]INNER JOIN[/COLOR] local_coment ON local_coment.id_local = localidades.id_local
[COLOR="Purple"]INNER JOIN[/COLOR] local_galeria ON local_galeria.id_local = localidades.id_local

agora explicarei sobre as inserçoes que você nao havia entendido.

bem como você nota, sua tabela localidades controla tudo certo?

então, primeiro você faz o cadastro na tabela localidades.

então depois você faz os cadastros nas demais tabelas referenciando a id da localidade.. transcrevendo isso em PHP e HTML.. basicamente você terá um formulario unico para a localidadade. pois você precisa de um ID para poder cadastrar uma galeria.

e um formulario para os comentarios, pois você também precisa de uma id..

agora eu pergunto.. precisa ser exatamente assim? cadastros sepadaros? a resposta é nao. nao precisa.. mas ai vai complicar bastante ate.. pois terias que fazer primeiro uma instruçao de insert na localidades e depois recuperar a ultima id inserida.. e então testar se há registro, você faz os outros 2 inserts em suas respectivas tabelas.. é mais trabalhoso e maior chance de erros..

então por sugestao de facilidade.. recomento criar uma "area" para cada finalidade... sendo que antes de tudo tens que cadastrar uma localidade.

então nos outros formularios.. você terá um campo select, listando todas as localidades existentes.. sendo assim possivel que você escolha para qual localidade cadastrar os comentarios e fotos..

é basicamente isso. acho que agora fui bem claro.

abraço e boa sorte

Postado

Maninho, depois dessa explicação, é muito díficil sair algo errado. Pelo que parece esse tópico está chegando ao fim, mas por enquanto deixa ver se aparece algum erro.

Diff, é possível criar um valor default (com o ID do registro criado armazenado na chave extrangeira) no sql a ser inserido nas tabelas filhas sempre que um registro for criado na tabela principal? Pois a View so exibi os dados quando todos as forem preenchidas.

  • Moderador
Postado

exatamente isso que deve acontecer. note que a consulta criada para a view os dados de todas as tabelas.

lembre-se de que o proposito da view nao é a manipulaçao de dados, só a exibiçao facilitada. caso queira exibir conteudos so das tabelas populadas... você terá que mudar a instrução sql, e retirar as colunas referente a tabela nao populada.

é de grande entendimento de que há um relacionamento nessas tabelas programado com on delete para cascade.

se por uma razao você der um truncate na tabela localidade.. apagará em todas as tabelas e inclusive na view.

nao entendi sobre o valor default

Postado

Quando falo em DEFAULT, estou falando em um texto pré-formatado que seja inserido nas tabelas parentes sempre que um registro na tabela principal for inserido algum valor para que haja a exibiçaõ dos dados pelo view (pois nem sempre haverá dados inseridos em todas as tabelas). Penso em esse texto (um ou doi caracteres) está disposto no sql e ser utilizado para que os campos das tabelas não fiquem vazios.

  • Moderador
Postado

acho q nao tem como fazer fazer isso.. nao tem sentido.. eu havia pensado que quando você cadastrasse uma localidade.. deveria cadastras também as coisas daquela localidade.

bem.. eu pensei melhor.. e eu faria seu banco um pouco diferente... eu separaria os campos da localidades, para uma tabela separada.. contendo só ID e nome da localidade

e outra tabela que recebe os atributos de cada localidade referenciada pela id da localidade.. enfim.. era só o que eu faria mas nao digo para você mudar.. é chato refazer de novo o banco.. rsrs

como havia falado.. se nao há dados em alguma tabela nao mostrara na view. nada impede de você criar outras views para consultas alternativas.. assim você pdoeria fazer uim switch case no php e selecionar da melhor forma possivel...

só para você ter uma ideia.. um dos ex-colegas meus de faculdade.. no tcc ele utilizou mais de 20 views .. para consultas alternativas e tal.. acho que deverias explorar mais esse lado.. tenta procurar soluçoes.

mas agora.. cadastrar textos defalt.. eu acho ruim pois ai toda vez que você for cadastrar alguma coisa .. você teria que dar um update set e especificar qual registro mudar..

Postado

Diff, tem como você me ajudar com um código que busque a ID que está exibido os dados na página, e através de um link, carregue esse mesmo ID numa outra página?

Por exemplo:

Fazer o chamado de um ID através de um link (<a href="../paginas/noticias.php?id=<?php echo $row_noticia['id']; ?>> ID=1</a>), esse ID preenche uma página dinâmica através dos seus campos; nessa mesma página dinâmica, criar outro link que recupere esse ID atual e o lance para carregar uma outra página.

Deu pra entender?

  • Moderador
Postado

rsrs ficou um pouco confuso mesmo

se eu entendi.. você quer abrir o link . e nessa pagina ter o mesmo link mas para uma pagina separada? é isso?

se for.. é só você inserir o link de novo e usar o target blank... assim carrega o mesmo link em uma pagina separada

Postado

Por exemplo, eu quero carregar um registro numa pagina "A"; nessa página tera uma galeria de fotos.

Ao clicar em alguma foto, sera carregado a pagina "B"contendo todas as imagens relacionadas ao ID da pagina "A"anterior.

Se fosse feito dessa forma <a href="../paginas/noticias.php?id=<?php echo $row_noticia['id']; ?>> ID=1</a>, somente o ID da imagem clicada seria carregada e não é isso que eu quero. Quero que o url envie novamente o ID que carregou a página "A".

Estou querendo que, qualquer que seja a imagem clicada, o resultado deverá ser o mesmo: ser exibido uma nova galeria contendo todas as imagens relacionadas a uma determinada localidade.

E agora, deu pra entender?

Postado

Diff, olha eu de novo!!! Rapaz estou com um problema na tabela espelho. Estou criando um menu dinâmico de dois níveis (menu e submenu). Esse menu é composto por 2 tabelas relacionadas, uma contem a categoria e a outra, o assunto. Fiz o relacionamento e em seguida uma view. Meu problema ocorre quando utilizo a função repet region para exibir todos registros da tabela pai.

Os dados são exibidos normalmente, o problema é que o sistema está exibindo registros repitidos. Eu sei que a tabela espelho repete os registro da tabela pai para poder exibir todos os dados da tabela filha correspondentes ao registro em destaque.

Queria saber se há alguma forma de não exibir registros repetidos?

  • Moderador
Postado

tenta usar o DISTINCT

exemplo: SELECT DISTINCT ......

mas se esta repetindo amigo acho que deve estar havendo algum erro.. pois se uma consulta for elaborada errada... o mysql cria uma matriz ou seja.. um vetor bidimencional e repete os dados.. portanto tenta rever como você fez a consulta dessas duas tabelas .. se encontrar o erro.. apague a tabela espelho, e refaça ela.

abraço

Postado

Acho que não é erro, pois pela lógica que utilizei para criar os relacionamentos das tabelas, realmente a view deve repetir os registros da tabela pai para poder referenciar os registros da tabela filha.

Por exemplo:

id_pai=1 == id_filha=1

id_pai=1 == id_filha=2

id_pai=1 == id_filha=3

id_pai=1 == id_filha=5

id_pai=2 == id_filha=4

id_pai=2 == id_filha=6

  • Moderador
Postado

ta certo, então qual o problema? alias.. é necessário que você faça um menu por banco de dados? um simples menu assim.. você pode fazer com um UL e LI

Postado

porque quero evitar ter que ficar fazendo upload sempre que uma página tiver que ser criada. Resolvi criar um página dinâmica que exiba todas as informações através de buscas no banco de dados.

assim posso passar essa tarefa para outra pessoa.

  • Moderador
Postado

continuo sem entender. você só faz o menu uma vez.. inclui em todas suas paginas.. e se tiver que alterar alguma coisa.. so altera o arquivo do menu. acho que nao deves colocar coisas triviais como esta no banco de dados.. ou seja.. fazer uma consulta so para um menu.. enfim.. minha opiniao é esta

por exemplo você pode criar uma pagina de atualizaçao de menu. onde pelo php.. você altera o conteudo do menu e tal.. é coisas simples de se fazer.

enfim.. pra nao repetir.. como ja sugeri tenta usar o distinct ele faz a consulta de coisas nao repetidas

abraço

  • 2 semanas depois...
Postado

Resolvi o problema, para cada categoria do Menu criei um recorset e dei um repet region nas tag LI para que sempre que um conteúdo for postado, eles se organizem como itens de um menu; permitindo a existência de página dinâmicas.

Agora tenho outra dúvida: não estou conseguindo raciocinar de como fazer para criar uma condição que verifique em três tabelas qual registro foi atualizado ou criado recentemente para exibi-lo na página (pensei em puxar os dados das tabelas a partir do último registro, mas ainda falta a lógica para verificar qual deles foi atualizado recentemente).

Obs.: somente o registro que foi atualizado o criado é que será exibido.

  • Moderador
Postado

bem.. sobre o mais recente cadastrado.. você pode colocar na sua consulta o DESC que serve para ele ordenar do ultimo ao primeiro.. e usar um limit 1 para limitar a somente este.

sobre o atualizar.. bem.. se você mentem um horario cadastrado.. podes ordenar por hora ou seja... a hora mais recente foi aquele que foi atualizado

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...