
Sarà capitato, o capiterà a qualcuno di voi, di dover lavorare in locale con dei dati esportabili in maniera semplice (ad esempio su una pen drive). Il sistema più immediato che mi è venuto in mente è stato quello di usare uno strano binomio, e cioè: PHP e Access. Anche se sappiamo benissimo chel'interazione tra PHP ed i database trova la sua massima espressione con MySQL, sia su sistemi Linux che su sistemi Windows, in caso di necessità è bene ricordare che, su Windows, PHP è in grado di lavorare anche con database diversi da MySQL, sfruttando a pieno le caratteristiche e le interfacce richieste da DBMS differenti. PHP è quindi capace di lavorare anche con Ms Access e con Ms SQL Server: Ecco come ho fatto a far si che PHP interagisse con Access.
Premessa
L'interfaccia tra qualsiasi linguaggio di programmazione, sia Web che WUI, con DBMS di casa Microsoft, ad esempio proprio Access, è ADO (ActiveX Data Object) chi, come me, proviene dal Visual Basic o per i programmatori ASP questa non è una novità.
Ovviamente prima di continuare con l'esempio sento il dovere di sottolineare che l'accoppiata PHP con un DBMS di casa Microsoft non è delle più consigliabili e performanti, ma tuttavia perfettamente funzionante.
Le conoscenze richieste per la piena comprensione di questo Articolo sono:
- PHP e la sua sintassi base
- ADO, almeno le basi
- Ms Access, almeno un minimo di dimestichezza con la sua interfaccia visiva
- SQL, almeno le basi
Struttura del database di provaPer l'implementazione di qualche esempio pratico creeremo il file Access
miodatabase.mdb composto dalla sola tabella
utenti, a sua volta composta dai campi
id (Contatore),
nome (Testo) e
cognome (Testo).
Posizionate il database sul vostro server Web personale, Apache o EasyPHP che sia, ad esempio sotto il percorso di prova
C:\percorso_fisico\miodatabase.mdb
dove
www è l'indirizzo fisico del vostro server Web personale, installato, come nell'esempio, sulla partizione
C.
Il database è pronto. Proseguiamo.
Introduzione ad ADOADO è una libreria di casa Microsoft che permette l'interazione con DBMS di casa Microsoft stessa o con altri DBMS, ad esempio con MySQL per il suo utilizzo con ASP.
ADO mette a disposizione tre oggetti fondamentali:
Connection,
Recordset e
Command. In questo Articolo utilizzeremo i primi due che servono rispettivamente a gestire la connessione ed a gestire i dati. Il terzo è un oggetto specialistico, ottimo ma non troppo usato nemmeno dai programmatori di stampo Microsoft, se non in occasioni particolari.
Nota per i programmatori ASP: cari colleghi :-) come me siete abituati ad utilizzare il carattere punto (.) per separare il nome della variabile che contiene, ad esempio la connessione, col metodo o con la proprietà da utilizzare; in PHP, per la sola interazione con ADO, si usa come separatore la forma
->variabile->metodo
Non dimenticatelo !
Lettura dei datiPer eseguire la lettura dei dati creiamo sul server, nella cartella di prova, il file
leggi.php; di seguito il codice commentato del file:
<html>
<head><title>prova</title></head>
<body>
<?php
/* La query SQL, le parentesi quadrate sono
necessarie solo quando i nomi dei campi presentano spazi */
$query="select [nome],[cognome] from Clienti" ;
/* I parametri di connessione */
$path= "C:/www/" ;
$db_name= "miodatabase.mdb" ;
$dsource=$path.$db_name ;
$cn_string="Provider=Microsoft.Jet.OLEDB.4.0;" ;
$cn_string.="Data Source=$dsource;" ;
/* La connessione */
if (!file_exists($dsource) ){
die("Il database non esiste") ;
}
$cn= new COM("ADODB.Connection");
$cn->open($cn_string) ;
/* Istanziamo un oggetto Recordset
e inviamo la query attraverso
il metodo Open() */
$rs= new COM("ADODB.Recordset") ;
$rs->Open($query,$cn) ;
/* Ciclo per recuperare i valori dal recordset
EOF= tutto il set di dati è stato esaminato
e il cursore è giunto in fondo */
while(!$rs->EOF){
echo($rs->Fields['Nome']->value." ".$rs->Fields['Cognome']->value."
") ;
$rs->MoveNext() ;
}
/* Chiusura Recordset (da non farsi nelle query di comando) */
$rs->Close() ;
/* Pulizia dell'oggetto Recordset */
$rs->Release() ;
$rs= null ;
/* Chiudo la connessione e libero la memoria */
$cn->Close() ;
$cn->Release() ;
$cn= null ;
?>
</body>
</html>
Il funzionamento è semplice: al Recordset passo la query in lettura e specifico la variabile in cui è stata aperta la connessione; la proprietà
EOF dell'oggetto Recordset (End Of File) legge tutti i dati in funzione della query specificata; se settata su TRUE vuol dire che non ci sono dati nel database, quindi lancio il messaggio di notifica; se settata su FALSE all'interno di un ciclo, legge tutti i dati in funzione della query specificata; il metodo
MoveNext() interrompe il ciclo e posizione il cursore di ADO all'inizio del ciclo, evitando un loop infinito.
Nella chiusura degli oggetto troviamo i metodi
Close() e
Release() che servono rispettivamente a chiudere l'oggetto ed a distruggere un COM. In fine si setta la variabile su
null in modo da svuotare la memoria della variabile.
Scrittura dei datiIl criterio con cui si scrivono dei dati su un database Access con PHP è simile al criterio di lettura dei dati; nel codice che segue, scritto nel file
scrivi.php non utilizza il Recordset ma esegue una INSERT SQL grazie al metodo
Execute() dell'oggetto Connection; il codice commentato:
<html>
<head>
<title>Interazione tra PHP ed Ms Access</title>
</head>
<body>
<?PHP
/* I parametri di connessione */
$path= "C:/www/" ;
$db_name= "miodatabase.mdb" ;
$dsource=$path.$db_name ;
$cn_string="Provider=Microsoft.Jet.OLEDB.4.0;" ;
$cn_string.="Data Source=$dsource;" ;
/* La connessione */
if (!file_exists($dsource) ){
die("Il database non esiste") ;
}
$cn = new COM("ADODB.Connection");
$cn->open($sc);
// Definisco la query
$sql = "INSERT INTO utenti (nome, cognome) VALUES
('gianni', 'nativo')";
// Effettuo l'inserimento dei dati
$cn->Execute($sql);
// Lancio un messaggio di conferma
print "<p>Inserimento effettuato con successo</p>";
// Chiudo la Connection
$cn->Close();
$cn->Release();
$cn = null; ?>
</body>
</html>
C.I.P. (Copia, Incolla, Prova)