|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |
|
Membre actif
![]() |
Bonjour à tous,
j'ai un petit problème concernant la récupération du dernier id auto_increment d'une table. On m'a suggéré ici http://www.developpez.net/forums/sho...d.php?t=384059 d'utiliser la focntion last_insert_id. L'inconvénient de cette fonction est qu'elle doit être effectuée dans le même requête que l'insertion. En effet, si on exécute d'abord Code :
"INSERT INTO matable (...) VALUES (...);"
Code :
"INSERT INTO matable (...) VALUES (...);last_insert_id();"
Le souci est que mysql_query semble perdre les pédales avec la double requête. Quand j'exécute ceci avec mysql_query, j'obtiens le message habituel : Citation:
Merci |
|
|
|
00
|
|
|
#2 |
|
Membre régulier
![]() Inscription : octobre 2006 Messages : 121 ![]() |
Bonjour,
je ne sais pas si cette solution peut vous convenir. 1° la table qui mémorise l'id CREATE TABLE `memid` ( `Table1` char(20) default NULL, `Id1` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 la table sur laquelle on a un champ autoincrement CREATE TABLE `matable` ( `id` tinyint(4) unsigned NOT NULL auto_increment, `Champ1` int(4) default NULL, `Champ2` char(50) default NULL, `trois` char(10) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `zero` (`id`), UNIQUE KEY `id` (`id`), KEY `Deux` (`Champ2`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=latin1 et un trigger delimiter // create trigger MyTrigger After INSERT on toto for each row Begin update `memid` set id1=new.id where table1=toto end// delimiter ; Après chaque insert dans matable il suffit de faire select id1 from memid where table1=matable Cordialement MS |
|
|
00
|
|
|
#3 | ||
|
Membre actif
![]() |
Cette solution semble intéressante
En fait, la double-requête n'est pas possible avec mysql_query pour des raisons de sécurité (éviter le détournement de champs de saisie non protégés). J'ai trouvé cette info sur le manuel php.net En fait ma solution (trouvée sur un autre site dont j'ai déja perdu l'adresse, je n'ai rien inventé) consiste à verrouiller les tables en écriture pour toutes les autres transactions (pas de risque de concurrence d'écriture) à chaque insertion dans la base. On effectue l'insertion, puis un récupère le maximum de l'id dans la table où l'insertion vient d'être réalisée. On écrit cette valeur dans la table de stockage, puis on libère le lock : Code :
|
||
|
|
00
|
|
|
#4 |
|
Membre confirmé
![]() Inscription : juillet 2007 Messages : 201 ![]() |
utilise pluto mysql_insert_id()
comme ceci... <?php $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) { die('Impossible de se connecter : ' . mysql_error()); } mysql_select_db('mydb'); mysql_query("INSERT INTO mytable (product) values ('kossu')"); printf("Le dernier ID inséré dans est le id %d\n", mysql_insert_id()); ?> |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com