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;
}
}
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_ *. –
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. –
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