2009-05-15 7 views
2

J'ai écrit une classe PHP rapide pour faciliter l'accès à une base de données mysql. La classe fonctionne bien, et a une méthode query() qui ouvre la connexion, exécute la requête puis ferme la connexion (je sais que la connexion est supposée se fermer par PHP même après la fin du script, mais je n'aime pas compter beaucoup sur cela). Du point de vue des performances, je sais que l'ouverture d'une connexion à une base de données chaque fois que j'exécute une requête n'est peut-être pas une très bonne pratique (et aussi quand j'utilise mysql_real_escape_string() pour filtrer ne fonctionne pas, car il n'y a pas de connexion active à la base de données). Mais j'aimerais être plus clair à ce sujet. Est-ce vraiment mal de faire? Pourquoi? Et j'aimerais aussi savoir de bonnes alternatives à cela.Cette classe PHP est-elle optimisée pour l'accès à la base de données mysql?

est ici la classe:

class DB { 

private $conn; 

//database data 
private $dbhost; 
private $dbname; 
private $dbuser; 
private $dbpass; 

/** 
* Constructor 
* @dbhost string the database host 
* @dbname string the database name 
* @dbuser string the database username 
* @dbpass string the database password 
*/ 
public function __construct ($dbhost, $dbname, $dbuser, $dbpass) 
{ 
    $this->dbhost = $dbhost; 
    $this->dbname = $dbname; 
    $this->dbuser = $dbuser; 
    $this->dbpass = $dbpass; 
} 

/** 
* Connects to mysql database 
*/ 
private function open() 
{ 
    $this->conn = mysql_connect ($this->dbhost, $this->dbuser, $this->dbpass) 
    or die ("Error connecting to database"); 

    mysql_select_db ($this->dbname) or die ("Error selecting database"); 
} 

/** 
* Closes the connection to a database 
*/ 
private function close() 
{ 
    mysql_close($this->conn); 
} 

/** 
* Executes a given query string 
* @param string $query the query to execute 
* @return mixed the result object on success, False otherwise 
*/ 
public function query ($query) 
{ 
    $this->open(); 
    $result = mysql_query($query, $this->conn) 
    or die ("Error executing query ".$query." ".mysql_error()); 

    $this->close(); 
    return $result; 

} 

}

+2

Pourquoi avez-vous même besoin de cette classe en premier lieu? Il ne semble pas ajouter quoi que ce soit aux fonctions standard. Et si quoi que ce soit, vous devriez utiliser PDO ou mysqli, pas les fonctions mysql_ *. –

+2

Et aussi: "Est-ce vraiment mal de faire?" Si c'est en référence à vous n'utilisant pas mysql_real_escape_string(), oui, c'est très très très mauvais. Mais encore une fois, les requêtes paramétrées par mysqli ou PDO seraient une bien meilleure solution. –

+0

Non, il ne s'agissait pas d'utiliser mysql_real_escape_string(), c'est essentiel. Il s'agissait d'ouvrir la connexion chaque fois que j'interrogais la base de données. La classe elle-même n'ajoute rien de fonctionnel, mais c'est une couche d'abstraction à la base de données, au lieu de polluer le code avec des appels de fonction répétés et la gestion des erreurs. – rogeriopvl

Répondre

13

(Je sais que la connexion est censé fermer par PHP lui-même après la fin du script, mais je n'aime pas compter beaucoup sur ça).

Pourquoi? C'est une caractéristique de la langue. Il n'y a aucune raison de ne pas y croire. Beaucoup de sites fonctionnent très bien en comptant sur PHP pour fermer leurs affaires. En tant que programmeurs, bien sûr, nous voulons le fermer nous-mêmes. C'est très bien. Mais l'ouverture et la fermeture d'une connexion de base de données pour chaque requête est une idée horrible. La meilleure façon de le faire est d'appeler open() à partir de votre constructeur et de renommer votre close() en __destruct(). Selon la documentation, __destruct sera appelé "dès que toutes les références à un objet particulier sont supprimées ou lorsque l'objet est explicitement détruit ou dans un ordre quelconque dans la séquence d'arrêt." Cela ressemble à un endroit idéal pour ranger le code de fermeture de votre connexion à la base de données.

+5

Pour élaborer plus loin, l'ouverture d'une connexion de base de données est une opération assez coûteuse. Avec certains SGBD, l'ouverture d'une connexion peut prendre plus de ressources que l'interrogation, pour des requêtes simples. En outre, vous cassez complètement tout ce qui vit pendant la durée d'une connexion, comme les transactions, les tables temporaires, les variables de connexion, etc. La reconnexion entre chaque requête est vraiment, vraiment moche, et il n'y a pas de bonne raison de le faire . –

+0

Il est à noter que la méthode __destruct() ne fonctionne que dans PHP5 +. En PHP4, le code sera toujours exécuté, mais __destruct ne sera pas appelé automatiquement. La base de données sera toujours fermée à la fin du script bien sûr. – DisgruntledGoat

Questions connexes