PHP - Interrogare un Database Access con la classe PDO




Se anche voi avete aggiornato la versione di PHP
avrete notato tante novità e se non vi site letti gli articoli di riferimento e come me avete installato la versione PHP 5.6.31
il vostro script che gira tranquillamente da anni, di punto in bianco vi darà un fantastico messaggio di errore.
Nello specifico, in quest'articolo mi occuperò dell'interfacciamento di una pagina PHP con il database Microsoft Access
Di  seguito trovate un semplice vecchio script di connessione al database Access e l'estrapolazione di un campo da una tabella.

<?php

// impostazione variabili
$user = "";
$password = "";
$mdbFilename = "C:\xampp\htdocs\miacartella\miodb.mdb";

// stringa di connessione al database access
$conn = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$mdbFilename", $user, $password);
if (!$conn)
 {
 echo "Errore Connessione Database<br>";
 exit("Connection Failed: " . $conn);
 }

// imposto la query SQL
$sql="SELECT Libro.* FROM Libro";

// mi eseguo la query SQL
$rs2=odbc_exec($conn,$sql)or die("Query non valida: " . mysql_error());

// Inserisco i dati della query in un array
while($row = odbc_fetch_array($rs2))
 {
 // visualizzo il valore del campo
 echo $row["nome_campo"];
 }


?>


Nella versione PHP 5.6.31 questo script non funziona più e viene restituito messaggio di errore di questo tipo:

Warning: odbc_connect(): SQL error: [Microsoft][Driver ODBC Microsoft Access] Not a valid file name., SQL state S1000 in SQLConnect in C:\xampp\htdocs\connessionedb.php on line 24
Connection Failed:[Microsoft][Driver ODBC Microsoft Access] Not a valid file name.
oppure

PHP Fatal error: Uncaught Error: Call to undefined function odbc_connect() in C:\xampp\htdocs\miacartella\connessionedb.php:24\nStack trace:\n#0 {main}\n thrown in C:\xampp\htdocs\miacartella\index.php on line 11

Facendo delle ricerche in rete dei messaggi di errore, vengono fornite varie risposte.
Ad esempio la creazione di una stringa DSN su Microsoft Windows Origini dati ODBC.
Oppure vengono fatte fare ricerche su Dynamic Link Library (DLL): php_odbc.dll,
alcuni fanno installare dei driver  ODBC driver for your PHP client mentre altri
consigliano di scaricare un file AccessDatabaseEngine.exe dal sito Microsoft.


Nel mio caso ho risolto in questo modo:

E' necessario entrare nel file di configurazione di PHP.ini ed abilitare l'estensione:

extension=php_pdo_odbc.dll

Altrimenti utilizzando il codice sotto riportato si riceverà il seguente messaggio di errore:

Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in C:\xampp\htdocs\miacartella\cnn.php:13 Stack trace: #0 C:\xampp\htdocs\miacartella\cnn.php(13): PDO->__construct('odbc:DRIVER={Mi...') #1 C:\xampp\htdocs\miacartella\index.php(1): include_once('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\miacartella\cnn.php on line 13



Bisogna inoltre prestare attenzione alla stringa di connessione al database.
Nel mio caso il path era il seguente: C:\xampp\htdocs\miacartella\miodb.mdb
Se passiamo questa stringa per la connessione alla libreia php_pdo_odbc, ci viene restituito un messaggio di errore:

SQLSTATE[HY000] SQLDriverConnect: -1044 [Microsoft][Driver ODBC Microsoft Access] Not a valid file name.

oppure

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] SQLDriverConnect: -1044 [Microsoft][Driver ODBC Microsoft Access] Not a valid file name.' in C:\xampp\htdocs\miacartella\cnn.php:13 Stack trace: #0 C:\xampp\htdocs\miacartella\cnn.php(13): PDO->__construct('odbc:DRIVER={Mi...') #1 C:\xampp\htdocs\miacartella\index.php(1): include_once('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\miacartella\cnn.php on line 13

Utilizzando:   $dbName = $_SERVER["DOCUMENT_ROOT"]."\miacartella\miodb.mdb";
la stringa che passeremo al db sarà:  C:/xampp/htdocs\miacartella\miodb.mdb

a questo punto tutto è pronto per ritornare ad interrogare il nostro database Access con la versione di PHP 5.6
Ecco il nuovo codice che vi permetterà di collegarvi a Microsoft Access.

<?php

// inserisco il path al db
$dbName = $_SERVER["DOCUMENT_ROOT"] . "\web_canalizzazioni\miodb.mdb";


// verifico che il file esista
if (!file_exists($dbName)) {
    die("Could not find database file.");
 }


// provo a collegarmi al db altrimenti restituisco il messaggio di errore
try
 {
 $db = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$dbName; Uid=; Pwd=;");
 }
catch(PDOException $error_mess)
 {
    echo $error_mess->getMessage();
 }

// imposto la stringa sql


$sql = "SELECT * FROM miatabella";

// eseguo la query
$result = $db->query($sql);


// ciclo tutti i risultati
while ($row = $result->fetch())
 {
 echo "<br>".$row["miocampo"];
 }


?>


Come avrete notato è cambiato il modo di interazione.
Le varie funzioni odbc_connect, odbc_exec, odbc_fetch_array hanno lasciato spazio alla classe PDO
e ai relativi oggetti new PDO(), getMessage(), query(), fetch()




Commenti