Auteur Sujet: Obtenir l'identifiant de la dernière transaction  (Lu 9081 fois)

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Obtenir l'identifiant de la dernière transaction
« le: 01 juin 2009 à 12:08:13 »
Voilà un truc tout simple, qui est utile lorsqu'on le connaît et que l'on cherche sans arrêt dans le cas contraire : obtenir l'identifiant généré par la dernière requête INSERT MySQL.
Si vous avez un clef qui est un entier (int) alors vous pouvez faire cela :
$Id = mysql_insert_id();
Mais si votre clef est un BIGINT (dès fois que vous vous soyez dit que la terre entière viendrait jouer à votre jeu), il faut faire autrement :
$SQL = "SELECT LAST_INSERT_ID() as last FROM maTable;";
$result = mysql_query($SQL);
$last = mysql_result($result, 0, "last");
Voilà. C'est tout bête quand on le sait. Vous n'aurez plus à chercher.

Hors ligne SorenS

  • Membre Junior
  • **
  • Messages: 91
  • Karma: +0/-0
  • Développeur web PHP
    • Kueny Raphaël - Développeur web php
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #1 le: 01 juin 2009 à 14:55:30 »
J'ai un peu de mal à voir ce que cela retourne et aussi à quoi cela sert ???
--- Développeur web php passionné de jeux web ---

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #2 le: 01 juin 2009 à 15:11:53 »
Par exemple, un nouveau membre vient de s'inscrire. Un identifiant unique est alors créé dans la base de données.
Si le logiciel doit remplir d'autres tables en faisant une liaison avec celle des membres, il faut obtenir cet identifiant unique.
Le voici donc.

Hors ligne khiguard

  • Modérateur
  • Membre Complet
  • *****
  • Messages: 119
  • Karma: +4/-0
    • Alonya: jeu de gestion et de stratégie.
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #3 le: 01 juin 2009 à 18:12:45 »
C'est très utile au contraire.

Je prend un exemple concret :
Tu insert un bâtiment qu'un joueur viens de construire: une pêcherie.
Ce bâtiment fait des effets divers que tu intègre dans une autre table. Tu a besoin de l'ID du bâtiment pour lier les effets au bâtiments.
Tu fait l'insert du bâtiment , tu recherche l'ID du batiment, puis tu insert l'ID de l'effet et l'ID du bâtiment pour lier les deux, et pour savoir que tel bâtiment fait tel effet. Pour ma pêcherie, je dirais qu'il faut comme effet, que le pêcherie donne du poisson, et donne plus de nourriture au total.

Tu fait donc :
- INSERT "PECHERIE"
- $Id = mysql_insert_id(); // Pour rechercher l'ID du batiment
- INSERT EFFET "poisson" avec $id
- INSERT EFFET "nourriture" avec $id

J'espère que c'est plus clair comme cela. :)

Par contre, je ne savais pas que c'était impossible avec un bigint, en même temps, je l'utilise jamais :)
@+
Sombre Destin : Jeu de gestion/stratégie.
Alonya : Jeu de gestion/stratégie par partie. (en construction)
Acdn : Webzine ludique.

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #4 le: 01 juin 2009 à 18:28:04 »
Citer
je ne savais pas que c'était impossible avec un bigint
Ce n'est pas impossible, mais les effets ne sont pas garantis. Le problème vient du fait que la valeur retournée est du type PHP long (int). Et du coup, si les valeurs sont au-delà, ça plante. Donc, le système peut fonctionner pendant longtemps avant de retourner des valeurs erronées (ce peut-être marrant si vous voulez mettre une "bombe logique" dans un logiciel, mais faut vraiment être con...)

Hors ligne galaan

  • Néophyte
  • *
  • Messages: 5
  • Karma: +0/-0
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #5 le: 02 juin 2009 à 09:37:56 »
Plus qu'utille : INDISPENSABLE.
je me rappelle qu'a mes débuts, j'ai du déployer des trésors d'ingéniosités pour recuperer cette ID jusqu'à ce que je tombe par hasard sur cette fonction.

Dans le meme ordre d'idée mais quand meme beaucoup moins utile, on pourrait parler de :
mysql_ affected_ rows()  // ramène le nombre de lignes affectées par une requête
mysql_info()                   // ramène une série d'information sur la dernière requête.

Bon courage a tous.

Galaan 


 

Hors ligne keke

  • Animateur
  • Membre Junior
  • *****
  • Messages: 89
  • Karma: +3/-0
    • Magdales
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #6 le: 02 juin 2009 à 10:01:05 »
Voilà un truc tout simple, qui est utile lorsqu'on le connaît et que l'on cherche sans arrêt dans le cas contraire : obtenir l'identifiant généré par la dernière requête INSERT MySQL.
Ca sent le vécu ^^.

perso, je la cherche systématiquement cette fonction ^^. En fait, dès que je fais un nouveau module pour mon jeu ... une fois par mois.

Kéké
Kéké : administrateur de Magdales.

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #7 le: 02 juin 2009 à 10:16:47 »
Citer
perso, je la cherche systématiquement cette fonction
Je me suis fait depuis un bout de temps maintenant, une classe MySQL que j'améliore au fur et à mesure des besoins. Je n'ai donc plus à me soucier de cette partie.
Le fait de travailler avec des classes change vraiment la vie. Dès que je fais une amélioration, elle est automatiquement répercutée sur mes autres sites. Le pied :-)

Hors ligne keke

  • Animateur
  • Membre Junior
  • *****
  • Messages: 89
  • Karma: +3/-0
    • Magdales
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #8 le: 02 juin 2009 à 14:01:59 »
Ha ça ... comme j'ai qu'un seul site, je passe à côté de cet avantage ^^.

Mais bon, j'ai mis en lien un site qui semble traiter de manière adapté pour mon grand age de l'avantage et des inconvénients de la POO ^^. J'y arriverais pour d'autres projet adaptés !

kéké
Kéké : administrateur de Magdales.

Hors ligne SorenS

  • Membre Junior
  • **
  • Messages: 91
  • Karma: +0/-0
  • Développeur web PHP
    • Kueny Raphaël - Développeur web php
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #9 le: 03 juin 2009 à 10:13:25 »
En effet cela peut bien servir. En revanche, un truc que tu ne précises pas, mysql_insert_id() retourne le dernier identifiant s'il y est en AUTO_INCREMENT


mysql_insert_id() retourne le dernier identifiant généré par un champ de type AUTO_INCREMENT, sur la connexion MySQL courante ou sûr la connexion spécifiée par link_identifier .
source : Manuel PHP


Et encore un truc à savoir je pense :

Note: La fonction MySQL LAST_INSERT_ID() contient toujours la valeur AUTO_INCREMENT la plus récente, et n'est pas remise à zéro entre deux requêtes.
source : Manuel PHP


Qui a dit que j'adorai le manuel PHP ? :)
--- Développeur web php passionné de jeux web ---

Hors ligne guile

  • Membre Junior
  • **
  • Messages: 56
  • Karma: +1/-0
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #10 le: 03 juin 2009 à 21:21:24 »
La règle que je retiens est : "ne pas utiliser de big int".

En effet, l'intérêt est très minime comparé à un int.

Dans MySQL, un INT peut aller jusque 4 milliards (environ)
Un BigInt 18 milliards de milliards...

Je n'ai personnellement jamais vu ni entendu parler dans mon entourage de table de plus de 4 milliards de ligne.
Et si ce cas se présentait, je peux assurer que votre serveur web devra être très très ... très costaud!

La taille de la table est d'au moins 16 Go (juste pour le champs).
Un index PRIMARY sur plus de 4 milliards d'enregistrement serait énorme.
Le temps de recherche, même s'il est indexé, nécessiterait un temps absolument énorme.

Non, je confirme, un bigint en clé primaire c'est se compliquer la vie pour rien.


Au fait, pour les classes d'accès à une base, il en existe énormément, de très performantes, et intéressantes. Néanmoins, pour apprendre l'objet c'est l'exemple optimal, et le plus portable d'un projet à un autre.

Petits détail maintenant :
Je ne peux comprendre qu'on oublie la fonction mysql_insert_id(), tout bon IDE avec "autocompletion" permet de la retrouver instantanément
Pour mysql_affected_rows, j'ai déjà eu des ennuis quand il s'agit de compter le nombre de ligne d'un SELECT.
Certes, elle est plutôt efficace pour les UPDATE, DELETE, INSERT. Mais j'ai eu de malheureuses expériences avec les SELECT retournant un grand nombre de lignes.

Pour palier ce problème, j'ai appris à utiliser mysql_num_rows($queryresult) qui renvoie le nombre effectif de ligne retournées par une requête SELECT. Cela reste néanmoins une fonction relativement gourmande, à utiliser avec parcimonie (à mon avis pas super performante sur les très gros résultats).
Il faut alors savoir équilibrer son choix entre un SELECT COUNT(*) et un mysql_num_rows(...) : les deux solutions n'étant pas ultime.
Personnellement, j'utilise rarement le décompte de ligne d'une requête.


Edit: Ah oui, et j'oubliais! En lisant le post je m'attendais à voir un truc sur les transactions en base de données. Ici on ne parle pas de transaction, mais juste d'index ajouté par la dernière requête SQL. Pour ce qui est des transactions, je pourrais tenter de vous en parler, même si je ne pratique pas. C'est l'outil ultime pour garantir ses données.
« Modifié: 03 juin 2009 à 21:24:13 par guile »

Hors ligne keke

  • Animateur
  • Membre Junior
  • *****
  • Messages: 89
  • Karma: +3/-0
    • Magdales
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #11 le: 04 juin 2009 à 09:40:19 »
4 milliards de ligne ?

Selon les projets, ça peut être bien suffisant, ou au contraire très limitatif.

Si tu prends une table de log ... chaque action de joueurs, monstres ou chaque évènements insèrant une ligne ... si tu as 100 000 PNJ et 20 000 PJ ... ça peut monter très vite en une année !

J'ai bossé sur de gros projet où la base de donnée (assez complexe il faut dire) faisait 60 Tera octet. Ca reposait sur une archi AS 400 en DB2 certes, mais le nombre de lignes de certaines tables devaient bien dépassé le milliard.

Kéké
Kéké : administrateur de Magdales.

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #12 le: 04 juin 2009 à 12:05:56 »
Citer
Si tu prends une table de log ... chaque action de joueurs, monstres ou chaque évènements insèrant une ligne ... si tu as 100 000 PNJ et 20 000 PJ ... ça peut monter très vite en une année !
Heu.. Si tu arrives à ce niveau, c'est qu'il y a un souci dans l'agencement de la base.
Mes 2 projets, PBeM Exchange et PBeM Stats (en bêta pour ce dernier), utilisent des logs en quantité. Et pourtant, la base, pour PBeM Exchange ne dépasse pas le Mo. Il faut savoir "compiler" les données au fur et à mesure. Certaines informations n'étant plus nécessaire dans le temps.
Pour les données concernant le PNJ par exemple, il est possible de regrouper les actions sur une journée complète, voir sur une semaine en fonction de la quantité.
Bon, ce n'est pas toujours possible, mais si la taille devient un problème, il faut aller dans ce sens à mon avis.

Hors ligne keke

  • Animateur
  • Membre Junior
  • *****
  • Messages: 89
  • Karma: +3/-0
    • Magdales
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #13 le: 04 juin 2009 à 14:37:12 »
Vi Prélude ^^. Selon les projets, mon exemple ne tient pas la route. Mais il a valeur d'exemple, pas d'exhaustivité.

Cependant, la longévité de l'information n'implique pas une réduction de l'id auto-incrémenté.

Mais des méthodes existent pour l'éviter. Des méthodes qui obligent à pousser encore plus loin la réflexion ou des recours à des procédures stockées.

Une technique consiste par exemple à mettre en clé primaire (la date + un id). L'id peut donc est renouvelé tous les jours.
D'autres technique (comme par exemple là où je bosse) utilise un système de clé où le premier chiffre correspond à la partition en cours d'utilisation. Ainsi en mai, on est à l'id 4000000001, en juin à l'id 5000000001, etc ... Il y a 6 partitions qui sont purgées tous les 3 à 4 mois.
Les clefs sont gérées par Trigger.

Je viens de voir que le dernier id est "4 298 814 471" . C'est donc pas du milliard. Mais si on laissait ainsi, en quelques mois ça le deviendrait.

Bref, la suppression, l'archivage, la compilation de donnée ne sont pas toujours faisables. Les contraintes métiers ne sont pas toujours de la partie.

La base de Magdales dépasse parfois les 80 Mo de données, mais effectivement, des purges sont lancées toutes les semaines.

Kéké
Kéké : administrateur de Magdales.

Hors ligne Prelude

  • Administrateur
  • Membre Héroïque
  • *****
  • Messages: 1155
  • Karma: +9/-0
    • Mon blog
Re : Obtenir l'identifiant de la dernière transaction
« Réponse #14 le: 04 juin 2009 à 14:59:11 »
Commencer l'Id par le chiffre des mois c'est déjà un début de hashcoding. D'où la nécessité de faire quelques études, que ce soit à la fac ou dans les bibliothèques le we ;-)
Heu... "4 298 814 471", c'est plus de 4 milliard, non ?!