Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/07/2007, 11h34   #1
Membre actif
 
Avatar de Nicomart
 
Inscription : septembre 2005
Messages : 206
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : septembre 2005
Messages : 206
Points : 176
Points : 176
Envoyer un message via Skype™ à Nicomart
Par défaut Deux requêtes simultanées avec mysql_query($req,$db)

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 (...);"
, puis on obtient last_insert_id =0. La solution consiste à exésuter dans la même requête SQL :
Code :
"INSERT INTO matable (...) VALUES (...);last_insert_id();"
et là on récupère bien le nouvel identifiant. Testé sous phpmyadmin, ça marche.

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:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in monsite on line 78
Auriez vous une solution alternative ?

Merci
Nicomart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 14h51   #2
Membre régulier
 
Inscription : octobre 2006
Messages : 121
Détails du profil
Informations personnelles :
Âge : 61

Informations forums :
Inscription : octobre 2006
Messages : 121
Points : 90
Points : 90
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
MarcS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 15h43   #3
Membre actif
 
Avatar de Nicomart
 
Inscription : septembre 2005
Messages : 206
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : septembre 2005
Messages : 206
Points : 176
Points : 176
Envoyer un message via Skype™ à Nicomart
Cette solution semble intéressante entre-temps j'en ai trouvé une autre qui semble également fonctionner :

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 :
1
2
3
4
5
6
7
8
9
mysql_query("LOCK TABLES art WRITE");
$req = 'INSERT INTO matable (`cle`, `valeurs` ) VALUES (NULL, mesvaleurs);';
mysql_query($req,$db);
$result = mysql_query("SELECT MAX(`cle`) AS LAST_ID FROM matable");
while ($row = mysql_fetch_array($result))
    $lastid = $row['LAST_ID'];
$req = "UPDATE `lastinsert_ids` SET numero = ".$lastid." WHERE nom = 'leNom';";
mysql_query($req,$db);
mysql_query("UNLOCK TABLES");
Finalement, ça équivaut à un trigger. En tout cas, merci de vous être penché sur mon problème.
Nicomart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 11h16   #4
Membre confirmé
 
Inscription : juillet 2007
Messages : 201
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 201
Points : 227
Points : 227
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());
?>
acirfa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h25.


 
 
 
 
Partenaires

Hébergement Web