PDO e connessioni a più database

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.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
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
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
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
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
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
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
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
Autore Titolo Forum Risposte Data
L pdo (stampare un valore con ritorno a funzione) PHP 0
K [PHP] PDO.bindingParam PHP 2
M [PHP] Interrompere DROP TABLE con PDO PHP 0
M [PHP] Alternativa a datagrid con PDO PHP 6
M [PHP] Creare un menu a tendina con pdo PHP 18
M [PHP] Array di array - PDO PHP 2
3_g errore con mysql insert in PDO PHP 29
W [PHP] Creazione classe PDO PHP 4
F PHP, PDO e visualizzazioni errori e/o eccezioni PHP 3
3_g [PHP] mvc, pdo e classi... PHP 7
F Help-PDO copiare Database MySQL PHP 3
F php PDO mysql connessione(select_db) PHP 3
Fredyss redirect a altra pagina php dopo commit su postgresql con PDO PHP 1
K Non trovo l'errore! PDO MYSQL UPDATE PHP 2
C [PHP] PDO prepared statement - select query errore PHP 7
ANDREA20 [PHP] Errore $this->db_connection = new PDO PHP 0
CristianB72 Non riesco a connettermi al DB tramite PDO Database 10
MarcoGrazia [PHP][PDO][MySQL] Non registra ma non da nemmeno errori. PHP 0
MarcoGrazia [PHP][PDO] Come connettersi al database Snippet PHP 0
MarcoGrazia [PDO][PHP[MySQL] Piccolo modulo di ricerca in un sito tramite l'operatore LIKE Snippet PHP 1
neo996sps [PHP e funzioni con PDO] Funzione per generare corpo tabella PHP 1
Marco_88 fetchAll() PDO PHP 13
D Paginazione dati PDO PHP 8
N Problemi estrazione / visualizzazione immagini dal database con PDO PHP 2
R Organizzazione PHP Mysql PDO PHP 15
M PDO e mysqli PHP 1
MarcoGrazia [PDO][MySQL] L'update non avviene PHP 1
MarcoGrazia [PDO] insert che non inserisce e non da errori PHP 1
Monital Da mysql a PDO PHP 3
S PDO accertarsi del avvenimento della query PHP 1
voldemort PHP PDO: non c'ho capito niente PHP 1
L [RISOLTO]PDO if per "non ci sono dati" PHP 8
L pdo e sistema crud PHP 1
L Paginazione con pdo. PHP 8
L pdo con login PHP 2
L PDO : bindParam PHP 3
L login con pdo/mysql PHP 2
S Problema di login con PDO PHP 2
B Esercizio PDO PHP 20
B Pdo PHP 6
S Meglio mysqli o PDO ? PHP 2
borgo italia query con PDO PHP 11
borgo italia classe pdo PHP 9
M PDO prepare PHP 1
L da mysql a pdo PHP 4
I Scelta rete per 500 connessioni wifi solo LAN Reti LAN e Wireless 0
Misterxxx IP cam e connessioni esterne IP Cam e Videosorveglianza 5
M VPS OVH lentissima solo con certe connessioni ADSL (e non con altre) Server Dedicati e VPS 2
M Hosting per blog wordpress con molte connessioni simultanee Hosting 2
R Due reti Due firewall Due connessioni e un ponte radio Reti LAN e Wireless 16

Discussioni simili