Connessione a database MSSQL su Drupal7
Questa e' difficile, lo so ma mi e' stato chiesto: e' un must.
Il mio Drupal 7 lavora su MySql.
Solo che c'e' una pagina che deve tirare fuori i dati da una tabella Microsoft SQL.
Non posso ricopiarla sul DB MySql, deve rimanere esterna.
chiedo come realizzo la connessione?

Risposte
Penso che ti occorreranno: +
Penso che ti occorreranno:
+ Drivers per sql server http://drupal.org/project/sqlsrv
+ Configurare connessioni multiple http://drupal.org/node/310071
+ db_set_active() per switchare tra le connessioni all'interno del codice
Se riesci, scrivi un breve how to, è un argomento molto interessante.
se ho capito bene devo
se ho capito bene devo "copiare" fra le connessioni multiple questo esempio:
$databases['default']['default'] = array('driver' => 'mysql',
'database' => 'drupaldb1',
'username' => 'username',
'password' => 'secret',
'host' => 'dbserver1',
);
$databases['extra']['default'] = array(
'driver' => 'sqlite',
'file' => 'files/extradb.sqlite',
);
);
dove al posto di sqlite mettero' MSSQL etc...
Ho capito bene?
Per il resto devo aspettare l'amministratore del server :)
Dovrà essere qualcosa del
Dovrà essere qualcosa del tipo:
..$databases['mssql']['default'] = array(
'driver' => 'sqlsrv',
'database' => 'nome_db',
'username' => 'username',
'password' => 'password',
'host' => 'nome_istanza_server',
);
Non ho capito bene cosa
Non ho capito bene cosa indica default.
Si intende default database cioe' il database generale di Drupal?
Ma non e' quello che voglio fare io
Se guardi il post
Se guardi il post http://drupal.org/node/310071 è spiegato. Ad esempio per una connessione puoi indicare un db master e più slave. Per ogni connessione vanno indicati almeno i parametri di default.
ho risolto in questo
ho risolto in questo modo:
/*
* Displays Page content for MS SQL
*/
function mssql() {
$page_content = '';
try {
$conn = new PDO( "sqlsrv:Server=NOMESERVER;Database=NOMEDATABASE", NULL, NULL);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$page_content .= "Connection Succeeded!";
} catch (PDOException $e) {
$page_content .= "Error connecting to SQL Server: " . $e;
}
return $page_content;
} //
Ogni volta che compariva l'errore dicevo all'amministratore di installare il driver. Per un paio di volte e poi ha funzionato
Ottimo, hai utilizzato
Ottimo, hai utilizzato direttamente le librerie PDO. In questo modo però di contro non puoi usare le api di Drupal per i database...
A presto!
Ciao a tutti, appena arrivato
Ciao a tutti,
appena arrivato :) pongo una domanda.
SU un Portale che gestisco con DRUPAL 6 utilizzo le API di Drupal per l'accesso al Database. Adesso che vorrò migrare a Drupal 7 ho cominciato a riutilizzare le librerie PDO. Tutto fila alla perfezione tranne una cosa, devo riaprire la connessione che in realtà è già aperta.
Ciò comporta un inutile allungamento dei tempi e un maggior consumo di risorse.
Inoltre, ogni tanto (se molti utenti sono connessi allo stesso tempo) ottengo l'errore che l'utente del database ha troppe connessioni aperte.
MI CHIEDO (cioè vi chiedo :) ,ma c'è un modo per riutilizzare la connessione già aperta da Drupal, senza però essere costretti ad usare le API?
In altre aprole, invece di una
$conn = new PDO (.....,....,)
come posso recuperare l'oggetto $conn che esiste da qualche parte?
Grazie
Luciano
Ciao, prova ad utilizzare il
Ciao, prova ad utilizzare il metodo http://api.drupal.org/api/drupal/includes--database--database.inc/functi... ad esempio:
<?php$conn=Database::getConnection();
$results = $conn->query("select * from node");
while ($result = $results->fetch()){
var_dump($result);
}
?>
spero ti sia utile!
Ma certo! Molte
Ma certo! Molte grazie
Ancora non ho installato il 7, ma vorrei fare una prova nell'attuale installazione che è sotto DRUPAL 6.22
Se non ho capito male l'oggetto connessione sta in una variabile globale in DRUPAL 6, quindi lo script di cui sopra diventerebbe:
<?php
global $active_db; //connessione attiva
$conn=$active_db;
$results = $conn->query("select * from node");
while ($result = $results->fetch()){
var_dump($result);
?>
non va come ho scritto sopra
non va come ho scritto sopra ...
SI tratta di capire l'equivalente di
$conn=Database::getConnection();
in DRUPAL 6
Ciao, D6 non usa le lib PDO,
Ciao, D6 non usa le lib PDO, la variabile globale $active_db non è un oggetto ma una risorsa "mysql link". Non penso sia possibile fare un cast tra i due tipi di connessioni.
Hai perfettamente ragione. in
Hai perfettamente ragione. in Drupal 7 non c'è problema perché si basa sulle PDO.
In Drupal 6, invece,per utilizzare le PDO bisogna per forza aprire una nuova connessione. Se non si volesse aprire la nuova connessione bisogna scendere a livello più basso, tipo:
mysql_query(....)
Il punto è che io apro una nuova connessione ottenendo di tanto in tanto il seguente errore:
User db_user already has more than 'max_user_connections' active connections
Speravo di risolverlo utilizzando le connessioni persistenti, ma il risultato non è cambiato:
$dbh = new PDO($temp[scheme].':host='.$temp[host].';dbname='.$temp[path], $temp[user], $temp[pass],
array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'', PDO::ATTR_PERSISTENT => true)
);
Dalla parte del codice, per
Dalla parte del codice, per limitare il pb puoi ottimizzare le chiamate magari mettendo la connessione come variabile statica o globale e chiudendola non appena non è più utile, senza attendere la fine dello script. Altrimenti devi agire sulle impostazioni mysql aumentando le connessioni massime per utente. Le connessioni persistenti ti possono essere utili per le performances, ma non so se ti possono aiutare per il limite di connessioni massime.
Ciao blackice78, grazie per
Ciao blackice78,
grazie per la tua disponibilità. Non mi preoccupo più del problema, perché Drupal 7 utilizza le PDO e quindi appena avrò tempo e modo di passare al 7, il problema sarà risolto. Grazie ancora
salve
salve