[RISOLTO]Classe database: connessione in costruttore?

peppeocchi

Utente Attivo
20 Apr 2013
30
0
0
Ciao a tutti,
ho un dilemma che mi perseguita ormai da settimane: è corretto effettuare la connessione al database nel costruttore di una classe, estesa poi da altre classi?
Faccio subito qualche piccolo esempio.

Ho una classe generica DbClass
PHP:
<?php
class DbClass {
	protected $host = "XXX";
	protected $username = "XXX";
	protected $password = "XXX";
	protected $dbName = "XXX";

	protected $_mysqli;
	protected $_query;

	public function __construct() {
		$this->_mysqli = new mysqli($this->host,$this->username,$this->password,$this->dbName);
		if($this->_mysqli->connect_errno) {
			echo "Connection failed: ".$this->_mysqli->connect_error;
			exit();
		}
	}
......
	public function __destruct() {
		$this->_mysqli->close();
	}

Ho poi altre classi che ne estendono le funzionalità, ad esempio
PHP:
<?php

require_once "classDB.php";

class User extends DbClass {
	private $Uusername;
	private $Upassword;
......
PHP:
<?php

require_once "classDB.php";

class AuthUser extends DbClass {
......

Quindi ogni volta che creo un oggetto di una di queste classi, sono automaticamente connesso al database.
E' corretto mettere nel costruttore la connessione al database?
Che problemi posso avere se nello stesso script creo oggetti di classi diverse? Tipo
PHP:
$user = new User;
.....
.....
$auth = new AuthUser;
.....

Dovrei modificare la DbClass in qualche altro modo, modificando/togliendo la connessione nel costruttore?

Grazie.
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, anch'io uso più o meno la stessa tecnica
solo che non estendo un altra classe per la connessione al db, anche perchè mysqli è già una classe, mi connetto direttamente nel costruttore di ogni classe che necessita del database e mi disconnetto nel suo distruttore
fino ad ora non ho riscontrato nessun problema
non so dirti se teoricamente sia una soluzione ottimale ma a livello pratico è molto efficiente
 

skillsfactory

Utente Attivo
23 Nov 2012
50
0
0
Un altra tecnica è quella di utilizzare un pattern singleton

PHP:
class DbClass {
    private $instance;
    protected $host = "XXX";
    protected $username = "XXX";
    protected $password = "XXX";
    protected $dbName = "XXX";

    protected $_mysqli;
    protected $_query;

    private function __construct() {
        $this->_mysqli = new mysqli($this->host,$this->username,$this->password,$this->dbName);
        if($this->_mysqli->connect_errno) {
            echo "Connection failed: ".$this->_mysqli->connect_error;
            exit();
        }
    }

    public static function getIstance()
    {
        if( is_null(self::$instance) )
       {
             self::$instance = new self();
       }
        
         return self::$instance;
    }

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

PHP:
require_once "classDB.php";

class AuthUser { 
    
    private $db;

    public function __construct() {
        $this->db = classDB::getIstance();

        $this->db->query("SELECT * FROM tabella");
    }


In questo modo tutti gli oggetti istanzieranno una sola connessione. Il primo a chiamare classDB::getIstance() creerà l'istanza, tutti gli altri riceveranno la prima istanza creata.
 
Ultima modifica:

peppeocchi

Utente Attivo
20 Apr 2013
30
0
0
Grazie mille per le risposte! Interessante il pattern singleton, molto interessante!
Ho appena modificato il codice, c'era un errore (credo) nella dichiarazione di $instance, infatti ho ricevuto subito un Fatal error, risolto modificando con
PHP:
private static $instance;

solo una curiosità, probabilmente stupida, non c'è un modo per evitare la variabile $db nelle altre classi?

Grazie ancora!
 

skillsfactory

Utente Attivo
23 Nov 2012
50
0
0
Ho appena modificato il codice, c'era un errore (credo) nella dichiarazione di $instance, infatti ho ricevuto subito un Fatal error, risolto modificando con
PHP:
private static $instance;

hai fatto bene, è giusto così... avevo scritto il codice direttamente sul forum senza pravorlo....

solo una curiosità, probabilmente stupida, non c'è un modo per evitare la variabile $db nelle altre classi?


certo... puoi chiedere l'ustanza direttamente nei metodi

PHP:
function blabla()
{
    $db = classDB::getIstance();
    $db->query("Select * from tabella");
}

oppure ancora più comodamente

PHP:
function blabla()
{
    classDB::getIstance()->query("Select * from tabella");
}
 

peppeocchi

Utente Attivo
20 Apr 2013
30
0
0
Grazie ancora per la risposta!

Ho un piccolo problema adesso, con il distruttore.

Codice:
Fatal error: Call to a member function close() on a non-object in /path/classDB.php on line 48

che sarebbe questa parte del codice

PHP:
public function __destruct() {
		$this->_mysqli->close();
	}

Tengo a precisare che classDB non la uso mai direttamente, ma sempre indirettamente con le classi estese.

Qualche idea?
 

skillsfactory

Utente Attivo
23 Nov 2012
50
0
0
toglila

PHP:
public function __destruct() { }

anche perchè come fai a sapere con esatezza quando chiudere la connessione?? tanto vale lasciarlo fare al garbage collector. Ti ricordo che tutti gli oggetti in php vivono all'interno della richiesta http, terminata quella vengono tutti distrutti...
 

peppeocchi

Utente Attivo
20 Apr 2013
30
0
0
Si, hai probabilmente ragione, fin'ora non mi è capitato di distruggere un'oggetto prima della fine di uno script, in realtà avevo implementato quella funzione in previsione di opzioni che non ho mai usato in pratica...

Grazie ancora!
 
Discussioni simili
Autore Titolo Forum Risposte Data
elpirata [PHP] [RISOLTO] Stampare classe css in base al risultato della query PHP 6
J [risolto] Trasformare la seguente classe PHP PHP 2
emanuelevt [risolto] classe che non si rimuove jQuery 1
F [Risolto] upload immagini con la classe di Baol74 con size immagine Classic ASP 15
L (risolto) MySQL 0
B getElementById su piu id(Risolto) Javascript 7
L Esercitarsi con Js [RISOLTO] Javascript 4
C [RISOLTO]Inserimento variabile php in input html PHP 20
L risolto visualizzazione e ordinamento dati PHP 1
moustache [RISOLTO] SQL PHP IIS PHP 8
Sergio Unia Ricezione email con destinatari multipli [Risolto] PHP 2
L update tabelle in php mysql [risolto] PHP 6
M Semplice visualizzatore di immagini [risolto con plugin wp] PHP 7
L [RISOLTO] Stampa a video risultato count in html PHP 13
L [RISOLTO] Eliminare una discussione creata PHP 3
tomorc [HTML] Problema con scroll bar (risolto) HTML e CSS 0
A [PHP] Problema query insert [RISOLTO] PHP 14
B [PHP] recuperare IP dei server in load balancing [RISOLTO] PHP 3
K [RISOLTO] Problema Griglia Php+Mysql PHP 13
S [RISOLTO] aggiorna tabella da select option asp classic Classic ASP 7
elpirata [RISOLTO][Javascript] Datapicker e autocompletamento campo input Javascript 2
elpirata [RISOLTO][Mysql] Problema insert valori apostrofati MySQL 1
elpirata [RISOLTO][Mysql] Contare le occorrenze in un campo tipo varchar MySQL 2
G [MS Access] Gestione biglietti [RISOLTO] MS Access 2
G [MS Access] Casella combinata & Query [RISOLTO] MS Access 4
G [MS Access] Query mese corrente con conteggio [RISOLTO] MS Access 2
M [RISOLTO]Windows media player non mi funziona più su win 10 pro 64 bit Windows e Software 2
C [RISOLTO][PHP] Errore di sintassi PHP 8
IT9-Gpp [RISOLTO] Leggere variabile restituita da success Ajax 3
Kolop [RISOLTO][PHP] Problema Pagination PHP 2
C [RISOLTO][PHP] Funzione ONclick PHP 14
C [RISOLTO][PHP] Conteggio righe di una tabella PHP 4
N [PHP] Utilizzo variabili di sessione [Risolto] PHP 13
Tommy03 [RISOLTO][PHP] Webserver o devserver? PHP 2
Sergio Unia Recupero dati da una vecchia versione MySql [Risolto] MySQL 4
spider81man [PHP] Problemi cancellazione dato su DB [RISOLTO] PHP 1
A [RISOLTO]Inserimento Immagini da pc a MySql PHP 15
A [PHP] RISOLTO Invio Mail con Tabella PHP 2
felino Risolto - [Wordpress][WooCommerce] PayPal Checkout e campi di fatturazione WordPress 2
elpirata [PHP][RISOLTO] Sommare gli importi estratti da un ciclo while PHP 3
elpirata [PHP][RISOLTO] Effettuare la somma dei tempi di lavorazione PHP 3
elpirata [PHP] [RISOLTO]Sovrascrivere testo in una tabella PHP 2
A [RISOLTO]Recuperare dati inviati con json tramite php PHP 4
C [RISOLTO][PHP] Passaggio variabili senza refresh di pagina PHP 7
elpirata [PHP][RISOLTO] Errore di tipo Notice: Undefined index - Come risolvere quando si hanno tante var PHP 10
S Problema in PHP per invio file XML - RISOLTO- PHP 8
A [Javascript] [RISOLTO] Doppio "submit", in uno stesso "Form" , che puntino ad "action" diversi Javascript 1
marino51 [Risolto]videochat di messenger ha smesso di funzionare sul telefonino Smartphone e tablet 1
A [Javascript] [HTML] RISOLTO...Allungare un box all'apertura della pagina No Mouse over Javascript 9
ken_korn [Javascript][Risolto] browser.tab.Tabs.favIconUrl non funziona Javascript 5

Discussioni simili