Pour suivre ce tutorial, il faut connaître :
- La syntaxe SQL INSERT.
- Les procédures PHP de connexion aux différentes bases de données.
Parallèlement à ce tutorial, vous pouvez consulter le tutorial Pourquoi ne pas modifier un identifiant
Récupérer un identifiant qui vient d’être inséré
Il est parfois nécessaire de récupérer l’identifiant d’un enregistrement qui vient d’être insérée dans une base de données grâce à l’instruction SQL INSERT.
Prenons l’exemple simple suivant :
Une table
Code : Tout sélectionner
CREATE TABLE utilisateur (
id_utilisateur int(10) unsigned NOT NULL auto_increment,
nom varchar(255) default NULL,
prenom varchar(255) default NULL,
login varchar(255) default NULL,
passwd varchar(255) default NULL,
email varchar(255) default NULL,
PRIMARY KEY (id_utilisateur)
)Code : Tout sélectionner
INSERT INTO ma_table (login, passwd, email)
VALUES ('zeus', 'monpassquejedonnepas', '[email protected]')Code : Tout sélectionner
Afficher l’identifiant du membre qui vient d’être inséréMySQL implémente une instruction SQL qui permet de récupérer le dernier identifiant inséré dans une table, à condition que cet identifiant soit en auto_increment : LAST_INSERT_ID().
NOTE : cette instruction n’est pas définie dans la norme ANSI SQL92 et n’est définie que pour MySQL.
La condition est extrêmement importante puisque cette fonction se base sur la dernière valeur de l’auto_increment.
Basée sur cette instruction SQL, il existe une fonction PHP permettant de récupérer ce dernier identifiant : mysql_insert_id()
L’implémentation de cette solution pour répondre au besoin définit plus haut serait la suivante :
/**
* Le code de connexion à la base de données MySQL n’est pas représenté dans cet exemple mais
* on estime que cette connexion a été réalisée et a fonctionnée.
*/
//Insertion de l'enregistrement en base de données
$str_insert = " INSERT INTO ma_table (login, passwd, email)
VALUES ('zeus', 'monpassquejedonnepas', '[email protected]')";
$o_insert = mysql_query($str_insert);
//Récupération de l'identifiant de l'enregistrement qui vient d'être inséré
$id = mysql_insert_id();
echo "L'identifiant du dernier enregistrement est : ".$id;
Autre SGBDComme précisé précédemment, la norme ANSI SQL92 n’implémente pas de système de récupération du dernier identifiant inséré.
Pour parer à cette absence, il existe 2 solutions, qui diffèrent de la solution MySQL par le fait qu'elles doivent être réalisées AVANT l'insertion :
- les procédures stockées. Nous ne détaillerons pas ce point car ces procédures sont destinées à un public plus expérimenté en PL/SQL et mériteraient un tutorial complet.
- La récupération du plus grand identifiant existant. Le principe général est d’exécuter un SELECT sur le plus grand identifiant existant dans la table.
/**
* Le code de connexion à la base de données n’est pas représenté dans cet exemple mais
* on estime que cette connexion a été réalisée et a fonctionnée.
* L'exemple suivant utilise une base de données PostgreSQL mais peut etre remplacé par une
* base de données MSSQL, Oracle, ... simplement en changeant le nom des fonctions PHP
*/
//Insertion de l'enregistrement en base de données
$str_insert = " INSERT INTO ma_table (login, passwd, email)
VALUES ('zeus', 'monpassquejedonnepas', '[email protected]')";
$o_insert = pg_query($str_insert);
//Récupération de l'identifiant de l'enregistrement qui vient d'etre inséré
$str_insert_id = "SELECT MAX(id_utilisateur) AS last_insert_id FROM ma_table";
$o_insert_id = pg_query($str_insert)
//Si la requete a fonctionnée et qu'elle a retournée un résultat
if ( $o_insert_id && ( $a_result = pg_fetch_array($o_insert_id) ) )
{
$id = $a_result['last_insert_id'];
}
echo "L'identifiant du dernier enregistrement est : ".$id;
Avertissement : Cette méthode est plus risquée que la précédente car elle passe par une requête SELECT dont le temps d’exécution laisse plus de temps à une autre requête INSERT de s’exécuter. Les cas de chevauchements sont tout de même assez rare.