mercoledì 21 gennaio 2009

Joomla, aprire connessioni a più database

Rispondo con un nuovo post ad un commento lasciato al post Joomla 1.5: funzioni di accesso al database perché la risposta non è brevissima ed è difficile postare codice nei commenti.

Negli esempi del post menzionato si mostra come eseguire query sul database di Joomla, ma se si volesse fare la stessa cosa su un altro database magari per visualizzare o comunque manipolare i dati gestiti da una altra applicazione?

Quando si agisce sul database di Joomla possiamo ottenere un'istanza della classe JDatabase semplicemente con

$db =& JFactory::getDBO();

Poi si utilizza $db come già visto

$sql = "SELECT * FROM #__users";
$db->setQuery($sql);
$results = $db->loadObjectList();

Per accedere ad un altro database dobbiamo creare ed inizializzare un altra istanza di JDatabase in questo modo

$options = array(
 'driver' => 'mysql',
 'host' => 'localhost',
 'user' => 'xxx',
 'password' => 'yyy',
 'database' => 'zzz',
 'prefix'=> 'phpbb_'
);

$db2 =& JDatabase::getInstance( $options );

Nell'array $options passiamo i parametri della connessione. Si assume che localhost sia l'host, come di solito è, altrimenti va impostato l'indirizzo giusto, al posto di xxx yyy zzz vanno utente, password e nome database.

Ottenuta l'istanza la si utilizza come al solito. Ad esempio

$sql = "SELECT * FROM #__posts";
$db2->setQuery($sql);
$results = $db2->loadObjectList();

Nell'elemento prefix di $options si passa il prefisso delle tabelle. L'esempio appena fatto mostra una query sul database di phpBB3 che usa come prefisso phpbb_. Le istruzioni setQuery() sostituiscono #__ con questo prefisso.

Se il database a cui si accede non utilizza prefissi per le tabelle si può omettere l'elemento prefix da $options e nelle istruzioni setQuery indicare il solo nome della tabella senza anteporre #__

Tutto il codice degli esempi è scheletrico, se si usano le funzioni in applicazioni reali va fatto un minimo di controllo sui valori di ritorno di tutte le funzioni per intercettare eventuali errori.

7 commenti:

Sergio ha detto...

Sono in debito, veramente grazie!

Massimo ha detto...

Di nulla :) Sono contento di esserti stato di aiuto.

Niro Vincenzo ha detto...

E'possibile connetterdi ad un dabase IBM db2?

Massimo ha detto...

Con questo sistema ci si può connettere solo ai database supportati da Joomla. Al momento solo MySql (per quello che ne so).

Anonimo ha detto...

ti ringrazio qui, ma potrei farlo in coda ad una bella quantità dei tuoi articoli, che sto leggendo (e studiando!) con attenzione e gratitudine: le tue spiegazioni chiare senza essere semplicistiche sono esattamente quello che mi serviva per avere la "spinta" e cominciare a pormi il problema di sviluppare componenti ad hoc per joomla.
Che dirti se non buon lavoro e un sincero grazie, oltre ai meritatissimi complimenti e all'egoistico auspicio che tu in futuro abbia ancora voglia di "sfornare" qualche bell'articolone su joomla :-)

ps: belli e interessanti anche i posts su Drupal, ma per ora mi sto concentrando su joomla ... ci tornerò in futuro!

viviana

Massimo ha detto...

Grazie :-)

Anonimo ha detto...

Leggo i tuoi post più di un anno dopo la loro pubblicazione e devo dirti che sono tuttora il meglio che ho trovato quanto a completezza, semplicità di esposizione e livello di interesse. Un ringraziamento e un saluto. A.

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.