• User Attivo

    query per film actor

    Buongiorno, sono nuovo, spero mi possiate aiutare

    Sto costruendo un sito in php, argomento cinema, per ora sperimentale per capire il codice, poi viene migliorato e aggiunti altri dati
    Il database è in mysql cosi formato

    Database struttura: 3 tabelle

    actor: <------Table
    actor_id
    photo
    name

    film: <------Table
    film_id
    movie_title
    year

    film_actor: <------Table
    actor_id
    film_id

    Ho creato una pagina in cui si effettua la ricerca attori e tramite una scelta si passa ad un'altra tramite una query
    Nella pagina attori vengono visualizzati i dati della tabella actory e dei film

    **cinema.php

    [PHP]<?php

    $con = mysqli_connect("localhost","root","","xxx");

    $id = $_GET['id'];
    $id = mysqli_real_escape_string($con,$id);
    $query = mysqli_query($con, "SELECT film.* FROM film
    JOIN film_actor ON film_actor.film_id = film.film_id
    WHERE film_actor.actor_id = " . intval($_GET['id']));
    while($row=mysqli_fetch_array($query)){
    ?>

    <tr class="we">

    <td><?php echo "<a href="film.php?id=" . $row['film_id'] . "">" . $row['movie_title'] . "</a>";?></td>

    <td><?php echo $row['year']; ?></td>[/PHP]

    **film.php

    [PHP] $film_id = $_GET["id"];
    $query = mysql_query ("SELECT * FROM film WHERE film_id=". $film_id, $db);

    $row = mysql_fetch_array ($query);
    [/PHP]**
    **
    [PHP]<p class="bioheading">
    <p class="bioheading">Title</p><p class="biodata"><td><?php echo $row['movie_title']; ?><td></p>
    <p class="bioheading">Year</p><p class="biodata"><td><?php echo $row['year']; ?></td></p>[/PHP]

    nella pagina **film.php **oltre alle informazioni del film ci sono anche quelli degli attori che vorrei visualizzare,
    ricordo che nella pagina cinema.php visualizzo sia l'attore che la lista dei suoi film
    ho inserito questo, ma manca la query

    [PHP]<p><?php echo $row['actor_id'] . $row['nome'] ?>[/PHP]

    Come fare?


  • Staff Tecnico

    Ciao,

    Se non ho capito male quello che vuoi ottenere nella pagina film.php è il dettaglio del film scelto e la lista degli attori presenti.

    Ci sono due strade per raggiungere questo risultato, la prima è secondo me la migliore.

    **1. **La query che potresti fare è la seguente:

    SELECT a.actor_id, a.photo, a.name FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id WHERE fa.film_id = {film_id}
    

    dove {film_id} è la variabile php contenente l'id del film scelto.

    Questo vuol dire che avrai due query differenti, una per prendere i dati del film (che hai già scritto correttamente tu) e una per prendere i dati degli attori.

    **2. **Se invece vuoi fare una query unica potresti fare:

    SELECT * FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id JOIN film as f ON f.film_id = fa.film_id WHERE fa.film_id = {film_id}
    

    dove {film_id} è la variabile php contenente l'id del film scelto.

    Così facendo si ottiene un array che in ogni riga contiene i dati dell'attore e del film selezionato.

    Per la visualizzazione la cosa migliore è di prendere i dati dei film dal primo elemento dell'array e poi fare un ciclo per visualizzare i dati degli attori.

    Spero di essere stato abbastanza chiaro :smile5:


  • User Attivo

    Ciao andreagotta :smile5:
    grazie per la risposta, purtroppo come ho scritto non capisco molto di php, il codice che sto costruendo e' preso da internet o altro
    sono autodidatta, cerco d'imparare

    nella pagina film.php oltre alla scheda completa ci possono essere anche molti attori,

    ho inserito questo ma ricevo errore e naturalmente la pagina e' vuota

    [PHP]
    $db = mysql_connect ("localhost", "xxx", "xxx");
    // Create connection
    mysql_select_db ("xxx", $db);
    // Check connection
    if ($conn->connect_error) {
    die("Errore di Connessione: " . $conn->connect_error);
    }

    $film_id = $_GET["id"];
    $query = mysql_query ("SELECT a.actor_id, a.photo, a.name FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id WHERE fa.film_id = {film_id}=". $film_id, $db);

    $row = mysql_fetch_array ($query);

    ?>[/PHP]

    questo e' l'errore

    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in W:\domains\localhost\Testcerca_2019\film.php on line **15

    **[PHP]
    linea 15: $row = mysql_fetch_array ($query);
    [/PHP]

    ps: stranamente non mi arrivano le notifiche sull'email :mmm:


  • User Attivo

    @andreadragotta said:

    Ciao,

    **1. **La query che potresti fare è la seguente:

    >SELECT a.actor_id, a.photo, a.name FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id WHERE fa.film_id = {film_id}
    >```
    
    
    
    **2. **Se invece vuoi fare una query unica potresti fare:
    
    

    SELECT * FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id JOIN film as f ON f.film_id = fa.film_id WHERE fa.film_id = {film_id}

    **
    1.** non funziona, ho dovuto sostituire **name con nome e inserito il segno $ in {film_id}, cosi {$**film_id}


    1. ******questa funziona **visualizzo l'id e il nome, ma sto usando 2 query

    questa per i film

    [PHP]<?php

    $db = mysql_connect ("xxx", "xxx", "xxx");
    // Create connection
    mysql_select_db ("xxx", $db);
    // Check connection
    if ($conn->connect_error) {
    die("Errore di Connessione: " . $conn->connect_error);
    }

    $film_id = $_GET["id"];
    $query = mysql_query ("SELECT * FROM film WHERE film_id=". $film_id, $db);

    $row = mysql_fetch_array ($query);

    ?>[/PHP]

    e per gli attori

    [PHP]<?php

    $db = mysql_connect ("xxx", "xxx", "xxx");
    // Create connection
    mysql_select_db ("xxx", $db);
    // Check connection
    if ($conn->connect_error) {
    die("Errore di Connessione: " . $conn->connect_error);
    }

    $film_id = $_GET["id"];
    $query = mysql_query ("SELECT * FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id JOIN film as f ON f.film_id = fa.film_id WHERE fa.film_id = {$film_id}");

    $row = mysql_fetch_array ($query);

    ?>[/PHP]

    ma tu ha specificato che la 1 e' meglio :mmm:


  • User Attivo

    problema, ho scoperto che se inserisco 2 attori nello stesso film viene visualizzato solo 1, qualcosa non va' nel codice


  • User Attivo

    andreagotta grazie per il codice 🙂 ma ci sono problemi che non riesco a risolvere :bho:, in film.php la query restituisce solo un attore, in realta' sono di piu' :mmm:
    puoi fixarlo?


  • Staff Tecnico

    Ciao, ti avevo incollato solo la query SQL, ti metto di seguito il codice php che dovrebbe soddisfare la tua richiesta.

    [PHP]<?php
    $db = mysql_connect ("xxx", "xxx", "xxx");
    mysql_select_db ("xxx", $db);
    if ($conn->connect_error) {
    die("Errore di Connessione: " . $conn->connect_error);
    }

    $film_id = $_GET["id"];
    $query_film = mysql_query("SELECT * FROM film WHERE film_id = ". $film_id);
    $row = mysql_fetch_array($query_film);

    $query_actors = mysql_query("SELECT a.actor_id, a.photo, a.name FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id WHERE fa.film_id = ". $film_id);
    $actors = mysql_fetch_array($query_actors);

    if(count($row) != 1){
    echo "Errore";
    }else{
    ?>
    <h1><?= $row[0]['movie_title']; ?></h1>
    <h3><?= $row[0]['year']; ?></h3>

    <strong>Lista degli attori</strong>
    <ul>
    <?php foreach($actors as $actor){ ?>
        <li><img src="<?= $actor['photo'] ?>" width="100px" alt="<?= $actor['name'] ?>"><?= $actor['name'] ?></li>
    <?php } ?>
    </ul>
    

    <?php
    }
    ?>
    [/PHP]


  • User Attivo

    ciao Andrea

    mi da errore :rollo:

    **Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in **W:\domains\localhost\Testcerca_2019\film.php on line **13
    Errore

    linea 13

    [PHP]$actors = mysql_fetch_array($query_actors);[/PHP]



  • User Attivo

    questo sembra funzionare, ci vuole il ciclo while

    per i film c'e' l'altra query

    film.php

    [PHP]<?php

    $db = mysql_connect ("localhost", "xxx", "xxx");
    // Create connection
    mysql_select_db ("xxx", $db);
    // Check connection
    if ($conn->connect_error) {
    die("Errore di Connessione: " . $conn->connect_error);
    }

    $film_id = $_GET["id"];
    $query = mysql_query ("SELECT * FROM film_actor as fa JOIN actor as a ON a.actor_id = fa.actor_id JOIN film as f ON f.film_id = fa.film_id WHERE fa.film_id = {$film_id}");

    while($row=mysql_fetch_array($query)){

    ?>

    <div class="castbox"><p><img class="headshot" src="<?php echo $row ['nome'] ?>"><br><?php echo "<a href="cinema.php?id=" . $row['actor_id'] . "">" . $row['nome'] . "</a>";?></a><br><i><?php echo $row['credited'] ?></i><br><br> <br> <br></div>

    <?php
    }
    ?>
    [/PHP]

    Testato e sembra funzionante


  • User Attivo

    Altra query da risolvere, grazie Andrea per il suo contributo 🙂

    in film.php ci sono queste informazioni

    [PHP]

    <div class="castbox"><p><img class="headshot" src="<?php echo $row ['nome'] ?>"><br><?php echo "<a href="cinema.php?id=" . $row['actor_id'] . "">" . $row['nome'] . "</a>";?></a><br><i><?php echo $row['credited'] ?></i><br><br> <br> <br></div>
    [/PHP]

    in **cinema.php nella lista film attori

    [PHP]<?php

    $con = mysqli_connect("localhost","root","","xxx");

    $id = $_GET['id'];

                $id = mysqli_real_escape_string($con,$id);  
                $query = mysqli_query($con, "SELECT film.* FROM film  
    

    JOIN film_actor ON film_actor.film_id = film.film_id
    WHERE film_actor.actor_id = " . intval($_GET['id']));
    while($row=mysqli_fetch_array($query)){
    ?>

    <tr class="we">

    <td><?php echo "<a href="film.php?id=" . $row['film_id'] . "">" . $row['movie_title'] . "</a>";?></td>

    <td><?php echo $row['year']; ?></td>

    <td><?php echo $row['credited']; ?></td>

    <?php
    }
    ?>
    [/PHP]**

    quello che vorrei adesso e' collegare il campo [PHP]<?php echo $row['credited']; ?>[/PHP] di** film.php con quello di cinema.php

    i dati di credited sono visibili in film.php ma non in cinema.php (nella lista)

    film_actor < -----------Tabella

    [LEFT]actor_id
    [LEFT]
    film_id[/LEFT]

    credited
    [/LEFT]
    **


  • User Attivo

    Scusate se mi intrometto, ma nel 2019 non si possono vedere più le funzioni di mysql native. Né per didattica, né per test, per nulla proprio!

    Utilizza PDO per interfacciarti con MySQL 🙂

    https://it.phptherightway.com/#databases

    Al massimo MySQLi


  • Moderatore

    @flaviors200 said:

    Scusate se mi intrometto, ma nel 2019 non si possono vedere più le funzioni di mysql native. Né per didattica, né per test, per nulla proprio!

    Utilizza PDO per interfacciarti con MySQL 🙂

    https://it.phptherightway.com/#databases

    Al massimo MySQLi
    Ciao flaviors200.
    Hai perfettamente ragione in quello che dici e mi trovi pienamente d'accordo, anche perchè sono funzioni deprecate da anni che non girano quasi più da nessuna parte. Detto questo però, questa non è una scuola, ma un luogo ove cercare confronto e chiedere aiuto.
    La parte della richiesta in questo thread è una corretta Query SQL per ottenere dei dati, più che l'uso di PHP e va benissimo che tu dica di usare PDO, ma allora poni un esempio pratico, così che possa rimanere qui di aiuto anche per qualcun altro, perchè siamo tutti in grado di leggere php.net, ma non tutti abbiamo la stessa esperienza in questo settore.


  • User Attivo

    Ciao Stefano,

    non voglio certo fare il professore qua dentro, anche perchè di esperienza ne ho ma imparo sempre qualcosa di nuovo tutti i giorni, e credo che si possa imparare anche dai forum 🙂

    L'esempio pratico in realtà c'è e lo avevo pure linkato

    http://it.phptherightway.com/#databases

    Posso anche riportare il codice qui sul forum, però l'editor del codice molte volte non indenta bene e fatico parecchio a farlo a manina con gli spazi, dunque o lo posto su pastebin oppure, come in questo caso, il codice è già nella risorsa linkata (tra l'altro ancorata al paragrafo sui database).

    Grazie comunque per il tuo intervento.


  • Moderatore

    @flaviors200 said:

    Ciao Stefano,

    non voglio certo fare il professore qua dentro, anche perchè di esperienza ne ho ma imparo sempre qualcosa di nuovo tutti i giorni, e credo che si possa imparare anche dai forum 🙂

    L'esempio pratico in realtà c'è e lo avevo pure linkato

    http://it.phptherightway.com/#databases

    Posso anche riportare il codice qui sul forum, però l'editor del codice molte volte non indenta bene e fatico parecchio a farlo a manina con gli spazi, dunque o lo posto su pastebin oppure, come in questo caso, il codice è già nella risorsa linkata (tra l'altro ancorata al paragrafo sui database).

    Grazie comunque per il tuo intervento.
    Io ti ringrazio per la partecipazione che hai nel forum, ma oggettivamente parlando (non soggettivamente), quegli esempi non spiegano nulla, ma forse dei concetti dove fare copia e incolla per chi, già conosce le strutture di PDO e può prenderne spunto per riscriverle, perchè a livello codice, sono bucate e prive di controlli.
    Se conosci PDO, sai benissimo che esistono una serie ben definita di istruzioni che vanno passate alle variabili e che fanno parte della classe stessa, che li, non vengono neanche menzionate compromettendo di molto la stabilità e sicurezza delle connessioni al database.
    Questo intendevo. O si fanno degli esempi concreti e ben definiti oppure è preferibile non aggiungere altre nozioni a metà a delle persone che magari cercano aiuto su tutt'altro argomento, che ricordo essere una query SQL.


  • User Attivo

    Salve a tutti, 🙂
    come ho specificato nel thread sono un principante che conosce poco il php, quel poco che ho imparato non mi permette di risolvere i problemi legati a questo linguaggio,
    per questo chiedo aiuto a voi che siete molto piu' esperti di me, spero con il tempo di migliorare e aiutare un giorno forse qualcuno allo mio stesso livello.
    Il PDO non lo conosco, parto dalle basi piccole, dopotutto il mio database lo uso solo io.
    Grazie a tutti, e spero mi aiutate 🙂

    ps: non sono un programmatore, ne opero in questo campo, il mio lavoro e' di un altro tipo,
    quello che faccio e' una passione.


  • Moderatore

    Ciao Alex, cerco di aiutarti anche se sono dal telefono e mi rimane veramente difficile scrivere una corretta SQL, però il concetto te lo posso illustrare.
    Per estrarre gli attori di un dato film, devi necessariamente effettuare un query su di essi e non sul film da estrarre e lo puoi fare eseguendo un INNER JOIN.
    In pratica, la tua query è errata dal punto di vista delle estrazioni, non proprio nel metodo.
    Ovvero.
    Select actor.name as name, actor.photo as photo, film.movie_title as movie_title, film.year as year FROM film_actor INNER JOIN actor on film_actor.actor_id = actor.actor_id INNER JOIN film on film.film_id = film_actor.film_id where actor_film.film_ id = $film_id

    Mi spiace che sono in giro e non riesco ad aiutarti al meglio.
    Prova e fammi sapere.


  • User Attivo

    Ciao Ultima,
    a quale codice ti riferisci? :mmm:
    a film.php o cinema.php?
    perche' come lo strutturato adesso funziona come volevo io
    certo ci sono ancora molte cose da fare,
    oltre a quello citato sopra (non posso inserire il link al post perche' non sono Premium), ma e' quello prima del vostro intervento

    e questi (dove apriro' altri thread)

    • trovare il metodo per inserire le foto agli attori e i film
    • avere la possibilita' di aggiungere, cancellare, modificare dalla pagina php
    • inserire film scegliendo un attore collegato o viceversa
      ecc...

  • Moderatore

    Io creerei un unico file, film.php che viene richiesto quando passi la variabile film_id. In questo modo, con una sola query ottieni sia il film richiesto, che la lista degli attori partecipanti in elenco con annessi parametri aggiuntivi.
    Poi, per il caricamento delle immagini, quindi delle photo, cerca su PHP.net la variabile globale $_files e la funzione move_uploaded_file()
    Ci sono esempi pratici, che con un po'di ingegno, riesci tranquillamente ad adattare alle tue esigenze.
    Per le altre cose, il discorso è più ampio perché entrano in gioco altri tipi di fattori, sia di HTML, php e SQL, ma niente di trascendentale.
    Potresti provare a cercare su Google qualcosa tipo: creare un mini CMS in PHP. Almeno per apprenderne i concetti base. Ma a mio avviso, dovresti cercare per prima cosa sullo sperimentare porzioni di codice, per apprenderne la logica. Poi quando hai una buona conoscenza di base, ti lanci nella costruzione di un qualcosa di tuo.


  • User Attivo

    Ultima ciao,

    Ricreare tutto da zero e' un'impresa per me, ci ho messo mesi per arrivare a questo risultato, sono piu' professionale con il mio mestiere che scrivere php
    come e' scritto il codice adesso sembra funzionare, mancano ancora alcune cose da aggiustare, ma non so come fare,

    se mi aiuti su come visualizzare i **credited nella pagina cinema.php **ho risolto la fase query

    poi apro altre discussioni per gli altri aiuti


  • User Attivo

    @Ultima said:

    Io ti ringrazio per la partecipazione che hai nel forum, ma oggettivamente parlando (non soggettivamente), quegli esempi non spiegano nulla, ma forse dei concetti dove fare copia e incolla per chi, già conosce le strutture di PDO e può prenderne spunto per riscriverle, perchè a livello codice, sono bucate e prive di controlli.
    Se conosci PDO, sai benissimo che esistono una serie ben definita di istruzioni che vanno passate alle variabili e che fanno parte della classe stessa, che li, non vengono neanche menzionate compromettendo di molto la stabilità e sicurezza delle connessioni al database.
    Questo intendevo. O si fanno degli esempi concreti e ben definiti oppure è preferibile non aggiungere altre nozioni a metà a delle persone che magari cercano aiuto su tutt'altro argomento, che ricordo essere una query SQL.

    Ma infatti quelle risorse servono soprattutto a prendere spunto, se uno vuole la pappa bella e pronta è un altro discorso.

    Io ho semplicemente fatto notare che bisognerebbe cambiare approccio e non copiare e incollare il primo codice che si trova in rete, seguendo cattive pratiche.

    Nell'esempio del sito PHP The Right Way c'è tutto quello che serve per connettersi ed eseguire query in maniera sicura, comprese le query parametriche.

    istruzioni che vanno passate alle variabili e che fanno parte della classe stessa, che li, non vengono neanche menzionate compromettendo di molto la stabilità e sicurezza delle connessioni al database

    Cosa intendi? I parametri PDO::MYSQL_ATTR_INIT_COMMAND oppure PDO::ATTR_EMULATE_PREPARES ad esempio?