Come definire e utilizzare una connessione al database esterno in un modulo personalizzato


10

Sto sviluppando un modulo che dipenderà fortemente dalle query di database esterni. Esiste una procedura ottimale per la definizione e l'utilizzo di una connessione di database esterna in un modulo?

Questa pagina mi dice come effettuare la connessione, ma non dove inserirla in un modulo (hook specifico?), Quindi devo definirla solo una volta. Inoltre, è sempre necessario eseguire "db_set_active ('YourDatabaseKey');" o posso passare un argomento che imposterà il db da usare? Sto usando Drupal 7.


Se si utilizzano diversi tipi di database, è necessario il modulo DBTNG
Sivaji,

Grazie per il suggerimento, ma quel modulo è necessario solo se stai usando Drupal 6. Sto usando Drupal 7.
Whisky

Risposte:


10

Non esiste un posto particolare in cui inserire questo codice (hook o modulo), basta inserirlo nel punto desiderato.
Quindi dovrebbe andare subito prima delle query sull'altro database e subito dopo per ripristinare il DB predefinito.

Se tutto il tuo modulo si affiderà al DB esterno, mettilo all'inizio della prima funzione chiamata per il tuo modulo e alla fine dell'ultima funzione.

Ovviamente ognuna delle tue funzioni dovrebbe essere eseguita sul DB esterno e nulla deve essere necessario interrogare il database predefinito senza tornare indietro.

Il seguente codice non riuscirebbe:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

$node = node_load(123); //This would fail on the external DB.

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

Dovresti passare avanti e indietro:

db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 
$node = node_load(123); //Query made on the default Drupal DB.
db_set_active('YourDatabaseKey');

$result = db_query('SELECT ...'); //Your own queries on the external DB.

db_set_active(); 

2
Grazie per la spiegazione. Ho finito per creare una funzione separata che seleziona il mio db esterno con db_set_active e se fallisce, aggiunge la configurazione del db e riprova. In questo modo posso usarlo nei diversi hook prima di eseguire query esterne, ma devo impostare di nuovo il valore predefinito attivo come hai sottolineato.
Whisky

4

Dovrai aggiungere in settings.phpsituato /sites/default/nella seguente sintassi

// Drupal 6

$db_url['default'] = 'mysql://db_user:password@localhost/db_name';
$db_url['external'] = 'mysql://db_user2:password@localhost/db_name2';

// Drupal 7

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'db1',
      'username' => 'user1',
      'password' => 'pass',
      'host' => 'host1',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
  'extra' =>
  array (
    'default' =>
    array (
      'database' => 'db2',
      'username' => 'user2',
      'password' => 'pass',
      'host' => 'host2',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

E dopo queste impostazioni è possibile utilizzare db_set_active () per passare da un database all'altro.


Grazie, puoi farlo in questo modo, ma ho scelto di farlo dal mio modulo come descritto nella pagina a cui mi sono collegato nella domanda. In questo modo è possibile avere gli utenti amministratori compilare la propria configurazione in un modulo di impostazione amministratore.
Whisky
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.