Class SQL
Voici l'explication d'une class SQL faite par Jarod (
www.webinformatic.fr) avec l'aide de fonctions de Raymond Irving. Cette class permet, entre autre, de se connecter à une base, de faire des requêtes, de supprimer des données, et bien d'autre choses encore.
Si vous n'êtes pas au point sur la programmation orientée objet, allez lire
l'article avant de commencer la lecture de cette class. (Comme on dit, on ne met pas la charrue avant les boeufs !! )
1. L'initialisation
Voici quelques variables à définir avant tout pour le bon fonctionnement de cette class.
public $prefixe;
public $link_id;
public $query_result;
public $nb_requete = 0;
2. Le constructeur
Attaquons maintenant les class. Tout d'abord, comme vous pouvez le deviner, commençons par le constructeur.
Il permet la connexion à la base de donnée.
function __construct($db_host, $db_username, $db_password, $db_name, $db_prefixe) {
$this->prefixe = $db_prefixe;
$this->link_id = @mysql_connect($db_host, $db_username, $db_password);
if ($this->link_id) {
if (@mysql_select_db($db_name, $this->link_id))
return $this->link_id;
else
die('Impossible de sélectionner la base de données. MySQL a renvoyer l\'erreur suivante: '.mysql_error());
}
else
die('Impossible de se connecter au serveur MySQL. MySQL a renvoyer l\'erreur suivante: '.mysql_error());
}
Voilà pour ce qui est de la class constructeur.
Vous suivez ? Alors on continue ...
3. La class pour faire une requête de type select
function select($fields = "*", $from = "", $where = "", $orderby = "", $limit = "") {
if (!$from)
return false;
else {
$table = $from;
$where = ($where != "") ? "WHERE $where" : "";
$orderby = ($orderby != "") ? "ORDER BY $orderby " : "";
$limit = ($limit != "") ? "LIMIT $limit" : "";
++$this->nb_requete;
return $this->r = mysql_query("SELECT $fields FROM $table $where $orderby $limit");
}
}
4. Fonction qui execute une requête
function requete($sql, $unbuffered = false) {
if ($unbuffered)
$this->query_result = @mysql_unbuffered_query($sql, $this->link_id);
else
$this->query_result = @mysql_query($sql, $this->link_id);
if ($this->query_result) {
++$this->nb_requete;
return $this->query_result;
}
else {
return false;
}
}
Cette fonction execute une requete passée en paramètre par la variable $sql. La variable $buffered permet d'utiliser ou non le mode buffered. Elle retourne ensuite un identifiant si la requete a bien fonctionnée, faux sinon.
Pour plus d'explication sur le mode buffered :
par ici !
5. Fonction de suppression
function delete($from,$where='',$fields='') {
if (!$from)
return false;
else {
$table = $from;
$where = ($where != "") ? "WHERE $where" : "";
++$this->nb_requete;
return $this-> r = mysql_query("DELETE $fields FROM $table $where");
}
}
6. Fonction de mise à jour
function update($fields, $table, $where = "") {
if (!$table)
return false;
else {
if (!is_array($fields))
$flds = $fields;
else {
$flds = '';
foreach ($fields as $key => $value) {
if (!empty ($flds))
$flds .= ",";
$flds .= $key . "=";
$flds .= "'" . $value . "'";
}
}
$where = ($where != "") ? "WHERE $where" : "";
++$this->nb_requete;
return $this-> r = mysql_query("UPDATE $table SET $flds $where");
}
}
7. Fonction d'insertion
function insert($fields, $intotable, $fromfields = "*", $fromtable = "", $where = "", $limit = "") {
if (!$intotable)
return false;
else {
if (!is_array($fields))
$flds = $fields;
else {
$keys = array_keys($fields);
$values = array_values($fields);
$flds = "(" . implode(",", $keys) . ") " .
(!$fromtable && $values ? "VALUES('" . implode("','", $values) . "')" : "");
if ($fromtable) {
$where = ($where != "") ? "WHERE $where" : "";
$limit = ($limit != "") ? "LIMIT $limit" : "";
$sql = "SELECT $fromfields FROM $fromtable $where $limit";
}
}
++$this->nb_requete;
$rt = $this-> r = mysql_query("INSERT INTO $intotable $flds $sql");
$lid = $this->insert_id();
return $lid ? $lid : $rt;
}
}
Cette fonction exécute une requête de type insert et retourne l'id provenant de cette meme requete.
La fonction array_key retourne toutes les clés d'un tableau.
8. Fonction qui retourne les données d'une requête sous forme de tableau
function getRow($ds, $mode = 'assoc') {
if ($ds) {
if ($mode == 'assoc') {
return mysql_fetch_assoc($ds);
}
elseif ($mode == 'num') {
return mysql_fetch_row($ds);
}
elseif ($mode == 'both') {
return mysql_fetch_array($ds, MYSQL_BOTH);
}
else {
$echo("Type inconnu :($mode) Merci de spécifier un des trois modes suivant: 'assoc', 'num' ou 'both'.");
}
}
}
La variable $mode permet de retourner un tableau soit de type associatif (par defaut), soit de type normal, ou encore de type indicé numériquement.
9. Autres fonctions
Fonction qui retourne le dernier identifiant généré par un champ de type AUTO_INCREMENT via un INSERT, sur la connexion MySQL courante ou sûr la connexion spécifiée par link_id, faux sinon.
function insert_id() {
return ($this->link_id) ? @mysql_insert_id($this->link_id) : false;
}
Fonction qui retourne le nombre de requetes effectuées.
function NbRequete() {
return $this->nb_requete;
}
Fonction qui protege les données avant d'envoyer la requête à MySQL.
function escape($str) {
if (function_exists('mysql_real_escape_string'))
return mysql_real_escape_string($str, $this->link_id);
else
return mysql_escape_string($str);
}
Fonction retourne le message d'erreur généré par la dernière commande MySQL, ou bien '' (la chaîne vide) si aucune erreur n'est survenue.
function LastError() {
return mysql_error();
}
Fonction qui permet la fermeture de la connexion courante identifiée par link_id, la fonction retourne true si réussite, false sinon.
function close() {
if ($this->link_id) {
if ($this->query_result)
@mysql_free_result($this->query_result);
return @mysql_close($this->link_id);
}
else
return false;
}
10. Aller plus loin
Au début de cette class, il est utile de tester si la connexion au serveur est possible, c'est pour cela qu'on doit ajouter en tête ces quelques lignes :
if (!function_exists('mysql_connect'))
exit('MySQL n\'est pas supporté. Consultez la documentation PHP ou contactez votre hébergeur');
Si la connexion ne se fait pas, on arrête l'exécution du script.
11. Exemple d'utilisation
Tout d'abord, pour la connexion :
$db_host = "localhost";
$db_username = "root";
$db_password = "";
$db_name = "nom_db";
$db_prefixe = "";
$db = new Mysql($db_host, $db_username, $db_password,$db_name, $db_password);
On fait une instanciation de la class avec en paramètre les identifiants
de connexion. Pour plus de sécurité (et aussi pour vous faciliter la tâche)
mettez les variables de connexions dans un fichier config.php dans un dossier protégé
par un .htaccess . Et faites :
<?php require'conf/config.php'; ?>
Comme ça, si vous devez changer de mot de passe ou de nom de base de
donnée, vous modifierez le fichier, et donc les variables, qu'une seule fois.
Pour faire une requête de type select :
Par exemple, je veux faire une requête de type :
SELECT email FROM commandes;
Voilà ce que je dois écrire :
<?php $req =
$db ->
select("email","commandes","","","");
?>
Vous pouvez également remplir les champs pour les paramètres WHERE,
ORDER BY, LIMIT.
Pour une mise à jour :
<?php $db -> update(""mailto:email%3D'webi@wb.fr"email='webi@wb.fr'","commandes","id=7"); ?>
Ici on va faire une requête du type :
UPDATE commandes SET "mailto:email%3D'webi@wb.fr" email='webi@wb.fr' WHERE
id=7;
Ce qui va permettre de modifier le champs email de la table commandes où
l'id est égal à 7.
En fin de fichier, la déconnexion :
<?php $db->close(); ?>
Pour fermer la connexion avec la base de donnée.
Voici un lien pour télécharger la class et un fichier qui vous permettra de faire des tests.
Si vous avez des idées pour l'amélioration de cette class, n'hésitez pas.
Télécharger la source