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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 33
    Points
    33
    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 émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 168
    Points : 122
    Points
    122
    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
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 33
    Points
    33
    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
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 33
    Points
    33
    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
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 33
    Points
    33
    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
    Points : 3 390
    Points
    3 390
    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 ...
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  8. #8
    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
    Points : 3 390
    Points
    3 390
    Par défaut
    Ensuite, il y a la guerre des ";", faut regarder sur le forum

    (Voir ci dessus, moi j'en mets jamais mais en mettant en fin de ligne 1, voir voir 36, ça marche aussi)

    Ensuite 2, les mots réservés, ça aussi c'est petit mais dès fois on perd un temps pas possible: je verrais 'alias' le faire ...
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    il manque les quotes

    et faut utiliser mysql_real_escape_string (avec le bon mysql_set_charset)

    utiliser sprintf serait plus simple

  10. #10
    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
    Points : 3 390
    Points
    3 390
    Par défaut
    Effectivement

    Mais cela aurait levé une exception non ?

    Et puis si le cas ne retournais pas d'erreur car la gestion d'erreur ne traite pas ce type, il y aurait une insertion d'une ligne vide ?
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Fench Voir le message
    Effectivement

    Mais cela aurait levé une exception non ?

    Et puis si le cas ne retournais pas d'erreur car la gestion d'erreur ne traite pas ce type, il y aurait une insertion d'une ligne vide ?
    ça dépend du mode d'erreur (au niveau de l'affichage), si la constantes n'existe pas il prend la variable du même nom

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 33
    Points
    33
    Par défaut
    Merci pour votre aide: ça fonctionne!
    Honte à moi, apparemment c'était à cause de l'oubli des ' sur $_POST['nom_site'] et peut-être les ; en fin d'instruction SQL.

    Par contre remplacer ça '".$_POST['nom_site']."', par ça '$_POST['nom_site']', ne fonctionne pas chez moi.

    Pour la colonne alias, je vais la nommer autrement au cas où.

    Merci encore
    Ci-dessous mon code fonctionnel.

    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
    <?php
    include_once 'common.php';
    connecterBDD();
     
    $sql1= "INSERT INTO site (nom, alias, commentaires)
    		VALUES ('".mysql_real_escape_string($_POST['nom_site'])."',
    				'".mysql_real_escape_string($_POST['alias_site'])."',
    				'".mysql_real_escape_string($_POST['commentaires'])."')";
     
    $sql2= "SET @site_id = LAST_INSERT_ID()";
     
    $sql3= "INSERT INTO adresse (site_id, adresse, code_postal, ville, pays, tel, fax, contact)
     		VALUES (@site_id,
    				'".mysql_real_escape_string($_POST['adresse'])."',
    		 		'".mysql_real_escape_string($_POST['code_postal'])."',
    		 		'".mysql_real_escape_string($_POST['ville'])."',
    		 		'".mysql_real_escape_string($_POST['pays'])."',
    		 		'".mysql_real_escape_string($_POST['tel'])."',
    		 		'".mysql_real_escape_string($_POST['fax'])."',
    		 		'".mysql_real_escape_string($_POST['contact'])."')";
     
    $sql4= "SET @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 ('".mysql_real_escape_string($_POST['code_societe'])."',
    		 		'".mysql_real_escape_string($_POST['societe'])."',
    		 		'".mysql_real_escape_string($_POST['adresse'])."',
    		 		'".mysql_real_escape_string($_POST['code_postal'])."',
    		 		'".mysql_real_escape_string($_POST['ville'])."',
    		 		'".mysql_real_escape_string($_POST['pays'])."',
    		 		'".mysql_real_escape_string($_POST['tel'])."',
    		 		'".mysql_real_escape_string($_POST['fax'])."',
    		 		'".mysql_real_escape_string($_POST['siren'])."',
    		 		'".mysql_real_escape_string($_POST['siret'])."',
    		 		'".mysql_real_escape_string($_POST['ape'])."',
    		 		'".mysql_real_escape_string($_POST['cpte_clt_orange_m'])."')";
     
    $sql6= "SET @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->exec($sql1);
    	$dbh->query($sql2);
    	$dbh->exec($sql3);
    	$dbh->query($sql4);
    	$dbh->exec($sql5);
    	$dbh->query($sql6);
    	$dbh->exec($sql7);
    	$dbh->commit();
     
    } catch (Exception $e){
    	$dbh->rollBack();
    }
    deconnecterBDD();
    ?>

+ 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