Ir para conteúdo

POWERED BY:

Arquivado

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

uiLhian

Inner join / PDO

Recommended Posts

bom eu tenho o seguinte código em msql_*

 

    $db->query( "select * from albuns order by album_name asc" )->fetchAll();
    if ( $db->rows >= 1 )
    {
        $albuns = $db->data;
        foreach ( $albuns as $album )
        {
            $a = ( object ) $album;
            $db->query( "select * from fotos where foto_album = $a->album_id order by foto_pos asc" )->fetchAll();
            if ( $db->rows >= 1 )
            {
                $f = ( object ) $db->data[0];
                ?>
                <div class="box-detail box-alb" id="<?= $a->album_id ?>">
                    <div class="box-inner-alb">    
                        <a href="album.php?id=<?= $a->album_id ?>" >                                  <img src="thumb.php?img=fotos/<?= $f->foto_url ?>">
                        </a>
                    </div>
                </div>
                <?php
            }
        }
    }

no caso ele só me retorna as a quantidade de imagens da tabela fotos conforme a quantidade de album que tem na tabela album.

 

 

foreach ( $albuns as $album )        {            $a = ( object ) $album;
select * from fotos where foto_album = $a->album_id order by foto_pos asc

 

no caso eu fuçando na net vi sobre o INNER JOIN.

 

e fim o seguinte:

 

$stmtO = $pdo->prepare('SELECT obra_id, foto_album, foto_url
                        FROM obras AS o
                        INNER JOIN fotos AS f ON o.obra_id = f.foto_album
                        WHERE foto_album = $o->obra_id
                        ORDER BY foto_pos ASC'
                       );
    $stmtO->execute();
    $obras = $stmtO->fetchAll(PDO::FETCH_ASSOC);
    
    if ( $stmtO->rowCount() >= 1 )
    {
        foreach ( $obras as $o )
        {

sei que aqui nessa linha esta errado WHERE foto_album = $o->obra_id pois ele está antes do "foreach" o que eu gostaria de saber é como fazer ae no caso pra ele me retornar somente a primeira imagem da tabela fotos que no caso seria a capa de cada album/obra.

 

bom não sei se deu pra entender é que é dificil explicar. :)

 

mas desde ja obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas que nem no caso ae o $o está antes do 'laço' né. então ele não vai ter valor. acredito eu.

aqui o erro: Notice: Undefined variable: o in

 

 

então alguma luz no fim do tunel ? :(

 

 

94 visitas.

onde que errei na criação do tópico ?!

 

;(

Compartilhar este post


Link para o post
Compartilhar em outros sites

da um echo nisso

 


 

SELECT obra_id, foto_album, foto_url                         FROM obras AS o                         INNER JOIN fotos AS f ON o.obra_id = f.foto_album                         WHERE foto_album = $o->obra_id                         ORDER BY foto_pos ASC

para eu ver o resultado sem as variáveis e ver o possível erro.

 

também não vi a necessidade de usar o objeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

os erros que me retornam:

 

 

Notice: Undefined variable: o in E:\Wamp\www\U\galeria.php on line 9

 

Notice: Trying to get property of non-object in E:\WebServer\Wamp\www\U\galeria.php on line 9

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY foto_pos ASC' at line 5' in E:\Wamp\www\U\galeria.php on line 12

Linha 9: WHERE foto_album = $o->obra_id

Linha 12: $stmtO->execute();

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom eu tenho 2 tabelas: obras e fotos

na tabela obras tem os seguintes campos: obra_id | obra_nome | obra_cidade

na tabela fotos tem os seguintes campos: foto_id | foto_url | foto_album

 

foto_url = o nome da imagem upada tipo nome.jpg

foto_album = id da obra = obra_id

 

a e eu quero listar as obras que no caso seria tipo uma "categoria" obra1, obra2 ... e cada uma com sua galeria.

no caso esse $o->obra_id seria o total de obras cadastradas no qual receberia somente a "primeira" imagem da tabela fotos no qual a imagem fosse foto_album.

 

tipo obra_id = 7 pegaria a 'primeira' imagem da tabela fotos cujo o foto_album fosse igual a 7.

ae quando eu clicar nessa "categoria" ela abriria a galeria cujo todas imagem fosse igual foto_album igual a 7.

 

olha o código em msql_* original:

 

bom eu tenho o seguinte código em msql_*

 

    $db->query( "select * from albuns order by album_name asc" )->fetchAll();    if ( $db->rows >= 1 )    {        $albuns = $db->data;        foreach ( $albuns as $album )        {            $a = ( object ) $album;            $db->query( "select * from fotos where foto_album = $a->album_id order by foto_pos asc" )->fetchAll();            if ( $db->rows >= 1 )            {                $f = ( object ) $db->data[0];                ?>                <div class="box-detail box-alb" id="<?= $a->album_id ?>">                    <div class="box-inner-alb">                            <a href="album.php?id=<?= $a->album_id ?>" >                                  <img src="thumb.php?img=fotos/<?= $f->foto_url ?>">                        </a>                    </div>                </div>                <?php            }        }    }

 

 

 

 

 

 

?

 

um help por favor... :(

Compartilhar este post


Link para o post
Compartilhar em outros sites


<?

$albuns = $db->query( "select * from albuns order by album_name asc" );

 

if ( $albuns->rowCount() !== 0 )

{

 

foreach ( $albuns->fetchAll( PDO::FETCH_OBJ ) as $obj )

{

 

$foto = $db->query( sprintf( "select * from fotos where foto_album = '%s' order by foto_pos asc", $obj->album_id ));

if ( $foto->rowCount() !== 0 )

{

 

$f = $foto->fetch ( PDO::FETCH_OBJ );

?>

<div class="box-detail box-alb" id="<?php echo $obj->album_id; ?>">

<div class="box-inner-alb">

<a href="album.php?id=<?php echo $obj->album_id; ?>" > <img src="thumb.php?img=fotos/<?php echo $f->foto_url; ?>">

</a>

</div>

</div>

<?php

}

 

$foto = null;

}

}

 

$albuns = null;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

WDuarte muito obrigado ae pela grande força...

me fala uma coisa nesse método que eu estava fazendo com inner join pra esse caso não serviria ?

tipo o "unico" método seria esse ae mesmo ?

 

desde ja muito obrigado mesmo. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com inner join funciona, porém não é recomendado para loops, pois dobra a carga no servidor.

 

E se sua hospedagem for compartilhada corre o risco de ser suspenso.

 

Experiência própria!

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi... :)

então nesse caso ae o modo "correto" seria esse mesmo. !?

 

O modo correto é aquele que te traz o resultado positivo, sem implicar no desempenho do servidor, hoje em dia performance é necessário. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendido... :)

é que achei que daria pra fazer de uma forma mais "simples" como menos código. :)

MAS... como funcionou, fica como resolvido.

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.