uiLhian 1 Denunciar post Postado Setembro 19, 2013 Por exemplo tenho essa seguinte função: function listarBanners() { $pdo = conectar(); $listar = $pdo -> query("SELECT * FROM banner_jquery"); $listar -> execute(); $dados = $listar -> fetchAll(PDO::FETCH_OBJ); return $dados; } teria como eu usar uma "unica" função para listar em vários lugar do site ? ou teria que criar uma função para cada "objetivo"... desde ja muito obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
angelorubin 142 Denunciar post Postado Setembro 19, 2013 Olá, Uma dica, tente sempre abstrair ao máximo, por exemplo, o que é mais genérico e pode ser reutilizado, listar ou listarBanner? Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 19, 2013 Olá, Uma dica, tente sempre abstrair ao máximo, por exemplo, o que é mais genérico e pode ser reutilizado, listar ou listarBanner? então é isso que quero saber como posso (se posso) usar uma function em vários lugares. ae no caso daria um nome "unico" a função, e utilizaria ela onde fosse o caso... obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Setembro 19, 2013 Por exemplo tenho essa seguinte função: function listarBanners() { $pdo = conectar(); $listar = $pdo -> query("SELECT * FROM banner_jquery"); $listar -> execute(); $dados = $listar -> fetchAll(PDO::FETCH_OBJ); return $dados; }teria como eu usar uma "unica" função para listar em vários lugar do site ?ou teria que criar uma função para cada "objetivo"... desde ja muito obrigado! Uma função definida pode ser usada em qualquer lugar. Para usar uma mesma função com resultados diferentes, você precisa de parâmetros function listar(PDO $banco, $tabela) { $lista = $banco->query("SELECT * FROM {$tabela}"); $listar->execute(); return listar->fetchAll(PDO::FETCH_OBJ); } $conn = new PDO('sqlite::memory:'); $banners = listar($conn, 'banner_jquery'); $usuarios = listar($conn, 'usuarios'); ... Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 19, 2013 Uma função definida pode ser usada em qualquer lugar. Para usar uma mesma função com resultados diferentes, você precisa de parâmetros function listar(PDO $banco, $tabela) { $lista = $banco->query("SELECT * FROM {$tabela}"); $listar->execute(); return listar->fetchAll(PDO::FETCH_OBJ); } $conn = new PDO('sqlite::memory:'); $banners = listar($conn, 'banner_jquery'); $usuarios = listar($conn, 'usuarios'); ... hummmm... entendi, vou tentar fazer alguns testes aqui e ver o resultado. Obs.: vou deixar o tópico só hj em aberto para poder fazer os testes e caso haja duvidas aproveitar o mesmo, mas marcarei como resolvido amanha (caso não haja problemas) desde ja muito obrigado pela atenção! haaa.. uma duvida pra que serviria isso ? PDO('sqlite::memory:'); é a mesma coisa que isso ? $pdo = conectar(); Compartilhar este post Link para o post Compartilhar em outros sites
angelorubin 142 Denunciar post Postado Setembro 19, 2013 Olá, O PDO fornece drivers para acesso a diferentes formas de armazenamento de dados, dentre eles o (sqlite) - http://php.net/manual/pt_BR/pdo.drivers.php Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Setembro 19, 2013 hummmm... entendi, vou tentar fazer alguns testes aqui e ver o resultado. Obs.: vou deixar o tópico só hj em aberto para poder fazer os testes e caso haja duvidas aproveitar o mesmo, mas marcarei como resolvido amanha (caso não haja problemas) desde ja muito obrigado pela atenção! haaa.. uma duvida pra que serviria isso ? PDO('sqlite::memory:'); é a mesma coisa que isso ? $pdo = conectar(); Mais ou menos. Primeiro que não tenho como saber o que tem dentro dessa [inline]conectar()[/inline] aí. O que [inline]PDO('sqlite::memory:')[/inline] faz é iniciar um novo banco de dados do tipo SQLite na memória RAM do seu computador. Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 19, 2013 Mais ou menos. Primeiro que não tenho como saber o que tem dentro dessa [inline]conectar()[/inline] aí. O que [inline]PDO('sqlite::memory:')[/inline] faz é iniciar um novo banco de dados do tipo SQLite na memória RAM do seu computador. entendi era isso que gostaria de saber. porque assim o exemplo que citei como "duvida" era em um query simples e tal... assim o que queria saber que nem no caso eu tenho essas duas "query" function listarBanners() { $pdo = conectar(); $listar = $pdo -> query("SELECT obraID,obraCIDADE,obraSTATUS,fotoOBRAID,fotoNOME,fotoCAPA FROM obras INNER JOIN fotos ON obraID = fotoOBRAID WHERE obraSTATUS = '1' AND fotoCAPA = '0' ORDER BY obraID ASC "); $listar -> execute(); $dados = $listar -> fetchAll(PDO::FETCH_OBJ); return $dados; } /** function listar3Utimas() { $pdo = conectar(); $queryOBRAS = $pdo->query("SELECT obraID,obraBAIRRO,obraCIDADE,obraUF FROM obras ORDER BY obraID DESC LIMIT 3 "); IF ($queryOBRAS->rowCount() !== 0) { foreach ($queryOBRAS->fetchAll(PDO::FETCH_OBJ) as $o) { $queryFOTOS = $pdo->query(sprintf("SELECT fotoNOME FROM fotos WHERE fotoOBRAID = '%s' ORDER BY fotoCAPA ASC", $o->obraID) ); IF ($queryFOTOS->rowCount() !== 0) { $f = $queryFOTOS->fetch(PDO::FETCH_OBJ); } **/ eu queria saber como poderia estar "criando" uma unica function para estar usando em ambas, e/ou entre outras... Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Setembro 19, 2013 porque assim o exemplo que citei como "duvida" era em um query simples e tal... assim o que queria saber que nem no caso eu tenho essas duas "query" function listarBanners() { $pdo = conectar(); $listar = $pdo -> query("SELECT obraID,obraCIDADE,obraSTATUS,fotoOBRAID,fotoNOME,fotoCAPA FROM obras INNER JOIN fotos ON obraID = fotoOBRAID WHERE obraSTATUS = '1' AND fotoCAPA = '0' ORDER BY obraID ASC "); $listar -> execute(); $dados = $listar -> fetchAll(PDO::FETCH_OBJ); return $dados; } /** function listar3Utimas() { $pdo = conectar(); $queryOBRAS = $pdo->query("SELECT obraID,obraBAIRRO,obraCIDADE,obraUF FROM obras ORDER BY obraID DESC LIMIT 3 "); IF ($queryOBRAS->rowCount() !== 0) { foreach ($queryOBRAS->fetchAll(PDO::FETCH_OBJ) as $o) { $queryFOTOS = $pdo->query(sprintf("SELECT fotoNOME FROM fotos WHERE fotoOBRAID = '%s' ORDER BY fotoCAPA ASC", $o->obraID) ); IF ($queryFOTOS->rowCount() !== 0) { $f = $queryFOTOS->fetch(PDO::FETCH_OBJ); } **/eu queria saber como poderia estar "criando" uma unica function para estar usando em ambas, e/ou entre outras... Acho que a principal preocupação é parar de ter que ficar copiando e colando em novas funções. Essa, inclusive, é uma excelente forma de entender quando você precisa e quando não precisa de uma função. Tudo que é copiado e colado, pode ser colocado como forma de função, e as modificações se tornam parâmetros. Partindo de um exemplo mais simples: function listaUsuarios() { $conn = new PDO('sqlite::memory:'); $stmt = $conn->prepare('select * from usuario'); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_OBJ); } Então, um belo dia, você precisa listar todos os banners. Você copia a função [inline]listaUsuarios[/inline] como [inline]listaBanners[/inline] e faz algumas modificações: function listaBanners() { $conn = new PDO('sqlite::memory:'); $stmt = $conn->prepare('select * from banners'); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_OBJ); } Aí existe uma chance de refatoração para aproveitarmos código e diminuir a cópia-e-cola: function lista($conn, $table) { $stmt = $conn->prepare("select * from {$table}"); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_OBJ); } Veja que agora podemos trocar tanto a conexão com o banco de dados quanto a tabela que será buscada. Você deve localizar os pontos de repetição das suas duas funções e separá-los do que varia Fugindo um pouco do tema do tópico, esse conteúdo que você comentou no último post pode ser resolvido com um inner join Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 20, 2013 - qual a diferença entre usar o prepare() e o query() ? - e uma outra coisa selecionar todos camposo SELECT * ou selecionar os que serão usados SELECT campo1,campo3 influencia em alguma coisa ? desempenho e tal... Fugindo um pouco do tema do tópico, esse conteúdo que você comentou no último post pode ser resolvido com uminner join desculpe, mas aonde você fala ? desde ja muito obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Setembro 20, 2013 - qual a diferença entre usar o prepare() e o query() ?[inline]query[/inline] vai processar sua consulta diretamente, como fazíamos antigamente com [inline]mysql_query[/inline] para citar um exemplo. [inline]prepare[/inline], além de preparar uma consulta, permite que você substitua parâmetros... $query = "Insert into usuarios (id, nome, email, idade) values (null, :nome, :email, :idade);"; $stmt = $pdo->prepare($query); $lines = array( array( 'nome' => 'Fulano', 'email' => 'fulano@email.com', 'idade' => 30 ), array( 'nome' => 'Sicrano', 'email' => 'sicrano@email.com', 'idade' => 20 ), array( 'nome' => 'Beltrano', 'email' => 'beltrano@email.com', 'idade' => 40 ) ); foreach ($lines as $line) { $stmt->execute($line); } - e uma outra coisa selecionar todos camposo SELECT * ou selecionar os que serão usados SELECT campo1,campo3 influencia em alguma coisa ? desempenho e tal...É melhor passar campo a campo. Usei * nos exemplos por questão de brevidade. desculpe, mas aonde você fala ? desde ja muito obrigado! Veja, você obtém os ID's das obras pra depois exibir as fotos delas: $queryOBRAS = $pdo->query("SELECT obraID,obraBAIRRO,obraCIDADE,obraUF FROM obras ORDER BY obraID DESC LIMIT 3 "); ... foreach ($queryOBRAS->fetchAll(PDO::FETCH_OBJ) as $o) { $queryFOTOS = $pdo->query(sprintf("SELECT fotoNOME FROM fotos WHERE fotoOBRAID = '%s' ORDER BY fotoCAPA ASC", $o->obraID) ); Você pode fazer isso de uma vez sóSELECT obras.obraID as id, obras.obraBAIRRO as bairro, obras.obraCIDADE as cidade, obras.obraUF as uf, fotos.fotoNome as foto FROM obras INNER JOIN fotos ON fotos.fotoOBRAID = obras.obraID ORDER BY obras.OBRAID, fotos.fotoCAPA Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 20, 2013 então eu fiz um teste com INNER JOIN mas ele me retorna o resultado "errado", pois me retorna as imagens de uma "unica" ID. tipo as tres ultimas imagens referente a id. - no modo "antigo" ele me retorna as "quatro ultimas" (fotos/id) ou seja uma/primeira foto de cada id. que é o resultado que quero (funciona tipo os trs ultimos registros). $queryOBRAS = $pdo->query("SELECT obras.obraID as id, obras.obraBAIRRO as bairro, obras.obraCIDADE as cidade, obras.obraUF as uf, fotos.fotoNOME as foto FROM obras INNER JOIN fotos ON fotos.fotoOBRAID = obras.obraID ORDER BY obras.OBRAID DESC LIMIT 3 "); foreach ($queryOBRAS->fetchAll(PDO::FETCH_OBJ) as $o) { ?> <li class="span3"> <a href="portifolio.php?ID=<?php echo($o->id); ?>" class="thumbnail"> <img src="thumb.php?img=fotos/<?php echo($o->foto); ?>" alt=""/> </a> </li> <?php } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Setembro 20, 2013 Na minha sugestão não existe o LIMIT, exatamente por não termos como saber quantas fotos estão cadastradas para cada obra. Fazendo apenas uma consulta, depois disso você itera o resultado imprimindo as fotos. Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 20, 2013 porque assim esse "script" é pra listar as 3 ultimas obras cadastradas na index. do jeito que tava ele listava as 3 ultimas obras/id cadastradas que no caso pegava a primeira foto de cada obra/id cadastrada. ja com inner join ele me lista o "bd" inteiro. caso queira ver o site é esse aqui http://construtorawvaraujo.com ae no caso ele ta listando as 4 ultimas. Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Setembro 20, 2013 where obra.obraID in (select obraID in obra order by obraID desc limit 3) Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 21, 2013 $queryOBRAS = $pdo->query("SELECT obras.obraID as id, obras.obraBAIRRO as bairro, obras.obraCIDADE as cidade, obras.obraUF as uf, fotos.fotoNOME as foto, fotos.fotoCAPA as capa FROM obras INNER JOIN fotos ON fotos.fotoOBRAID = obras.obraID WHERE obras.obraID in (SELECT obraID FROM obras) ORDER BY fotos.fotoCAPA LIMIT 4 "); desse jeito deu mais ou menos certo. se eu tiro o LIMIT ele lista todas fotos contidas na tabela "fotos". o que deveria fazer no caso era listar somente o total de registros/obras da tabela "obras" com a fotocapa da tabela fatos. que no caso seria 12 "fotos/obras". Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 21, 2013 tentei editar o post acima mais não deu. então estive fazendo os testes e usando desse modo acima ae ele não funciona mesmo. pois como disse ele lista todas imagens contidas na tabela "fotos" ja o resultado que preciso é listar somente "uma" imagem de cada obra. Com o script que passei: Lista "certo" as 12 obras contidas na tabela. Com o INNER JOIN lista "errado" ele lista todas imagens contidas da tabela "fotos" repara qe na segunda imagem tem a barra de rolagem pois contem todas imagens para baixo. Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Setembro 23, 2013 ... WHERE obras.obraID in (SELECT obraID FROM obras) ORDER BY fotos.fotoCAPA LIMIT 4 "); Um pouquinho de atenção não faria mal, não. Na minha sugestão, o [inline]LIMIT[/inline] entra dentro do parênteses, não fora. tentei editar o post acima mais não deu. então estive fazendo os testes e usando desse modo acima ae ele não funciona mesmo. pois como disse ele lista todas imagens contidas na tabela "fotos" ja o resultado que preciso é listar somente "uma" imagem de cada obra. Com o script que passei: Lista "certo" as 12 obras contidas na tabela. Com o INNER JOIN lista "errado" ele lista todas imagens contidas da tabela "fotos" repara qe na segunda imagem tem a barra de rolagem pois contem todas imagens para baixo. Se você só precisa de uma foto por obra, pode utilizar o [inline]group by[/inline] e agrupar os ID's das obras. Assim você teria apenas uma linha por obra. Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 24, 2013 se eu coloco o LIMIT dentro do parenteses me retorna os seguintes erros: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1235 This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'' in E:\Wamp\www\home.php on line 102 ( ! ) PDOException: SQLSTATE[42000]: Syntax error or access violation: 1235 This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' in E:\Wamp\www\home.php on line 102 :( Compartilhar este post Link para o post Compartilhar em outros sites
uiLhian 1 Denunciar post Postado Setembro 24, 2013 então me corrige se eu estiver errado. aparentemente assim esta agrupando corretamente. $queryOBRAS = $pdo->query("SELECT obras.obraID as id, obras.obraBAIRRO as bairro, obras.obraCIDADE as cidade, obras.obraUF as uf, fotos.fotoNOME as foto, fotos.fotoCAPA as capa FROM obras INNER JOIN fotos ON fotos.fotoOBRAID = obras.obraID WHERE obras.obraID in (SELECT obraID FROM obras) GROUP BY fotos.fotoOBRAID ORDER BY obras.obraID,fotos.fotoCAPA DESC "); ae o que estou tentando fazer agora é mostrar a imagem que esta "setada" como capa no banco "fotos". tipo cada album tem uma "foto/capa" que é gravada na coluna "fotoCAPA" na tabela fotos. e mostrar as obras de tras pra frente. mas não estou obtendo resultado. :( Compartilhar este post Link para o post Compartilhar em outros sites