Ir para conteúdo

Arquivado

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

uiLhian

Usar uma Função de listar mais de uma vez

Recommended Posts

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

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

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

 

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

 

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

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

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

- 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

- 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

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

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

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
$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

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: 2zh19pz.png Lista "certo" as 12 obras contidas na tabela.

Com o INNER JOIN 9jeo1s.png 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

 

 

...
  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: 2zh19pz.png Lista "certo" as 12 obras contidas na tabela.

Com o INNER JOIN 9jeo1s.png 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

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

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

×

Informação importante

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