Ho realizzato una semplice classe in PHP per una migliore gestione dei database.
Codice sorgente
<?php /*********************************************************************** ************* D A T A B A S E C L A S S ***************************** * ********************************************************************* * * Filename: db.class.php * Version: 1.1 * Author: Mr.DoT <[email protected]> * License: GNU/GPL * Release: 16th November, 2012 * Description: Questo script consente una gestione più semplificata del * database MySQL da script PHP * * Changelog: * 1.1 - Privatizzate le variabili utilizzate per connettersi * al database (utente, password, ecc.); * - Eliminato le variabili globali, snellendo di parecchio * tutto il codice; * * 1.0 - Versione iniziale * ********************************************************************/ class DataBase { private $connected = false; // Variabile di controllo che rileva se // la connessione al // database è attiva oppure no private $lastConnection; // Variabile che identifica l'ultimo // collegamento al database private $dbhost, // Indirizzo server MySQL $dbuser, // Nome utente MySQL $dbpwd, // Password MySQL $dbname; // Nome database // Costruttore di classe public function __construct() { // Includo il file contenente le informazioni sul database include_once(dirname(__FILE__)."/db.config.php"); // Inizializzo le variabili di classe, per accedere a MySQL $this->dbhost = $dbhost; $this->dbuser = $dbuser; $this->dbpwd = $dbpwd; $this->dbname = $dbname; } // Apre la connessione con il database public function OpenConnection() { // Se è già connesso, esco dalla funzione if ($this->connected) return $this->lastConnection; // Effettuo la connessione al database $link = mysql_connect($this->dbhost, $this->dbuser, $this->dbpwd); // Se non ci sono stati errori di connessione: if ($link) { // Attivo la connessione $this->connected = true; // Memorizzo l'ultima connessione $this->lastConnection = $link; // Esco dalla funzione return $link; } // Se ci sono stati errori di connessione restituisco FALSE return false; } // Chiude la connessione con il database public function CloseConnection($link=null) { // Se è già disconnesso, esco dalla funzione if (!$this->connected) return true; // Se non viene specificato $link uso l'ultimo collegamento if (!$link) $link = $this->lastConnection; // Se la disconnessione dal database è avvenuta senza errori: if (mysql_close($link)) { // Disattivo la connessione ed esco dalla funzione $this->connected = false; return true; } // Se invece ci sono stati errori esco dalla funzione con FALSE return false; } // Seleziona un database public function SelectDatabase($db_name=null, $link=null) { // Imposto il nome del database di default, se non specificato if (!$db_name) $db_name = $this->dbname; // Imposto la connessione di default, se non viene specificato if (!$link) $link = $this->lastConnection; // Seleziono il database. Se non ci sono errori esco dalla funzione if (mysql_select_db($db_name, $link)) return true; // Se invece ci sono errori esco dalla funzione con FALSE return false; } // Esegue una query SQL public function Query($query, $db_name=null) { // Mi connetto al database (se disconnesso) $link = $this->OpenConnection(); if (!$link) return false; // Seleziono il database if (!$this->SelectDatabase($db_name)) return false; // Eseguo la query $result = mysql_query($query, $link); if (!$result) return false; // Mi disconnetto dal database (se connesso) if (!$this->CloseConnection()) return false; // Infine, se non ci sono problemi, esco dalla funzione // restituendo il risultato della query return $result; } // Calcola il numero di righe di una determinata query public function NumRows($query) { // Esegue una query $result = $this->Query($query); // Restituisce il numero di righe della query presa in oggetto return mysql_num_rows($result); } // Ottiene un array di valori di una singola riga (la prima trovata), // in base alla query, // oppure un singolo valore, specificando $key (indice della riga) public function GetRow($query, $key=null) { // Ottengo i risultati della query $result = $this->Query($query); // Ottengo l'array della prima riga, dai risultati di prima $row = mysql_fetch_array($result); // Se è specificato il nome della colonna ($key) restituisco // il valore specifico, altrimenti tutta la riga ($row) if ($key) return $row[$key]; else return $row; } } ?>
Il file di configurazione
Per prima cosa, creare un nuovo file php e chiamarlo db.config.php. Esso conterrà le informazioni necessarie per connettersi al database.
Per funzionare è necessario che il suddetto file si trovi nella stessa cartella dello script contenente la classe (file “db.class.php”), altrimenti genererà errori.
<?php /*********************************************************************** ************* D A T A B A S E C O N F I G *************************** * ********************************************************************* * * Filename: db.config.php * Description: Informazioni per connettersi al database * * ********************************************************************/ $dbhost = "localhost"; $dbuser = "root"; $dbpwd = ""; $dbname = "myDatabase"; ?>
Occorre cambiare le informazioni delle variabili $dbhost, $dbuser, $dbpwd e $dbname in base alla propria configurazione, che varia a seconda del gestore di hosting. Nel caso di connessioni in locale solitamente i dati sono sempre quelli, tranne il nome del database che va cambiato per forza di cose.
La spiegazione delle variabili da usare nel file di configurazione del database è la seguente:
$dbhost = nome del server del database
$dbuser = nome dell’utente che usa il database
$dbpwd = password per accedere al database
$dbname = nome del database
Utilizzo della classe
A questo punto, per utilizzare la classe è sufficiente:
<?php // Includo la classe require_once("db.class.php"); // Creo l'oggetto database $db = new DataBase(); // Scrivo la query e... $query = "SELECT * FROM miatabella WHERE active=1"; // ... la eseguo! $numeroUtenti = $db->NumRows($query); // Produco l'output echo "Nella tabella ci sono ".$numeroUtenti." utenti attivi."; /*** Output di esempio: *** * Nella tabella ci sono 28 utenti attivi. * *********************************************/ ?>
Metodi
La classe dispone di diversi metodi (funzioni) utilizzabili:
OpenConnection()
Stabilisce una connessione con il database.
CloseConnection()
Chiude la connessione con il database.
SelectDatabase( [ string $db_name = null ] [, resource $link = null ] )
Seleziona il database
Query( string $query )
Esegue una query e ne restituisce i risultati.
NumRows ( string $query )
Restituisce il numero di righe di una specifica query.
GetRow ( string $query [, string $key = null ] )
Ottiene un array di valori relativi alla prima riga dei risultati di una query.
Se $key viene specificato restituisce il valore del campo $key della prima riga dei risultati della query.
<?php // Creo l'oggetto database $db = new DataBase(); // Scrivo la query e... $query = "SELECT * FROM miatabella WHERE nome='Mario'"; $cognome = $db->GetRow($query, "cognome"); echo "Il cognome di Mario è: ".$cognome; // *** OUTPUT: *** / // Il cognome di Mario è: Rossi ?>
La classe viene distribuita con licenza GNU/GPL, quindi è liberamente utilizzabile, modificabile, pubblicabile a patto che non sia per scopi commerciali e che rimangano le informazioni sull’autore e sul codice, in testa ad esso.
Per domande o suggerimenti commentate pure qui sotto! 🙂
Complimenti! codice semplice, pulito e chiaro… caratteristiche di professionalità.
Ho scritto tante classi sui db ma poi mi sono perso nei controlli, il tuo codice mi è stato di grande aiuto per rifare una classe che per qualche motivo non mi funziona a dovere e non ho tempo di sistemarla. GRAZIE dell’aiuto.
Grazie mille! Sono contento che sia stato di aiuto.
@Marco Grazia
Ciao Marco,
ti ringrazio molo del tuo commento. Mi hai aiutato a evidenziare alcuni punti critici permettendo allo script di essere più corretto (evitando sprechi inutili di risorse) e più snello.
Ho provveduto ad applicare la modifica, dopo averla testata sul mio server locale, per quanto riguarda le variabili globali, che ora sono sparite.
Per quanto riguarda i distruttori, ho letto che l’oggetto viene distrutto non appena termina l’ultima ricorrenza nello script principale. Questo può causare problemi di sicurezza ugualmente?
Ciao, forse sarebbe il caso di rivedere un po’ tutto per togliere alcune parti critiche, parlo dei vari global che usi all’interno dei metodi della tua classe.
Ad esempio potresti utilizzare un richiamo al file db.config.php che viene richiamato all’interno del metodo __construct() in questo modo anche il suo prichiamo diviene trasparente all’utente.
$class = new DataBase();
…
…
class DataBase {
…
…
public $connected = null;
private $dbhost = null;
private $dbuser = null;
private $dbpwd = null;
private $lastConnection = null;
public function __construct() {
// Includo il file contenente le informazioni sul database
include_once(dirname(__FILE__).”/db.config.php”);
$this->dbhost = $dbhost;
e via dicendo
….
}
In questo modo eviti di lasciare nella memoria del PHP dati che possono essere sensibili dato che quando chiudi la classe dopo averla usata questi vengono resi null, al limiti aggiungi un metodo __destruct() che distrugge esplicitamente questi dati una volta chiuso l’oggetto
…
unset($class);
cosa che andrebbe fatto sempre, anche solo per liberare il server.
Ho messo $connect pubblica ma non c’è necessità per come hai strutturata tu la classe tutte le variabili possono benissimo essere private visto che non si usano fuori da essa.
Ciao.
Sisi ottimo 😉 io di solito non mi spendo in così tanti commenti sul codice anche se è molto utile per capirlo e modificarlo, sia per chi scrive il codice che per chi lo legge a posteriori 🙂
@MatrixTeo
Grazie! Cerco di spiegarlo così come sono riuscito a capirlo io… perché sono sicuro che ci sono tante persone “de coccio” come me… 😆
Bravo! Il codice è chiaro e si può facilmente personalizzare 😉