Inserimento dati a cascata

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
attivato $set['log'] = true;

quando inserisco un dato da select (che non visualizzo) si resetta l'altro
il messaggio visualizza
Congratulazioni, Alex é stato modificato nel database.

dovrei visualizzare altro?
 

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
postato dove sai

prima ho inserito career_status e poi salvato, reinserito dopo la ricerca eye_color

risultato come ho scritto sopra
 

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
buongiorno marino51 :)

sto testando il tutto, sembra che il tutto FUNZIONA perfettamente (finalmente :))

hai fatto un ottimo lavoro, grazie, ;) sei veramente una brava persona, oltre che un ottimo programmatore :p

ci sarebbero pero' delle piccole cose d'aggiustare, vedi tu' se vale la pena

1)
quando si effettua la ricerca su attori e film lasciando tutti i campi vuoti il risultato mi restituisce tutti i record,
questo metodo va bene se ci sono pochi inserimenti ma in caso di 1000 1.000.000 di record la pagina sicuramente andra in crash
esaurendo la memoria
come si risolve?
con la paginazione
esempio su 1000 risultati
10 record (personalizzabili) per pagina

2)
l'eliminazione di un film non e' possibile se e' collegato con attori

possibile che non esiste un metodo per cancellare un film o scollegare la relazione ? mi sembra strano

l'idea sarebbe creare una query che prima cancella/scollega il record nella tabella film_actor e poi il film nella tabella film

tabelle
mio database con relazioni

actor
actor_id
nome


film_actor // collega film_actor
actor_id
film_id


film
film_id
movie_title


fammi sapere
 

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
o forse non e' necessaria la paginazione, basta solo validare i campi quando si fa' la ricerca con un warning di inserire almeno un dato :rolleyes:
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
quando si effettua la ricerca su attori e film lasciando tutti i campi vuoti il risultato mi restituisce tutti i record,
questo metodo va bene se ci sono pochi inserimenti ma in caso di 1000 1.000.000 di record la pagina sicuramente andra in crash
esaurendo la memoria
come si risolve?
con la paginazione
esempio su 1000 risultati
10 record (personalizzabili) per pagina
si devono usare i filtri, sono stati messi apposta per ridurre il numero degli elemeti estratti e facilitare la scelta ottenendo un set mirato
credo che un'altra soluzione non abbia senso, perché far scorrere le pagine annoia, non é corretto eseguire due ricerche in sequenza ed ogni volta rischiare di "paginare" 100 volte per non aver usato i filtri
i filtri lavorano anche con parole incomplete, puoi cercare "l' esorcista" immettendo la l seguita dall'apice ed il film viene selezionato

perché é necessaria la paginazione ?

l'eliminazione di un film non e' possibile se e' collegato con attori

possibile che non esiste un metodo per cancellare un film o scollegare la relazione ? mi sembra strano
per me non é un problema di programmazione ma logico,
ritieni sia giusto eliminare il film con tutti i legami agli attori, pensaci ancora un attimo e lo facciamo
 

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
1) lo escludiamo, penso che in fondo non vale la pena, in fondo la ricerca serve per questo

2) eliminazione film, questo e' necessario,

per testare gli script ho inserito un film/i che non esiste nella realta' (e adesso e' inutile) nel profilo Alex (inutile anche questo)

Tabella film
Test movie per Alex
movie_id 343

Tabella actor
Alex
actor_id 40

adesso in phpmyadmin eseguo questa query nella tabella film_actor (che collega actor e film)

SQL:
SELECT * FROM `film_actor` WHERE `film_id` = 343
trovato, eseguo altra query

SQL:
DELETE FROM `film_actor` WHERE `film_actor`.`actor_id` = 40 AND `film_actor`.`film_id` = 343;
collegamento film actor delete

altra query e trovo il film da tabella film

SQL:
SELECT * FROM `film` WHERE `film_id` = 343
delete film

SQL:
DELETE FROM `film` WHERE `film`.`film_id` = 343;
fatto, film cancellato

quindi il codice sarebbe strutturato cosi

1) delete collegamento da film_actor
2) conferma delete o rinuncia
3) dopo la scelta delete
4) message collegamento cancellato
5) message se voglio cancellare anche il film
6) conferma delete o rinuncia
7) message film cancellato dal dtabase

fine

anche per gli attori penso vale la stessa logica, Alex e' inutile e' dovrebbe essere cancellato dopo aver rimosso i collegamenti


query testate su phpmyadmin
 
Ultima modifica:

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
adesso che ci penso rimane un problema, nel caso il film e' collegato con molti attori?

allora si dovrebbe eseguire una ricerca e valutare se eliminare i collegamenti film actor
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
intanto con queste 4 righe di codice, puoi limitare la lista dei film selezionando solo quelli collegati

PHP:
function leggiPost()
{
    global $conn, $set, $actor, $film;

    $set['azione']  = trim(htmlspecialchars($_POST['myForm']));
    $set['bottone'] = trim(htmlspecialchars($_POST['submit']));    // aggiungi questa riga

PHP:
            if ($film['release_data']) { $sql.= " AND release_data LIKE '%" . $film['release_data']."%'"; }

            if ($set['bottone'] == "collegati") { $sql = "SELECT * FROM (".$sql.") t WHERE collegato='c'"; }    // aggiungi questa riga

            $sql.= " ORDER BY collegato, movie_title, distributor, year";

PHP:
    <center><span class='infoblock-pagetype'>
      <input type='submit' name='submit' value='cerca' />
      <span style='padding-left: 30px;'></span>
      <input type='submit' name='submit' value='collegati' />    <!-- aggiungi questa riga -->
      <span style='padding-left: 30px;'></span>                  <!-- aggiungi questa riga -->
      <input type='submit' name='submit' value='rinuncia' />
    </span></center>
  </form>
  <br />
  <div class='col-sm-10 col-sm-offset-2'><h2><?= $message; ?></h2></div>
</div>
</body>
</html>
<?php
}

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

function displayFilmList()
ti ho lasciato i riferimenti per non sbagliare l'inserimento
 

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
fatto, 4 righe di codice aggiunto

test

selezionando su collegati vengono visualizzati i film dell'attore
 
Ultima modifica:

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
Ciao marino51
lo script mi sembra uguale a quello precedente :rolleyes:, cosa e' cambiato?
edit:
non e' uguale, quello era actor/film
questo e' film/actor

hai integrato per caso il delete?
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
hai integrato per caso il delete?
no, il rischio é di cancellare l'intero set "film/attore" o "attore/film"
in realtà la query é pronta
SQL:
        case "conferma elim":
            $sql = "DELETE FROM actor"
                 . " WHERE actor_id='" . $row['actor_id']. "'";

//            $sql = "DELETE actor FROM actor"
//                 . " INNER JOIN film_actor ON actor.actor_id = film_actor.actor_id"
//                 . " WHERE actor.actor_id='" . $row['actor_id']. "'";
            $x = "eliminato";
            break;
ma, dopo la prova, l'ho lasciata commentata
 

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
no, il rischio é di cancellare l'intero set "film/attore" o "attore/film"
in realtà la query é pronta
SQL:
        case "conferma elim":
            $sql = "DELETE FROM actor"
                 . " WHERE actor_id='" . $row['actor_id']. "'";

//            $sql = "DELETE actor FROM actor"
//                 . " INNER JOIN film_actor ON actor.actor_id = film_actor.actor_id"
//                 . " WHERE actor.actor_id='" . $row['actor_id']. "'";
            $x = "eliminato";
            break;
ma, dopo la prova, l'ho lasciata commentata
buongiorno marino51,

quindi non si puo' eliminare il film o l'attore?
che prova hai fatto?
:rolleyes:
perche' su phpmyadmin il delete e' riuscito perfettamente
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
perche' su phpmyadmin il delete e' riuscito perfettamente
la query commentata che ti ho postato, funziona bene,

ne faccio solo un discorso di sicurezza, esempio,
se elimino un attore che ha 50 film collegati,
perdo anche i 50 collegamenti,
va bene ?
se la risposta é positiva, puoi inserire la query commentata (eliminando quella operativa ora)

per i film, la query é la stessa modificando attori in film
 

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
la query commentata che ti ho postato, funziona bene,

ne faccio solo un discorso di sicurezza, esempio,
se elimino un attore che ha 50 film collegati,
perdo anche i 50 collegamenti,
va bene ?
se la risposta é positiva, puoi inserire la query commentata (eliminando quella operativa ora)

per i film, la query é la stessa modificando attori in film



case delete attori

Alex ha 2 film collegati
i 2 film collegati hanno come attori Alex e Gigi
se elimino Alex rimane Gigi con i 2 film collegati

case delete film
Film 1 e collegato con Alex e Gigi
Alex e Gigi sono collegati anche con Film 2 e Film 3
eliminando Film 3 Alex e Gigi sono collegati con Film 1 e Film 2

in pratica prima di cancellare si verificano i dati e poi si effettua il tutto

se la risposta é positiva, puoi inserire la query commentata (eliminando quella operativa ora)
nel mio codice non ci sono query commentate, a quale script ti riferisci dei tre?

mi potresi gentilmente postare il codice delle 2 query (film e actor) per delete film e actor
con relativo warning prima di cancellare
se possibile anche i riferimenti dove inserire il codice

Grazie marino51
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
cinetecaAttori.php

nella function validaForm(), bisogna disabilitare il controllo,

facendo riferimento all' if più esterno, va cambiato il blocchetto in questo modo

PHP:
    if( in_array( $set['azione'],
                  array("elimina") ) )
    {
        $x = aggiornaDB("conta_colleg");

        if( !empty($x) )
        {
            $message = "ATTENZIONE : esistono ".$x." film collegati all&acute; attore, valuta se proseguire";
            return;
        }
    }

nella function aggiornaDB($azione = ""), facendo riferimento al case, va cambiato il blocchetto in questo modo

PHP:
        case "conferma elim":
            $sql = "DELETE FROM film_actor WHERE actor_id='" . $row['actor_id']. "'";
            $result = $conn->query($sql);

            $sql = "DELETE FROM actor WHERE actor_id='" . $row['actor_id']. "'";
            $x = "eliminato";
            break;

cinetecaFilm.php

nella function validaForm(), bisogna disabilitare il controllo,

facendo riferimento all' if più esterno, va cambiato il blocchetto in questo modo

PHP:
    if( in_array( $set['azione'],
                  array("elimina") ) )
    {
        $x = aggiornaDB("conta_colleg");

        if( !empty($x) )
        {
            $message = "ATTENZIONE : esistono ".$x." attori collegati al film, valuta se proseguire";
            return;
        }
    }

nella function aggiornaDB($azione = ""), facendo riferimento al case, va cambiato il blocchetto in questo modo

PHP:
        case "conferma elim":
            $sql = "DELETE FROM film_actor WHERE film_id='" . $row['film_id']. "'";
            $result = $conn->query($sql);

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

Alex_70

Utente Attivo
13 Nov 2018
312
14
18
HELL
perfetto, funziona perfettamente :) grande lavoro marino51, grazie tante :)

un piccolo appunto, in cinetecaCollega.php

dopo collegati e la visualizzazione di tutti i film collegati all'attore

sshot-1.png


seleziono il film


sshot-2.png


clicco su Elimina ma non visualizzo la conferma di eliminazione, si puo' integrare questo codice?

sshot-3.png

inoltre dopo eliminazione aggiungerei anche il collegamento con cinetecaFilm.php al film eliminato in caso dopo lo scollegamento all'attore si decide di eliminare anche il film

esempio:
Test movie per Alex 5 non e' piu' associato all'attore Alex nel database, vuoi eliminare anche questo film?
conferma
o rinuncia

in caso di conferma si passa al film e si elimina, con rinuncia si ritorna alla pagina vuota

finale, ho messo il testo colorato per evidenziare meglio le scelte, si potrebbe fare anche questo nel codice
con i warning (rosso o verde) e i bottoni (rosso verde o altro)