PHP: Nuova classe di gestione database

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! 🙂

7 thoughts to “PHP: Nuova classe di gestione database”

  1. 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.

  2. @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?

  3. 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.

  4. 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 🙂

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.