venerdì 6 novembre 2015

Esercitazione MySQL - Foreign Key

C:\.....\bin>mysql -u root -p
Enter password:******
Welcome to the MySQL monitor....
....
....
....
mysql> create database scuola;
Query OK, 1 row affected (0.00 sec)

mysql> use scuola;
Database changed

mysql> create table classe (idc integer not null auto_increment primary key, ann
o integer not null, sezione char(1) not null, descrizione varchar(25) not null);

Query OK, 0 rows affected (0.22 sec)

mysql> insert into classe (anno,sezione,descrizione) values (1,'a','informatica');
Query OK, 1 row affected (0.03 sec)

mysql> insert into classe (anno,sezione,descrizione) values (1,'b','informatica');
Query OK, 1 row affected (0.02 sec)

mysql> insert into classe (anno,sezione,descrizione) values (1,'c','informatica');
Query OK, 1 row affected (0.01 sec)

mysql> insert into classe (anno,sezione,descrizione) values (1,'a','chimica');
Query OK, 1 row affected (0.02 sec)

mysql> insert into classe (anno,sezione,descrizione) values (1,'b','chimica');
Query OK, 1 row affected (0.03 sec)

mysql> insert into classe (anno,sezione,descrizione) values (1,'c','chimica');
Query OK, 1 row affected (0.03 sec)

mysql> select * from classe;
+-----+------+---------+-------------+
| idc | anno | sezione | descrizione |
+-----+------+---------+-------------+
|   1 |    1 | a       | informatica |
|   2 |    1 | b       | informatica |
|   3 |    1 | c       | informatica |
|   4 |    1 | a       | chimica     |
|   5 |    1 | b       | chimica     |
|   6 |    1 | c       | chimica     |
+-----+------+---------+-------------+
6 rows in set (0.00 sec)

mysql> create table studente (idce integer, foreign key(idce) references classe(idc) on delete cascade, ids integer not null auto_increment primary key, nome varchar(25) not null, cognome varchar(25) not null, citta varchar(25) not null);
Query OK, 0 rows affected (0.19 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (1,'giacomo','leopardi','recanati');
Query OK, 1 row affected (0.02 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (1,'mario','rossi','milano');
Query OK, 1 row affected (0.02 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (1,'giovanni','brambilla','bologna');
Query OK, 1 row affected (0.02 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (4,'massimo','bianchi','milano');
Query OK, 1 row affected (0.02 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (4,'gianluca','basso','pavia');
Query OK, 1 row affected (0.03 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (4,'davide','mallemaro','torino');
Query OK, 1 row affected (0.03 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (2,'giuseppe','astri','bolzano');
Query OK, 1 row affected (0.02 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (3,'luca','bonfanti','aosta');
Query OK, 1 row affected (0.04 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (5,'susanna','castaldi','napoli');
Query OK, 1 row affected (0.04 sec)

mysql> insert into studente (idce,nome,cognome,citta) values (6,'maria','soprano','taranto');
Query OK, 1 row affected (0.04 sec)

mysql> select * from studente;
+------+-----+----------+-----------+----------+
| idce | ids | nome     | cognome   | citta    |
+------+-----+----------+-----------+----------+
|    1 |   1 | giacomo  | leopardi  | recanati |
|    1 |   2 | mario    | rossi     | milano   |
|    1 |   3 | giovanni | brambilla | bologna  |
|    4 |   4 | massimo  | bianchi   | milano   |
|    4 |   5 | gianluca | basso     | pavia    |
|    4 |   6 | davide   | mallemaro | torino   |
|    2 |   7 | giuseppe | astri     | bolzano  |
|    3 |   8 | luca     | bonfanti  | aosta    |
|    5 |   9 | susanna  | castaldi  | napoli   |
|    6 |  10 | maria    | soprano   | taranto  |
+------+-----+----------+-----------+----------+
10 rows in set (0.00 sec)

mysql> select * from classe;
+-----+------+---------+-------------+
| idc | anno | sezione | descrizione |
+-----+------+---------+-------------+
|   1 |    1 | a       | informatica |
|   2 |    1 | b       | informatica |
|   3 |    1 | c       | informatica |
|   4 |    1 | a       | chimica     |
|   5 |    1 | b       | chimica     |
|   6 |    1 | c       | chimica     |
+-----+------+---------+-------------+
6 rows in set (0.00 sec)

mysql> delete from classe where idc=1;
QUERY OK, 1 row affected (0.02 sec)

mysql> select * from classe;
+-----+------+---------+-------------+
| idc | anno | sezione | descrizione |
+-----+------+---------+-------------+
|     |      |         |             |
|   2 |    1 | b       | informatica |
|   3 |    1 | c       | informatica |
|   4 |    1 | a       | chimica     |
|   5 |    1 | b       | chimica     |
|   6 |    1 | c       | chimica     |
+-----+------+---------+-------------+
5 rows in set (0.00 sec)

mysql> select * from studente;
+------+-----+----------+-----------+----------+
| idce | ids | nome     | cognome   | citta    |
+------+-----+----------+-----------+----------+
|      |     |          |           |          |
|    4 |   4 | massimo  | bianchi   | milano   |
|    4 |   5 | gianluca | basso     | pavia    |
|    4 |   6 | davide   | mallemaro | torino   |
|    2 |   7 | giuseppe | astri     | bolzano  |
|    3 |   8 | luca     | bonfanti  | aosta    |
|    5 |   9 | susanna  | castaldi  | napoli   |
|    6 |  10 | maria    | soprano   | taranto  |
+------+-----+----------+-----------+----------+
10 rows in set (0.00 sec)

I vincoli di integrità referenziale di propagazione consentono di definire le operazioni eseguite da SQL Server quando un utente tenta di eliminare o aggiornare una chiave alla quale fa riferimento una chiave esterna.
Le clausole REFERENCES delle istruzioni CREATE TABLE e ALTER TABLE supportano le clausole ON DELETE e ON UPDATE. Le operazioni di propagazione possono anche essere definite utilizzando la finestra di dialogo Relazioni chiavi esterne:
NO ACTION è il valore predefinito se non viene specificata ON DELETE o ON UPDATE.
ON DELETE NO ACTION: Specifica che se si tenta di eliminare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, verrà generato un errore e verrà eseguito il rollback dell'istruzione DELETE.
ON UPDATE NO ACTION: Specifica che se si tenta di aggiornare un valore di chiave in una riga e alla chiave fanno riferimento chiavi esterne in righe esistenti in altre tabelle, verrà generato un errore e verrà eseguito il rollback dell'istruzione UPDATE.
Con CASCADE, SET NULL e SET DEFAULT, le eliminazioni o gli aggiornamenti di valori di chiave possono influire sulle tabelle con relazioni di chiave esterna tracciabili alla tabella in cui è stata eseguita la modifica. Se le operazioni referenziali di propagazione sono state definite anche nelle tabelle di destinazione, tali operazioni saranno inoltre valide per le righe eliminate o aggiornate. 
ON DELETE CASCADE: Specifica che se si tenta di eliminare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, verranno inoltre eliminate tutte le righe contenenti tali chiavi esterne.
ON UPDATE CASCADE: Specifica che se si tenta di aggiornare un valore di chiave in una riga e a tale valore fanno riferimento chiavi esterne in righe esistenti in altre tabelle, tutti i valori che compongono la chiave esterna verranno anch'essi aggiornati al nuovo valore specificato per la chiave.
Fonte: Esercizio pratico in laboratorio e "https://technet.microsoft.com/it-it/library/ms186973(v=sql.105).aspx"

domenica 1 novembre 2015

Progettazione di un Software o Sistema Informativo

Progettare un Software o un Sistema Informativo




Ci sono diverse fasi nella progettazione di un Sistema Informativo, nel dettaglio:

-          Analisi: ha lo scopo di individuare i concetti chiave della richiesta e fornire per ogni concetto chiave una documentazione che prende il nome di “Glossario dei termini”.
-          Progettazione Concettuale: per eseguire la progettazione concettuale ho bisogno di uno strumento: un modello di riferimento. Un modello di riferimento è un insieme di regole che ha lo scopo di ricreare uno schema concettuale, il modello che andremo ad utilizzare è il modello Entità-Associazioni (Modello E/R).
Regole:
o      Entità -> Concetto chiave (rappresentato con un rettangolo)
o       Associazione -> Il legame tra i concetti chiave (rappresentato con un rombo)
o       Tipi di legame -> 1:1, 1:N, N:M … 1 _____ N (rappresentato con una riga)

*!* Per individuare le entità all'interno di una traccia dovrò fare attenzione ai sostantivi
*!* Per individuare le associazione all'interno di una traccia dovrò fare attenzione ai verbi
*!* Bisogna stare attenti a non creare da uno stesso concetto chiave più concetti chiave: in Italiano si è soliti utilizzare dei sinonimi per rendere il testo più leggibile, i sinonimi possono trarre in inganno

Esempio:
Prendiamo in analisi un associazione Classe – Studente:



Le entità sono STUDENTE e CLASSE, il legame che le unisce è la FREQUENZA di uno studente ad una determinata classe.
*!* Lo schema deve funzionare sia se letto da sinistra a destra che se letto da destra a sinistra.
-          Più Studenti frequentano una Classe
-          Una Classe è frequentata da più studenti

Sia per le entità che per le associazioni sono previsti degli attributi:


*!* Solo le entità possono prevedere un identificatore univoco rappresentato dalla sottolineatura del nome dell’attributo.

Vanno previste anche delle specifiche di progetto: dettagli di progettazione che vanno motivati per valutare ogni aspetto del progetto. 
Esempio: ogni studente deve frequentare un minimo di una classe? Se voglio lavorare su studenti che hanno un corso attivo probabilmente si, ma se devo gestire anche uno storico di studenti che negli anni hanno già portato a termine il loro percorso allora potrei avere studenti che non stanno frequentando alcun corso.

mercoledì 28 ottobre 2015

Esercitazione MySQL - PrimaryKEY

Esercitazione MySQL: creazione utente - assegnazione permessi amministratore - creazione database - connessione database - creazione tabella dipendenti contenente i campi: ID (int not null auto_increment primarykey, nome varchar (25) not null, cognome varchar (25) not null, stipendio int not null) - verifica della primarykey con eliminazione di una riga della tabella e inserimento di una nuova riga (la nuova riga avrà un numero successivo in sequenza e non utilizzerà la primarykey lasciata libera dalla precedente cancellazione).

Codice MySQL:


giovedì 7 maggio 2015

Correzione Verifica su classe Login Maggio 2015

Realizzare un’applicazione WEB che consenta la registrazione di più utenti. I dati saranno memorizzati all’interno di un array di nome Utenti. In seguito viene descritta l’organizzazione dell’applicazione:



PAGINA HTML DI INDEX PER LOGIN:
<html>
<head>
Pagina di Login
</head>
<body>

<form action="Controllo.php" method="post">
Username: <input type="text" name="user"><br>
Password: <input type="text" name="pass"><br>
<input type="submit" value="Entra">
</form>
Se non sei ancora registrato clicca <a href='nuovaRegistrazione.html'>"QUI"</a> e registrati

</body>
</html>

PAGINA HTML PER EFFETTUARE NUOVA REGISTRAZIONE:
<html>
<head>
Nuova Registrazione...
</head>
<body>
Inserisci i seguenti campi per procedere alla registrazione:<br><br>
<form action="Registra.php" method="POST">
Nome:     <input type="text" name="newNome"><br><br>
Cognome:  <input type="text" name="newCognome"><br><br>
eMail:    <input type="text" name="newEmail"><br><br>
Username: <input type="text" name="newUser"><br><br>
Password: <input type="text" name="newPass"><br><br>
<input type="submit" name="REGISTRATI!"><br><br>
</form>
</body>
</html>

CODICE PHP -> Controllo.php
<?PHP
class Login
{
var $Utenti = array();
var $username;
var $password;
var $fileDati;   //canale per salvataggio su FILE
public function __costruct()
{
$this->username=null;
$this->password=null;
}
public function Inserisci()
{
$this->username=$_POST["user"];
$this->password=$_POST["pass"];
}
public function Visualizza()   //metodo per visualizzare i dati ricevuti in input
{
foreach($this->Utenti as $buffer)
echo "ARRAY: $buffer<br>";
}
public function leggiDati()
{
$utenteRiconosciuto=0;
$this->fileDati=fopen("Database.txt", "r");
while(!feof($this->fileDati))
{
fscanf($this->fileDati,"%s",$this->Utenti[]);
}
$i=3;
$j=4;
while($i<count($this->Utenti))
{
if((strcmp($this->username, $this->Utenti[$i])==0)&&(strcmp($this->password, $this->Utenti[$i+1]==0))) 
$utenteRiconosciuto++;
$i=$i+5;
$j=$j+5;
}

if($utenteRiconosciuto>0)
echo "Utente riconosciuto!<br>";
else
echo "Utente non Riconosciuto...<br>";

fclose($this->fileDati);
}
}
$obj = new Login();
$obj->Inserisci();
$obj->leggiDati();
?>

CODICE PHP -> Registra.php

<?PHP
class Registrazione
{
var $Utenti = array();
var $username;
var $password;
var $nome;
var $cognome;
var $eMail;
var $reg;
var $fileDati;   //canale per salvataggio su FILE
public function __costruct()
{
$this->username=null;
$this->password=null;
$this->nome=null;
$this->cognome=null;
$this->eMail=null;
}
public function Inserisci()
{
$this->Utenti[]=$_POST["newNome"];
$this->Utenti[]=$_POST["newCognome"];
$this->Utenti[]=$_POST["newEmail"];
$this->Utenti[]=$_POST["newUser"];
$this->Utenti[]=$_POST["newPass"];
}
public function Visualizza()   //metodo per visualizzare i dati ricevuti in input
{
echo "username inserito: $this->username";
echo "<br>password inserita: $this->password";
}
public function scriviDati()
{
$this->fileDati=fopen("Database.txt", "a");
foreach($this->Utenti as $b)
fwrite($this->fileDati, $b."\r\n");   //scrivo su file il contenuto della variabile username e password
fclose($this->fileDati);
}
public function benvenuto()
{
$numeroUtentiRegistrati=count($this->Utenti);
$i=($numeroUtentiRegistrati-5);
$this->fileDati=fopen("Database.txt", "r");
echo "Benvenuto ".$this->Utenti[$i]. " ".$this->Utenti[$i+1];
}
}

$obj = new Registrazione();
$obj->Inserisci();
$obj->scriviDati();
$obj->benvenuto();
?>

Tabella Dinamica PHP

Esempio di una tabella dinamica realizzata in linguaggio PHP:

<?php

require_once "profile.php";
$j=0;   //inizzializzo per stampa indice in esempio tabella

echo"<table border=5>";

for($i=0;$i<3;$i++)   //ciclo FOR per numero riche
{
echo "<tr>";
for($j=0;$j<10;$j++)   //ciclo FOR per numero colonne
echo "<td>riga n° $i / colonna n° $j</td>";
echo "</tr>";
}

echo "</table>";

?>

Il PHP (cenni di base)

I Principali linguaggi di programmazione:
PHP | C | C++ | JAVASCRIPT | JAVA |
Cos'hanno in comune questi linguaggi di programmazione?
Tutti utilizzano i costrutti fondamentali:
-)sequenza
-)selezione
-)iterazione
Tutti utilizzano operatori aritmetici e di confronto:
-) + - * / ++ -- += *= > < ecc...
Tutti utilizzano operatori logici:
-) && || !
Tutti sono KeySensitive

Cos'ha di diverso il linguaggio PHP?
-)Dichiarazione di variabili
-)Dichiarazione Array
-)Funzioni

PHP è un linguaggio Web (lato Server)
Dichiarazione di variabili:
$ a;   //è un linguaggio debolmente tipizzato, non va indicato il tipo di dato che la variabile dovrà contenere, essa assume il tipo di dato quanto riceve il determinato dato.
Esempio:
-          $a = 5;   //è un intero
-          $a = ciao;   //ora è una stringa
-          $a = 7,2;   //ora è un float
-          $a = ‘a’;   //ora è un carattere
*!* Negli altri linguaggi di programmazione visti fin ora è necessario inserire il tipo di variabile: int a=5; ecc…

Input e Output:
Quando una pagina HTML contiene un TAG <form>, uno dei suoi attributi è method, che può valere GET o POST.
$_GET e $_POST sono degli Array e servono per intercettare i dati in Input e appartengono al protocollo http://.
Il metodo GET consiste nell’accodare i dati all’indirizzo della pagina richiesta, non si possono trasferire più di 256 caratteri e proprio per quanto detto precedentemente non è indicato per il trasferimento di dati riservati.
Con il metodo POST i dati vengono invece inviati in maniera da non essere direttamente visibili per l’utente, si possono trasferire una maggiore quantità di dati.

$_GET[“nome variabile”];   $_POST[“nome variabile”];   sono i canali associati all’applicazione Client.  
*!* L’equivalente di scanf(…); e gets (…);
Per eseguire un operazione di Output si utilizza l’istruzione echo “testo…”; L’Output è il risultato dell’operazione richiesta dal Client e spedita dal Server, che viene interpretata dal Browser.
*!* L’equivalente di printf(…); e puts (…);

Requisiti necessari:
Per utilizzare PHP si ha sempre bisogno di un Client che richiede un servizio e di un Server che è in grado di offrire il servizio richiesto.
Per simulare un situazione di questo tipo utilizziamo XAMPP che racchiude al suo interno un applicazione Server, nel dettaglio:
-          Apache -> Server Web
-          Interprete PHP
-          DBMS MySQL

Per accedere alla propria macchina si inserisce nella barra indirizzi del browser il localhost oppure l’equivalente indirizzo IP 127.0.0.1, nella cartella localhost deve esserci la pagina web index.html che viene riconosciuta dal server web come Home Page.
*!* Sul nostro PC la comunicazione avviene tra Browser e Server Web. Il Browser lavora su una porta TCP/IP diversa da quella del Server.

Fonti: Appunti lezione Prof. Alemanno

HTML - Cenni di base

L'HTML è un linguaggio web, non rientra tra i linguaggi di programmazione in quanto non ha variabili e non utilizza i costrutti fondamentali ma usa solamente sequenze di "tag".
I "tag" servono a organizzare i contenuti di una pagina web, ce ne sono diversi ma hanno tutti (a eccezione di pochissimi "tag") un inizio e una fine.
I "tag" sono formati dai simboli < e > all'interno dei quali si trova il nome stesso del "tag": esempio <nometag> e vengono chiusi allo stesso modo facendo precedere davanti al nome del "tag" il simbolo "/" esempio </nometag>.

Vediamone alcuni tra i più importanti:
<html>   ...   </html> è il tag che indica il punto di partenza della pagina da visualizzare sullo schermo, tutto il suo contenuto è la pagina web.
<head>   ...   </head> contiene le informazioni utili per i motori di ricerca, contiene il "tag" <title>   ...   </title> che serve a dare il titolo alla pagina web,.
<body>   ...   </body> è la vera pagina HTML, contiene quello che compare sullo schermo, quello che vediamo.
<h1>   ...   </h1> combina l'effetto grassetto con font e dimensione carattere (la dimensione è data dal numero dopo la lettera h, numero che può variare da 1 a 6. Inoltre il "tag" lascia uno spazio sopra e sotto la scritta contenuta.
<br> va a capo di una linea, il "tag" non necessita di chiusura
<bh> disegna una linea, il "tag" non necessita di chiusura
<a è il "tag" per il link, href> è l'attributo del "tag" per linkare una pagina web o un file. E' importante ricordarsi che per linkare una pagina web bisogna inserire l'indirizzo completo in forma http://www.ecc... in caso contrario il browser andrà a cercare pagine interne al sito.
All'interno del "tag" andrà inserita anche il testo da visualizzare come link ed infine la chiusura del "tag" </a>.
*!* href="id" è l'identificatore, per linkare un punto della pagina.
esempio <a href="http://www.google.it">link a google.it</a>
esempio <a href="#a1">Clicca qui per andare in fondo alla pagina</a>   ...   <a id="a1">
<p>   ...   </p> è il "tag" paragrafo, lascia una riga spaziata in alto e una spaziata in basso per tutto il testo contenuto dentro il "tag".

La livello strutturale è fondamentale impostarei "tag" all'interno della pagina seguendo un modello di tipo matriosca come l'esempio seguente:
<html>
   <head>
      <title>
          .....
      </title>
   </head>

   <body>
          .....
   </body>
</html>
non rispettando questa struttura si incrrerà in errori di visualizzazione della pagina.

Liste:
<ul>   ...   </ul> è il "tag" per creare delle liste, molto utile per creare dei menù all'interno delle pagine web, ci sono due tipologie di liste: unordered (disordinate, con i pallini ecc...) e <ol>   ...   </ol> ordered (ordinate, con numeri ecc...), vediamo un esempio:
        <ul>   //unordered
<li>uno</li>
<li>due</li>
<li>tre</li>
</ul>

<ol>   //ordered
<li>uno</li>
<li>due</li>
<li>tre</li>
</ol>

Tabelle:
Molto importanti sono le tabelle che permettono tra l'altro di creare i layout delle pagine web.
il "tag" da utilizzare è <table>   ...   </table>.
vediamo un esempio:
<table "widht:100" border="1">   
//widht->occupa il 100% dell'area visibile, se non viene utilizzato la tabella viene adattata alla parola più lunga.
      <tr> 
      //"tag" per creare una riga all'interno della tabella.
            <td> 
            // "tag" per creare celle all'interno della tabella (non colonne) 
           </td>
<th>
                // "tag"per l'intestazione 
               </th>
      </tr>
            <tr> //righe
<td>...</td>
<td>...</td>
</tr>
<tr> //righe
<td>...</td>
<td>...</td>
</tr>
</table>
E' possibile effettuare delle operazioni sulle celle per unirle l'une alle altre: 
<td colspan="3"> le unisce in orizzontale, in questo caso tre celle 
mentre 
<td rowspan="3"> le unisce in verticale, in questo caso tre celle

Vediamo un esempio di un layout di una pagina web creato con i "tag" <table>:
<html>
<body>

<p>Esercizio Tabella</p>

<table style="width:100%" border="1">   
<tr>
<th>LOGIN</th>
<td colspan="2">INTESTAZIONE...........................................</td>
</tr>
<tr>
<td>Menu
<ul>
<li>selezione 1</li>
<li>selezione 2</li>
<li>selezione 3</li>
</ul>
</td>
<td>CORPO DEL TESO....</td>
<td>colonna dx</td>
</tr>
<tr>
<td colspan="3"> 
chiusura layout pagina...................................
</td>
</tr>
</table>
</body>
</html>

Fonti: Appunti lezione Prof. Alemanno