Transcript for:
Creazione Struttura Connessione Database

Ben ritrovati ragazzi! Bene oggi quello che andiamo a fare è crearci una struttura un pochino diciamo uno scheletro oggi sarà un lavoro un pochino noiosetto però ci vuole perché fondamentalmente noi quello che abbiamo visto l'altra volta è questo file, zoom un pochettino, control più, ecco qua, dove abbiamo fatto una prova di connessione al database. Abbiamo, sì, ci siamo connessi al database e siamo riusciti a fare quello che volevamo, ovvero mostrare a video il risultato, però diciamo che non è la migliore architettura di questo mondo. Qui abbiamo...

queste stringhe dove abbiamo cablato il nome del server il nome del username e password il nome del database e immaginiamo che in un'altra pagina dobbiamo sempre usare la connessione al database quindi per un altro motivo non è la cosa migliore ricopiare nuovamente questa parte perché ovviamente va contro il principio del non ripetere se stessi ma poi soprattutto immaginiamo di voler rispondere spostare tutta l'applicazione su un server live per esempio ovviamente qui io devo andare a cambiare il nome del server il nome del username e password e il nome del database che quindi per forza di cose se ho in un solo punto devo andare a modificare un punto solo altrimenti sarebbe un lavoro veramente infernale bene detto questo andiamo a creare una struttura io direi prima cosa Questi dati sono dati di configurazione, quindi il loro posto migliore naturale è in un file di configurazione, che potrebbe essere questo, l'init ad esempio, o ancora meglio creare un file che si chiama config, che a me piace molto l'idea di creare un config.php, che sarà un file che andrà a contenere tutte le configurazioni, anche queste qua. Io le sposterei, faccio ctrl x e le sposto. nel config perché mi piace di più. Spostiamoci, mettiamo queste e ce ne mettiamo altre quattro dove andiamo a definire ad esempio vediamo un po'come sono queste, qui avevamo server name, username, password e nome database, andiamole a chiamare, controllo un attimo come le ho chiamate nel... nel progetto finale in modo da mantenere allineato e chiamarle allo stesso modo allora nel progetto finale le ho chiamate dbhost, dbuser, dbpass e dbname ecco posso anche fare un bel copia e incolla così benissimo il database qui è senza il trattino php ecommerce così perfetto Questo file di configurazione, almeno io so che devo andare a cambio server, bene, cambio soltanto questo file e queste impostazioni, queste stringhe qua, queste, queste sopra, e tutto rifunziona.

Quindi nell'init io andrò a fare un require, o meglio un require once, perché è una sola volta, e punterò il file config, quindi.slash cartella attuale config. php, ecco qua in questo modo non dovremmo aver rotto niente in teoria quindi in pratica qui io adesso chiudiamo questa finestra anzi apriamola un'altra facciamo un google chrome nuova finestra e mi vado ad aprire il sito su una nuova finestra ecco qua, allora Abbiamo detto che l'url è questo qui, root url, vado a chiamare proprio questo, copia e incollo qua. Attenzione, che cosa dice qui?

Non riesco ad aprire il file config.php. Cerchiamo di capire insieme il motivo di questo file. Allora ragazzi, eccoci qua.

Il problema essenzialmente qui era il fatto che Quando voi chiamate l'url del sito c'è un redirect da cui cambia location, va in public, quindi lo script chiamante è questo. E'questo qua che va a chiamare init. Quindi questo deve fare punto punto, quindi esce di un livello, entra in inc e apre init.

E quindi dentro init per chiamare config devi anche qua, uscire di un livello, entrare in inc. e chiamare config questo punto dovrebbe andare eccolo qua era quello il problema bene serve sempre per imparare chiaramente questo problema si presenta soltanto qua anche perché successivamente una volta che io avrò incluso config io ho la costante root path quindi vado a usare questa e non ho più problemi di percorsi relativi assoluti chiaramente la prima volta all'inizio, inizio, inizio dello script quella costante non è ancora definita quindi devo usare un percorso relativo per forza di cose ma non ci preoccupiamo perché sarà l'ultima volta da qui in poi in giù ora, definite queste costanti volevo andarmi a creare, chiudiamo un attimo, una classe che si preoccuperà dell'interazione con il database in modo che vado sempre a richiamare quella classe lì e non c'ho da ricopiare ogni volta impostazioni o comunque avvio della connessione, un nuovo oggetto MySQL, questo lo farò una volta su un punto e richiamerò sempre quello. Non abbiamo ancora la cartella classes, bene la creiamo, una cartella per le nostre classi e ci vado a creare dentro il mio primo file che lo chiamerò db.php. Allora, questo file inizia così, e sarà una classe db.

Perfetto. Com'è fatta sta classe? Allora, io voglio che l'apertura della connessione sia fatta in un solo punto in tutta l'applicazione. Perché?

Perché immaginiamo che il database lo usa, che ne so... una classe che serve per richiamare le categorie un'altra classe che serve per richiamare i prodotti entrambe usano il database io voglio che l'apertura della connessione non si aprano due connessioni diverse ma si apra in un punto solo e magari venga condivisa da tutti gli oggetti che fanno uso del database ci vuole veramente più a dirlo che a farlo quindi vi faccio vedere qui creo un costruttore... public function underscore underscore construct questo è il nome del metodo magico che è il metodo costruttore qui posso inizializzare delle proprietà diciamo che questo db avrà una proprietà pubblica public la chiamiamo con come connection e qui la vado a settare vado a settare this con è uguale a un parametro che mi viene da fuori con e questa connessione io vorrei però che mi venisse da una variabile globale quindi come faccio? rendo privata questa variabile e mi creo una, faccio riferimento a una variabile globale che si chiamerà magari sempre con e assegno alla mia variabile privata con, quindi al campo privato di questo oggetto, la variabile globale.

Da dove mi viene questa variabile globale? Mi verrà da un punto. del codice in cui io andrò a aprire la connessione.

Allora tutte le variabili globali io tanto sono globali quindi posso utilizzare in tutto lo script. Se io creo una variabile, la chiamo global, questa è visibile in tutto lo script. Per una questione proprio di non perderle di vista, a me piace magari creare un file dove definisco queste variabili globali, dove le dichiaro. E poi vabbè, durante il giro di tutto lo script... Possono cambiare anche di valore al limite, però le dichiaro in un punto unico.

Quindi come faccio? Creo un nuovo file, lo chiamerò globals.php e qui mi piace metterci le mie variabili globali. Almeno so che cerco una variabile globale, dove starà?

Dove starà? Sta qui, dichiarata qui. Allora, intanto quello che mi serve è una bella variabile così. Quindi una variabile connessione e apro la connessione MySQL Connect. In questo modo istanzio questo oggetto con ciò che ritorna a questo metodo, quindi un oggetto connection.

Questo oggetto connection è richiamabile globalmente con questa keyword e andrò a settare dentro l'oggetto. come proprietà dell'oggetto DB. Ok, a questo punto vado a fare, e questo è tanto tutto codice diciamo un po'boilerplate, ovvero codice di partenza, se la connessione si apre, quindi se va tutto bene, non entra qui.

Altrimenti se c'è un errore di connettività, ad esempio qualche parametro tipicamente questo errore di connettività è solo se non si raggiunge il server. o sono sbagliati i parametri definiti nel config, non c'è altra possibilità. Allora a quel punto fa questa echo, problema di connessione, posso anche dargli die, muori qui perché tanto se c'è problemi di connessione è inutile che fai qualsiasi altra cosa più avanti.

Se invece tutto va bene facciamo questo. Ci avrò un'altra variabile pubblica qui, pdo la chiamo, un oggetto data object, e lo istanzio qui passandogli i parametri della connessione, quindi le mie costanti che ho dichiarato in precedenza. In questo modo ho questo oggetto che userò all'interno di questa classe per interfacciarmi al database.

Oppure anche posso usare l'oggetto MySQLI se non voglio usare ObjectOriented. Non c'è problema, posso usarli entrambi. Diciamo, quali saranno i metodi di questa classe DB? Allora, il primo è sicuramente query.

Quindi avrò una funzione query. che mi servirà per lanciare una query al database semplicemente. Eccola qua.

Q è sul database, quindi sull'oggetto PDO invoco il metodo query passandogli SQL che sarà un parametro che mi viene passato dall'esterno che è proprio la query SQL vera e propria. Facciamo anche un po'di gestione dell'errore, diciamo qualcosa del genere, ve lo spiego subito. Ecco qua, cioè un try catch, quindi se provo a eseguire questi passi, se vanno bene esco, se no entro nel catch e c'è la gestione dell'eccezione. Quindi essenzialmente quello che faccio qui è faccio la query.

se non ha risultati o se c'è stato un errore di qualsiasi tipo rilancia l'eccezione e se invece l'errore non c'è stato quindi se qui non ci entra quindi non c'è stato problema che cosa fa? fa il metodo fetchAll su quello che ha restituito il metodo query e mette i risultati dentro questo oggetto data e li restituiamo al chiamante della funzione query quindi praticamente query ci restituisce un array di risultati, altri metodi, questi li copio e li incollo e dopo ve li spiego. Allora, copia, incollo, prendo chiaramente il codice dalla versione che ho già fatto. Sì, io avrò un metodo selectAll che mi servirà per, fondamentalmente gli passo due parametri, un nome di tabella e un array di colonne.

Questo perché? perché fondamentalmente io mi piacerebbe chiamarlo per esempio select all il primo parametro è product e il secondo parametro è per esempio id, name e price e questa cosa qui mi restituisce fa una select id, name e price from tabella product e mi restituisce il risultato stessa cosa select one dove oltre al nome tabella e nome di colonne e l'array delle colonne io passo anche un id e qui la stessa cosa questo fa esattamente la stessa cosa di quello prima però seleziona chiaramente l'id deve essere qui state attenti questa l'ho fatta in modo che la colonna si deve chiamare proprio id quindi select asterisco di select tutte queste colonne qui prima si concatena l'array di colonne su uno stringone lungo e dopo quindi seleziona tutto quanto quello che che ho passato qua creandosi una stringa per esempio name, title, message, tutto quello che ho passato, from, nome della tabella che ho passato, where id la proprietà della tabella, cerchiamo di chiamarle tutte id le chiamiamo i primarie id magari autoincrementanti ai numeri intero in modo che Anche perché qui, vedete, non gli passo gli apici, quindi questo parametro non può essere una stringa, deve essere intero o comunque numerico. Quindi setteremo le tabelle in modo da avere come chiavi primarie colonne che si chiamano proprio id, che sono auto-incrementanti e chiavi primarie. A questo punto abbiamo la sicurezza che questo metodo ci restituisce un risultato solo. Poi c'è delete1 che fa la stessa cosa e gli passo il nome della tabella e il valore dell'id che devo cancellare.

E update1 che fa la stessa cosa ovvero gli passo sempre il nome della tabella, l'array di colonne che voglio aggiornare di cui voglio fare l'update e l'id. E lui farà update nome della tabella, set nome delle colonne con il valore che io ho passato e io gli passerò un array del tipo un array fatto così. name John age 20 ecco una cosa così cioè gli passerò columns sarà un parametro del genere così lui sa che deve fare set name uguale John age uguale 20 e si concatena tutta la stringa in questo modo where chiaramente fa questa date where l'id è uguale a quello che gli passo e quindi diciamo che questo è un si poteva fare in tanti modi diversi però ho fatto diciamo una classe di interfaccia con il database quindi io non andrò a a volte andrò a scrivere query però quando posso soprattutto per le operazioni di base che sono selezione del singolo elemento eliminazione del singolo elemento aggiornamento di una sola entità e selezioni di tutte le entità selezioni dell'entità singola per i d queste operazioni di base non devo andare scrive le query perchè soggiorno metodo che me lo fa bene e oltre a questo andrò a vedere avrò un'altra classe che la classe di b manager che cosa fa la classe di b manager fondamentalmente interagisce con la classe di b o meglio diciamo c'è una classe di b manager ciao la come pro una proprietà sua, uno dei suoi campi, sarà l'oggetto DB.

Quindi lui attraverso il suo oggetto parla col database, gestisce il database. Per quello lo chiamo DB Manager. Ora la incollo qua e ve la faccio vedere.

Ecco sì, DB Manager. Ci avrà come proprietà questi tre campi, quindi DB, che sarà un riferimento a un oggetto di tipo della classe che abbiamo creato sopra. di tipo DB.

Poi ci avrà una proprietà columns che è un array e una proprietà tableName che è una stringer. Nel costruttore andiamo semplicemente a dare vita a questa proprietà, ovvero fare in modo che questa proprietà sia un oggetto vero e proprio, un'istanza della classe DB e me lo salvo qua. E dopodiché questa avrà una sorta di metodi di interfaccia diciamo un livello di astrazione in più rispetto a a quella sotto e andrà ad utilizzare i metodi della classe chiaramente DB avrà dei metodi come get semplicemente get che prende un solo id e farà una ritorna il risultato della select one passandogli this table name, this columns e l'id fatto il cast a intero e me lo ritorna sotto forma di oggetto quindi che cosa farà questo ad esempio se io gli dico Ci avrò table name ad esempio uguale a products, columns uguale a name price, facendo get, passandogli ad esempio i d1, mi ritornerà un solo prodotto sotto forma di oggetto con quelle proprietà valorizzate, prese dal database. Quindi questa è una classe che si interfaccia. con questo, cioè utilizza questa DB per interfacciarsi al database e vabbè mi direte che allora che fa questo?

guarda, noioso, dice hai fatto copia e incolla e basta, è vero però adesso abbiamo un grande vantaggio abbiamo il vantaggio enorme che l'operazione di data entry ovvero di inserimento, le CRUD cosiddette ovvero create, read, update e delete ovvero le operazioni di base sull'entità sono veramente di una semplicità assurda. Facciamo subito subito subito un esempio. Io per esempio voglio, diciamo che ci abbiamo messo in piedi questa cosa, ovvero abbiamo la classe DB. Questa io la voglio utilizzare in un'altra classe.

Io ho una classe che la chiamerò, abbiamo la gestione dei prodotti, la chiamiamo Product Manager. Quindi product.php è il nome del file, apro php e creo una bella classe product manager. Questa qui mi dovrà gestire i prodotti.

Come faccio io ad utilizzare la classe db manager? Molto semplicemente andrò a fare un extens di db manager. In questo modo questa estende quest'altra e ci avrà tutte queste proprietà, cioè ci avrà ad esempio get, get all, create, delete, update. E nel costruttore di questo product manager non dovrò fare altro che valorizzare le variabili, diciamo questi due campi, quindi columns e table name. Devo fare solo ed esclusivamente quello.

se io adesso faccio qui istanzio un costruttore quindi faccio creo public no istanzio scusate creo un costruttore function underscore underscore construct e questo mi che cosa farà questo qua? farà innanzitutto devo richiamare il costruttore del padre perché il padre deve istanziare sto db Quindi per richiamare il costruttore del padre faccio molto molto semplicemente una parent, parent constratto, questa cosa qui. Così richiamo il costruttore del parent, che è il parent, è lui, è la classe padre, è un oggetto della classe padre. Bene, a questo punto. Vado semplicemente a crearmi tutti quanti i nomi delle colonne che a questo punto per noi sono, sembra ben pochi però andiamo a rivedere un attimo phpMyAdmin giusto per ricordarci perché io già me ne so dimenticato.

Allora abbiamo creato mi sembra due tabelle. Eccolo qua phpCommerce senza... senza trattino perché l'altro è la versione completa qui ci avevamo product che c'è vediamo un po i campi c'è id name description price e category di benissimo dobbiamo fare quindi per andare a settare l'oggetto Array columns andiamo a fare così e sarà un array fatto come?

fatto dove ogni elemento è una delle colonne ci siamo detti id name price già me l'ho dimenticato e poi c'era id name price description price e categoria id non importa l'ordine ma giusto per questo qui importante cercate di tenere sempre tutto in minuscolo cioè o meglio anche se alcuni database non sono case sensitive può darsi che andate a metterlo live e il server live invece ha l'opzione case sensitive attiva e quindi non vi funziona più quindi vi consiglio di utilizzare tutto minuscolo per i nomi delle colonne magari se hanno più di una parola separarli con l'underscore e fare la stessa cosa su tutte le query che scrivete lato codice. Questo vi toglie un sacco di problemi se mantenete questa convenzione. Quindi category underscore id. Bene, fatto questo dobbiamo andare anche al table name, quindi this table name. uguale a abbiamo detto product anche questa sempre case sensitive quindi tutto minuscolo perfetto ok va fatto questo in teoria io sono già pronto ad utilizzare questa classe l'unica cosa che devo fare è devo richiamare sia questa che questa cioè includerle nello script principale in modo che vengano caricate altrimenti Se io vado ad esempio nella pagina prova.php o nella pagina dei prodotti, andiamola a usare nella pagina dove andremo a usare, quindi nella pagina dei prodotti.

Product list qua. Invece che solo hello from nome pagina andiamola ad utilizzare. Allora qui come prima cosa abbiamo la...

vedete che quella viene richiamata... ProductList viene richiamata da qui. Vi ricordate l'include page dove $page era quello che gli passo in query string? Quindi viene richiamata da qui.

E prima di venire richiamata chiama init e include init.php. Quindi includendo init.php io mi devo accertare che dentro init, ovvero dentro l'inizializzazione di tutto lo script, vengono incluse anche le classi come facciamo? andiamo dentro init.php e oltre a includere config vado a fare due cose vado a includere require ones qui posso utilizzare il root path perchè chiaramente avendo già incluso questo root path è definita root path root path ha il backslash finale, quindi posso iniziare a scrivere il percorso senza backslash. Root path è il path qua, a index.

Quindi per includere, devo includere sia globals sia le mie classi, queste due. Per includere globals vado a fare inc slash globals punto vhp. Per includere le mie classi vado a fare, non è inc ma è classes, una è db e l'altra è product.php.

Ok, così sono incluse. Adesso io dentro a products list, anzi lasciamoci l'ello from file e qui sotto andiamo a fare il nostro giochetto. Io mi vado a istanziare il mio product manager, un oggetto lo chiamerò productmgr, è uguale a new product manager. Vedete l'intelli senso già lo rileva perché vede che in questo giro, diciamo, product manager è richiamato. E adesso se io voglio, ad esempio, prendermi un prodotto, vado a fare, anzi tutti i prodotti.

Come faccio? li salvo in una variabile products ProductManager.getAll perché vi ricordate che getAll è un metodo della classe DBManager, questo qua, però la nostra ProductManager estende DBManager, quindi è anche un metodo della classe ProductManager. E quindi dentro products io ci avrò...

tutti i prodotti che ci sono nel mio database. Andiamo a fare un var dump giusto per assicurarci che ho detto una cosa vera e proviamo anche se funziona perché io sono molto prono a errori, ne faccio veramente tanti mentre scrivo codice. Bene, fatto questo andiamo ad aprire di nuovo prodotti ecco qua, infatti il primo errore è uscito Chiamo una funzione non definita ESC che sta dentro a db.php alla riga 42. Benissimo, quello sicuramente è un copia e incolla che ho fatto io e che mi sono dimenticato di qualcosa. Riga 42, ESC.

Allora, ESC è diciamo una funzione che mi sono creato io, non è obbligatoria però... è un modo diciamo di sanitizzare l'input quindi me la vado un attimo a prendere e la mettiamo in piedi anche di qua comunque è un modo semplice diciamo che io qui che cosa vado a fare qui e anche in altri punti mi vado a concatenare tutti i nomi colonna che mi arrivano da questo array columns concatenando diciamo che Ognuno di questi nomi lo vado a sanitizzare, ovvero se ci stanno magari caratteri speciali li vado a trattare, non ci dovrebbero essere, diciamo che è più una forma di protezione che un reale bisogno. Però quello che vado a fare è che, ecco qua, mi vado a prendere questo ESC, che non fa altro che fa un escape string, e lo vado a mettere...

dentro a... facciamoci un altro file chiamalo functions giusto per new file delle funzioni che si usano in tutto il codice in maniera... funzioni globali ne andiamo a mettere qua in modo che questo le ritrovo sempre e questo... Chiaramente vengono utilizzate quindi devono essere inglobate prima di DB. Quindi andiamo a vedere DB lo inglobiamo qua.

Functions andiamolo a inglobare prima. Quindi qua ad esempio andiamo a inglobare functions prima. Bene a questo punto quel problema dovrebbe essere sparito.

Ecco i nostri prodotti. Prodotto 1, prodotto 2, prodotto 3. benissimo se ad esempio io voglio solo il prodotto 1 come faccio a questo punto è veramente veramente semplice io voglio solo il prodotto 1 invece che fare questo faccio prodotto vediamo qual è l'id del prodotto 1 ci dobbiamo avere l'id questo ha id 1 prendiamo quello con id 1 e prodotto è uguale a product manager il mio oggetto product manager get passandogli il valore dell'id e questo faccio var dump di product a sto punto ecco qua c'è soltanto l'1 se invece ad esempio faccio il voglio il 2 chiaramente Ecco qua, prodotto 2. Vedete come tutto questo codice che abbiamo messo su e che magari era anche un po'poco comprensibile? Andatevelo a rivedere piano piano, tanto metto tutto in GitHub. A questo punto c'è molto più senso, che quello che va a fare è ci crea un terreno semplice per poter iniziare a sviluppare.

Ora, avevamo detto magari di fare la pagina dei prodotti? Vogliamo dare un minimo di layout qui, ma proprio un minimo perché già ci siamo dilungati abbastanza per oggi, però diciamo che creiamo un div di classe row per fare una bella riga di prodotti. chiaramente devo chiudere php qui eh devo andare fuori dalla modalità php e qui sto in modalità normale quindi html ci abbiamo, che cosa ci abbiamo prendiamo ad esempio prendo il markup di uno solo ma andiamo su, per farvi vedere un esempio semplice, se andiamo un attimo su bootstrap andiamo su bootstrap e prendiamoci una card qualcosa di proprio semplice una card fatta così, si ma adesso non mi serve niente tanto dopo lo prendiamo da delà il layout, adesso è giusto per farvi vedere come funziona diciamo che questo layout lo andremo a a fare identico identico per tutte le diciamo questo che è più semplice Ogni prodotto avrà un layout di questo tipo.

Come facciamo a dire che voglio per ogni prodotto presente nel mio array products, prendiamo questo qua, products, questo guardamp non ci serve più, andrò a dire che questo è il layout per uno solo. Immaginiamo che è fatto così. titolo descrizione tutto titolo lo possiamo utilizzare per metterci magari il prezzo 10 euro adesso ve lo faccio vedere statico e dopo lo andiamo a rendere dinamico in un secondo e poi ci avremo un link che dice visualizza vedi ok qualcosa di molto molto semplice allora qualcosa così titolo descrizione e un pulsante vedi bene ora vogliamo farne uno per ognuno dei prodotti si fa un ciclo for each allora c'è una bellissima sintassi che è questa qua entro in modalità php e ne esco e qui metto foreach metto i due punti alla fine e quando voglio che termini il foreach apro un altro tag php e lo richiudo e scrivo la parola end foreach tutto attaccato, punto virgola ecco qua da qui a qui c'è il foreach cioè sarebbe per ogni per ogni cosa che ti passo qui dentro fammi riesegui questo codice qui in mezzo che cosa gli passiamo qui in mezzo?

gli passiamo products cioè per ogni products array s e qui ci posso mettere il nome con cui voglio chiamare il l'iesima iterazione, chiamiamola product, quindi ogni iterazione avrò accesso ad una variabile product che è l'elemento corrente per stampare il titolo entro in modalità php e ne esco e farò l'eco di questo ricordatevi che è un oggetto e quindi product proprietà title era title non mi sembrava proprio la colonna name name description e price benissimo quindi ho sbagliato io era name product name poi mi prendo sto pezzetto Per dire il prezzo era product.price e pure euro, quindi stampo questa cosa e dopo spazio euro. Per stampare la descrizione è product description. Adesso la stampiamo tutta, dopo vedremo che ne stamperemo un pezzo magari. Poi vedi e abbiamo magari il link per andare sulla pagina dei prodotti e vederne uno solo. Come facciamo a creare questo link?

Facciamo echo di root url dove andiamo a concatenare slash no shop and page uguale a product, view product, come abbiamo chiamato la pagina, view product, eccola qua, view product. and id passeremo un parametro id che è uguale a concateniamo product.id ok salviamo e andiamo a vedere il risultato ricarico ecco qua prodotto 1 prodotto 2 prodotto 3 con i rispettivi con le descrizioni e se faccio vedi adesso non funzionerà però se faccio vedi quello che fa è mi va sulla pagina shop c'è su shop, slay e page view product id uguale a 1 per il primo se vado sul terzo mi va sulla pagina id uguale a 3 quindi è perfettamente funzionante la prossima volta questo layout lo facciamo vero quindi prendo il template che ho nel video finale però tanto abbiamo visto come si fa si mette al posto dove voglio inserire nel codice dinamico i tag php Qui però potrebbe succedere una cosa, ultima cosa. Diciamo che ad esempio questo array di prodotti che io ricevo è vuoto. Quindi per simularlo diciamo products è uguale a un array vuoto.

Così simuliamo il fatto che da database non mi arriva niente. A questo punto io ho un problema. Perché?

Perché io vado a ricaricare e lui si arrabbia. ah no, scusate, se è così non si arrabbia il problema è quando invece ho null se io non ho proprio l'oggetto qui si arrabbia ecco, infatti mi diceva il for each, perché se è un array vuoto il for each non viene mai eseguito invece se è nullo si arrabbia perché dice guarda, non mi puoi passare primo e come le parametro del for each null e qui esce questo errore brutto diciamo per evitare questa cosa una buona pratica è prima del for each mettere un if cioè se è definita o diversa da null quindi if se products posso dire anche solo if products ovvero se questo se è diverso da vuoto o comunque esistente questo me lo valuta a true altrimenti me lo valuta a false quindi Al termine di questo ci si mette un endif, quindi questo mi evita un bel problema. Quindi qui in questo caso non succede niente e va benissimo. Un'altra cosa è mettiamo un messaggio nel caso in cui i prodotti non ce ne siano, perché magari ancora non ce stanno. Metteremo un tag else, php else.

else due punti, importanti due punti, ci mettiamo ad esempio un paragrafo che dice nessun prodotto disponibile. Ecco qua, a questo punto quando ricarico non ho prodotti e mi dice nessun prodotto disponibile. Se invece ho prodotti, quindi togliamo questa.

E mettiamo questa. Non mi compare nessun prodotto disponibile ma mi compare la lista dei prodotti. Bene ragazzi per oggi è tutto. Finalmente abbiamo mosso i primi passi. Bene io farò il commit di questo codice che abbiamo fatto oggi.

E come promesso così che potete fare semplicemente un... Voi quello che dovete fare è semplicemente un pull, quindi la rivediamo un attimo come era. Vediamo qua. Quello che dovete fare è o cliccate qui sulla rotellina per sincronizzare i cambiamenti, oppure se vi dà errore oppure perché potarsi avete fatto delle modifiche in locale e vanno in conflitto con quello che volete tirarvi giù, andate qui su More Action e fate Pull o Pull Rebase, a seconda se volete. magari rebase mi sembra che tolga le vostre modifiche in locale e si riprende giù tutto dal server e non dimenticate qui in basso come branch se volete seguire questo codice quindi avere queste modifiche qui voi dovete selezionare youtube series qui di tutti i branch disponibili voi dovete prendere origin youtube series questa qua Bene ragazzi, ora è proprio tutto, faccio il commit così ve lo ritrovate.

In descrizione trovate i link sia al repository su github sia al link per prelevarvi il codice. Ci vediamo alla prossima. Se il video vi è piaciuto mettete un mi piace, iscrivetevi e ci vediamo alla prossima. Ciao ragazzi!