Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
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 28/04/2006, 10h38   #1
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Par défaut LastInsertId() ne marche pas

Bonjour,

Je souhaite récupérer un identifiant avec après une insertion, PDO que j'utilise implémente une méthode $connexion->lastInsertId()...

Dans mon cas cela ne marche pas...

Voici mon code :

Citation:
<?php
                  
// Préparation de la requête
                  
$statement = $this->oPdoConnexion->prepare($sqlInsertFolder);
                  
                  
$statement->bindParam(':nom_doss', $sFolderName, PDO::PARAM_STR);
                  
$statement->bindParam(':date_create_doss', $sDateNow, PDO::PARAM_STR);
                  
$statement->bindParam(':id_user', $iUserId, PDO::PARAM_INT);

                  
self::printDebugTrace("--> " ."\$sDateNow = $sDateNow");
                  
self::printDebugTrace("--> " .$sqlInsertFolder);                  
                  
                  
$statement->execute();
                  
                  
$iLastInsertId = $this->oPdoConnexion->lastInsertId();
                  
                  
$iRowCount = (integer) $statement->rowCount();
                  
                  if (!
$iRowCount == 1)
                  {
                        
throw new Exception(
                              
__CLASS__ . '::' . __METHOD__ .
                              
' --> Aucun enregistrement affecté lors de l\'ajout du dossier'
                        
);
                  }
                  
                  return
$iLastInsertId;
?>
Colorez votre code PHP sur les forums grâce à Developpez.com

A noter que tout se passe bien, l'enregistrement est bien ajouté mais impossible de choper d'avoir le lastInsertId ...
J'ai vu dans la doc pdo que cette methode pouvait prendre un argument de type string ... mais je vois pas trop à quoi ça pourrait m'avancer
La doc ici: http://fr2.php.net/pdo

Par avance merci de votre aide

@++
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 10h48   #2
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
salut
a tu un message d'erreur, ta base supporte l'auto-incremant?
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 10h52   #3
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Ma table contient bien un champ autoincrémenté :

La valeur est bien générée automatiquement !!
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 11h32   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Désolé pour le HS mais ne serait-il pas préférable d'avoir :
Citation:
if ($iRowCount != 1)

plutôt que :
Citation:
if (! $iRowCount == 1)

?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 11h57   #5
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Oui c'est un peu mois lisible comme je l'ai fait ...
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 11h59   #6
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
ta pas d'autre bille pour eclaissir tous ca
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 14h58   #7
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Malheureusement non ... pas d'erreur ... valeur nulle !!!
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 20h49   #8
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Salut,

Tu l'executes sur quel BDD ? Quel est le schéma de ta table ?
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 09h25   #9
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
  1. Mysql -> innoDb
  2. La structure de la table :
Code :
1
2
3
4
5
6
7
CREATE TABLE `panier` (
  `ID_DOSS` int(11) NOT NULL auto_increment,
  `NOM_DOSS` varchar(255) NOT NULL,
  `DTCREATE_DOSS` datetime default NULL,
  `USERIDCREATE_DOSS` int(11) NOT NULL,
  PRIMARY KEY  (`ID_DOSS`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 15h26   #10
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Finalement j'arrive bien à récupérer mon identifiant ...

A mon avis j'ai mal diagnostiqué la panne !!!

@+

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
            // Préparation de la requête
            $statement = $this->oPdoConnexion->prepare($sqlInsertFolder);
 
            $statement->bindParam(':nom_doss', $sFolderName, PDO::PARAM_STR);
            $statement->bindParam(':date_create_doss', $sDateNow, PDO::PARAM_STR);
            $statement->bindParam(':id_user', $iUserId, PDO::PARAM_INT);
 
            self::printDebugTrace("--> " ."\$sDateNow = $sDateNow");
            self::printDebugTrace("--> " .$sqlInsertFolder);            
 
            $statement->execute();
 
            $iLastInsertId = $this->oPdoConnexion->lastInsertId(); // YEESS ça marche !!!
Même si ça semble évident pour les habitués de ce genre de librairie ... il est à noter que même avant le comit ou le rollBack de la transaction l'identifiant est généré ... donc disponible (et 'jeté' en cas de rollBack() ... ce qui est plutôt rassurant !!!)
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 16h21   #11
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Pourtant je ne voit pas de transaction dans ton code.
Sinon c'est cool que tu ai résolu ton problème.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 17h23   #12
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Ce que j'ai mis est un fragement de ma classe PANIER, la transaction est initiée à la connexion, le commit() et le rollBack() sont gérés dans le script qui utilise ma classe (en fonction des exceptions levées ...)

Merci de votre aide ...

@+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2006, 17h39   #13
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Voici une petite démo juste illustrer mon propos ...

Citation:
<?php

      
// LES CONSTANTES *************************************
      
define('MYSQL_HOST', 'localhost');
      
define('MYSQL_DB', 'panierchaine');
      
      
define('MYSQL_USER', 'root');
      
define('MYSQL_PWD', '');      
      
      
      
// LES VARIALBES **************************************
      
$pdo_str_conn = sprintf(
        
"mysql:host=%s;dbname=%s",
        
MYSQL_HOST,
        
MYSQL_DB
      
);
      
      
$sSql = <<<EOF
                  INSERT INTO `panier` (
                        `ID_DOSS` ,
                        `NOM_DOSS` ,
                        `DTCREATE_DOSS` ,
                        `USERIDCREATE_DOSS` )
                  VALUES (
                        NULL ,
                        :nom_doss,
                        :date_create_doss,
                        :id_user
                  );";
EOF;      
      
$oPdoConn = null;
      
$oPdoStatement = null;
      
$sFolderName = 'coco';
      
$sDateNow = date("Y-m-d H:i:s");
      
$iUserId = 46;
      
      
try {
            
            
// Créer une connexion PDO
            
$oPdoConn = new PDO($pdo_str_conn, MYSQL_USER, MYSQL_PWD);
            
            
// Mettre en place la gestion des exceptions en cas d'erreur
            
$oPdoConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            
            
// Commencer la transaction
            
$oPdoConn->beginTransaction();
            
            
// préparation de la requête à l'exécution
            
$oPdoStatement = $oPdoConn->prepare($sSql);

            
// Lier les les paramètres à la requête
            
$oPdoStatement->bindParam(':nom_doss', $sFolderName, PDO::PARAM_STR);
            
$oPdoStatement->bindParam(':date_create_doss', $sDateNow, PDO::PARAM_STR);
            
$oPdoStatement->bindParam(':id_user', $iUserId, PDO::PARAM_INT);
            
            
// exécuter la requête
            
$oPdoStatement->execute();
            
            
// Imprimer l'identifiant de la ligne que l'on vient d'ajouter
            
echo sprintf(
                  
"LastInsertId='%s'\n",
                  
$oPdoConn->lastInsertId()
            );
            
            
// Valider la transaction
            
$oPdoConn->commit();
            
            
$oPdoConn = null;
      }
      
catch (Exception $ex) {
            
// Annuler la transaction en cas de problème
            
$oPdoConn->rollBack();
            echo
"\n" . $ex->getMessage();
      }
?>
Colorez votre code PHP sur les forums grâce à Developpez.com


Aller je m'arrête !!! @+
eric.pommereau 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 03h07.


 
 
 
 
Partenaires

Hébergement Web