Créer un custom auto incrément avec PHP

Une clé primaire, dans la notion de base de données est systématiquement une colonne qui contient pour chaque enregistrement une valeur non redondante que doit avoir une table. Cela doit identifier chaque enregistrement de manière unique.

phpmyadmin

Vous avez peut-être marre d’utiliser l’auto_increment de MySQL ou tout autre alternative pour d’autres SGBD qui a une forme un peu restreinte et pas sémantique, nous allons écrire notre script en PHP pour customiser cette colonne qui généralement est nommée « id » mais libre de le nommer comme on le veut.

Admettons que vous informatisez une école, un identifiant d’un élève « ELE01 » ou d’un enseignant « ENS01 » serait mieux que d’être simplement « 1 »

On va faire une chose assez simple, nous allons avoir une logique ETUDIANT_ID où

  • ID : est le numéro unique de l’étudiant

Donc, on aura une suite comme ETUDIANT_1, ETUDIANT_2…. ETUDIANT_n…

Concept

Coté logique de notre code aussi on ferra très simple :

Lors de l’enregistrement dans la table, on vérifie d’abord s’il y a une donnée dans la table. Si non, on enregistrement sans problème la donnée avec le numéro unique qu’on aura par default, soit ETUDIANT_1. S’il y a un ou plusieurs enregistrements, on récupère l’id du dernier enregistrement et on l’incrémente.

[stextbox id=”warning”]

ETUDIANT_1 n’est pas de type numérique mais bel et bien alphanumérique. Pensez bien à mettre le type de l’id en VARCHAR sinon ça ne va pas bien fonctionner

[/stextbox]

Schématiquement, cela peut se résumer en ceci :

ordinogramme

Code

//… connexion dans la base de données



//recupère le dernier article dans la base de données

$req = $db->query('SELECT * FROM etudiant ORDER BY ID DESC LIMIT 1');
$dernier_etudiant = $req->fetch();
$req->closeCursor();
$increment = "ETUDIANT_1";
/*
Si le dernier etudiant n'est pas vide, ce qui montre qu'il y a des données dans la base de données
 */
if (!empty($dernier_etudiant)) {

    /*
     * Je sépare le mot etudiant de la partie à incrémenter
     * $part[0] aura le mot ETUDIANT et $part[1] aura le dernier l'id (ex 1)
     */
    $part = explode('_', $dernier_etudiant['id']);

    /*
     * J'incrémente la partie incrémentable et je le concatène sur le mot etudiant.
     * J'ai profité au passage pour caster $part[1] en int pour s'assurer que j'aurais bien une
     * valeur numérique à incrémenter
     */
    $increment = $part[0] . '_' . (int)$part[1] += 1;
}

Je pense que je n’ai pas à expliquer car le code est commenté et au final, on voit bien que notre système fonctionne très bien et aussi que la requête sql est évidente.

Après vous n’avez qu’à utiliser la variable $increment lors de l’enregistrement comme ceci :

if (!empty($_POST)) {
    $_POST = array_map('htmlspecialchars', $_POST);
    $success = false;
    $data = array(
        "id" => $increment,
        'nom' => $_POST['nom'],
        'postnom' => $_POST['postnom']
    );
    if($db
        ->prepare('INSERT INTO Etudiant VALUES(:id, :nom, :postnom)')
        ->execute($data)){
        $success = true;
    }
}

customAI

Cette implémentation n’est pas si mal mais si vous voulez changer la structure de votre clé primaire (par exemple ELEVE01), vous devriez écrire à chaque fois le code correspondant. pas très idéal.

Librairie CustomAI

Raison pour laquelle j’ai développé la librairie CustomAI qui va vous permettre de gagner en rapidité. La librairie n’a fait qu’implémenter la logique qu’on a vue ci-haut.

Exemple d’implémentation de la même chose qu’on a fait mais avec la librairie

require 'CustomAI.php';
use Informagenie\CustomAI; 
$increment = new CustomAI($db, 'Etudiant', 'id', "ETUDIANT_(0)");

Explications :

  1. Dans la ligne 1, rien de compliqué qu’en requirent le fichier de la librairie
  2. J’ai customisé mon masque pour qu’elle prenne une forme à souhait. (plus d’infos)
  3. J’ai instancié la librairie CustomAI avec le premier paramètre, la connexion PDO de la base de données et le second paramètre c’est le nom de ma table, le troisième paramètre qui est la colonne clé primaire de ma table et le 5ème argument, j’ai customisé mon masque pour qu’elle prenne une forme à souhait. (Plus d’infos)

 

L’avantage c’est qu’on a un code réutilisable. Et si on veut pour les élèves, on a simplement qu’à modifier le 4ème paramètre avec « ELEVE(0) ». Pour plus d’informations.

6 Commentaires

  1. Ana 5 juin 2017
  2. jesse 6 juin 2017
    • Goms 8 juin 2017
  3. Ana 13 juin 2017

Ajouter un commentaire