PDO e connessioni a più database

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Dopo ben 3 anni da autodidatta credo di essere arrivato al punto da potermi permettere di riprogettare correttamente il mio script(creato anche con il vs preziossisimo aiuto).

Ora voelvo creare, aldilaà del file che contiene i parametri per l'accesso al database, un file per ogni connessione a 3 database. Necessariamente vorrei avere 3 connessioni per 3 database che posso richiamare nei file dove serve,
ed avrei bisogno di qualche chiarimento in merito.

Intanto una cosa che non sono mai riuscito a capire:( considerando che il file connessione sarà incluso nel file index e quindi poi presente in tutto lo script)

A) Se apro la connessione al db1 devo chiuderla ad ogni query che faccio sullo stesso o può tranquillamente restare aperta per tutta l'esecuzione dello script?

Inoltre vorrei creare le tre connessioni e tenerle a disposizione in funzione della query che deve essere eseguita(in funzione della scelta dell'utente)

B)Come creo la connessione al db1 al db2 al db3 con PDO e poi far riconoscere alla query su quale delle tre connessioni appoggiarsi?

Grazie delle spiegazioni.
 
ho cercato di pensare a buone soluzioni, forse 1 ... e ben confusa,

potresti creare 3 classi "classeDB1", "classeDB2" e "classeDB3" che puoi includere all'occorrenza negli script senza l'obbligo di includerle tutte,

certo in questo modo sei costretto a ripetere il codice .... ma è un copia/incolla

poi le differenzi con

$db1=new classeDB1();
$data = $db1->Query_select($sql);

la connessione è meglio che stia aperta

ma è solo un'idea
ciao
Marino
 
ho fatto una prova con due db, mi sembra funzionare bene,
ti posto lo script ed il risultato
come vedi senza chiudere il db ...
ciao
Marino
PHP:
<?php

# http://localhost/test_site/php/SolarPower/test.php

require('_Config_DB_opt.php');
require('_Config_DB_solpow.php');

$db_SPW=new solarpowerDB();
$db_OPT=new optideaDB();

$sql = "select count(*) from inverter_dat_2011";
$data = $db_SPW->Query_select($sql);
print $data[0][0]."<br /><br />";

$sql = "select * from caratteristiche";
$data = $db_OPT->Query_select($sql);
$data_counter = count($data);
print "$data_counter<br /><br />";

$sql = "select count(*) from inverter_dat_2012";
$data = $db_SPW->Query_select($sql);
print $data[0][0]."<br /><br />";

$sql = "select * from matrice";
$data = $db_OPT->Query_select($sql);
$data_counter = count($data);
print "$data_counter<br /><br />";
?>


risultato

110574

37

82951

7955
 
intanto grazie

non capisco questo
PHP:
require('_Config_DB_opt.php');
require('_Config_DB_solpow.php');

$db_SPW=new solarpowerDB();
$db_OPT=new optideaDB();

se ti sembra sciocca la domanda tieni conto che io in PDO so solo come connettermi al database ma poi non so nemmeno come estrarre dati
 
prima di tutto lasciami ringraziare di tutto cuore Luigi777,
ho visto un suo post, di qualche mese fa, che conteneva una classe database
ho percepito che era una buona soluzione, l'ho "presa" e me la sono sistemata
inserendo un po' di idee

le istruzioni "require" importano le due classi nello script
le successive aprono i db e li rendono disponibili

pdo lo vedi all'interno della classe ma è un modo per connettersi al database,
nulla di particolare, nel mio file trovi
$dbPDO = 'sqlsrv'
da sostituire con mysql .... ma cerca il nome giusto, non ho mai utilizzato mysql

subito dopo la connessione al db trovi l'attivazione degli errori,
attivando in questo modo, tutti gli errori "gravi" vengono scritti nel log di php
errori non controllabili per esempio il nome di una tabella o di un campo sbagliati
io preferisco lasciarlo sempre attivo anche in "produzione"

trovi anche la gestione delle "transazioni" (non so se si può con mysql)
ma quando ho aggiornamenti su più tabelle che devono essere coerenti,
inizio una transazione che chiudo con il "commit" o con il "rollback"

la funzione "myLog" mi permette di disseminare log nelle applicazioni
e commento la riga con "error_log" in produzione.

la funzione "myErr" la utilizzo, per esempio, quando mi accorgo che qualche utilizzatore tenta di forzare
il normale funzionamento dell'applicazione, anche in questo caso registro il mio messaggio e chiudo
l'applicazione per l'utilizzatore

da ultimo la funzione che registra l'errore del db non correggibile.

hai già l'esempio delle select ma ti posto anche un breve esempio di un'update all'interno di una transazione
preferisco non inserire nella classe le funzioni come questa perchè specifiche dell'applicazione
e mi sembra meglio così ...

penso sia tutto facile da capire .... in ogni caso ... posta
ciao
Marino


questa è la classe, puoi cambiare nome per creare le altre 2 e null'altro (salvo parametri del db)
PHP:
<?php

error_reporting(E_ALL);

class solarpowerDB {

  private $db; 
  public $OPtransaction = false;

  function __construct(
    $dbPDO  = 'sqlsrv',
    $dbHOST = '',
    $dbUSER = '',
    $dbPASS = '',
    $dbNAME = ''){ 

    try { $this->db = new PDO("$dbPDO:Server=$dbHOST;Database=$dbNAME", "$dbUSER", "$dbPASS"); }
    catch (PDOException $e) { $this->handle_sql_errors("PDO : OPEN DB", $e); }
    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $this->OPtransaction = false;
  } 

  function __destruct() { 
    $this->close(); 
  } 

  function Query_exec($sql){
    $this->MyLog("SQL : $sql");
    try { return $this->db->exec($sql); }
    catch(PDOException $e){ $this->handle_sql_errors($sql, $e); }
  } 

  function Query_select($sql){
    $this->MyLog("SQL : $sql");
    try { $sth = $this->db->prepare($sql); $sth->execute(); return $sth->fetchall(PDO::FETCH_NUM); }
    catch(PDOException $e){ $this->handle_sql_errors($sql, $e); }
  } 

  function begin_transaction(){
    try { $this->db->beginTransaction(); }
    catch(PDOException $e){ $this->handle_sql_errors($row, $e); }
    $this->OPtransaction = true;
    return true;
  } 

  function commit_transaction(){
    try { $this->db->commit(); }
    catch(PDOException $e){ $this->handle_sql_errors($row, $e); }
    $this->OPtransaction = false;
  } 

  function rollback_transaction(){
    try { $this->db->commit(); }
    catch(PDOException $e){ $this->handle_sql_errors($row, $e); }
    $this->OPtransaction = false;
  } 

  function close(){ 
    unset($this->db); 
  }

  function MyLog($text) {
    global $swN;
    error_log("$swN $text", 0);		// commentare se non si vuole il log
  }

  function MyErr($text) {
    global $swN;
    error_log("$swN $text", 0);
    print "ERRORE INATTESO, contatta l'amministratore del sistema";
    die;
  }

  function handle_sql_errors($sql, $e){
    if ($this->OPtransaction) $this->db->rollBack();

    error_log("SQL cmd    : $sql", 0);
    error_log("error code : ". $e->getCode(), 0);
    error_log("error info : ". $e->getMessage(), 0);
    print "ERRORE INATTESO, contatta l'amministratore del sistema";
    die;
} }


questo è l'esempio
PHP:
function update_DB() {
  global $db,$swN;

  $db->MyLog("function update_DB");

  $OPdbresult = $db->begin_transaction();
  if ($OPdbresult) {

    $sql = "update .... set";
    $sql.= " .....=.....";
    $sql.= " .....=.....";
    $sql.= " where ....=....";
    $sql.= " and .....=......";

    $OPdbresult = $db->Query_exec($sql);
    if ($OPdbresult)
      $OPdbresult = update_formule_DB();

    if ($OPdbresult) $db->commit_transaction();
    else             $db->rollback_transaction();
  }
  return $OPdbresult;
}

ps. utilizzo la fetch con NUM, sostituiscila con ASSOC se ti va meglio
 
Ultima modifica:

Discussioni simili