Récupérer une valeur AUTOINCREMENT

Résolu
Jean-Guy Badiane Messages postés 646 Date d'inscription   Statut Membre Dernière intervention   -  
Jean-Guy Badiane Messages postés 646 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à vous, chers amis consommateurs ! :)

Je travaille actuellement sur une routine en PHP, qui me permet de récupérer des fiches au format XML, de traiter leurs informations, et de les insérer dans une base de données mySQL.

Je possède en tout quatre tables. La principale possède un champ IDENTIFIANT, qui s'auto-incrémente à chaque insertion. Or je souhaiterais pouvoir récupérer cet identifiant généré par la base de données, afin de l'insérer dans les autres tables.

J'ai essayé avec la fonction LAST_INSERT_ID. Et le résultat ne me plait qu'à moitié. En effet, la première fiche est insérée avec un identifiant égal à 0. Cependant, la seconde est insérée, affectée d'un ID convenable.

Voici mon code, pourriez-vous me dire ce qui ne va pas ?


//BOUCLE pour chaque fiche    
//je récupère l'identifiant de mon fichier dans la variable $idfichier    
//je récupère toutes les informations nécessaires dans un tableau $fiche[]    

$rechercheFiche="SELECT identifiant_bd FROM 'matable' WHERE identifiant_xml='".addslashes($idfichier)."'";    
$resultatRechercheFiche = em_db::row($rechercheFiche);    
     
//si on ne récupère rien, la fiche n'est pas présente dans la table     
if(!($resultatRechercheFiche['identifiant_bd']))    
{    
    $date = time();    
             
    $insertF="INSERT INTO fichier (identifiant, nom, description, date_modif) VALUES (NULL, '681','".addslashes($fiche['nom'])."','".$date."')";    
    em_db::exec($insertF);    
                  
    $masuperquery="SELECT LAST_INSERT_ID()";    
    $resultmasuperquery = em_db::row($masuperquery);    
    $supermasuperquery = implode($resultmasuperquery);    
              
    $insertL="INSERT INTO langue (identifiant, id_lang) VALUES ('".addslashes($supermasuperquery)."', 'fr')";    
    em_db::exec($insertL);    

    //première fiche, identifiant égal à 0    
    //deuxième fiche, identifiant égal à 99, comme prévu    
              
    $insertS="INSERT INTO structure (identifiant, id_structure) VALUES ('".addslashes($supermasuperquery)."', '1')";    
    em_db::exec($insertS);    

    //idem pour les autres    
       
    $idstruct="SELECT id_structure FROM 'structure' WHERE identifiant='".addslashes($supermasuperquery)."'";    
    $resultidstruct = em_db::row($idstruct);    
              
    $insertM="INSERT INTO matable (identifiant_bd, identifiant_xml, date_modi, id_structure) VALUES ('".addslashes($supermasuperquery)."', '".addslashes($fiche['id'])."', '".addslashes($fiche['dateMAJarticle'])."', '".addslashes($resultidstruct['id_structure'])."')";    
    em_db::exec($insertM);    
              
    $chaine = '<td valign="top"><pre>Nouvelle insertion</pre></td>';    
    //affichage de $chaine    
}




Je vous remercie d'avance, et vous souhaite une agréable soirée.

Jean-Guy Badiane.




Le saumon, ça voyage mal dans le mocassin.

6 réponses

Siluni
 
mysql_insert_id();
0
Jean-Guy Badiane Messages postés 646 Date d'inscription   Statut Membre Dernière intervention   7
 
Malheureusement, mon cher ami, j'ai déjà testé cette possibilité.


$supermasuperquery = mysql_insert_id(); 
//avec cette fonction, cela ne marche pas 

$masuperquery="SELECT identifiant FROM 'fichier' 
WHERE identifiant='".mysql_insert_id()."'"; 
$supermasuperquery = em_db::row($masuperquery); 
//comme ça, ce n'est pas mieux



Je ne trouve toujours pas ce qui cloche. Pourtant, les fonctions devraient rouler. Mais je ne comprends pas pourquoi l'identifiant n'est pas récupéré la première fois pour l'actualité A, mais récupéré pour l'actualité A'.

Merci d'avance, cher Siluni. :)

Jean-Guy Badiane, animateur d'événementiels.
Le saumon, ça voyage mal dans le mocassin.
0
Jean-Guy Badiane Messages postés 646 Date d'inscription   Statut Membre Dernière intervention   7
 
Je viens d'effectuer de nouveaux tests.


En réalité, le problème ne vient pas des noms des fiches.
Il s'agit en fait de la fonction LAST_INSERT_ID dans ma boucle.


LAST_INSERT_ID n'agit pas lors du premier passage dans ma boucle (donc pour la première fiche). C'est pour cela qu'elle lui affecte la valeur 0. En revanche, pour les autres fiches, la fonction est OK, et donne à chacune un joli petit numéro.



Comment cela se fait-il ?


Merci d'avance.
Un caniche abricot à celui ou à celle qui me sortira du pétrin ! :)

Jean-Guy Badiane.
0
Jean-Guy Badiane Messages postés 646 Date d'inscription   Statut Membre Dernière intervention   7
 
Je ne comprends pas le bug, il doit y avoir quelque chose qui m'échappe.

Toujours est-il que seule la fonction LAST_INSERT_ID marche.
mysql_insert_id ne récupère aucun identifiant, et une requête du style select(max)... met le bazar dans toutes les ID.

Un petit coup de main, s'il vous plait ? :)

Merci d'avance ! Jean-Guy.
Le saumon, ça voyage mal dans le mocassin.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jean-Guy Badiane Messages postés 646 Date d'inscription   Statut Membre Dernière intervention   7
 
Nouvelles précisions.

Apparemment, ma première insertion dans la table 'FICHIER' est ignorée. J'ai testé une nouvelle requête, qui récupère le premier identifiant, dans l'ordre décroissant (OK, puisqu'il s'agit d'une incrémentation).

$deuxresultmasuperquery = em_db::row('SELECT identifiant FROM 'fichier' ORDER BY identifiant DESC LIMIT 1');


Cependant, pour ma première fiche, le programme lui attribue un identifiant déjà utilisé, précisément celui de la dernière fiche créée avant l'exécution du programme.

Comme si je n'avais rien inséré entretemps. :)


Jean-Guy Badiane.
0
Jean-Guy Badiane Messages postés 646 Date d'inscription   Statut Membre Dernière intervention   7
 
Finalement, le problème est résolu.

Note aux futurs consommateurs qui auront le même souci, et qui liront ce thread au détour d'une recherche sur ce fabuleux outil qu'est Internet...

-> utilisez la méthode grobourin (big up à Eaulive) : tout supprimer.

Cela fonctionne à nouveau, et ça fait un bien fou de tout détruire !
(ne pas confondre avec Diên Biên Phù, qui le fut également, mais en 1954)

Merci encore de votre soutien ! :)

Jean-Guy Badiane.
Le saumon, ça voyage mal dans le mocassin.
0