In questo post propongo una mini web-application in linguaggio PHP che consente di interagire con un database
Microsoft Access. La limitazione principale è che il server deve girare in ambiente Windows.
La connessione al database sfrutta la classe COM che fornisce un ambiente idoneo all'utilizzo di diversi
tipi di componenti COM come per esempio applicazioni Word, Excel e Powerpoint, ma anche ADO.
Questa classe, nel pacchetto PHP per Windows, è integrata nella distribuzione, e non è necessaria nessuna
installazione. Per quanto riguarda la versione, sembra che quella minima sia la 4.1.x,
ma non ho avuto modo di fare prove. Suggerirei comunque di utilizzare le versioni 5.2.x per stare tranquilli!
Una generica connessione ad un database MS Access, ed il riempimento di un recordset può essere avviata con queste istruzioni:
$cn = new COM("ADODB.Connection");
$cnStr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".
realpath("./nomeDatabase.mdb").";";
$cn->open($cnStr);
$rs = $cn->execute("SELECT * FROM nomeTabella");
...
$rs->Close();
$cn->Close();
Tornando alla mini-applicazione che ha uno scopo prettamente dimostrativo, le sue funzioni sono:
- Selezionare una tabella di un file MS Access e mostrare l'elenco dei records
- Selezionare attraverso la chiave primaria un record e modificare uno o più campi
- Selezionare attraverso la chiave primaria un record e cancellarlo
- Inserire un nuovo record
Per poter utilizzare l'applicazione, è necessario innanzitutto modificare le impostazioni definite nel file config.php definendo il nome e il percorso del database, il nome della tabella, il nome e la posizione della chiave primaria e la possibilità di attivare o meno la modifica e cancellazione dei record attraverso i link alla chiave primaria.
Il codice del file principale che mostra la lista dei record e i form per le modfiche, le cancellazioni e gli inserimenti è disponibile leggendo il file
test.php.
Un ultimo file: modify.php
si occupa di gestire le POST ed effettuare le query di inserimento, aggiornamento e cancellazione.
Alcune annotazioni: per semplificarsi la vita con Access è bene non dare mai il nome "note" ad un campo, perché è una parola chiave.
Se proprio fosse necessario, bisognerà riferirsi a quel campo con la forma nometabella.note.
Altra considerazione: se in PHP è attiva la direttiva magic_quotes_gpc le variabili POST verranno trattate con i caratteri di escape per l'apostrofo.
Per memorizzare questi dati nel database, sarà quindi necessario fare prima uno stripslahes() e poi rimpiazzare gli apostrofi raddoppiandoli (che è il modo di "escapare" in Access!).
Infine, per motivi di tempo non ho gestito gli errori della classe COM, però è possibile farlo controllando le eccezione tramite la classe com_exception.
Molte curiosità sull'argomento trovano risposta in questa FAQ
Download:
Il pacchetto comprendente tutti i file PHP, il foglio stile e il database MS Access fatture.mdb è scaricabile qui.
Uno screenshot:
Conclusioni:
Sono convinto che le cose che sono nate per stare in coppia diano i risultati migliori, quindi PHP con MySQL. Però avere a disposizione la possibilità di interagire con un database così diffuso e così fortemente legato alle applicazioni Microsoft (Access si sposa bene con Visual Basic!) è un'ottima cosa. Non fosse altro per poter gestire delle emergenze, uno scambio di dati, la migrazione dei dati e via dicendo. O magari semplicemente per non perdere tempo e riutilizzare vecchie applicazioni con il vantaggio delle web-application.
Riferimenti ed approfondimenti:


l'esempio riportato è perfetto!
solo una cosa mi sono accorto ke se voglio inserire nuovi dati
da errore non li salva nel db come mai
dice ke ci sono anomalie sulla line 47 del file modify.php
puoi aiutarmi a risolvere questo piccolo inghippo...
ciao!
Ciao Andrea, ti ringrazio della segnalazione, sulla mia macchina di sviluppo pero' funziona tutto. Avrei bisogno di maggiori informazioni riguardo l'errore, hai provato a fare delle modifiche e delle cancellazioni sui record già presenti? Se apri il file Access direttamente, riesci a fare delle modifiche? Che versione di server PHP hai? Quale è esattamente il messaggio di errore?
Fammi sapere...
allora aprendo manualmente il db funziona sia in modifica ke come inserimento dati.
Quando apro il file test.php
riesco ad elencare i dati, e modificarli.
quando xro' clicco su inserimento nuovo record...
mi visualizza i campi x l'inserimento quando poi clicco su inserisci
mi esce questo errore:
Fatal error: Uncaught exception 'com_exception' with message 'Source: Microsoft OLE DB Provider for ODBC DriversDescription: [Microsoft][Driver ODBC Microsoft Access] Errore di sintassi (operatore mancante) nell'espressione della query 'id ='.' in C:\xampp\htdocs\lavori\accessconnect\modify.php:47 Stack trace: #0 C:\xampp\htdocs\lavori\accessconnect\modify.php(47): com->execute('UPDATE clienti ...') #1 {main} thrown in C:\xampp\htdocs\lavori\accessconnect\modify.php on line 47
per favore risp.
ciao e grazie mille a priori!
Ciao Andrea, ho fatto nuovi test su diverse macchine Windows con WAMP 1.7.x e 2.0c, non ho riscontrato problemi, non credo che dipenda da XAMPP che non conosco.
L'errore che descrivi indica che, nello script modify.php non viene riconosciuto il nome della variabile POST che indica l'azione da compiere, e in questo caso la procedura interpreta come modifica l'azione da svolgere. Infatti la segnalazione indica: "com->execute(UPDATE clienti...). Ovviamente l'azione non va a buon fine perché il campo ID risulta vuoto essendo un autoincrement. Prova a fare un dump delle variabili POST in modify.php e controlla che il valore di POST['azione'] sia effettivamente "inserisci". Se così non fosse, c'e' qualche problema nel form.
Allora, ho notato che il form per gli inserimenti non veniva chiuso correttamente con il tag di chiusura. Ho corretto l'errore e uploadato il pacchetto dei sorgenti in formato zip. Prova a scaricare la nuova versione e verifica...
Ciao Mario,
Ho unzippato il tuo esempio in una cartella ma quando
faccio eseguire test.php con DSVPHP Editor/Firefox mi da questo errore:
PHP Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `ADODB.Connection': Impossibile trovare il modulo specificato. ' in C:\Users\silemi\Desktop\accessconnect\test.php:4 Stack trace: #0 C:\Users\silemi\Desktop\accessconnect\test.php(4): com->com('ADODB.Connectio...') #1 {main} thrown in C:\Users\silemi\Desktop\accessconnect\test.php on line 4
Puoi aiutarmi.
Grazie
Hung
Ciao, purtroppo non conosco DSVPHP editor, probabilmente il server integrato PHP non integra la classe COM. La versione ufficiale di PHP per windows integra sempre la classe COM, come riportato sul sito. Se vuoi un ambiente integrato, ti suggerirei di installare WAMP5, che funziona egregiamente, ed è facile reperire documentazione sulla sua configurazione.
Molto utile, sono del parere che gli esempi pratici siano molto più efficaci e comprensibili di una una tonnellata di teoria.
Grazie
Il problema di Andrea è dovuto al fatto che internet explorer non gestisce il tag button sostituisci le occorrenze <button type='submit' con <input type='submit' e vedrai che funziona.
Ciao
Salve, ha scritto che per accedere ad un database Access tramite php è necessario che il database sia gestito da un server che giri sotto windows.
Il mio database vorrei caricarlo sul server altervista.org.
La mia domanda è questa: come faccio a sapere che il server altervista.org faccia girare il mio database con windows?
La ringrazio e rimango fiducioso in una Sua risposta.
Marco
Ciao Marco,
veramente uno dovrebbe sapere a priori quale server web utilizza! Ad ogno modo, un sistema molto semplice è quello di pubblicare un file php con all'interno questo codice:
echo (PHP_OS);
quando richiami la pagina, troverai scritto il sistema operativo sul quale gira il server web.
Maggiori informazioni sul tuo server le puoi ottenere creando un file PHP con il seguente codice:
phpinfo();
niente di più, otterrai una marea di informazioni preziosissime!