Pagine

giovedì 18 settembre 2008

Php e Access


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 prova



Per 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 ADO



ADO è 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 dati



Per 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 dati



Il 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)

Nessun commento: