Query group actor e film

Ciao, non mollare!
Non limitarti a fare copia ed incolla degli esempi che ti ho fatto, soprattutto se copi esempi che ho scritto prima di vedere il tuo codice :) E comunque no, non intendevo quello, infatti l'esempio di codice che hai usato era utile se utilizzavi la prima query che ti avevo proposto, tu hai scelto la seconda, quindi non puoi utilizzare quella strategia, quella con il groupby nella query.

Ragioniamo, abbiamo cambiato la query che ora ci restituisce una riga per ogni attore che ha collaborato con l'actor_id che riceviamo in $_GET, e che per ogni attore "crea una nuova colonna" in maniera dinamica chiamata films, la quale grazie alla funzione GROUP_CONCAT concatena i vari film dove hanno collaborato i due attori.
Quindi otteniamo una cosa simile come risposta alla nostra query:
group_actor_film.png

Fino a qui chiaro?

Ora ti basta modificare il blocco di codice dentro il ciclo while che già avevi e aggiungere la visualizzazione che preferisci del valore contenuto nella "colonna" creata con GROUP_CONCAT e chiamata films, puoi anche fare un semplice echo intanto per capire.

Se proprio non riesci posta come ti ha spiegato Max 1 il codice delle tue prove, e ti fornisco un esempio funzionante, ma prima prova secondo me ce la fai!

P.S. ti conviene usare le funzioni mysqli invece che mysql che sono deprecate da php5.5
 
ti confesso che sono molto in difficolta' :rolleyes: , la soluzione sicuramente sara' semplice ma io non ci arrivo

ho modificato questo codice

PHP:
$result = mysql_query( $query );
if (!$result)
die("mySQL error: ". mysql_error());
while( $row = mysql_fetch_array( $result ) ) : ?>

e il risultato e' veramente pessimo :(

group_actor_film_4.png
 
Chiedo scusa, pare che il dono della chiarezza :D Non ti scoraggiare che riproviamo a comunicare ;)

Ora ti basta modificare il blocco di codice dentro il ciclo while che già avevi e aggiungere la visualizzazione che preferisci del valore contenuto nella "colonna" creata con GROUP_CONCAT e chiamata films, puoi anche fare un semplice echo intanto per capire.

provo ad essere più chiaro, con:

modificare il blocco di codice dentro il ciclo while
Intendo il codice che hai scritto, contenuto tra l'apertura del while, e la sua chiusura endwhile, quello che effettivamente stampa la visualizzazione che vedi nella pagina.

con questo:
Se proprio non riesci posta come ti ha spiegato Max 1 il codice delle tue prove, e ti fornisco un esempio funzionante, ma prima prova secondo me ce la fai!
Intendevo posta tutto il codice, o almeno quello utile che serve ad aiutarti (tutto quello che agisce con i dati: query + codice che si occupa di visualizzare contenuto nel blocco while), con quelle 4 linee che hai postato come facciamo a capire dove stai sbagliando? E come posso indicarti come fare? Posta tutto il codice che hai attualmente e te lo sistemo con i commenti.

L'unica cosa che posso dirti da quello che hai messo, è che probabilmente hai cambiato mysql_fetch_object (che usavi prima) con mysql_fetch_array, non hai cambiato come accedi ai dati di $row e quindi hai quel risultato.
Io ti ho consigliato una cosa diversa.

Ora ti basta modificare il blocco di codice dentro il ciclo while che già avevi e aggiungere la visualizzazione che preferisci del valore contenuto nella "colonna" creata con GROUP_CONCAT e chiamata films, puoi anche fare un semplice echo intanto per capire.


rimanendo in tema film...
Aiutami ad aiutarti
cit. Jerry Maguire :D
 
ok posto il codice che parte dalla while :), siccome avevo postato l'intero file pensavo che bastava

PHP:
$result = mysql_query( $query );
if (!$result)
 die("mySQL error: ". mysql_error()); 
while( $row = mysql_fetch_object( $result ) ) : ?> 



<table class="w3-table-all w3-margin-top" >

-------------------------------------------
<?php echo $row->year; ?>
-------------------------------------------

<tbody><tr>
      <td width="95px" align="center">
      <img src="image_upload/actor/uploads/<?=$row->nome?> (<?=$row->actor_id?>)/<?=$row->foto?>" width="80px" height="130px" style="border:4px solid #333333;" target="_blank">
      
      
<p class="w3-small"><a href="cinema.php?id=<?php echo $row->actor_id; ?>" target="_blank"><?php echo $row->nome; ?></a>
          
(<?php echo $row->credited; ?>)</p>
      </td>

<td>
          <ul class="w3-ul w3-hoverable w3-small">

<a href="film.php?id=<?php echo $row->film_id;?>"><?php echo $row->movie_title;?>&nbsp;(<?php echo $row->year; ?>)</a>
          
          </ul>
          
      </td>
    </tr>
 </tbody></table>


<? endwhile; ?>

</body></html>
 
  • Love
Reactions: f107
Continuo a darti qualche consiglio, spero sia gradito:
  • attenzione alla leggibilità del codice, prova ad indentare anche l'HTML, altrimenti è difficile leggere
  • ti avevo chiesto di mettere anche la query per vedere se avevi fatto altre modifiche, vabbè l'ho immaginata
  • ti ho chiesto di ripostare il codice, perché non so che modifiche nel mentre avevi effettuato
  • usa mysqli invece che mysql (sono simili, non è niente di impattante
  • i tag <ul> si aspettano tag <li> all'interno
Guida alla lettura:
  • Ti ho messo dei commenti che potrai leggere, in maiuscolo quelli importanti da leggere
    • quelli che iniziano "QUESTO NON PUò STARE QUI" sono per evidenziare un problema logico nella struttura che vuoi seguire (questi li ho dedotti, la struttura dell'HTML non è molto chiara, ma ho visto un <ul> e ho messo la lista dei film lì)
    • quello che inizia con "VUOI VEDERE DA TE?" è un esempio per farti vedere come puoi guardare il valore di una variabile (per uso di "debug").
    • Ho messo qualcosa che inizia con "STEP" per cercare di indicarti i step logici che fai
  • Non ho potuto testare il codice (non ho il tuo DB e altre cose), ma sono confidente che se c'è qualche problema (di nome delle variabili ecc) che tu riesca a risolverlo, in caso contrario chiedi senza problemi.
Ecco qui, facci sapere:
PHP:
<?php
// NON MI HAI MESSO LA QUERY CHE STAI UTILIZZANDO, IMMAGINO SIA QUESTA:
/*
// STEP DEFINISCO LA QUERY, questo mi serve per chiedere al db i dati che desidero
$query = "
SELECT
  `a`.`actor_id`,
  `a`.`nome`,
  `a`.`foto`,
  GROUP_CONCAT(CONCAT(`f`.`film_id`, ' || ', `f`.`movie_title`, ' || ', `f`.`year`, '||', `other_act`.`credited`)) as films
FROM
  `film_actor` `sel_act`
INNER JOIN `film_actor` `other_act` ON
  `other_act`.`film_id` = `sel_act`.`film_id`
  AND `other_act`.`actor_id` != `sel_act`.`actor_id`
INNER JOIN `actor` `a` ON
  `a`.`actor_id` = `other_act`.`actor_id`
INNER JOIN `film` `f` ON
  `f`.`film_id` = `other_act`.`film_id`
WHERE
  `sel_act`.`actor_id` = $actor_id
GROUP BY `a`.`actor_id`, `a`.`nome`
ORDER BY `f`.`year` DESC;
";
*/
// STEP ESEGUO LA QUERY, questo serve per inviare la richiesta al DB
$result = mysql_query( $query );

// STEP VERIFICO LA RISPOSTA, questo serve percontrollare che non ci siano problemi con la query appena eseguita
if (!$result)
die("mySQL error: ". mysql_error());

// STEP PROCESSO RISULTATI, con un loop while leggo i risultati della query eseguita
while( $row = mysql_fetch_object( $result ) ) :
    // DENTRO QUESTO BLOCCO DI CODICE SIAMO IN UN BLOCCO WHILE, blocco di codice eseguito in loop, avrà un esecuzione per ogni riga restituita dal DB
?>


<table class="w3-table-all w3-margin-top" >
-------------------------------------------
<?php // QUESTO NON PUò STARE QUI, OGNI FILM HA ANNO DIVERSO, SE VUOI VEDERLI RAGGRUPPATI QUESTO PUNTO NON HA SENSO echo $row->year; ?>
-------------------------------------------
<tbody><tr>
      <td width="95px" align="center">
      <img src="image_upload/actor/uploads/<?=$row->nome?> (<?=$row->actor_id?>)/<?=$row->foto?>" width="80px" height="130px" style="border:4px solid #333333;" target="_blank">
    
    
<p class="w3-small"><a href="cinema.php?id=<?php echo $row->actor_id; ?>" target="_blank"><?php echo $row->nome; ?></a>
        
(<?php // QUESTO NON PUò STARE QUI, OGNI FILM HA UN credited DIVERSO, SE VUOI VEDERLI RAGGRUPPATI QUESTO PUNTO NON HA SENSO echo $row->credited; ?>)</p>
      </td>
<td>

<?php
  
?>
          <ul class="w3-ul w3-hoverable w3-small">
          <!-- <a href="film.php?id=<?php echo $row->film_id;?>"><?php echo $row->movie_title;?>&nbsp;(<?php echo $row->year; ?>)</a>-->
            <?php
                // QUI STAMPI I FILM, DEVO OPERARE QUI! YEEEEH
                // studiando la query vedo che i film aggregati (separati da virgola) sono nella "colonna" chiamata films, vedo inoltre che la struttura è per ogni film: "FILM_ID || MOVIE_FILM || YEAR || CREDITED"

                // VUOI VEDERE DA TE? TOGLI IL COMMENTO AD UNA DELLE DUE RIGHE CHE INIZIANO CON die( CHE TI INTERESSA
                // die(var_dump($row)); // visualizza tutti i valori dentro $row
                // die(var_dump($row->films)); // visualizza tutti i valori dentro $row "colonna" films

                // procedo alla visualizzazione dei film
                // separo la stringa per ",", ottengo così un array di tutti i film
                foreach(explode(',', $row->films) as $film_data):
                    // separo $film_data, contentente "FILM_ID || MOVIE_FILM || YEAR || CREDITED" per il separatore " || "
                    list($film_id, $movide_film, $year, $credited) = explode(' || ', $film_data);
                    // DENTRO QUESTO BLOCCO DI CODICE PUOI METTERE year E credited
            ?>
                <li>
                    <a href="film.php?id=<?php echo $film_id;?>">
                        <?php echo $movie_title;?>&nbsp;(<?php echo $year; ?>)
                    </a>
                </li>
            <?php
                // FINE BLOCCO foreach
                endforeach;
            ?>
        
          </ul>
        
      </td>
    </tr>
</tbody></table>

<?php
    // FINE BLOCCO WHILE
    endwhile;
?>
</body></html>

Spero di essere stato chiaro :)
 
Ultima modifica:
  • Like
Reactions: Tommy03 and Alex_70
Wow :D, io non potevo fare questo, sono ancora molto indietro per arrivare a questi livelli, forse un giorno :)
i consigli sono sempre accettati, specialmente se sono utili :)

che dire, non mi aspettavo veramente tutto questo,
di solito ho notato in molte persone una mania di grandezza con chi non ne capisce come loro,
se sei uno che non capisci allora la loro prima risposta e' "STUDIA" e poi ne riparliamo, ma non e' questo l'approccio migliore
per far imparare un'altro, f107 lo ha dimostrato, prendete esempio da lui

grazie tante di cuore f107 (o ti devo chiamare Matteo?) :)

ecco il risultato finale
(ho migliorato anche la grafica aggiungendo la class bootstrap che colora e inserendo la foto che ovviamente e' quella dell'id principale)

group_actor_film_5.png
 
Ultima modifica:
  • Love
Reactions: f107
Mi dispiace di non essere un professionista del settore, ma sto guardando il blog e sto imparando da voi. Ottimo lavoro a tutti! Inoltre vorrei chiedervi cosa mi consigliate per ottenere un codice migliore in php
att: pelispedia
 

Discussioni simili