Inserimento dati a cascata

  • Creatore Discussione Creatore Discussione Alex_70
  • Data di inizio Data di inizio
marino51 comunque grazie per il tuo grande aiuto, se non vuoi continuare ti capisco, e stato tutto molto difficile (anche se tu hai scritto all'inizio che era facile), figuriamoci farlo io.

Spero che altri utenti che ne capiscano piu' di me mi aiutano a completare lo script che al momento risulta essere incompleto e non e' quello che avevo richiesto :confused:, anzi.

Cerchero' di ragionare su come costruire il nuovo codice che ricordo dovrebbe funzionare cosi

1) Inserimento film in form 1
2) dopo l'inserimento
3 passare al codice 2 per collegare film, film_actor, actor (tutto nella stessa pagina)
4) la form 2 dovrebbe mostrarmi i dati compilati precedentemente,

film_id,
movie_title

io devo inserire solo
actor,
genre
e
credited


questa e' la struttura semplificata del database

Tabella: actor
Tabella: film_actor <------------ questa e' relezionata con actor e film
Tabella: film

0.png
 
Ultima modifica:
per favore, il codice che segue eliminalo, memorizzandolo in un file chiamato "archivioFilm.include"
aggiorna i parametri per la connessione, il file non verrà più modificato salvo per mali estremi
ed i parametri di connessione non sono all'interno del nostro script

PHP:
    $servername = "localhost";
    $username   = "exadmin";
    $password   = "expass";
    $dbname     = "xxx";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_errno) { $message = "ERRORE : connessione al db fallita, " . $conn->connect_error; return; }

al suo posto metti la riga che segue, che importa nello script il codice per la connessione al db

PHP:
    require_once 'archivioFilm.include';

poi prova l'allegato, ci sono i bottoni di conferma

ps, puoi disabilitare il log, modificando in "false" (senzavirgolette)
PHP:
$set['log']        = true;
 

Allegati

buongiorno marino51 :)

dunque o fatto cosi

scaricato archivioFilm.zip

rinominato quello vecchio (per backup) e messo questo nuovo

inserito questo in archivioFilm.php

PHP:
<?php

require_once 'archivioFilm.include';  //// questo codice NEW

$set['script']     = $_SERVER['PHP_SELF'];


/* ---------------------------------------------------------------- */

creato un file rinominaldolo in archivioFilm.include

PHP:
<?php

    $servername = "localhost";
    $username   = "exadmin";
    $password   = "expass";
    $dbname     = "xxx";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_errno) { $message = "ERRORE : connessione al db fallita, " . $conn->connect_error; return; }

?>

RISULTATO se inserisco ID e clicco cerca :(

PHP:
Fatal error: Call to a member function query() on null in E:\OSPanel\domains\localhost\cinema\archivioFilm.php on line 181

line 181

PHP:
$result = $conn->query($sql);
 
caspita, mi sono accorto che

PHP:
require_once 'archivioFilm.include';


e' gia presente nel file, eliminato quello inserito ma il risultato non cambia

ps: ma require_once non viene inserito all'inizio del codice?
 
e' gia presente nel file, eliminato quello inserito ma il risultato non cambia
non capisco cosa vuoi dire,
ti ho chiesto di mettere quel codice in un file nuovo, con il nome e l'estensione indicati

ed esattamente in sostiruzione del codice rimosso, inserire la riga singola

lo scopo é di avere un codice quasi identico tra noi, perché abbiamo db diversi ed é necessario inserire tutti i tuoi parametri e togliere i miei quando ti passo lo script modificato

tutto ciò fatto sullo script già in tuo possesso, serve solo a capire se hai fatto le modifiche giuste e quindi proseguire con lo script ultimo che ti ho inviato e che si appoggia già al file esterno

ps: ma require_once non viene inserito all'inizio del codice?
assolutamente no, lo si mette dove serve in funzione del codice contenuto

ps, se fai diversamente a modo tuo, rispetto a quanto suggerito, gli errori sono possibili
 
I parametri di connessione li ho messi nel file archivioFilm.include

quello che avevo aggiunto in piu' in archivioFilm e' questa riga, ma poi mi sono accorto che era gia' presente (quindi lo tolta)

PHP:
require_once 'archivioFilm.include';

il codice adesso e' uguale al tuo

Risolto: avevo scambiato i file in localhost :eek:
 
Ultima modifica:
perfetto, funziona, anche per unique key ;)

funziona anche CKEDITOR sul campo synopsis (cosa e' cambiato? :rolleyes:)

aggiungerei una variabile (movie_title, anno) nell'echo che visualizza questo dopo inserimento/cancellazione/modifica

esempio

Congratulazioni, The Exorcist (1973) é stato aggiornato nel database

ho provato a farlo io ma sono tutte $row :rolleyes:

passeremo alla fase 2 adesso?

ps: cosa ti ha fatto cambiare idea nel continuare? ieri avevi abbandonato :)

sshot_codice14.png
 
devi sostituire interamente la "function aggiornaDB"
cancella tutta la funzione, (ti aiutano le righe di separazione, che ti consiglio di lasciare)
ed inserisci il nuovo codice in sostituzione, le modifiche sono marginali ma meglio trattare l'intero blocco
PHP:
function aggiornaDB($azione = "")
{
    global $conn, $set, $row, $message;

    if($set['log']) error_log("aggiornaDB  : ".$azione, 0);

    switch ($azione)
    {
        case "conferma ins":
            $sql = "INSERT INTO film(movie_title, also_known, year, minutes, distributor, studio, release_data, incollection, synopsis) VALUES ("
                 . "  '" . $row['movie_title']  . "'"
                 . ", '" . $row['also_known']   . "'"
                 . ", '" . $row['year']         . "'"
                 . ", '" . $row['minutes']      . "'"
                 . ", '" . $row['distributor']  . "'"
                 . ", '" . $row['studio']       . "'"
                 . ", '" . $row['release_data'] . "'"
                 . ", '" . $row['incollection'] . "'"
                 . ", '" . $row['synopsis']     . "'"
                 . "  )";
            $x = "inserito";
            break;

        case "conferma mod":
            $sql = "UPDATE film SET"
                 . "  movie_title='"   . $row['movie_title']  . "'"
                 . ", also_known='"    . $row['also_known']   . "'"
                 . ", year='"          . $row['year']         . "'"
                 . ", minutes='"       . $row['minutes']      . "'"
                 . ", distributor='"   . $row['distributor']  . "'"
                 . ", studio='"        . $row['studio']       . "'"
                 . ", release_data='"  . $row['release_data'] . "'"
                 . ", incollection='"  . $row['incollection'] . "'"
                 . ", synopsis='"      . $row['synopsis']     . "'"
                 . "  WHERE film_id='" . $row['film_id']      . "'";
            $x = "modificato";
            break;

        case "conferma elim":
            $sql = "DELETE FROM film"
                 . " WHERE film_id='" . $row['film_id']. "'";
            $x = "eliminato";
            break;

        case "cerca":
            $sql = "SELECT film_id, movie_title, also_known, year, minutes, distributor, studio, release_data, incollection, synopsis"
                 . " FROM film WHERE film_id='" . $row['film_id'] . "'";
            break;

        case "conta_id":
            $sql = "SELECT count(*) as counter FROM film WHERE film_id='" . $row['film_id'] . "'";
            break;

        case "conta_titolo":
            $sql = "SELECT count(*) as counter FROM film WHERE movie_title='" . $row['movie_title'] . "'";
            break;

        default:
            $message = "ERRORE : aggiornaDB, azione non riconosciuta";
            return;
            break;
    }
    if($set['log']) error_log("sql         : ".$sql, 0);



    $result = $conn->query($sql);
    if ( !$result ) { $message = "ERRORE : aggiornaDB, errore nella query, " . $conn->error; return; }

    if( in_array( $azione,
                  array("cerca", "conta_id", "conta_titolo") ) )
    {
        $dati = $result->fetch_assoc();  $result->free();
    }



    switch ($azione)
    {
        case "cerca":
            $row = $dati;
            break;

        case "conta_id":
        case "conta_titolo":
            return $dati['counter'];
            break;

        default:
            $message = "Congratulazioni, ".$row['movie_title']." (".$row['year'].") é stato ".$x." nel database.";
            inizializzaVariabili();
            break;
    }
}
 
fase 2, potresti usare questo codice per gestire gli attori, funziona uguale,
la logica é identica, cambiano solo le informazioni da trattare
ma come dici tu é sempre $row (per fare meno fatica e non perdere mai i dati, dico io)
potresti cominciare dal form, modificando blocchetto dopo blocchetto ....

poi potremmo passare alla fase 3, compito più arduo,
1) definire una logica di funzionamento
2) disegnare il form conseguente
 
ok, ho cambiato la funzione function aggiornaDB, tutto a posto :)
adesso si capisce cosa e' stato modificato/inserito/eliminato
si puo visualizzare il message in alto? sopra il titolo
per gli attori sicuramente faro' il processo inverso, ma non adesso, quando lo script e' finito (se no :eek:)
il form che collega actor film_actor film e' gia' pronto e' funzionante (manca la ricerca), solo che si deve collegare con questo
avevo pensato cosi in caso dei film, lo script inserimento passa all'altro script l'id del film, poi io scelgo gli attori da collegare
che ne pensi?
di solito in altri siti funziona cosi: sei nella scheda attore e selezioni aggiungi film
oppure
sei nella scheda film e selezioni aggiungi attore

grazie
 
Ultima modifica:
@Alex_70
Che bisogno hai di scrivere i post saltando una riga ogni riga? In questo modo i post diventano lunghi e meno leggibili!!
 
Max 1

scrivo cosi per rendere comprensibile il concetto, se non va bene posso scrivere standard :)
ho aggiustato il post sopra, va bene adesso?
 
anche l'occhio vuole la sua parte :)

sshot_codice15.png


ho messo i messaggi sopra tramite una variabile nel blocco html, non ho capito come distanziare i bottoni, sono troppo vicini :rolleyes:
 
si puo visualizzare il message in alto? sopra il titolo
puoi spostare la riga del messaggio, sotto riportata, dove vuoi, con il limite che sia esterna al form
ovvero NON DEVE essere un campo compreso tra <form> e </form>
PHP:
  <div class='col-sm-10 col-sm-offset-2'><h2><?= $message; ?></h2></div>

solo che si deve collegare con questo
avevo pensato cosi in caso dei film, lo script inserimento passa all'altro script l'id del film, poi io scelgo gli attori da collegare
che ne pensi?
ho realizzato una cosa simile per le formule dei mangimi,
associando ad ogni formula (film) i componenti (attori) e le caratteristiche (?)
ma ti garantisco che é decisamente oneroso, perché si aggiunge la gestione di script e form diversi che é il massimo del caos

non sarebbe male fare una ricerca per attore (come hai suggerito) e agganciare il film
ma vorrei tenere limitato il numero dei film su cui operare la scelta, altrimenti si lavora di "scroll"

esempio, immagina
gli attori (formule) in una lista x confermare il prescelto

1588098028220.png


ed una equivalente lista di film (componenti) da cui scegliere quale associare

1588098276818.png


ma vorrei tenere queste liste molto corte per evitare lo "scoll" della pagina

suggerisci .....
 
sono troppo vicini

il metodo più semplice, metti uno <span> dopo ciascuno di loro, tipo
HTML:
    switch ($azione)
    {
        case "cerca":
            $readonly2 = "";
            $btn = "<input type='submit' name='submit' value='modifica' />"
                 . "<span style='padding-left: 30px;'></span>"
                 . "<input type='submit' name='submit' value='elimina' />";
            break;

        case "inserisci":
            $btn = "<input type='submit' name='submit' value='conferma ins' />";
            break;

        case "modifica":
            $btn = "<input type='submit' name='submit' value='conferma mod' />";
            break;

        case "elimina":
            $btn = "<input type='submit' name='submit' value='conferma elim' />";
            break;

        default:
            $readonly1 = "";
            $readonly2 = "";
            $btn = "<input type='submit' name='submit' value='inserisci' />"
                 . "<span style='padding-left: 30px;'></span>"
                 . "<input type='submit' name='submit' value='cerca' />";
            break;
    }
    $btn .= "<span style='padding-left: 30px;'></span>"
         .  "<input type='submit' name='submit' value='rinuncia' />";

SCUSA ho fatto un errore, ho corretto il blocco

sostituisci tutto il blocco
 
Ultima modifica:
sono riuscito a distanziare solo un bottone ma l'altro no :rolleyes:

sshot_codice16.png


ho dovuto usare lo slash nel codice se no dava errore

PHP:
switch ($azione)
    {
        case "cerca":
            $readonly2 = "";
            $btn = "<input type='submit' name='submit' value='modifica' />"
                 . "<span style=\"padding-left: 30px;\"></span>"
                 . "<input type='submit' name='submit' value='elimina' />";
                   "<span style=\"padding-left: 30px;\"></span>";
            break;

        case "inserisci":
            $btn = "<input type='submit' name='submit' value='conferma ins' />";
                   "<span style=\"padding-left: 30px;\"></span>";
            break;

        case "modifica":
            $btn = "<input type='submit' name='submit' value='conferma mod' />";
                   "<span style=\"padding-left: 30px;\"></span>";
            break;

        case "elimina":
            $btn = "<input type='submit' name='submit' value='conferma elim' />";
                   "<span style=\"padding-left: 30px;\"></span>";
            break;

        default:
            $readonly1 = "";
            $readonly2 = "";
            $btn = "<input type='submit' name='submit' value='inserisci' />"
                 . "<span style=\"padding-left: 30px;\"></span>"
                 . "<input type='submit' name='submit' value='cerca' />";
                   "<span style=\"padding-left: 30px;\"></span>";
            break;
    }
  
  
    $btn .= "<input type='submit' name='submit' value='rinuncia' />";
                  "<span style=\"padding-left: 30px;\"></span>";


    // valorizza la select "incollection"

questo operatore dopo $btn e' normale che deve stare li? :rolleyes:

PHP:
$btn .= "<input type='submit' name='submit' value='rinuncia' />";

per il codice successivo ci sto pensando su come strutturarlo :rolleyes:
 
Ultima modifica:
sono riuscito a distanziare solo un bottone ma l'altro n
hai messo il codice un po' a "casaccio",
sostituisci tutto il blocco con quello che ti ho postato qui

1588146934253.png


per quanto riguarda il legame attore film, avrei una soluzione semplice, ma,
dipende da come é preferibile lavorare,
ho il film e lego gli attori, oppure
ho l'attore e lego i film ?

é importante sapendo quali dati hai a disposizione, lavori preferibilmente sugli attori o sui film ?

detto ciò, supponendo gli attori siano il punto di partenza,

si può creare un form per la (sola) ricerca dell'attore e conferma,
a cui far seguire un secondo form per la (sola) ricerca del film e conferma
ed infine un terzo form per la conferma della "congiunzione"

in questo modo lo script diventa lineare e facile

nel frattempo se puoi posta lo script con cui aggiorni gli attori e la struttura del db che stai usando
 
Buongiorno a tutti :)

ciao marino51


per inserire i film e gli attori uso pypmyadmin, di solito aggiorno gli attori (la filmografia e' piu' complessa da gestire)
per modificare i film ho un form che abbiamo usato come base di partenza per fare questo che preleva 'id dell'attore
tramite $actor_id = $_GET["id"];
poi ho un'altro form che ho trovato inserito in un progetto film, lo modificato e funziona, questo serve per colllegare gli attori al film (ma non lo uso principalmente, per il motivo che ho scritto qui in questo topic)

struttura del database semplificata

sshot_codice17.png

Tabella actor
actor_id
nome
foto
eccc..

Tabella film_actor questa collega gli l'attore e il film
actor_id
film_id
credited
genre
last_update

Tabella film
film_id
movie_title
also_known
year
minutes

Importante: tutto il progetto iniziale e' partito dal database sakila, i campi principali e le tabelle sono uguali al mio,
il database con i doc e' liberamente scaricabile dal sito MySQL

sakila database sito

sakila database download

questo sono i form per modifica attore e per collegare film attore (in fase embrionale)


grazie
 
Ultima modifica:
nel form addMovieActor che collega attori e film si potrebbe inserire una ricerca sia per gli attori che per i film con il preview di una cover (actor e film , se disponibile) , in questo modo si semplifica il processo
 

Discussioni simili