68 articoli dell'autore Andrea Pastore

Andrea Pastore 29/11/2020 0

6. Recuperare dati da più tabelle: la clausola JOIN

Può capitare di dover recuperare le informazioni da più di una tabella, ad esempio supponiamo di dover recuperare le informazioni di un articolo e quelle della sua categoria. Tra la tabella articolo e la tabella categoria che è una relazione 1 a N, nella tabella articoli c’è un campo categoria che contiene l’id della categoria. Potremmo pensare di fare due query, la prima per recuperare i dati dell’articolo, la seconda per recuperare i dati della categoria.

Questo però è inefficiente, perché possiamo creare un’unica query che ci consente di recuperare tutte le informazioni che ci servono, grazie alla clausola JOIN. Vediamo un esempio

SELECT * FROM articoli AS a JOIN categorie AS c

ON a.categoria = c.id

La parola chiave AS serve per facilitare la scrittura della query, per riferirsi alle tabelle con un alias più compatto. Ad esempio quando scriviamo … articoli AS a … stiamo comunicando al database che d’ora in avanti nella query ci riferiremmo alla tabella articoli con la parola a. Analogamente la scritta … categorie AS c … indica che d’ora in avanti nella query ci riferiremmo alla tabella categoria con la parola chiave c.

La clausola JOIN comunica al database che deve restituire i valori di entrambe le tabelle. La parola chiave ON serve per specificare qual è la relazione tra le due tabelle.

Nota bene: quando usiamo la clausola JOIN MySQL restituirà solo le occorrenze che rispettano tale clausola.

Con riferimento alla query sopra supponiamo di avere queste tabelle:

Tabella articoli

id titolo testo categoria autore
1 Titolo 1 ... 1 Mario Rossi
2 Titolo 2 ... 1 Mario Rossi
3 Titolo 3 ... 0 Mario Rossi

Tabella categorie

id nome categoriaMadre
1 Categoria 1 ...
2 Categoria 2 ...

In questo caso la query di inizio pagina restituirà solamente due righe, perché non troverà alcuna corrispondenza nella tabella categorie per l’articolo con id = 3.  Per lo stesso motivo non verrà mostrata l’occorrenza Categoria 2, perché nella tabella articoli non c’è nessun articolo che è collegato ad essa.

 

Usare WHERE nelle query con JOIN

Come in altri contesti possiamo trovarci a voler estrarre solo poche righe e non l’intero contenuto della tabella. Anche in questo caso possiamo usare la parola chiave WHERE., ad esempio:

SELECT * FROM articoli AS a JOIN categorie AS c

ON a.categoria = c.id

WHERE a.id = 3

Dal momento che stiamo cercando tra più tabelle, le limitazioni devono indicare di quale tabella si tratta, per questo le colonne di una tabella vengono precedute dal carattere (o parola) indicato all’inizio della query dopo la parola AS.

NOTA: anche in questo caso vale la regola descritta a pagina precedente, se eseguissimo la query in database con le tabelle descritte non otterremmo alcun risultato perché un articolo con id 3 è presente, ma MySQL non troverebbe alcuna corrispondenza per categoria = 0

 

Selezionare i dati in output

Osserviamo la query fatta sopra: notiamo che inizia con SELECT * … il che significa che stiamo chiedendo al database di recuperare tutti i dati. Essendo un JOIN il risultato di questa query restituirà tutte le colonne di entrambe le tabelle. Possiamo impostare la query in modo che ci restituisca solo una parte di questi dati, ad esempio:

SELECT a.id, a.titolo, c.nome FROM articoli AS a JOIN categorie AS c

ON a.categoria = c.id

WHERE a.id = 3

con questa query cosi fatta stiamo chiedendo al database di darci solo tre elementi: l’id dell’articolo, il titolo dell’articolo e il nome della categoria

SELECT a.id, c.* FROM articoli AS a JOIN categorie AS c

ON a.categoria = c.id

WHERE a.id = 3

con quest’altra query invece abbiamo chiesto al database di restituirci l’id dell’articolo e tutte le colonne della tabella categorie.

Ci sono dei casi in cui vogliamo dare un nome diverso alla colonna, ad esempio perché ci sono due colonne che hanno lo stesso nome. Possiamo farlo aggiungendo la parola chiave AS seguita dal nome che vogliamo assegnare. Ad esempio:

SELECT a.id, a.titolo, c.id AS idCategoria, c.nome FROM articoli AS a JOIN categorie AS c

ON a.categoria = c.id

WHERE a.id = 3

 

Leggi tutto

Andrea Pastore 29/11/2020 0

5. Le relazioni tra tabelle

Ad ogni tabella di un database corrisponde un’entità (ad esempio la tabella auto, la tabella attori, la tabella cinema, la tabella utenti e cosi via), ma le tabelle possono aver bisogno di essere collegate le une alle altre. Per fare questo esiste

Abbiamo diversi tipi di relazioni

  • relazione 1 a 1
    Supponiamo che un’azienda voglia memorizzare gli indirizzi di residenza dei propri utenti. Questa è una relazione 1 a 1 perché ad ogni utente corrisponde un indirizzo. Per fare questa associazione possiamo inserire nella tabella utenti l’id dell’indirizzo, e nella tabella indirizzo l’id dell’utente.
  • relazione 1 a N
    supponiamo di avere una tabella utenti e una tabella ordini. Ad ogni ordine corrisponde un solo utente, ovviamente un utente può aver fatto più ordini. Per fare questa associazione inseriamo nella nostra tabella ordini un campo idUtente, dove memorizzeremo l’id dell’utente che ha eseguito l’ordine
  • relazioni N a N
    supponiamo di avere una tabella ordini e una tabella prodotti. In ogni ordine è possibile inserire più prodotti, e ovviamente un prodotto può comparire in più ordini. Per fare questa associazione ci serve una nuova tabella, contenente l’id dell’ordine e l’id del prodotto. Il codice MySQL per creare questa tabella potrebbe essere:
	CREATE TABLE `associazioneOrdiniProdotto` (

        `idOrdine` INT( 11 ) NOT NULL ,

        `idProdotto` INT( 11 ) NOT NULL ,

        ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

è possibile aggiungere degli attributi alle relazioni N a N, ad esempio potremmo voler memorizzare la quantità di un determinato prodotto in un ordine. In questo caso la query per la creazione diventerebbe:

	CREATE TABLE `associazioneOrdiniProdotto` (

        `idOrdine` INT( 11 ) NOT NULL ,

        `idProdotto` INT( 11 ) NOT NULL ,

        `quantita` INT( 11 ) NOT NULL ,

        ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
Leggi tutto

Andrea Pastore 29/11/2020 0

4. Gli operatori AND, OR e NOT

Questi operatori consentono di fare query un po’ più elaborate, e quindi di selezionare quello che ci serve con maggiore precisione. Consentono infatti di aggiungere delle condizioni alla query.

Ad esempio, guardiamo questa query:

SELECT * FROM tabella1 WHERE id<5 AND nome LIKE ‘Carlo’

La prima parte di questa query è l’ultima query di esempio del campo SELECT, a cui abbiamo aggiunto questa condizione:

AND nome LIKE ‘Carlo’

con questa aggiunta non basta più che l’id sia maggiore di 5 per essere selezionato, ma si aggiunge la condizione  per cui nome deve essere uguale a ‘Carlo’.

Vediamo ora il costrutto OR, consideriamo la seguente query:

SELECT * FROM tabella1 WHERE id<5 OR nome LIKE ‘Carlo’

La query è uguale a quella di prima, tranne per un dettaglio: al posto della parola chiave AND c’è la parola chiave OR. Questo fa cambiare completamente quello che restituisce la query: mentre prima venivano restituite tutte le riche che avevano id maggiore di 5 e nome Carlo, mettendo l’OR al posto di AND restituirà tutti i campi che avranno o id maggiore di 5 o nome Carlo. Il comando OR infatti per recuperare la riga chiede che almeno una delle due condizioni sia soddisfatta, non entrambe.

Vediamo ora il caso in cui dobbiamo selezionare tutte le righe di una tabella tranne quelle che rispecchiano una determinata condizione. Ad esempio, predndere tutti gli elementi di tabella1 tranne  quelli che hanno come nome carlo. In questo caso dobbiamo utilizzare l’operatore NOT preceduto dal campo che non deve essere uguale al valore che vogliamo evitare. Questo operatore però potrebbe essere usato in due modi

1. confronto di una stringa, come l’esempio sopra. In tal caso dobbiamo far seguire l’operatore NOT dalla parola LIKE ‘valoreDaEvitare’.

Nel caso di prima, la query è:

SELECT * FROM tabella1 WHERE nome NOT LIKE ‘Carlo’

2. I valori da confrontare sono il risultato di un’altra query, ad esempio voglio prendere tutte le righe di tabella 1 il cui id non è in tabella 2. Un caso potrebbe essere selezionare gli utenti che non hanno già ottenuto un determinato servizio. Ogni volta che l’utente ottiene quel servizio viene registrato in tabella2. In questo caso si usa l’operatore NOT seguito da IN.

SELECT * FROM tabella1 WHERE id NOT IN (SELECT id FROM tabella2)

 

Creare query più complesse

Una query di solito prevede più condizioni, alcune delle quali devono essere verificate prima di altre. Supponiamo di avere una tabella utente con questi campi:

  • id
  • nome
  • cognome
  • tipo
  • eta
  • anniEsperienza
  • residenza

Supponiamo ora di voler estrarre che un utente sia di tipo “operaio”, lavori da 10 anni, abbia un’età inferiore ai 35 anni e risieda a Catania o Palermo.

SELECT * FROM utente WHERE tipo LIKE ‘operaio’ AND eta <35 AND anniEsperienza >10 AND (residenza LIKE ‘Catania’ OR residenza LIKE ‘Palermo’)

 

Le parole chiave COUNT e SUM

Può capitare di dover semplicemente contare le occorrenze di una tabella, oppure di sommare un certo numero di valori (Ad esempio l’incasso di un giorno). Per questo ci vengono in aiuto i comandi MySQL COUNT e SUM.

Il comando COUNT consente di contare le occorrenze che rispettano le condizioni che vogliamo inserire, ad esempio la query:

SELECT COUNT(*) FROM articoli

restituirà il numero totale degli articoli nel database. Possiamo ovviamente creare query più complesse, come ad esempio:

SELECT COUNT(*) FROM articoli WHERE id=1

in questo caso la query restituirà solo il numero degli articoli con id categoria 1.

Il comando SUM consente di sommare i campi numerici delle occorrenze di una tabella, senza  costringerci ad elaborare queste operazioni con il linguaggio di programmazione che usiamo. Facciamo un esempio, supponiamo di avere questa tabella ordini (ovviamente molto semplificata):

CREATE TABLE `ordini` (

        `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,

        `idUtente` INT( 11 ) NOT NULL ,

        `importo` INT( 11 ) NOT NULL ,

        `dataOrdine` DATE NOT NULL ,

        PRIMARY KEY ( `id` )

        ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

Per sapere l’incasso totale effettuato possiamo eseguire questa query:

SELECT SUM(importo) FROM ordini

Se invece vogliamo sapere solo l’incasso di un dato giorno (ad esempio il primo Gennaio 2020) possiamo scrivere questa query:

SELECT SUM(importo) FROM ordini WHERE dataOrdine LIKE ‘2020-01-01’

 

Cercare occorrenze nel database contenenti parte di una parola chiave

Molto spesso può capitare di cercare nel database righe che non presentano una corrispondenza esatta con la parola chiave. Si pensi ad esempio quando si scrivono i campi del motore di ricerca di un sito che parla di automobili: se un utente scrive come parola chiave “Ferrari” la query di ricerca non deve restituire gli articoli che hanno come titolo Ferrari, ma che contengono la parola Ferrari. Ad esempio potrebbe restituire risultati di questo tipo:

  • Ferrari SF90: la nuova monoposto per il mondiale F1 2019
  • Mick Schumacher in Ferrari Driver Academy: è ufficiale
  • International GT Open 2018 a Monza con la Ferrari prima in classifica

Si tratta di titoli di articoli che contengono la parola Ferrari, ma anche molte altre. Questo si ottiene con la query di ricerca:

SELECT * FROM articoli WHERE titolo LIKE ‘%Ferrari%’

soffermiamoci un attimo ad osservare la parte finale della query: LIKE ‘%Ferrari%’: notiamo la presenza del simbolo % prima e dopo la parola Ferrari. Quel simbolo indica a MySQL che prima e dopo la parola chiave specificata possono esserci altre parole. Da una query di questo tipo possono scaturire i risultati visti sopra, altrimenti se avessimo scritto questa query:

SELECT * FROM articoli WHERE titolo LIKE ‘Ferrari’

non avremmo ottenuto alcun risultato, in quanto gli articoli visti sopra hanno titoli che contengono la parola Ferrari, ma non solo questa parola. 

Sono possibili anche due varianti di questa query:

SELECT * FROM articoli WHERE titolo LIKE ‘Ferrari%’

In questo caso il simbolo % sta solo dopo la parola Ferrari, quindi questa query cerca tutti gli articoli che iniziano con la parola Ferrari, e possono essere seguiti da un qualsiasi numero di parole.

SELECT * FROM articoli WHERE titolo LIKE ‘%Ferrari’

In questo caso il simbolo % sta solo prima della parola Ferrari, quindi questa query cerca tutti gli articoli che termineranno con la parola Ferrari, e possono essere preceduti da un qualsiasi numero di parole.

Leggi tutto

Andrea Pastore 29/11/2020 0

3. Il linguaggio SQL

Il linguaggio SQL è un linguaggio di scripting che viene utilizzato dai programmi per interagire con il database. Quando un programma deve compiere un’operazione con il database esegue una richiesta in questo linguaggio. Le richieste di questo tipo vengono chiamate query.

 

Parole chiave nelle query

Le query devono essere costruite con dei comandi, di seguito vediamo i comandi fondamentali per eseguire le operazioni di base.

 
CREATE

Serve per creare una tabella o un intero database, viene utilizzata soprattutto per creare tabelle

CREATE TABLE `tabella1` (

        `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,

        `campo1` VARCHAR( 255 ) NOT NULL ,

        `campo2` VARCHAR( 255 ) NOT NULL ,

        `campo3` VARCHAR( 255 ) NOT NULL ,

        PRIMARY KEY ( `id` )

        ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

La parola chiave NOT NULL indica al database che quella colonna non può non essere inserita. Significa che al momento dell’inserimento se un valore di una colonna NOT NULL non viene inviato il database non accetterà il dato.

La parola chiave AUTO_INCREMENT indica al database che quel valore deve incrementare in automatico ogni volta che ci sono inserimenti

La parola chiave PRIMARY KEY ( `id` ) indica al database che quel campo è univoco in quella tabella. Ciò significa che se il database riceve una richiesta di inserimento con un valore della variabile PRIMARY_KEY già presente, tale richiesta viene rifiutata.

Per ogni tabella possiamo scegliere il set di caratteri da utilizzare, specificandolo con il comando CHARACTER SET. In questo caso abbiamo scelto utf8 che comprende buona parte dei caratteri del mondo (anche i simboli speciali come &, %, gli alfabeti diversi da quello latino e tanto altro ancora).

Nota: se proviamo a creare una tabella già esistente MySQL restituirà un errore. Per evitare l’errore possiamo aggiungere la clausola IF NOT EXISTS, la tabella diventa

CREATE TABLE IF NOT EXISTS `tabella1` (

        `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,

        `campo1` VARCHAR( 255 ) NOT NULL ,

        `campo2` VARCHAR( 255 ) NOT NULL ,

        `campo3` VARCHAR( 255 ) NOT NULL ,

        PRIMARY KEY ( `id` )

        ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

Finora abbiamo creato tabelle in cui tutti i campi erano obbligatori, quindi accanto ad ogni campo c’era la scritta NOT NULL. Creiamo ora una tabella in cui alcuni campi non sono obbligatori, basterà che non specifichiamo la scritta NOT NULL ad alcuni di essi:

CREATE TABLE `tabella3` (

        `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,

        `campo1` VARCHAR( 255 ) NOT NULL ,

        `campo2` VARCHAR( 255 )  ,

        `campo3` VARCHAR( 255 )  ,

        PRIMARY KEY ( `id` )

        ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;

in questa nuova query di creazione notiamo che accanto a campo2 e campo3 non ci sono i campi NOT NULL, questo farà si che il database accetti un valore nullo per questi due campi.

 

INSERT

Serve per inserire una nuova riga nella tabella

Es: INSERT INTO tabella1 VALUES(NULL,'val1','val2','val3')

NB: questa query ha come primo valore NULL, perché avendo dichiarato prima che il campo id è AUTO_INCREMENT sarà il database ad assegnare il valore

Esiste anche un altro modo di scrivere una query, che è quello di specificare i campi che vengono inseriti. Ad esempio:

INSERT INTO `tabella1` (`id`, `campo1`, `campo2`, `campo3`) VALUES (NULL, 'a', '23', '');

In questo caso stiamo comunicando a MySQL quali campi intendiamo popolare, può avere dei vantaggi quando non tutti i campi della query sono obbligatori. È possibile aggiungere più righe con un’unica query, ad esempio:

INSERT INTO `tabella1` (`id`, `campo1`, `campo2`, `campo3`) VALUES (NULL, 'a', '23', ''),(NULL, 'b', '24', ''),(NULL, 'c', '25', '');

I valori di ogni riga devono essere separati da una virgola, tranne il valore finale che deve essere seguito dal punto e virgola di chiusura.

Supponiamo ora di inserire una riga in una tabella dove alcuni campi possono essere vuoti, prendiamo in esame la tabella3 vista sopra. Per inserire i campi in questa tabella possiamo usare la seguente query:

INSERT INTO `tabella3` (`id`, `campo1`, `campo2`, `campo3`) VALUES (NULL, 'c', '25', '');

dal momento però che campo2 e campo3 possono essere NULL possiamo evitare di inserirli, quindi il database accetterà anche queste query:

INSERT INTO `tabella3` (`id`, `campo1`, `campo2`) VALUES (NULL, 'c', '25');

e

INSERT INTO `tabella3` (`id`, `campo1`) VALUES (NULL, 'd');

I primi due campi invece, id e campo1, sono obbligatori e non possiamo fare a meno di inserirli. Quando nel database un campo non è specificato viene impostato a NULL.

 
SELECT

Serve per estrarre informazioni da una tabella esistente.

Possiamo usare questo comando in modo generico, che restituisce tutte le informazioni all’interno della tabella, ad esempio:

SELECT * FROM tabella1

Oppure possiamo essere più specifici aggiungendo la parola chiave WHERE, ad esempio

SELECT * FROM tabella1 WHERE id=1

La query qui sopra restituisce solo una riga, ovvero la riga in cui l’id vale 1. Se non è presente una riga che soddisfa queste condizioni verrà restituito un insieme vuoto.

Vediamo questo ulteriore esempio

SELECT * FROM tabella1 WHERE id<5

In questo esempio verranno restituite tutte le righe in cui il campo id ha valore minore di 5, anche in questo caso se non ci sono righe che soddisfano queste condizioni verrà restituito un insieme vuoto.

Vediamo ora un esempio in cui cerco tutte le righe in cui una colonna abbia un determinato valore, ma quella colonna non è numero ma una stringa.

SELECT * FROM tabella1 WHERE campo1 LIKE ‘val1’

In questo caso vengono restituite tutte le righe che hanno come campo 1 il valore val. Essendo campo1 un campo VARCHAR invece di usare l’operatore = dobbiamo usare l’operatore LIKE seguito dal valore della stringa tra apici. 

Il simbolo * dopo la parola chiave SELECT indica che stiamo chiedendo al nostro database l’intera riga (quindi tutte le colonne della tabella).

Può capitare di avere la necessità di selezionare solo una o più colonne di una riga, ma non l’intera riga. In questo caso scriveremo il nome di ogni colonna che vogliamo ottenere. Ad esempio, supponiamo di voler recuperare solamente la colonna campo1 dalla tabella tabella1. La query sarebbe cosi:

SELECT campo1 FROM tabella1

In questo caso otterremmo tanti risultati quante sono le righe della tabella, ma avremmo solamente la colonna campo1.

Possiamo scegliere un qualsiasi numero di campi da recuperare, basta separarli con una virgola. Ad esempio:

SELECT campo1, campo2 FROM tabella1

In questo caso recuperiamo campo1 e campo2 dalla tabella 1, quindi avremmo un output composto da tante righe quante sono gli elementi inseriti nella tabella, e su ogni riga le due colonne campo1 e campo2.

 

UPDATE

Serve per aggiornare delle righe già presenti nella tabella. Bisogna specificare la tabella che si vuole aggiornare (con la parola chiave SET), i campi che si vogliono aggiornare e quali righe vanno aggiornate (parola chiave WHERE)

Es: UPDATE tabella1 SET campo1='nuovo valore' WHERE id=1

 

DELETE

Serve per eliminare una o più righe di una tabella. Il comando DELETE. deve essere seguito da FROM e il nome della tabella, poi con la parola chiave WHERE definiamo cosa eliminare

Es: DELETE FROM tabella1 WHERE id=1

 

Limitare il numero di risultati in una query

Una esigenza frequente quando si opera con i database è quella di dover limitare il numero di risultati che una query deve restituire. Per questo scopo esiste in MySQL il comando LIMIT.

Questa parola chiave va aggiunta alla fine della query, specificando il numero di elementi massimo che si vuole ricevere, ad esempio:

SELECT * FROM tabella1 WHERE campo1 LIKE ‘val1’ LIMIT 5

Questa query restituirà solo le prime cinque occorrenze del database che rispettano le condizioni (ovvero che la colonna campo1 abbia valore ‘val1’).

 

Paginazione dei risultati

Un altro utilizzo della parola chiave LIMIT è la creazione delle paginazioni. Quando i database sono molto grandi si ha spesso la necessità di ricevere un certo numero di dati per volta. Pensiamo agli articoli di un blog devono essere visualizzate in pagine da 10 elementi per volta. Alla prima pagina possiamo usare la query:

SELECT * FROM articoli LIMIT 10

per la seconda pagina e per le successive, però, questa query non va bene: dobbiamo infatti chiedere al nostro database di restituirci i 10 articoli successivi all’ultimo già mostrato. Questo si fa con la seguente query:

SELECT * FROM articoli LIMIT 10, 10

Per prendere i dati della terza pagina scriveremo:

SELECT * FROM articoli LIMIT 20, 10

e così via.

Leggi tutto

Andrea Pastore 29/11/2020 0

2. Gestire un database da interfaccia grafica

Per gestire i database MySQL che creiamo possiamo utilizzare diversi programmi: il più comune è phpMyAdmin. Si tratta di una web application che consente di gestire i dati da un’interfaccia. Per scaricarla sul nostro computer dobbiamo installare Xampp, una piattaforma per creare un server locale sul nostro computer scaricabile gratuitamente dal sito https://www.apachefriends.org. Per accedere a phpMyAdmin ci basterà aprire un qualsiasi browser e digitare l’indirizzo localhost/phpMyAdmin.

 

L’interfaccia di phpMyAdmin

L’interfaccia grafica di phpMyAdmin consente di creare database, tabelle e modificare ogni sua parte. Nel nostro lavoro quotidiano useremo l’interfaccia solo per controllare i dati inseriti nel database e per piccole modifiche. Gli inserimenti, le modifiche più importanti verranno fatte con un linguaggio di scripting che vedremo più avanti.

Qui in basso possiamo vedere la home page di phpMyAdmin. A sinistra possiamo vedere i database presenti, accanto ad ogni database c’è un tasto + che permette di vedere le tabelle al suo interno. Notiamo che ci sono alcuni database necessari al funzionamento di phpMyAdmin.

Cliccando su un database vediamo l’elenco delle sue tabelle, come mostrato nella foto sottostante. Cliccando su una tabelle possiamo vederne il contenuto, modificarle o creare nuove tabelle.

 

Creiamo un nuovo database

Dalla home di phpMyAdmin clicchiamo sul link in alto Database e poi scriviamo il nome del database che vogliamo creare nel campo input che si trova sotto la scritta crea un nuovo database.

 

Creiamo una nuova tabella

Per creare una tabella di un database selezioniamo il database e cerchiamo nella pagina il form per creare una nuova tabella: si trova in fondo dopo l’elenco delle tabelle, chiaramente se non ci sono tabelle sarà in alto, come nella foto sottostante.

Dopo aver deciso il nome della tabella e il numero dei campi, apparirà una nuova schermata, che consente di definire il nome e il tipo di dato di ogni singolo campo.

 

Modificare una tabella

È possibile modificare le tabelle già create da phpMyAdmin cliccando sul nome della tabella dall’elenco delle tabelle del database. Si aprirà una schermata in cui si vedono i dati della tabella ed è possibile eseguire alcune operazioni, come rinominare la tabella. Come mostrato in figura dall’interno di una tabella cliccare su operazioni (il tasto evidenziato in figura) e tra le varie operazioni possiamo rinominarla modificando il valore accanto alla voce Rinomina la tabella in.

 

Ceare un utente con phpMyAdmin

Dalla home page di phpMyAdmin clicchiamo su utenti e poi su aggiungi account utente. Si aprirà la schermata sottostante:

Nel campo utente metteremo il nome del nostro utente, nel campo host dobbiamo selezionare locale, nel campo password dobbiamo inserire una qualsiasi password (essendo in locale e non in un  ambiente reale non dobbiamo preoccuparci della sicurezza di questa password) e possiamo lasciare il resto invariato. Fatto questo dobbiamo assegnare i privilegi di questo utente: scendiamo un po’ più giù e troveremo il form per effettuare questa operazione, mostrato in figura:

Selezioniamo la voce seleziona tutto accanto alla scritta privilegi globali e poi salviamo. Abbiamo il creato un utente che avrà accesso a tutti i database del nostro computer.

 

Tipi di dati principali inseribili in un database

TINYINT (Numero 4 byte)  Memorizza un numero intero compreso tra -127 e 128, se si aggiunge la proprietà UNSIGNED arriva a 255 
SMALLINT (Numero 6 byte) Memorizza un numero intero compreso tra -32768 e 32767, se si aggiunge la proprietà UNSIGNED arriva a 65535
INT (Numero 11 byte) Serve per memorizzare numeri interi grandi, arriva a miliardi di miliardi
DOUBLE Questo campo consente di immagazzinare un numero decimale, stabilendo quanti byte deve occupare la parte intera e quella decimale. Ad esempio possiamo stabilire che la parte intera occupi 8 cifre e quella decimale 2
VARCHAR serve per memorizzare piccole stringhe, massimo 255 caratteri
TEXT serve per memorizzare grandi quantità di caratteri (fino a 65000 caratteri)
DATE

Serve per memorizzare le date. In MySQL le date vanno messe con la notazione inglese, ovvero AAAA-MM-DD

Esempio: 2019-10-15 equivale alla nostra 15/10/2019

DATETIME

Serve per memorizzare le date complete di ora, minuti e secondi. Anche in questo caso dobbiamo usare la notazione inglese, ovvero AAAA-MM-DD HH:MM:SS

Esempio: 2019-10-15 equivale alla nostra 15/10/2019

 

Scelta del tipo di dato

Il tipo di dato da scegliere è sempre il più piccolo in base alle nostre esigenze. Ad esempio se devo scegliere il tipo di dato per una variabile numeroPostiAuto sceglierò TINYINT perché so che un’auto non potrà mai avere più di 128 posti auto.

Quando scegliamo un tipo di dato MySQL memorizzerà per ogni riga lo spazio che occupa quel tipo di dato, ad esempio se per la variabile che abbiamo avessimo scelto INT, MySQL avrebbe riservato 11 byte a parità di valore inserito.

Leggi tutto

Andrea Pastore 29/11/2020 0

1. Introduzione ai database

Cos’è un database?

Un database è uno speciale tipo di file progettato per immagazzinare grandi quantità di informazioni e per essere utilizzato dai programmi per memorizzare i dati necessari al loro funzionamento. Esistono vari tipi di database, quelli che vedremo noi sono di tipo MySQL. Altri database famosi sono Oracle, Sql server (il database di Microsoft) e MongoDb.

 

Differenza tra un database e un altro tipo di file

La differenza tra un database e un normale file sta nella velocità di recupero delle informazioni. Supponiamo di salvare in un database le impostazioni del nostro programma (Ad esempio il nome azienda, indirizzo, nome sito ed email). 

Queste informazioni possono essere salvate tranquillamente su un file, ad esempio un file .txt. Il tempo necessario al nostro programma per recuperare le informazioni, però, è di 3 -4 volte superiore se vengono prese dai file, e questa differenza aumenta al crescere della quantità dei dati da immagazzinare. Questo perché nel database oltre ai dati che inserisce l’utente il database salva altre informazioni per essere più rapido nella risposta.

 

Struttura di un database

I database sono organizzati in tabelle, che al loro interno conengono delle colonne dove vengono inseriti i dati. Si veda la figura sottostante.

Le colonne di una tabella possono contenere dati di diverso tipo, che occupano una diversa capacità nel database. Per ogni colonna quindi andremo a scrivere il tipo di dato, e il database si regolerà sulla quantità di spazio che deve riservare ad ognuna di esse. Molto spesso le tabelle hanno una colonna chiamata id che serve come identificativo di quella riga. Immaginiamo di avere una tabella contenente centinaia di utenti. Per identificarli in modo univoco possiamo creare una colonna chiamata id, che assegna un id unico ad ogni riga. Più avanti approfondiremo questo concetto.

 

Gli utenti di un database

MySQL consente di creare degli utenti e stabilire quali utenti hanno accesso a un determinato database. Possiamo anche stabilire cosa può fare un utente in quel database, ad esempio possiamo stabilire che un utente abbia accesso solo in lettura, un altro utente abbia accesso in lettura e scrittura, ma non gli sia consentito di cancellare elementi, e molte altre opzioni. Quando creiamo un utente di un database dobbiamo comunicare a MySQL cosa questo utente può fare. Le operazioni che un utente può compiere sono chiamate privilegi e vengono assegnate per ciascun database. Se diamo pieni poteri ad un utente su un database si dice che gli stiamo assegnando tutti i privilegi. Ad esempio può esserci l’utente mario che può accedere al database database1 con tutti i privilegi, e poi potremmo avere un altro utente antonio che può accedere al database1 in lettura e al database2 con tutti i privilegi.

Leggi tutto

Andrea Pastore 27/09/2020 0

26. Messa in produzione di un progetto

Una volta finito il nostro progetto dobbiamo trasportarlo dal nostro computer al server dove risiederà e sarà fruibile al web. Il server dove risiede il progetto accessibile a tutti è definito server di produzione. Le operazioni più comuni sono il caricamento dei file l’importazione del database, ma può capitare in progetti avanzati di dover fare altre configurazioni.

Caricare file con il protocollo FTP

L’FTP è un protocollo per il trasferimento di dati pensato per caricare file da un computer ad uno spazio web. Per caricare i file del prodotto Geecom che si vuole utilizzare si deve usare un client FTP, ad esempio FileZilla, un programma gratuito scaricabile dal sito http://filezilla-project.org/.

Dopo aver lanciato il programma apparirà questa schermata:

Per caricare i file bisogna stabilire una connessione col sito, riempendo i campi in alto a sinistra del pulsante connessione rapida. Nel campo “Host” bisogna scrivere l'indirizzo del dominio acquistato senza “www.”; nel campo “Nome utente” il nome utente con cui si accede allo spazio web, nel campo “Password” la password per accedere al vostro spazio web. Il campo “Porta” va lasciato vuoto, in questo modo viene usata la porta predefinita.

A connessione avvenuta si possono caricare i file: la finestra a destra mostra le cartelle sul server, quella a sinistra le cartelle del nostro computer. Per portare il nostro progetto online dobbiamo andare nella cartella principale, selezionate tutti i file e trascinarli nella finestra di destra di FileZilla. Il tempo necessario per il caricamento dipende dal numero di file da scaricare.

Leggi tutto

Andrea Pastore 27/09/2020 0

25. Composer

Composer è un gestore di pacchetti per PHP. È nato nel 2015 e da allora si è imposto come lo standard per la gestione delle dipendenze.

Scaricare Composer

Per scaricare Composer visitare il sito https://getcomposer.org/ e a seconda del sistema operativo che avete avrete una diversa procedura di installazione.

Il file composer.json

Il file composer.json contiene tutte le dipendenze per gestire il nostro progetto. Quando dobbiamo utilizzare una libreria esterna ci basterà inserirla in questo file e automaticamente Composer la scaricherà per noi.

Esempio di composer.json :

{

    "require": {

        "monolog/monolog": "dev- master#2eb0c0978d290a1c45346a1955188929cb4e5db7",

        "acme/foo": "1.0.x-dev#abc123"

    },

    "autoload": {

        "psr-4": {

            "Monolog\\": "src/",

            "Vendor\\Namespace\\": ""

        }

    }
Leggi tutto

Andrea Pastore 27/09/2020 0

24. Comunicazione tra server: il mondo delle API

Nel mondo informatico è frequente la necessità di parlarsi tra sistemi diversi. Supponiamo ad esempio che due server della stessa azienda devono scambiarsi informazioni sugli utenti: per fare questa cosa bisognerà prevedere lo sviluppo di file appositi che si connetteranno all’altro server e comunicheranno queste informazioni. Ogni server deve avere anche dei file predisposti per ricevere queste informazioni. Questi file prendono il nome di API. Mentre altri file sul server si occuperanno ad esempio di mostrare i siti o fare altri processi, le API saranno sempre in ascolto ricevere informazioni da uno o più server esterni.

Comunicazione tra server: l’esigenza di una lingua comune

I server possono avere diverse tecnologie, ma questo non deve essere un ostacolo alla comunicazione. Sono state inventate diversi sistemi di interscambio di dati, i più comuni sono il JSON e l’XML.

JSON

JSON sta per JavaScript Object Notation ed è il formato di scambio dei dati più diffuso oggi. Un oggetto JSON inizia e termina con una parentesi graffa, gli elementi al suo interno vengono rappresentati mettendo il nome dell’elemento seguito dai due punti e poi dal valore. Il nome dell’elemento sarà messo tra virgolette, il valore sarà messo tra virgolette solo se è una stringa. Ad esempio:

“nome”:”Mario”

oppure nel caso di un valore numerico:

“età”:5

Nota: dopo ogni elemento (tranne l’ultimo) è necessario mettere una virgola.

Vediamo un esempio di oggetto JSON che contengono le informazioni di una persona:

{
“nome”:”Mario”,
“cognome”:”Rossi”,
“età”:5,
“email”:”mariorossi@virgilio.it”
}

Array in JSON

Il JSON ha la possibilità di raccogliere elementi dello stesso tipo in un array, proprio come la maggior parte dei linguaggi di programmazione. Proprio come nei principali linguaggi di programmazione l’array si crea con le parentesi quadre e al suo interno vanno inseriti gli elementi separati da una virgola. Supponiamo ad esempio di dover rappresentare in JSON un oggetto regione, contenente nome, popolazione, pil e una lista delle principali città. Il campo principali città può essere un array con vari elementi all’interno:

	“principaliCitta”:[“Città 1”,“città 2”];

Un array può contenere anche oggetti. Pensando all’esempio di prima, supponiamo di voler rappresentare le città in maniera più accurata, indicando per ognuna nome, numero di abitanti e la provincia. L’esempio diventerebbe cosi:

	“principaliCitta”:[

{

“nome”:”Firenze”,

“abitanti”:300000,

“provincia”:”FI”

},{

“nome”:”Prato”,

“abitanti”:15000,

“provincia”:”FI”

}],

Esistono dei siti che consentono di validare il JSON scritto, ad esempio:

https://jsonformatter.curiousconcept.com/

Manipolare oggetti JSON con PHP

PHP mette a disposizione delle funzioni che consentono creare e decodificare oggetti in formato JSON: si tratta delle funzioni json_encode e json_decode.

json_encode

Per creare oggetti JSON usiamo la funzione json_encode() che prende in input un array e restituisce un oggetto JSON. Tipicamente useremo questa funzione abbinata alla funzione echo, perché dopo aver creato l’oggetto JSON vorremmo stamparlo. Vediamo un esempio:

           $utente = [

                "nome"       => "Mario",

                "cognome" => "Rossi",

                "email"       => "mariorossi@gmail.com"

           ];

          echo json_encode($utente);

i moderni browser possono formattare i dati JSON, basta indicare nell'header di pagina che si tratta di dati di questo tipo. Questo si fa con il seguente comando:

          header('Content-Type: application/json');

json_decode

La funzione json_decode() serve per decodificare i dati JSON: prende in input una stringa e restituisce l'oggetto a cui possiamo accedere  allo stesso modo in cui accediamo alle proprietà di una classe con variabili pubbliche. Vediamo un esempio:

          $jsonTxt = '{

                                "nome" : "Mario",

                                "cognome" : "Rossi",

                                "email" : "mariorossi@gmail.com"

                            }';

        $jsonObj  = json_decode($jsonTxt);

        // recupero le informazioni

        $nome       = $jsonObj->nome;

        $cognome = $jsonObj->cognome;

        echo "$nome $cognome";

SOAP

Il protocollo SOAP consente di scambiare informazioni tra componenti software utilizzando come fonte di scambio documenti scritti in XML (un metalinguaggio per la definizione di linguaggi di markup, come ad esempio HTML, ideato per consentire agli utenti di creare documenti con markup personalizzati). Era il protocollo di scambio standard prima dell’avvento del JSON, ma conserva una fetta non trascurabile di utilizzo. 

Il file WSDL

Ogni web server ha un file WSDL che contiene la descrizione della sua interfaccia: i parametri necessari ad eseguire le varie operazioni, i messaggi di risposta e cosi via.

La classe SoapClient

PHP mette a disposizione la classe SoapClient per comunicare con i web server SOAP.

Il costruttore di questo dato prende in input un indirizzo web dove è specificato il file WSDL con le opzioni del web server.

         $wsdl  = “linkwsdldelserver.wsdl";

         $soap = new SoapClient($wsdl);

Il metodo doRequest è quello che si occupa di eseguire la richiesta. Restituisce il responso del server, che dobbiamo mettere in una variabile:

         $responso = $soap->__doRequest($wsdl, $location, $action, $version);

Nota: la risposta viene fornita nel formato stdObject, quindi per accedere ai dati dovremmo comportarci come quando recuperiamo i dati di un oggetto, ad esempio:

	echo	$responso->elemento
Leggi tutto

Andrea Pastore 27/09/2020 0

23. I namespace

Un namespace una collezione di nomi di entità, definite dal programmatore, omogeneamente usate in uno o più file sorgente. A partire da PHP 7 anche PHP supporta questo approccio, che ha lo scopo di evitare confusione ed equivoci nel caso siano necessarie molte entità con nomi simili, fornendo il modo di raggruppare i nomi per categorie.

Concettualmente un namespace è assimilabile alla struttura delle cartelle di un filesystem: dobbiamo dichiarare un’origine per il nostro namespace che corrisponde alla directory root, o al nome del disco su sistemi Windows, e possiamo inserire in maniera sequenziale una serie di suddivisioni che in questa similitudine rappresenterebbero le sottocartelle.

Vantaggi dei namespace

Il primo vantaggio è quello di organizzare il codice in modo da facilitare la manutenibilità, ad esempio tramite lo standard PSR-4;

non dobbiamo preoccuparci dei problemi relativi alle omonimie tra classi, ad esempio una classe con un nome molto comune come Connection non sarà più un problema.

 

Leggi tutto