• User Attivo

    la query precedente funziona benissimo

    adesso mi serve una per inserire il titolo e collegarlo all'attore, ho fatto molti tentativi ma non riesco a risolvere :?:bho::rollo:

    Database struttura: 3 tabelle

    actor: <------Table
    actor_id
    nome
    foto

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

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

    **questo e' il codice completo
    **
    [PHP]<!DOCTYPE html>
    <html>
    <head> <title> I4 - Add Movie to Actor Relation </title> </head>
    <link rel="stylesheet" href="S1.css">
    <body>

    <div align="center" style="margin-left: 18%; padding: 1px 15px;">
        <h1> Add Movie to Actor Relation</h1>
        
        <form method = 'GET' action='#'> <div class="form-group"><label for="movieid">Movie Title   </label><option value=NULL> </option>
        <div>
            <label for="movie_title">Movie Title</label>
            <input type="text" class="textBox" placeholder="Text input" name="movie_title">
        </div><br>
        
        
        <div>
            <label for="credited">Credited</label>
            <input type="text" class="textBox" placeholder="Text input" name="credited">
        </div><br>
        
        <div>
        
        
        <div>
            <label for="year">Year</label>
            <input type="text" class="textBox" placeholder="Text input" name="year">
        </div><br>
        
        <label for="actorid">Actor   </label><select class="form-control" name='actorid'><option value=NULL> </option> 
    
        <?php 
            $servername = "localhost";
            $username = "xxx";
            $password = "xxx";
            $dbname = "xxx";
            
            $connection = new mysqli($servername, $username, $password, $dbname);
            
            $dataCells = array();
    
            $sql = "select concat(actor_id,' ', nome, ' ', credited, ' ') , actor_id from actor;";
            
            $result = $connection->query($sql);
            while ($resultProperties = mysqli_fetch_field($result)) {
                $name = $resultProperties->name;
                array_push($dataCells, $name); 
            }
            
            $colIndex = 0;
            $actorName;
            while ($row = mysqli_fetch_array($result)) {
                foreach ($dataCells as $cell) {
                    if ($colIndex == 0){
                        $actorName = $row[$cell];
    
                    }
                    else if ($colIndex == 1) {
                        echo "<option value=" . $row[$cell] . ">" . $actorName;
                        echo "</option>";
                    }
    
                    $colIndex++;
                }
                $colIndex = 0;
            }
        ?>
        </select><br><br>
        
        <div>
        
        
        <button type="submit" class="button">Add!</button></div><br>
    
        </form>
    
        <?php
            if (isset($_GET['movieid'])) {
                $movieid = $_GET['movieid'];
                $movie_title = $_GET['movie_title'];
                $credited = $_GET['credited'];
                $year = $_GET['year'];
                $actorid = $_GET['actorid'];
                
                
                
                $sql = "insert into film values 
                movie_title = '". $movie_title . "'
                , credited = '" . credited . "'
                , year = '" . $year ."'
                WHERE actor.actor_id = '" . $actorid ."' 
                AND 
                film.film_id = '" . $movieid ."'";
                    //echo $sql;
                    $result = $connection->query($sql);
                
                
                $connection = new mysqli("localhost", "exadmin", "expass", "xxx");
                $result = $connection->query($sql);
                
                // esecuzione della query
    

    if (!$connection->query($sql)) {
    echo "Errore della query: " . $connection->error . ".";
    }else{
    echo "Dati <b> " . $movie_title . " " . $also_known . " </b> inseriti correttamente nel database."; $sql;
    }

            }
    

    ?>

    </div>
    

    </body>
    </html>

    [/PHP]


  • User

    Ciao Alex, scusa la domanda che mi viene spontanea, hai studiato un po' di database relazionali prima di creare le tre tabelle sopra?
    Hai ben capito cos'è una "relazione molti a molti" e come viene implementata con le tabelle in un DB?
    In caso, ti consiglio i tutorial di W3C, sono molto chiari su questo aspetto e potrebbero risolverti molti problemi.

    Anyway, la tabella film_actor si chiama "tabella di congiunzione" e serve appunto a tener traccia dei collegamenti dei vari attori all'interno di un film e dei vari film recitati da un attore (per l'appunto la relazione molti a molti)!
    Quindi, per riuscire a collegare un attore ad un film devi andare ad eseguire una insert nella tabella film_actor con i due ID, in questo modo:

    INSERT INTO film_actor VALUES (id_film_ricevuto, id_attore_ricevuto);

    Ovviamente devi ricevere gli ID del film e dei vari attori da collegare.
    Potresti ricevere gli ID degli attori al momento dell'inserimento di un nuovo film, oppure anche in una pagina successiva che andrai ad implementare dopo aver fatto inserire le informazioni essenziali del film.
    In caso ricevessi tutte le informazioni in un solo momento, prima dovresti lanciare una query per inserire un nuovo film, poi, attraverso l'apposita funzione php mysql_insert_id recuperi l'ID dell'ultimo inserimento (in questo caso il film) e procedi all'inserimento dei vari ID degli attori ricevuti nella tabella di congiunzione film_actor!

    Spero di essere stato chiaro!


  • User Attivo

    Ciao Federico 🙂
    il concetto sulle query realazionali lo conosco,in teoria, ma nella pratica poi quando devo andare a creare le query sono un disastro,
    ci sono cose che non riesco ancora a fare,

    chiedo lumi a chi e' piu' esperto di me in materia

    spero di migliorare in futuro 😞

    il problema qui sta collegare il titolo, che io voglio inserire manualmente, con gli attori,
    ovviamente tutta la compilazione dei dati film deve stare nella stessa pagina, per l'ID attore che e' presente non si pone il problema,
    il titolo film pero' deve essere ancora inserito, quindi non esite ancora l'ID,


  • User

    OK Alex, allora devi utilizzare (come ti ho scritto sopra) la funzione di php (tu usi il 5.6) che si chiama:

    mysql_insert_id($conn);

    Grazie a questa funzione riesci a recuperare l'ultimo ID che è stato inserito nel DB.

    Allora, presupponendo di avere un form dove puoi compilare tutti i campi del film ed anche di selezionare gli attori, riceverai tutti i dati nel tuo script di conferma.
    A quel punto dovrai fare più query: una per inserire il film e altre query per collegare ogni attore al film.

    Quindi i passaggi sono:
    QUERY INSERT FILM -> nella tabella film;
    Recupero l'ultimo ID inserito con la funzione mysql_insert_id($conn) -> Sarà l'ID del tuo film appena inserito;
    UNA QUERY PER OGNI ATTORE DA COLLEGARE AL FILM -> nella tabella film_actor;

    Implementalo e vedi che funzionerà! 😉


  • User Attivo

    Federico grazie per le tue spiegazioni, mah.. non potresti inserirmi il pezzo di codice che manca nel post, prima che ci arrivo passeranno giorni :arrabbiato:
    come ho specificato nei primi thread ho cominciato a interessarmi al php da circa 2 mesi, ancora ho molto da imparare 😞


  • User Attivo

    Risolto :yuppi::fumato:

    una curiosita, quale sono gli input type corretti delle form per questi campi?
    io ho inserito questi, sono giusti?

    **Tipo

    varchan = <input type="text"

    year (4) = <input type="year"

    date = <input type="date"

    text = <input type="text"
    **[LEFT]

    enum=** <input type=" " ******questo non capisco ****
    [/LEFT]
    [LEFT]

    [/LEFT]


  • User

    Ciao Alex, se ti mettevo il codice avresti fatto semplicemente copia/incolla. Così invece hai analizzato la mia spiegazione e la hai implementata. Ora hai veramente imparato qualcosa di nuovo! 😉

    Per quanto riguarda gli input sono corretti.
    Per la questione ENUM, invece, sono dei valori nel DB che sono impostati inizialmente da te. Quindi nel momento in cui li inserisci dovranno rispettare le tue specifiche di creazione.
    Puoi utilizzare il type text nel campo di input, però devi controllare quando lo ricevi che sia formattato in modo corretto. Oppure, cosa più semplice, fai una tendina di selezione con gli ENUM disponibili e l'utente seleziona quello desiderato!


  • User Attivo

    Ciao Federico** :smile5:

    varchan = <input type="text" ha il limite di 255

    **text = <input type="text" simile al blocco note

    **

    varchan input come text e' giusto, ma text?

    sono diversi****

    **


  • User

    Ciao Alex, io farei così:

    Se hai un campo VARCHAR:

    <input type="text" maxlength="255" />
    

    Se hai un campo TEXT ma sai che la risposta può stare in una riga:

    <input type="text" />
    

    Se hai un campo TEXT che utilizzi per registrare ad esempio la trama del film (che quindi è lunga):

    <textarea placeholder="Scrivi la trama del film..."></textarea>
    

    Se hai un campo ENUM, pensandoci bene, andrei con la tendina a selezione per evitare qualsiasi errore da parte dell'utente:

    
    <select>
        <option value="ENUM1">ENUM1</option>
        ....
        <option value="ENUM8">ENUM8</option>
    </select>
    
    

  • User Attivo

    Grazie Federico 🙂