Bozza soluzione II Prova ITIA Esame di Stato 2022/2023

1.    Analisi della Piattaforma web per la gestione dei giochi educativi

Lo studente come il docente effettua il login nella piattaforma. Lo studente seguendo il link della classe virtuale sarŕ invitato a inserire il proprio login.

Le monete sono associate al Videogioco/Attivitŕ e allo studente

Nel Catalogo dei giochi verranno inserite anche le attivitŕ di completamento o  i quiz ( gestiti come un tipo di videogico)

Login (differenziato tra Docente e Studente Possib. Amministratore/gestore piattaforma)

Vincoli: lo studente e il docente devono effettuare il login in piattaforma

Progettazione concettuale

·        Individuazione delle entitŕ e degli attributi

VideoGiochi, Studente/Docente, Classi Virtuali, Login

VideoGiochi: Titolo, DescrizioneBreve, Descrizione, Classifica, MoneteGioco, img1,img2,img3

Studente: Nome,Cognome, Monete

Attributi Multi valore: Monete, Argomento

Registrazione: dati completi degli utenti che accedono al sistema

 

·        Descrizione delle entitŕ

1.      Videogiochi: catalogo dei giochi educativi presenti nel sistema/compresi le attivitŕ come i quiz.

2.      Studente: studente che utilizzerŕ l’applicazione e i giochi predisposti dal docente

3.      Docente: docente che accede alla piattaforma

4.      Classi Virtuali: il gruppo di alunni che userŕ i giochi predisposti

5.      Login: contiene i dati degli utenti definendo il livello di accessibilitŕ Docente/Alunno/ Amministratore/Gestore

6.      Registrazione: nome, cognome, CF,…etc

Videogiochi č un entitŕ forte che regge la piattaforma

Studente č debole potrebbe non partecipare

Docente č forte non avrebbe senso la piattaforma

Classe Virtuale debole potrebbe non essere stata ancora creata

Login č debole potrebbero non essere state ancora usate

Registrazione forte perché nessuno puň entrare nel sistema

Casella di testo: Studente
Id(pk),Nome, Cognome
Casella di testo: Videogioco
Id(pk), Titolo, DescrizioneBreve, Descrizione, Classifica, MoneteGioco, img1,img2,img3

 

 

 

Casella di testo: Registrazione
Id(pk), Nome, Cognome, CF, Residenza
Casella di testo: Docente
Id(pk),Nome, Cognome

 

 

 

 

Casella di testo: Classi Virtuali
codice(pk), Nome, materia, Ngiochi, Giochi associati

 

 

 

Studio delle relazioni:

Videogioco –(Gioca)—Studente

Cardinalitŕ:  (NxN)

Ad un videogioco possono giocare N giocatori

Uno studente puň giocare con N videogiochi

Opzionali: (0,0)

Ad un Videogioco puň non giocare alcuno studente (0)

Uno studente puň essere iscritto alla piattaforma ma non giocare a nessun gioco(0)

Docente –(Seleziona)—Videogioco

Cardinalitŕ: (NxN)

Un docente puň selezionare N videogiochi

Un Videogioco puň essere selezionato da piů docenti

Opzionalitŕ: (0,0)

Un docente puň non selezionare Videogiochi ( non ha creato ancora classi virtuali)(0)

Un Videogioco puň non essere selezionato da alcun docente(0)

Videogioco –(Compone)—Classe Virtuale (NxN)

Cardinalitŕ: (NxN)

Un Videogioco puň comporre piů classivirtuali

Una classe virtuale č composta da n videogiochi

Opzionalitŕ: (0,1)

Un Videogioco potrebbe non appartenere a nessuna classe virtuale(0)

Un classeVirtuale deve essere composta almeno di un videogico(1)

Docente –(crea)—ClasseVirtuale (Nx1)

Cardinalitŕ: (N,1)

Un docente puň creare N classi virtuali

Una classe virtuale puň essere creata da un docente

Opzionalitŕ: (0,1)

Un docente puň non creare classivirtuali(0)

Un Classe virtuale deve sempre essere stata creata da un docente (1)

Studente –(usa/associa)—ClasseVirtuale(NxN)

Cardinalitŕ: (NxN)

Uno studente puň usare N classi virtuali

Una classe virtuale puň essere usata da N studenti

Opzionalitŕ: (0,0)

uno studente puň non usare alcuna classe virtuale( č stato associato dal docente ad una classe ma lui non l’ha mai usata)(0)

Un classe virtuale potrebbe non essere stata usata da alcun studente(0)

Studente/Docente –(effettua)—Login(1xN)

Cardinalitŕ: (1XN)

Uno studente/docente effettua N login

Un login č effettuato da uno studente/docente

Opzionalitŕ: (1,1)

uno studente/docente deve effettuare almeno un login(1)

Un login č effettuato da un solo studente o docente(1)

Studente –(possiede)—Moneta

Cardinalitŕ: (NxN)

uno studente possiede N monete

Una moneta puň essere posseduta da N studenti

Opzionalitŕ:

uno studente puň possedere 0 monete(0)

un moneta deve essere posseduta almeno da uno studente(1)

Moneta –(associata)—Videogioco (Nx1)

Cardinalitŕ: (Nx1)

Una moneta puň essere associata a N videogico

Un videogioco puň essere associato ad una moneta

Videogioco –(associato)—argomento(1xN)

Cardinalitŕ: (1xN)

Un videogioco č associato ad un argomento

Ad un argomento sono associati N videogiochi

Opzionalitŕ:

un videogioco deve essere associato ad un argomento(1)

un argomento deve avere associato almeno un videogioco(1)

 

 

2.  Progettazione logica

Costruiamo il diagramma E/R semplificato eliminando gli attributi Multivalore che sono in Videogioco Argomento e in Studente Monete

 

Applichiamo le regole di traduzione logiche

Prima: tutte le entitŕ si trasformano in tabelle

1.      Argomento(id(pk),Descrizione)

2.      Videogioco(id(pk), Titolo, DescrizioneBreve, Descrizione, Classifica, nMonete, img1,img2,img3)

3.      Moneta(id(pk),Descrizione)

4.      Studente(CF(pk),nome,cognome)

5.      ClasseVirtuale((Nome,Materia)(pk),ngiochi)

6.      Docente(matricola(pk), nome,cognome,materia)

7.      Login(id(pk),email,password, funzionalitŕ)

Applichiamo le regole di traduzione per le relazioni:

Videogioco –(Gioca)—Studente (NxN)

1.      Videogioco(id(pk), Titolo, DescrizioneBreve, Descrizione, Classifica, nMonete, img1,img2,img3)

2.      Studente(CF(pk),nome,cognome)

3.      Gioca((idGioco(fk),CFStudente(fk))(pk)) ( aggiungo una nuova entitŕ con il nome della relazione e con le chiavi delle due entitŕ coinvolte nella relazione)

Docente –(Seleziona)—Videogioco(NxN)

1.      Docente(matricola(pk), nome,cognome,materia)

2.      Videogioco(id(pk), Titolo, DescrizioneBreve, Descrizione, Classifica, nMonete, img1,img2,img3)

3.      Seleziona((DocMat(fk),idVg(fk))(pk)) ( aggiungo una nuova entitŕ con il nome della relazione e con le chiavi delle due entitŕ coinvolte nella relazione)

Videogioco –(Compone)—Classe Virtuale (NxN)

1.      Videogioco(id(pk), Titolo, DescrizioneBreve, Descrizione, Classifica, nMonete, img1,img2,img3)

2.      ClasseVirtuale((Nome,Materia)(pk),ngiochi)

3.      Compone((idVg(fk), (Nome,Materia)(fk))(pk)) ( aggiungo una nuova entitŕ con il nome della relazione e con le chiavi delle due entitŕ coinvolte nella relazione)

Docente –(crea)—ClasseVirtuale (Nx1)

1.      ClasseVirtuale((Nome,Materia)(pk),ngiochi,matDoc(fk)) ( + Matricola del docente come FK)

2.      Docente(matricola(pk), nome,cognome,materia)

Studente –(usa/associa)—ClasseVirtuale (NxN)

1.      Studente(CF(pk),nome,cognome)

2.      ClasseVirtuale((Nome,Materia)(pk),ngiochi,matDoc(fk))

3.      Usa(CFStudente (fk), (ClasseNome,ClasseMateria)(fk))

Studente/Docente –(effettua)—Login(1xN)

1.      Studente(CF(pk),nome,cognome)

2.      Login(id(pk),email,password, CFStudente (fk))

Docente –(effettua)—Login(1xN)

1.      Docente(matricola(pk), nome,cognome,materia)

2.      Login(id(pk),email,password, CFStudente (fk), matDoc(fk),Funzionalitŕ)

Studente –(possiede)—Moneta(NxN)

1.      Studente(CF(pk),nome,cognome)

2.      Moneta(id(pk),Descrizione)

3.      Possedere (CFStudente(fk),IdMoneta(fk),numeroMonete,datatime)

Moneta –(associata)—Videogioco (Nx1)

1.      Moneta(id(pk),Descrizione)

2.      Videogioco(id(pk), Titolo, DescrizioneBreve, Descrizione, Classifica, nMonete, img1,img2,img3,idMoneta(fk))

Videogioco –(associato)—argomento(1xN)

1.      Videogioco(id(pk), Titolo, DescrizioneBreve, Descrizione, Classifica, nMonete, img1,img2,img3,idMoneta(fk), idArgomento(fk))

2.      Argomento(id(pk),Descrizione)

Schema logico finale

·        Videogioco(id(pk), Titolo, DescrizioneBreve, Descrizione,  nMonete, img1,img2,img3,idMoneta(fk), idArgomento(fk))

·        Argomento(id(pk),Descrizione)

·        Moneta(id(pk),Descrizione)

·        Possedere (CFStudente(fk),IdMoneta(fk),numeroMonete,datatime)

·        Studente(CF(pk),nome,cognome)

·        Docente(matricola(pk), nome,cognome,materia)

·        Login(id(pk),email,password, CFStudente (fk), matDoc(fk),Funzionalitŕ)

·        ClasseVirtuale((Nome,Materia)(pk),ngiochi,matDoc(fk))

·        Usa(CFStudente (fk), (ClasseNome,ClasseMateria)(fk))

·        Compone((idVg(fk), (Nome,Materia)(fk))(pk))

·        Seleziona((DocMat(fk),idVg(fk))(pk))

·        Gioca((idGioco(fk),CFStudente(fk))(pk))

 

3.  Schema fisico

#drop DATABASE if EXISTS pippo

CREATE DATABASE IF NOT EXISTS codeorg;

Use codeorg



CREATE TABLE Studente(

    CF VARCHAR(16) NOT NULL PRIMARY KEY,

    Nome  VARCHAR(50) NOT NULL,

    Cognome VARCHAR(50) NOT NULL

);

 

CREATE TABLE Docente(

    Matricola VARCHAR(6) NOT NULL PRIMARY KEY,

    Nome  VARCHAR(50) NOT NULL,

    Cognome VARCHAR(50) NOT NULL,

    Materia VARCHAR(50) NOT NULL

);

 

CREATE TABLE Moneta(

     id INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,

     Descrizione VARCHAR(500) NOT NULL

);

CREATE TABLE Argomento(

     id INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,

     Descrizione VARCHAR(500) NOT NULL

);

CREATE TABLE Videogioco (

    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,

Titolo VARCHAR(50) NOT NULL ,

DescrizioneBreve VARCHAR(160) NOT NULL ,

Descrizione VARCHAR(500) NOT NULL ,

Nmonete INT,

img1 BLOB,

img2 BLOB,

img3 BLOB,

idArgomento INT,

foreign key (idArgomento) references Argomento (id),

idMoneta INT,

 foreign key (idMoneta) references Moneta (id)

) ENGINE = InnoDB;

 

CREATE TABLE Possedere(

    CFStudente VARCHAR(16) NOT NULL,

    foreign key (CFStudente) references Studente (CF),

    idMoneta INT,

    foreign key (idMoneta) references Moneta (id),

    NMonete int NOT NULL,

    pdatatime DATETIME

);

 

CREATE TABLE ClasseVirtuale(

    Nome VARCHAR(16) NOT NULL,

    Materia VARCHAR(20) NOT NULL,

    primary key (Nome, Materia),

    ngiochi INT,

    Matdoc VARCHAR(6) NOT NULL,

    foreign key (Matdoc) references Docente (matricola)

);

CREATE TABLE Usa(

    CFStudente VARCHAR(16) NOT NULL,

    foreign key (CFStudente) references Studente (CF),

    Nome VARCHAR(16) NOT NULL,

    Materia VARCHAR(20) NOT NULL,

    foreign key (Nome,Materia) references ClasseVirtuale (Nome,Materia)

);

CREATE TABLE Login(

    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT ,

    email VARCHAR(16) NOT NULL,

    pass VARCHAR(20) NOT NULL,

    funzionalita VARCHAR(60) NOT NULL,

    CFStudente VARCHAR(16) NOT NULL,

    foreign key (CFStudente) references Studente (CF),

    Matdoc VARCHAR(6) NOT NULL,

    foreign key (Matdoc) references Docente (matricola)

);

CREATE TABLE Gioca(

    idGioco INT NOT NULL,

    foreign key (idGioco) references Videogioco (id),

    CFStudente VARCHAR(16) NOT NULL,

    foreign key (CFStudente) references Studente (CF),

   primary key (idGioco, CFStudente)

);

CREATE TABLE Seleziona(

    Matdoc VARCHAR(6) NOT NULL,

    foreign key (Matdoc) references Docente (matricola),

    idGioco INT NOT NULL,

    foreign key (idGioco) references Videogioco (id),

   primary key (Matdoc, idGioco)

);

CREATE TABLE Compone(

    idGioco INT NOT NULL,

    foreign key (idGioco) references Videogioco (id),

    Nome VARCHAR(16) NOT NULL,

    Materia VARCHAR(20) NOT NULL,

    foreign key (Nome,Materia) references ClasseVirtuale (Nome,Materia),

   primary key (idGioco,Nome,Materia)

);

 

4.  le interrogazioni in SQL

a)      select * from videogioco

inner join argomento on argomento.id = videogioco.idArgomento

where argomento.Descrizione like "specifico"

order by titolo

 

b)      SELECT * from studente

INNER join usa on studente.CF = usa.CFStudente

Inner join classevirtuale on usa.Nome = classevirtuale.Nome AND usa.Materia=classevirtuale.Materia

inner join compone on compone.Nome = classevirtuale.Nome and compone.Materia = classevirtuale.Materia

inner join videogioco on videogioco.id = compone.idGioco

inner join possedere on possedere.CFStudente= studente.CF

where classevirtuale.Nome like '1B' AND classevirtuale.Materia like “matematica”  AND videogioco.Titolo like "quiz"

order by possedere.NMonete

 

c)      select count(*), videogioco.Titolo from classevirtuale

inner join compone on compone.Nome = classevirtuale.Nome and classevirtuale.Materia

inner join videogioco on videogioco.id = compone.idGioco

GROUP by videogioco.id

 

Semplice login

Login.html

<!doctype html>

<html lang="it">

 

<head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  <title>Autenticazione su un sito</title>

</head>

 

<body>

  <h1>Autenticazione su un sito</h1>

  <form action="accedi.php" method="post">

    <p>

<input type="email" class="form-control" name="email" id="email" placeholder="name@example.com">

      <label for="email">E-mail</label>

 

    </p>

    <p>

      <input type="password" class="form-control" name="password" id="password" placeholder="Password">

      <label for="password">Password</label>

 

    </p>

    <p>

      <input type="submit" name="button" id="button" value="Entra" />

    </p>

  </form>

</body>

 

</html>

 

Accedi.php

<?php

    session_start();

    $servername = "localhost";

    $username = "root";

    $password = "";

    $db = "codeorg ";

   

    $conn = new mysqli($servername, $username, $password, $db);

   

        if($conn->connect_error){

            die("Connessione fallita: " . $conn->connect_error);

        }

   

   

    $email_user = $conn -> real_escape_string($_POST["email"]);

    $password_user = $conn -> real_escape_string($_POST["password"]);

 

    $sql = "SELECT id_utente, nome, password from LOGIN where email = ?";

    $stmt = $conn->prepare($sql);

    $stmt->bind_param('s', $email_user);

    $stmt->execute();

 

    $stmt->bind_result($out_id, $out_nome, $out_password);

 

    while ($stmt->fetch()) {

        if($password_user === $out_password){

            echo "Accesso effettuato per l'utente " .$out_nome;

            $_SESSION["email"] = $email_user;

            $_SESSION["id"] = $out_id;

            $_SESSION["nome"] = $out_nome;

        } else {

            echo "Username o password non valide";

        }

    }

    $stmt->close();

    $conn->close();

 

?>