Connessione a Oracle con PHP/Xampp su Windows

Se si vuole realizzare una procedura in Php che recuperi o che scriva dei dati da un database Oracle e la si vuole provare in locale con Xampp, è necessario assicurarsi che sul sistema ci siano le librerie e le configurazioni giuste. Vediamo come si fa.

Ingredienti

  • Sistema operativo: Windows 10 (versione Home o Professional)
  • Editor: Visual Studio Code (v. 1.61.2)
  • Ambiente di sviluppo: XAMPP (v. 3.3.0)
  • Server Oracle funzionante e configurato con credenziali note:
    • username (es. ‘dbusername)’,
    • password (es. ‘dbpassword)’,
    • stringa di connessione (es. ‘dbhost:dbport/servicename‘).
  • Libreria Oracle instant client (21.6) 
  • Libreria Pecl-OCI (8_12c)

Preparazione

Si suppone che sul sistema locale sia installato Xampp, che si conosca la sua directory base, per esempio C:\xampp\htdocs, e che si abbiano le credenziali di accesso a un server Oracle.

 A questo punto:

  1. Lanciare Xampp e avviare i servizi Apache e Mysql usando il Pannello di Controllo (Pdc).
  2. Creare la cartella C:\xampp\htdocs\test-oracle in modo che contenga i seguenti file: testPhpConf.php e testConnessione.php il cui contenuto sarà rispettivamente:
    1. testPhpConf.php: Pagina per vedere le configurazioni di PHP
      <?php
      echo phpinfo();
      ?>
    2. testConnessione.php: Pagina per provare la connessione ad Oracle
      <?php
      $conn = oci_connect('dbusername', 'dbpassword', 'dbhost:dbport/servicename');
      $query = 'select table_name from user_tables';
      $stid = oci_parse($conn, $query);
      oci_execute($stid, OCI_DEFAULT);
      while ($row = oci_fetch_array($stid, OCI_ASSOC)) {
      foreach ($row as $item) {
      echo $item." | ";
      }
      echo "\n";
      }
      oci_free_statement($stid);
      oci_close($conn);
      echo'FINITO';
      ?>

  3. Aprire con un browser le seguenti url:
    1. http://localhost/test-oracle/testPhpConf.php:  verificando che l’estensione oci8 non compaia tra quelle installate.
    2. http://localhost/test-oracle/testConnessione.php: verificando che lo script dia errore dato sulla chiamata oci_connect().
  4. Scaricare dal sito di Oracle [1] il file zip contenente la libreria  Instant Client per Windows x64. Può andare bene la versione più recente con nome “Basic Package” (ad oggi l’ultima è la 21.6).
  5. Scompattare lo zip e copiarlo in C:\ in modo che alla fine il percorso per raggiungere i file sia, per esempio, C:\instantclient_21_6.
  6. Modificare le variabili d’ambiente di Windows (Start->Pannello di Controllo->Sistema e sicurezza->Sistema->Impostazioni di sistema avanzate->Avanzate->Variabili d’ambiente->Variabili di sistema) in modo tale che nel PATH ci sia il percorso: C:\instantclient_21_6
  7. Verificare che nella cartella C:\xampp\php\ext ci sia una versione della libreria php_oci8, per esempio php_oci8_12c.dll. Se presente va bene, se assente allora:
    1. Scaricare dal repository per le estensioni di PHP chiamato PECL la  libreria php_oci8 più adatta alla versione di PHP che si sta usando. La versione di PHP in uso si vede dall’output visualizzato dal link 3a). La versione della libreria da scaricare è indicata in questa pagina. Per esempio, poiché la mia versione di php è la 7.4 la versione della libreria da utilizzare è la oci8-2.2.0.
    2. Cliccare quindi sul link DLL in corrispondenza della versione desiderata.
  8. Aprire il file di configurazione di PHP (php.ini) dal PdC di Xampp:
  9. Cercare la riga in cui è dichiarata l’estensione oci8_12 e scommentarla togliendo, se presente, il carattere ‘;’ all’inizio della riga. Se la riga non è presente in tutto il file, allora aggiungerla nella sezione del file dove sono dichiarate le estensioni da caricare.
  10. Riavviare il servizio Apache dal Pdc di Xampp (stop e start).
  11. Visualizzare di nuovo le seguenti pagine:
    1. http://localhost/test-oracle/testPhpConf.php: verificando che tra le estensioni installate e attivate ora c’è anche oci8.
    2. http://localhost/test-oracle/testConnessione.php: E verificare che lo script effettua la query e mostra il risultato della query come output. In questo caso particolare l’utente che ho usato non ha i diritti per visualizzare il cotentuto della tabella user_tables, ma l’output mostra che non ci sono stati errori nell’interrogazione del db. In altri casi, perima della stringa FINITO potrebbe esserci un elenco di nomi tabelle.


Fonti e riferimenti

 

2 years ago

Leave a Reply

Your email address will not be published. Required fields are marked *