Visualizzazione post con etichetta PHP. Mostra tutti i post
Visualizzazione post con etichetta PHP. Mostra tutti i post

giovedì 16 settembre 2010

Una rubrica con... MySQL e PHP

Ricordate il database realizzato con MySQL per una rubrica di contatti telefonici? Ho realizzato una semplice interfaccia con PHP e funzioni JavaScript per contrallare l'input. La cartella con tutti i file utili all'applicazione è scaricabile a questo indirizzo. Per rispettare l'input atteso dal database MySQL, nella pagina aggiungi.html, ho pensato a delle funzioni JavaScript che, attraverso l'uso di espressioni regolari, stabiliscono la presenza o meno di un possibile input. La struttura seguita è più o meno la seguente (per i numeri cambia il pattern in [0-9]{6,30}):

cognome=document.getElementById("NOME_CAMPO").value;
pattern=new RegExp("[a-zA-Z]{2,30}");
if (pattern.test(cognome)) return true;
else return false;

Il bottone per l'invio dei dati viene allora abilitato solo se le funzioni che controllano i campi dati del form (nome, cognome e numero di telefono) danno esito positivo! Tale controllo è poi necessario anche in fase di ricerca, nella pagina cerca.html. Particolare attenzione va infine fatta in fase di inserimento dati all'interno del database. Un contatto può avere uno o più numeri di telefoni! Pertanto, durante l'aggiunta di un numero occorre stabilire prima la presenza nel contatto all'interno della tabella contatti e successivamente procedere con l'aggiunta del nominativo, se quest'ultimo non è stato già inserito! Verificando che il numero sia effettivamente un nuovo numero per il contatto indicato. Tutto questo avviene all'interno del file aggiungi.php. Per eseguire l'applicazione su Apache2 occorre collocare l'intera cartella nella home del server (riga DocumenRoot del file /etc/apache2/sites-available/default) oppure effetuarne un collegamento simbolico in /etc/apache2/sites-enabled. Vi lascio qualche immagine dell'applicazione:








PHP e MySQL: le funzioni per il database

PHP e MySQL, entrambi prodotti open source, hanno sempre avuto un buon rapporto. Recentemente PHP ha aperto la porta anche ad altri database, aggiungendo per ognuno di essi un modulo. Il supporto di PHP verso MySQL rimane in ogni caso la strada più naturale per favorire l'integrazione di un database all'interno di un'applicazione web. Il modulo MySQL per PHP va abilitato all'interno della configurazione del server web (che per Apache2 avviene nel file /etc/php5/apache2/conf.d/mysql.ini). Questo ci permetterà l'accesso e la gestione del database attraverso l'uso di semplici istruzioni!
Prima di iniziare a interagire con un database occorre stabilire una connessione verso un server MySQL, ecco l'utilità della funzione mysql_connect($host,$user,$password). Dove:
  • $host: è il nome o indirizzo del server MySQL, può comprendere anche il numero di porta;
  • $user: è il nome dell'utente che si collega al server;
  • $password: è password assegnata all'utente di nome $user sull'host con nome o indirizzo $host;

Questa funzione restituisce un collegamento alla connessione verso il server MySQL, da usare nelle successive istruzioni. Solitamente a questa istruzione viene fatta seguire l'istruzione die(), che stampa un messaggio ed esce dallo script in caso di errore.

Se vi occorre una connessione persistente verso il database esiste, inoltre, la funzione mysql_pconnect(). Avete mai usato MySQL da riga di comando? La funzione mysql_connect() esegue per voi (in locale o in remoto) l'istruzione mysql -u NOME_UTENTE -p! Il secondo passaggio da compiere consiste nella scelta del database. Se da riga di comando, nel client MySQL, selezioniamo il database con use database NOME_DATABASE, in PHP dobbiamo invece affidarci alla funzione mysql_select_db($database,$connessione). Dove:

  • $database: è il nome del database;
  • $connessione: è il link alla connessione precedentemente ottenuto, in caso di successo, dall'istruzione mysql_connect();

Questa funzione ritorna un valore booleano: true in caso di successo, altrimenti false. Cosa deve accadere se la funzione non trova il database passato come argomento? Nella maggior parte dei casi tutto il codice PHP potrebbe non avere senso. Ecco allora come usare il valore restituito:

Adesso possiamo interrogare il database! Come? Con la funzione mysql_query($query,$connessione). Dove:

  • $query: è la stringa con la query da passare al server MySQL. Può pertanto contenere sia operazioni di inserimento che di modifica. E perché no? Anche istruzioni per la rimozione di occorrenze all'interno delle tabelle che compongono il database. Un limite a queste operazioni è ovviamente stabilito dai permessi dati all'utente che interagisce con il database;
  • $connessione: è il link alla connessione precedentemente ottenuto, in caso di successo, dalla funzione mysql_connect();
Questa funzione ritorna nel caso di SELECT, SHOW, DESCRIBE ed EXPLAIN un oggetto (o meglio, una risorsa) che contiene il risultato generato dalla query. Se la query contiene invece INSERT, UPDATE, DELETE o DROP ritorna true in caso di successo, altrimenti false.

Come possiamo esaminare il risultato restituito da mysql_query?
PHP offre più di una funzione! Prima ancora di andare a leggere il risultato contenuto nella variabile $risposta è forse utile conoscere il numero di righe che troveremo nell'oggetto. L'estrazione delle informazioni contenute in queste righe si esaurisce quasi sempre all'interno di un ciclo (come vedremo fra poco). Meglio stabilire fin dall'inizio se la query ha davvero generato un numero di righe utili, presumibilmente almeno uno! La funzione mysql_affected_rows($connessione) fa proprio questo: legge sulla connessione (quindi, variabile $connessione) il numero di righe generate come risposta all'ultima query di INSERT, UPDATE, REPLACE o DELETE.

Una delle funzioni PHP più usate per l'intercettazione delle informazioni all'interno delle righe ritornate da una query è la funzione mysql_fetch_array($risposta,TIPO_DI_INDIC) che ritorna un array di stringhe, indicizzato sia sui nomi dei campi dati che sugli indici numerici dell'array! Nei parametri passati alla funzione, $risposta è la variabile oggetto generata da mysql_query(), TIPO_DI_INDIC è una costante (opzionale) il cui valore stabilisce come deve essere indicizzato l'array. Può assumere uno di questi valori:
  • MYSQL_BOTH: indicizza l'array sia sui nomi dei campi dati che sugli indici dell'array;
  • MYSQL_ASSOC: indicizza l'array solo sui nomi dei campi dati;
  • MYSQL_NUM: indicizza l'array solo con indici numerici;
La funzione mysql_fetch_array() svolge anche un utile lavoro di scorrimento dell'array stesso. Attraverso un puntatore tiene la posizione dell'ultima riga letta, restituendone i valori a ogni chiamata. Quando non esistono più righe la funzione restituisce il valore false! Tale valore, allora, può essere restituito fin dall'inizio, se la query non genera alcun risultato!

Oppure:
La funzione mysql_fetch_assoc($risultati), a differenza di mysql_fetch_array(), raccoglie i risultati in un array associativo. Indicizzato, cioè, solo sui nome dei campi dati. Qualche volta può verificarsi un errore, perché non stamparlo sul monitor? Le funzioni mysql_errno($connessione) e mysql_error($connessione) ritornano rispettivamente il numero che identifica l'errore e la stringa che lo descrive (sono funzioni da non dimenticare se vogliamo aggiungere all'applicazione un database dedicato ai file di log). Se il nostro script va avanti per diverse righe dichiarando a destra e a sinistra variabili per contenere le risposte alle varie query è preferibile liberare le risorse occupate dalle variabili non più utilizzate con la funzione mysql_free($risultati) (che ritorna true in caso di successo, altrimenti false). A tale proposito, per non tenere sempre impegnate le risorse inutilizzate vi ricordo di chiuedere la connessione se non devono essere esguite sulla stessa altre query. La funzione mysql_close($connessione) chiude la connessione generata all'inizio da mysql_connect() e ora referenziata nella variabile $connessione. Questa deve essere una delle ultime istruzioni, non rimanete connessioni aperte! 
Altre utili funzioni PHP per MySQL sono: mysql_get_client_info() (che ritorna una stringa che descrive il tipo e la versione del client MySQL usato dall'utente che accede alla pagina PHP), mysql_info($connessione) (che ritorna informazioni sull'ultima query eseguita sul server MySQL) e mysql_stat($connessione) (che ritorna informazioni sullo stato del servizio e quindi del server MySQL).

giovedì 2 settembre 2010

PHP: recuperare i parametri da un form

Il passaggio di informazioni dal client al server può avvenire attraverso due metodi (ormai noti): GET e POST. Il metodo GET passa le eventuali informazioni al server attraverso l'url, accodandole all'indirizzo della pagina richiesta!
La regola usata anche in altri linguaggi di scripting e tecnologie per il web è la seguente: la query string (così viene detta la stringa con i parametri da passare al server) viene fatta seguire all'url della pagina, separata da quest'ultimo con il carattere ? Ogni nome e valore di variabile viene quindi aggiunto nella query string osservando la seguente sintassi: nome_variabile=valore, più valori sono poi separati tra loro dal carattere &. Ad esempio, l'indirizzo:
http://mio_sito/pagina.php?variabile1=valore1&variabile2=valore2
accede alla pagina pagina.php del mio_sito passando i valori delle variabili: variabile1 e variabile2. PHP memorizza la query string nell'array $_GET, le cui chiavi sono i nomi delle variabili passate. Pertanto, con l'istruzione $_GET['variabile1'] si accede al valore della variabile1 (che è valore1).
Alla semplicità e alla vulnerabilità del metodo GET (che usa una query string visibile nella barra degli indirizzi del browser, inadeguato dunque per la comunicazione di informazioni sensibili) pone rimedio il metodo POST che trasmette i nome ed i valori delle variabili in un header (a parte) della richiesta http. PHP usa per il metodo POST l'array $_POST, indicizzato anche in questo caso con i nomi delle variabili. Come prima, con l'istruzione $_POST['variabile1'] accediamo a valore1. Di seguito mostro due screen shot di un form per la registrazione, prima di inviare i dati:

e dopo l'invio dei dati:

Con le istruzioni: $_POST['user'], $_POST['password'], $_POST['sesso'] e $_POST['ruolo'] accedo rispettivamente al nome utente, alla password, al sesso e al ruolo inviato dall'utente. I nomi di tali campi dati sono stati precedentemente assegnati al form (la prima immagine) sicché attraverso la request riesco adesso a intercettarne i valori!

Apache2 e modulo PHP: visualizzare gli errori nel browser

L'installazione del modulo PHP per Apache2 usa una configurazione un po restrittiva per gli errori, visualizzati solo all'interno del file di log. La visualizzazione degli stessi all'interno del browser non può che velocizzare lo sviluppo dell'applicazione, soprattutto le prime volte (quando carichiamo più volte la pagina a caccia di eventuali errori).
Se avete letto l'articolo precedente sapete allora su quale file agire per modificare tale comportamento. Il file php.ini è strutturato in più sezioni ampiamente commentate. Per quanto riguarda gli errori bisogna cercare all'interno del file le voci error_reporting ed error_display. PHP usa vari livelli di debug per gli errori (anche questi elencati nel file), di default viene assegnata la stringa E_ALL & ~E_NOTICE alla variabile error_reporting. Questo abilita il modulo PHP alla scrittura di tutti egli errori (nel file di log) ad eccezione degli avvisi di warning. Se si verificano tali errori, lo sviluppatore vedrà all'interno del suo browser un'inutile pagine bianca! Per abilitare la visualizzazione di tutti gli errori nel browser occorre aprire il file php.ini con il nostro editor preferito. Ad esempio con:
sudo mousepad /etc/php5/apache2/php.ini
e modificare la riga error_reporting=E_ALL & ~E_NOTICE in error_reporting=E_ALL (questo abilita tutti i livelli di debug solo nel file di log). Per la visualizzazione all'interno del browser va infine modificata la riga error_display=Off in error_display=On. Se il server web è in esecuzione occorre poi riavviarlo: sudo /etc/init.d/apache2 restart. Per mettere alla prova il modulo PHP sulla nuova configurazione vi consiglio di scrivere una pagina contenente almeno un errore: riuscite a leggere nel browser l'errore che viene rilevato?

venerdì 27 agosto 2010

Installazione e configurazione di PHP su Apache server web

Il modo più semplice per provare i nostri script PHP, senza effettuare di continuo l'upload al server, è quello di installare un server web locale! Qualche mese fa ho già affrontato l'installazione di un server web, Apache Tomcat. Per usare il server web assieme al linguaggio di scripting PHP occorre installare e configurare il relativo modulo, vediamo come fare (installeremo da capo il server web e il client MySQL).
L'installazione di tutto l'occorrente può avvenire da riga di comando oppure per via grafica (attraverso il gestore di pacchetti). Con il comando:
sudo apt-get install apache2-mpm-prefork libapache2-mod-php5 mysql-server php5-mysql php5-gd
installiamo:
  • apache2-mpm-prefork: il server web;
  • libapache2-mod-php5: il modulo PHP per Apache2;
  • mysql-server: il server MySQL;
  • php5-mysql: interfaccia MySQL per PHP;
  • php5-gd: modulo GD per PHP5, permette la gestione delle immagini con PHP;
Altre estensioni e moduli PHP hanno generalmente il nome strutturato in questo modo: php5-nome_modulo. Pertanto, con il comando sudo apt-cache search php5- riceviamo una lista di tutti i moduli PHP (quelli presenti nei nostri repository). Al termine dell'installazione ritroveremo nella cartella /etc i file di configurazione che occorre modificare per rettificare l'installazione. La directory /etc/apache2/ raccoglie i file di configurazione del server web. Il file apache2.conf è uno dei file usati dal server per la configurazione dei servizi. Nella prima parte del file è possibile leggere alcune informazione di carattere generale circa l'uso e la struttura dello stesso file. All'interno del file vengono specificate numerose proprietà del server come: la cartella del server web (riga ServerRoot), la proprietà di persistenza per le connessioni (riga KeepAlive) e il numero massimo di connessioni (persistenti) da tenere aperte (riga MaxKeepAliveRequest), la cartella per i file di log (riga ErrorLog) etc.. Vi consiglio di dare uno sguardo a questo file, provate a farlo con il comando: less /opt/apache2/apache2.conf.
Le cartelle mods-available e mods-enabled servono alla gestione dei moduli. La prima contiene i moduli a disposizione del server web, l'altra raccoglie, invece, i link ai moduli attivi. Ogni modulo ha due file: un file con estensione .load utile all'avvio del modulo e un file con estensione .conf utile alla configurazione del modulo. Pertanto, se vogliamo abilitare un modulo aggiuntivo sul server web non ci resta che fare un link simbolico al file .load (e al relativo file di configurazione) nella cartella mods-enabled.
L'esecuzione di script PHP sul server web avviene grazie al modulo php5.load (non dimenticate mai il file di configurazione). Verificate nella cartella mods-enabled la presenza dei collegamenti. Il server web viene avviato, fermato o riavviato con il comando:
sudo /etc/init.d/apache2.2 start|stop|restart
(in alternativa è possibile avviare il server web eseguendo il file binario dalla cartella bin di Apache2). Attenzione, se all'avvio riscontrate un messaggio di warning relativo all'indirizzo locale del server, editate il file apache2.conf aggiungendo la riga: ServerName localhost. In alcuni casi, durante l'avvio, può verificarsi, poi, un errore dovuto ai permessi in scrittura della cartella per i file di log. Se avete letto attentamente le cose che ho scritto finora sapete, allora, in quale file andare a modificare il path. Prestate attenzione, a volte l'errore si verifica per l'assenza della cartella dei file di log! In tal caso è sufficiente crearla laddove essa occorre.
Per testare il modulo PHP scriviamo un semplice documento per la stampa di tutte le informazioni relative al server e al modulo PHP. Aprite un documento di testo e inserite la seguente riga:


salvate il file (con estensione .php) nella DocumentRoot, la cartella con le pagine php dell'applicazione web. Il nome da me usato per la pagina è stato info.php (vi occorrerà fra poco per accedere alla pagina).
Non avete ancora impostato la DocumentRoot? Nessun problema, editate il file /etc/apache2/sites-available/defaul e aggiungere o modificare la riga DocumentRoot facendola puntare alla cartella con le pagine PHP. Fatto?
Riavviamo il server, la pagina precedentemente salvata è adesso accessibile all'indirizzo http://localhost/info.php.