Ir para conteúdo

POWERED BY:

Arquivado

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

Evair Gretter

Array

Recommended Posts

Boa tarde pessoal.

 

 

Estou com um pequeno problema que é o seguinte.

 

Um cliente quer um site que tenha uma galeria, montei o uploader que grava as fotos em pastas e também no banco de dados, criei uma função que seleciona todos os registros do banco de dados.

 

Essa:

function ListarFotos(){
    $pdo=  conectarBanco();
    try{
        $listar = $pdo->query('SELECT * FROM fotos ORDER BY id asc');
        $listar->execute();
        if ($listar->rowCount() > 0):
            return $listar->fetchAll(PDO::FETCH_OBJ);
        else:
            return false;
        endif;
    }catch(PDOException $e){
        echo "Erro". $e->getMessage();
    }
}

Depois montei a página que faz a listagem de todas as fotos que estão cadastradas ("5 por cliente"), desta forma:

 <?php
                    $mostrar = ListarFotos();     
                    $m = new ArrayIterator($mostrar);?>
   <?php if ($m->current()->id !=0):
       ?>
   <?php while ($m->valid()):
       ?>
                        <ul>
                            <li><h1><img src="<?php echo $m->current()->fotop;?>"></h1></li>
                            <li><p><?php echo $m->current()->id ?></p></li>
                            <li><h2><a href="?foto=<?php echo $m->current()->fotop; ?>&ac=del">Excluir</a></h2></li>
                        </ul>
                       <?php
                          $m->next();
                    endwhile;
                    ?>
<?php
else: echo"Não existem fotos para excluir";
endif; ?>

Agora vem o problema, neste caso ele vai listar todas as imagens que foram cadastradas, mas eu queria listar apenas 1 foto de cada cliente, por exemplo. Foram cadastradas 5 fotos com ID 1 mas eu quero mostrar apenas 1 dessas fotos e não as 5, existe uma forma disso ser feito desse jeito que estou tentando fazer?

 

VLW

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade eu não tentei mas dei uma pesquisada e essa clausula LIMIT não atende o que eu quero fazer...

 

O que eu quero é o seguinte, vou cadastrar 10 clientes cada um com 5 fotos cada, mas para montar a galeria eu quero pegar uma foto de cada um apenas ou seja ao invés de listar 50 fotos quero listar apenas 10 uma de cada pessoa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Williams Duarte.

 

Também não vai resolver pois o group by vai agrupar por um parametro tipo GROUP BY id,

se eu tiver 5 id's iguais ele vai trazer todos os id's iguais o que não é o caso....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia lokaodomau.

 

Sim, já utilizei GROUP BY várias vezes mas nesse caso ele não vai resolver meu problema que é o seguinte:

 

O que eu quero é o seguinte, vou cadastrar 10 clientes cada um com 5 fotos cada, mas para montar a galeria eu quero pegar uma foto de cada um apenas ou seja ao invés de listar 50 fotos quero listar apenas 10 uma de cada pessoa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a estrutura da tabela?

 

Esse problema deve ser resolvido na consulta, pois quando tiver 100 clientes, cada um com 300 fotos, o desempenho fica comprometido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não vejo porque não funcionar group by na tabela foto, agrupando com o id do cliente,

 

mas se mesmo assim não funcionar.

 

cria um laço para o cliente e puxa foto dentro do while.

 

 

Lembrando que esse Group BY é com joins, senão não vai funcionar.

 

exemplo

SELECT f.imagem, c.nome_cliente FROM `tb_fotos` AS f LEFT JOIN `tb_clientes` AS c ON f.`id_cliente` = c.`id_cliente` GROUP BY f.`id_cliente`

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Galera Obrigado ae pela ajuda de todos.

Williams , tentei fazer da seguinte forma utilizando o GROUP BY mas ainda não consegui chegar ao resultador desejado.

SELECT * FROM (
SELECT id,COUNT(1) cnt
FROM fotos
GROUP BY id
)V
ORDER BY cnt DESC
LIMIT 2

quando dou um select normal (SELECT * FROM fotos) ele mostra que na tabela tenho os id's 1 2 3 e 4 cadastrados

e quando faço da forma acima ele mostra apenas um id ou dois dependendo do valor do LIMIT.

já tentei fazer com while de várias formas no array mesmo, mas tenho que ficar buscando toda hora dentro do array queria fazer de uma forma mais simples.


não sei se estou sendo claro na explicação das minhas dúvidas. Vou tentar explicar de outra forma pra ver se fica mais fácil.

 

Digamos que exista o cliente Jose que tirou algumas fotos dessas fotos cadastri 5, mas no site quero mostrar apenas uma foto do cliente Jose.

 

Ai é que está meu problema...

 

Quero mostrar apenas uma foto do cliente Jose, uma da cliente Maria, uma do cliente Pedro etc. Apenas uma foto de cada cliente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca a estrutura da tabela de fotos e indique qual campo representa o ID do cliente

Compartilhar este post


Link para o post
Compartilhar em outros sites

A estrutura SQL?

 

tabela `fotos`
--

CREATE TABLE IF NOT EXISTS `fotos` (
`codgio` int(11) NOT NULL AUTO_INCREMENT,
`id` text NOT NULL, (Campo ID que quero listar)
`fotog` text NOT NULL,
`fotom` text NOT NULL,
`fotop` text NOT NULL,
PRIMARY KEY (`codgio`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=18

Compartilhar este post


Link para o post
Compartilhar em outros sites

O correto de um relacionamento seria esta

 

apostolos.png

-- ----------------------------
-- Table structure for clientes
-- ----------------------------
CREATE TABLE `clientes` (
  `id_cliente` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_cliente`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;


-- ----------------------------
-- Table structure for fotos
-- ----------------------------
CREATE TABLE `fotos` (
  `id_foto` int(11) NOT NULL AUTO_INCREMENT,
  `id_cliente` int(11) NOT NULL,
  `imagem` varchar(255) DEFAULT NULL,
  `posicao` tinyint(4) DEFAULT '0',
  PRIMARY KEY (`id_foto`),
  KEY `fk_table1_clientes_idx` (`id_cliente`),
  CONSTRAINT `fk_table1_clientes` FOREIGN KEY (`id_cliente`) REFERENCES `clientes` (`id_cliente`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;


Veja

/*
Navicat MySQL Data Transfer

Source Server         : Local
Source Server Version : 50616
Source Host           : localhost:3306
Source Database       : apostolos

Target Server Type    : MYSQL
Target Server Version : 50616
File Encoding         : 65001

Date: 2014-06-10 15:06:18
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for clientes
-- ----------------------------
CREATE TABLE `clientes` (
  `id_cliente` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_cliente`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of clientes
-- ----------------------------
INSERT INTO `clientes` VALUES ('1', 'Pedro');
INSERT INTO `clientes` VALUES ('2', 'André');
INSERT INTO `clientes` VALUES ('3', 'Tomé');
INSERT INTO `clientes` VALUES ('4', 'Filipe');
INSERT INTO `clientes` VALUES ('5', 'Mateus');
INSERT INTO `clientes` VALUES ('6', 'Bartolomeu');
INSERT INTO `clientes` VALUES ('7', 'Maria');
INSERT INTO `clientes` VALUES ('8', 'José');
INSERT INTO `clientes` VALUES ('9', 'Jesus');
INSERT INTO `clientes` VALUES ('10', 'João Zebedeu');

-- ----------------------------
-- Table structure for fotos
-- ----------------------------
CREATE TABLE `fotos` (
  `id_foto` int(11) NOT NULL AUTO_INCREMENT,
  `id_cliente` int(11) NOT NULL,
  `imagem` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id_foto`),
  KEY `fk_table1_clientes_idx` (`id_cliente`),
  CONSTRAINT `fk_table1_clientes` FOREIGN KEY (`id_cliente`) REFERENCES `clientes` (`id_cliente`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of fotos
-- ----------------------------
INSERT INTO `fotos` VALUES ('1', '1', 'http://4.bp.blogspot.com/-JBERZ7Rf-9U/UCuJphI7QbI/AAAAAAAACLk/7bAf75R3tP4/s1600/pedro.jpg', '0');
INSERT INTO `fotos` VALUES ('2', '1', 'http://www.cedet.com.br/capaslivros/SaoPedroApostolo.jpg', '0');
INSERT INTO `fotos` VALUES ('4', '1', 'http://fawcettfollowers.files.wordpress.com/2012/06/pedro_31.jpg', '0');
INSERT INTO `fotos` VALUES ('5', '2', 'http://obrademariabrasilia.com/wp-content/uploads/2010/11/santo-andre.jpg', '0');
INSERT INTO `fotos` VALUES ('6', '2', 'http://2.bp.blogspot.com/-e7Ne7lX2fr8/TbLzkzYuG5I/AAAAAAAAAQ8/e6lQh8EwwqM/s1600/ApostoloFelipe.jpg', '0');
INSERT INTO `fotos` VALUES ('7', '3', 'http://www.imagick.org.br/cidade/imageLQG.JPG', '0');
INSERT INTO `fotos` VALUES ('8', '3', 'http://encontrocomcristo.com.br/wp-content/uploads/2013/08/S%C3%A3o-Tome.jpg', '0');
INSERT INTO `fotos` VALUES ('9', '4', 'http://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Ribera-san_bartolome.jpg/630px-Ribera-san_bartolome.jpg', '0');
INSERT INTO `fotos` VALUES ('10', '4', 'http://salvecheiadegraca.com.br/wp-content/uploads/et_temp/Filipe-167186_184x184.jpg', '0');
INSERT INTO `fotos` VALUES ('11', '5', 'http://site.ucdb.br/public/santos/9306-sao-mateus-a.jpg', '0');
INSERT INTO `fotos` VALUES ('12', '5', 'http://www.crcpr.org.br/new/content/image/curiosidades/saoMateus.gif', '0');

rode uma query de teste

SELECT c.id_cliente, c.nome, f.imagem, f.id_foto FROM `fotos` AS f LEFT JOIN `clientes` AS c ON f.`id_cliente` = c.`id_cliente` GROUP BY f.`id_cliente`

result1.png

 

Randomizando

SELECT c.id_cliente, c.nome, f.imagem, f.id_foto FROM `fotos` AS f LEFT JOIN `clientes` AS c ON f.`id_cliente` = c.`id_cliente` GROUP BY f.`id_cliente` ORDER BY RAND();

result.png

 

Espero que entenda de uma vez, senão eu desisto. =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente é ai que não estamos nos entendendo, essa tabela não precisa do ID do cliente e sim do ID da foto como está na tabela que enviei acima, é só pra montar uma galeria de fotos. Ela seria assim,

 

A pessoa entra no site e vai até a página FOTOS (Exemplo), nesta página vai ver uma galeria que fica trocando 1 foto de cada cliente por vez e logo abaixo da galeria a mesma foto de cada cliente, quando ele clica em uma foto a página faz um select pelo ID e monta uma galeria com todas as fotos que a pessoa clicou.


Não desista =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

O post #15 do @Williams Duarte está excelente, você se engana ao não utilizar o id do cliente na tabela de fotos, pense no futuro, de alguma forma você irá utilizar esta informação. De qualquer forma, o id da imagem está no resultado da consulta, você não precisa utilizar o id do cliente para nada, usa só o que te convém, que é o id da imagem, o que não te convém, não usa!!

 

Não leve este post como uma crítica, basta utilizar o exemplo postado no #15, para entender o código, entender a lógica, mudar o que é necessário, mas o meu conselho é que perca um tempo testando o código postado, pois vale a pena!

Compartilhar este post


Link para o post
Compartilhar em outros sites

essa tabela não precisa do ID do cliente e sim do ID da foto como está na tabela que enviei acima

Sugiro que estude modelagem, relacionamentos e normalização de banco de dados.

CREATE TABLE IF NOT EXISTS `fotos` (
  `codgio` int(11) NOT NULL AUTO_INCREMENT,
  `id` text NOT NULL, (Campo ID que quero listar)
  `fotog` text NOT NULL,
  `fotom` text NOT NULL,
  `fotop` text NOT NULL,
  PRIMARY KEY (`codgio`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=18

Só de olhar está tabela da pra ver que terá problemas se um dia quiser excluir um cliente e suas fotos.

 

 

Só não me fale que pode ser feito uma gambiarra no php, desta forma:

 

seleciono o id do usuário e varro o banco de dados em busca das fotos que quero apagar. :coolio:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite pessoal!

 

Nesta página as fotos não estão ligadas a nenhum cliente, então não terei nenhum problema quanto a isso.

 

Bom agradeço a ajuda de todos mas resolvi o problema adicionando um checkbox para que o "meu cliente" possa escolher qual foto vai aparecer na galeria. Assi mque o site estiver pronto posto o link para que vocês possam dar uma avaliada no resultado final.

 

Mais uma vez obrigado e desculpem a insistência em não utilizar JOIN nessa tabela mas é que realmente não preciso, até tenho outras tabelas com JOIN mas não é o caso desta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.