IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

soucis avec lastInsertId() et last_insert_id()? [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Par défaut soucis avec lastInsertId() et last_insert_id()?
    bonjour,

    je débute dans le php et je me heurte à un problème:
    je veux utiliser lastInsertId() à l'intérieur d'une transaction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <?php
    global $dbh;
    $user = 'root';
    $password = '';
    $dsn = 'mysql:host=localhost;dbname=info';
    try {
    	$dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
    	print "Erreur ! : " . $e->getMessage() . "<br/>";
    	die();
    }
     
    $site_id = '';
    $liste_societe_id = '';
    $adresse_id = '';
     
    try{
    	$dbh->beginTransaction();
     
    	// Création du site
    	$sql1 = "INSERT INTO site (nom, alias, commentaires)
    	VALUES ('".$_POST[nom_site]."',
    	'".$_POST[alias_site]."',
    	'".$_POST[commentaires]."');";
     	$dbh->exec($sql1);
     	$site_id = $dbh->lastInsertId();
     
     	// Création de l'adresse LAST_INSERT_ID
     	$sql2 = "INSERT INTO adresse (site_id, adresse, code_postal, ville, pays, tel, fax, contact)
     	VALUES ('".$site_id."',
     	'".$_POST[adresse]."',
     	'".$_POST[code_postal]."',
     	'".$_POST[ville]."',
     	'".$_POST[pays]."',
     	'".$_POST[tel]."',
     	'".$_POST[fax]."'
     	'".$_POST[contact]."');";
     	$dbh->exec($sql2); 
     	$adresse_id = $dbh->lastInsertId();
     
     	// Création de la société
     	$sql3 = "INSERT INTO liste_societe (code_societe, societe, adresse, code_postal, ville, pays, tel, fax, siren, siret, ape, cpte_clt_orange_m)
     	VALUES ('".$_POST[code_societe]."',
     	'".$_POST[societe]."',
     	'".$_POST[adresse]."',
     	'".$_POST[code_postal]."',
     	'".$_POST[ville]."',
     	'".$_POST[pays]."',
     	'".$_POST[tel]."',
     	'".$_POST[fax]."',
     	'".$_POST[siren]."',
     	'".$_POST[siret]."',
     	'".$_POST[ape]."',
     	'".$_POST[cpte_clt_orange_m]."');";
     	$dbh->exec($sql3);
     	$liste_societe_id = $dbh->lastInsertId();
     
     	// Création du lien adresse société
     	$sql4 = "INSERT INTO societe (adresse_id, liste_societe_id)
     	VALUES ('".$adresse_id."', '.$liste_societe_id');";
     	$dbh->exec($sql4);
     
    	$dbh->commit();
    } catch (Exception $e){
    	$dbh->rollBack();
    }
    global $dbh;
    $dbh = NULL;
    ?>
    après exécution ça me remplie les tables "liste_societe" et "site" mais pas les tables "societe" et "adresse"...

    là je vais pas tarder à m'arracher les cheveux....
    merci pour votre aide

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    est-ce que tes champs de clés primaires/id sont bien en auto_increment ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations forums :
    Inscription : Avril 2009
    Messages : 168
    Par défaut
    bonjour bryce426,

    1)
    dans le dernier insert:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Création du lien adresse société
     	$sql4 = "INSERT INTO societe (adresse_id, liste_societe_id)
     	VALUES ('".$adresse_id."', '.$liste_societe_id');";
     	$dbh->exec($sql4);
    je constate que la variable $liste_societe_id ne ressort pas correctement:
    il faudrait avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Création du lien adresse société
     	$sql4 = "INSERT INTO societe (adresse_id, liste_societe_id)
     	VALUES ('".$adresse_id."', '".$liste_societe_id."');";
     	$dbh->exec($sql4);
    2)
    Quelle sont les valeurs obtenues lorsque tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste_societe_id = $dbh->lastInsertId();

  4. #4
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Par défaut
    Merci pour vos réponses.

    Mes clés primaires sont toutes en auto-incrémentées.
    J'ai corrigé ma faute sur la variable $liste_societe_id.
    J'ai relevé les valeurs de mes last_insert_id et je remarque que "site_id" est toujours égal à "adresse_id" et pourtant je suis allé faire des INSERT par moi-même dans phpMyAdmin sur la table "site" pour que l'id s'auto-incrémente et qu'il soit différent de celui de la table "adresse" mais rien à faire "site_id" est toujours égal à "adresse_id"

    bizarre

    EDIT: euh non c'est encore pire que ça en fait voici mes relevé ce matin pour 3 essais:
    site id :39 / adresse id :39 / liste societe id :21
    site id :40 / adresse id :40 / liste societe id :40
    site id :41 / adresse id :41 / liste societe id :41

    pour info voici ma base de données en piéce jointe
    Images attachées Images attachées  

  5. #5
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Par défaut
    je viens de réessayer avec ce code ci-dessous et ça reste le même problème...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    <?php
    global $dbh;
    $user = 'root';
    $password = '';
    $dsn = 'mysql:host=localhost;dbname=info';
    try {
    	$dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
    	print "Erreur ! : " . $e->getMessage() . "<br/>";
    	die();
    }
     
    $sql1= "INSERT INTO site (nom, alias, commentaires)
    		VALUES ('".$_POST[nom_site]."',
    				'".$_POST[alias_site]."',
    				'".$_POST[commentaires]."');";
     
    $sql2= "SELECT @site_id := last_insert_id();";
     
    $sql3= "INSERT INTO adresse (site_id, adresse, code_postal, ville, pays, tel, fax, contact)
     		VALUES (@site_id,
    				'".$_POST[adresse]."',
    		 		'".$_POST[code_postal]."',
    		 		'".$_POST[ville]."',
    		 		'".$_POST[pays]."',
    		 		'".$_POST[tel]."',
    		 		'".$_POST[fax]."'
    		 		'".$_POST[contact]."');";
     
    $sql4= "SELECT @adresse_id := last_insert_id();";
     
    $sql5= "INSERT INTO liste_societe (code_societe, societe, adresse, code_postal, ville, pays, tel, fax, siren, siret, ape, cpte_clt_orange_m)
     		VALUES ('".$_POST[code_societe]."',
    		 		'".$_POST[societe]."',
    		 		'".$_POST[adresse]."',
    		 		'".$_POST[code_postal]."',
    		 		'".$_POST[ville]."',
    		 		'".$_POST[pays]."',
    		 		'".$_POST[tel]."',
    		 		'".$_POST[fax]."',
    		 		'".$_POST[siren]."',
    		 		'".$_POST[siret]."',
    		 		'".$_POST[ape]."',
    		 		'".$_POST[cpte_clt_orange_m]."');";
     
    $sql6= "SELECT @liste_societe_id := last_insert_id();";
     
    $sql7= "INSERT INTO societe (adresse_id, liste_societe_id)
     		VALUES (@adresse_id, @liste_societe_id);";
     
    try{
    	$dbh->beginTransaction();
    	$dbh->query($sql1);
    	$dbh->query($sql2);
    	$dbh->query($sql3);
    	$dbh->query($sql4);
    	$dbh->query($sql5);
    	$dbh->query($sql6);
    	$dbh->query($sql7);
    	$dbh->commit();
    } catch (Exception $e){
    	$dbh->rollBack();
    }
    ?>
    j'ai essayé le même code en regroupant les requêtes dans une seule variable: PAREIL!
    j'ai essayé les requêtes ensemble dans phpMyAdmin: ça fonctionne!

    ... là j'ai pas d'idées

    EDIT: mon problème n'a rien avoir avec les transactions, le soucis reste le même sans.

    EDIT2: je ne sais pas si ça peut avoir une incidence mais le serveur php/mysql est un boitier synology

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Par défaut
    plus d'idées à me proposer?

  7. #7
    Membre Expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Par défaut
    Bonjour,

    Juste pour être plus clair: Qd tu mets entre double quote, il a évaluation des variables donc tu peux modifier tes requêtes comme suit et essayer ... cela n'aura pas forcement d'incidence mais dès fois un petit rien entraîne un bug.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sql1= "INSERT INTO site (nom, alias, commentaires)
    		VALUES ('".$_POST[nom_site]."',
    				'".$_POST[alias_site]."',
    				'".$_POST[commentaires]."');";
    En:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $sql1= "INSERT INTO site (nom, alias, commentaires)
               VALUES ('$_POST[nom_site]', '$_POST[alias_site]', '$_POST[commentaires]')";
    Ensuite je regarde ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 08h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 17h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo