Votre lecteur Flash n'est pas à jour. Installer la dernière version
Home » Tutoriaux » PHP / SQL » Class SQL
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.

/**
 * Préfixe de vos tables dans la base de donnée.
 */
public $prefixe;
/**
 * Identifie de manière unique la connexion courante au serveur. 
 * (Id est retourné par mysql_connect)
 */
public $link_id;
public $query_result;
/**
 * Permet de retourner le nombre de requête effectué. 
 * Variable initialisé à 0 bien évidemment.
 */
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) {
    // connexion à la base de donnée , 
    // récupération de l'id de connexion si celle-ci a réussi.
    $this->prefixe = $db_prefixe; 
    $this->link_id = @mysql_connect($db_host, $db_username, $db_password);
    // si on a un ID de retour, on a bien une connexion au serveur donc on peut continuer en 
    // sélectionnant la base de donnée demandée.
    if ($this->link_id)  {
        if (@mysql_select_db($db_name, $this->link_id))
            // si la base existe, on retourne l'identifiant synonyme d'une connexion réussie.
            return $this->link_id;
        else // sinon on arrˆte tout et on retourne une erreur
            die('Impossible de sélectionner la base de données: '.mysql_error());
    }
    else
        die('Impossible de se connecter au serveur MySQL: '.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 = "") {
    // execute une requête de type 'select' et retourne une ressource,
    if (!$from) // si on a pas de donnée pour la variable $from, on retourne une erreur.
        return false;
    else {
        $table = $from;
        $where = ($where != "") ? "WHERE $where" : "";
        $orderby = ($orderby != "") ? "ORDER BY $orderby " : ""; 
        // si la variable $orderby est définie, on ajoute à la requête un champ ORDER BY.
        $limit = ($limit != "") ? "LIMIT $limit" : "";
        ++$this->nb_requete;  // on incrémente la variable pour le calcul du nombre de requête
        return $this->r = mysql_query("SELECT $fields FROM $table $where $orderby $limit");
    }
}

4. Fonction qui execute une requête

function requete($sql, $unbuffered = false) {
    // exécution de la requête $sql
    if ($unbuffered)
        $this->query_result = @mysql_unbuffered_query($sql, $this->link_id);
    else
        $this->query_result = @mysql_query($sql, $this->link_id);
    // si la requête s'est bien déroulé on incrémente le compteur de requête
    if ($this->query_result) {
        ++$this->nb_requete;
        // et on retourne l'identifiant de réussite de la requête
        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='') {
    // supprime un enregistrement de la table $from
    if (!$from)
        return false;
    else {
        $table = $from;
        $where = ($where != "") ? "WHERE $where" : ""; 
        // si la variable $where est définie, on ajoute à la requête un champ de type WHERE.
        ++$this->nb_requete;
        // incrementation de la variable du nombre de 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)) // on test si la variable n'est pas un tableau
            $flds = $fields;
        else { // on transforme le tableau en chaîne de caractère dont les champs sont séparés par une virgule.
            $flds = '';
            foreach ($fields as $key => $value) {
                if (!empty ($flds))
                    $flds .= ",";
                $flds .= $key . "=";
                $flds .= "'" . $value . "'";
            }
        }
        $where = ($where != "") ? "WHERE $where" : "";
        // on ajoute un champ WHERE si la variable $where est définie.
        ++$this->nb_requete; 
        // incrementation de la variable qui permet de connaître le nombre de requête effectué.
        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();
        // utilisation de la fonction insert_id qui permet de recupere l'identifiant de la derniere requête de type insert.
        return $lid ? $lid : $rt; // retourne l'etat de la derniere requete.
    }
}

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)
            // libère toute la mémoire et les ressources utilisées
            @mysql_free_result($this->query_result);
            // fermeture de la connexion<
            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";// nom de la base de
donnée
$db_prefixe = ""; // préfixe des tables
$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