OVH Cloud OVH Cloud

dbi: last_insert_id

8 réponses
Avatar
julien
Bonjour
J'utilise la librairie dbi (use DBI;) pour manipuler des tables mysql.
J'ai créé une sous-fonction pour exécuter les query. Je voudrais
récupérer la valeur d'un champs auto_increment lors d'un INSERT. Cela se
fait normalement par la methode last_insert_id. Voici ma fonction:
sub query_exec {
my $database=shift;
my $user=shift;
my $password=shift;
my $query=shift;

my $dbh = DBI->connect("DBI:mysql:$database:localhost", $user,
$password) or die "Ne peut se connecter\n";

my $sth = $dbh->prepare($query);
my $res = $sth->execute;

#$dbh->disconnect;

my $id = $dbh->last_insert_id();
#print "last id: $id\n";

return $sth;
}

J'ai l'erreur: Can't locate object method "last_insert_id" via package
DBI::db
Pourtant, cette methode est bien référence (voir
http://search.cpan.org/author/TIMB/DBI-1.38/DBI.pm)

D'où cela peut-il venir?

Merci
Julien

8 réponses

Avatar
julien
julien wrote:
Bonjour
J'utilise la librairie dbi (use DBI;) pour manipuler des tables mysql.
J'ai créé une sous-fonction pour exécuter les query. Je voudrais
récupérer la valeur d'un champs auto_increment lors d'un INSERT. Cela se
fait normalement par la methode last_insert_id.Désolé, je viens de voir que j'ai la version 1.30 alors que
last_insert_id a été ajouté dans la 1.38


Julien

Avatar
julien
julien wrote:
Bonjour
J'utilise la librairie dbi (use DBI;) pour manipuler des tables mysql.
J'ai créé une sous-fonction pour exécuter les query. Je voudrais
récupérer la valeur d'un champs auto_increment lors d'un INSERT. Cela se
fait normalement par la methode last_insert_id. Voici ma fonction:
sub query_exec {
my $database=shift;
my $user=shift;
my $password=shift;
my $query=shift;

my $dbh = DBI->connect("DBI:mysql:$database:localhost", $user,
$password) or die "Ne peut se connectern";

my $sth = $dbh->prepare($query);
my $res = $sth->execute;

#$dbh->disconnect;

my $id = $dbh->last_insert_id();
#print "last id: $idn";

return $sth;
}

J'ai l'erreur: Can't locate object method "last_insert_id" via package
DBI::db
Pourtant, cette methode est bien référence (voir
http://search.cpan.org/author/TIMB/DBI-1.38/DBI.pm)

D'où cela peut-il venir?

Merci
Julien

Après installation de la version 1.38, plus de message d'erreur, mais

$id est vide.

J'ai corrigé l'erreur: #print "last id: $$idn";

Julien

Avatar
Rue des Prairies
julien wrote:

Bonjour
J'utilise la librairie dbi (use DBI;) pour manipuler des tables mysql.
J'ai créé une sous-fonction pour exécuter les query. Je voudrais
récupérer la valeur d'un champs auto_increment lors d'un INSERT. Cela se
fait normalement par la methode last_insert_id. Voici ma fonction:
sub query_exec {
my $database=shift;
my $user=shift;
my $password=shift;
my $query=shift;

my $dbh = DBI->connect("DBI:mysql:$database:localhost", $user,
$password) or die "Ne peut se connectern";

my $sth = $dbh->prepare($query);
my $res = $sth->execute;

#$dbh->disconnect;

my $id = $dbh->last_insert_id();
#print "last id: $idn";

return $sth;
}

J'ai l'erreur: Can't locate object method "last_insert_id" via package
DBI::db
Pourtant, cette methode est bien référence (voir
http://search.cpan.org/author/TIMB/DBI-1.38/DBI.pm)

D'où cela peut-il venir?

Merci
Julien

Bonjour,


Essaie d'exécuter la requête :
"SELECT LAST_INSERT_ID()"


Olivier.

Avatar
Alain BARBET
J'utilise la librairie dbi (use DBI;) pour manipuler des tables mysql.
...

J'ai l'erreur: Can't locate object method "last_insert_id" via package
DBI::db
Pourtant, cette methode est bien référence (voir
http://search.cpan.org/author/TIMB/DBI-1.38/DBI.pm)

D'où cela peut-il venir?


As-tu vraiment interet d'utiliser les avantages de la compatibilité DBI?
Sinon utilise $sth->{'mysql_insertid'};

Avatar
Julien Sobrier
Rue des Prairies wrote:
Bonjour,

Essaie d'exécuter la requête :
"SELECT LAST_INSERT_ID()"


Olivier.

Bonjour

Le probleme, c'est qu'entre ma requete et "SELECT LAST_INSERT_ID()", il
peut y avoir eu d'autres requetes, donc je ne suis pas sur d'avoir le
bon id. Je pourrai locker la table, mais je ralentirai considerablement
mon programme.

Julien

Avatar
Rue des Prairies
Julien Sobrier wrote:
Rue des Prairies wrote:

Bonjour,

Essaie d'exécuter la requête :
"SELECT LAST_INSERT_ID()"


Olivier.

Bonjour

Le probleme, c'est qu'entre ma requete et "SELECT LAST_INSERT_ID()", il
peut y avoir eu d'autres requetes, donc je ne suis pas sur d'avoir le
bon id. Je pourrai locker la table, mais je ralentirai considerablement
mon programme.

Julien

Bonjour,


Non, pas si tu l'exécutes juste après l'insert.

Olivier.


Avatar
Julien Sobrier
Rue des Prairies wrote:
Julien Sobrier wrote:
Bonjour
Le probleme, c'est qu'entre ma requete et "SELECT LAST_INSERT_ID()",
il peut y avoir eu d'autres requetes, donc je ne suis pas sur d'avoir
le bon id. Je pourrai locker la table, mais je ralentirai
considerablement mon programme.

Julien

Bonjour,


Non, pas si tu l'exécutes juste après l'insert.

Olivier.

Bonjour

Meme si d'autres programmes manipulent cette base donnees en parallele?

Julien


Avatar
Rue des Prairies
Julien Sobrier wrote:
Rue des Prairies wrote:

Julien Sobrier wrote:

Bonjour
Le probleme, c'est qu'entre ma requete et "SELECT LAST_INSERT_ID()",
il peut y avoir eu d'autres requetes, donc je ne suis pas sur d'avoir
le bon id. Je pourrai locker la table, mais je ralentirai
considerablement mon programme.

Julien

Bonjour,


Non, pas si tu l'exécutes juste après l'insert.

Olivier.

Bonjour

Meme si d'autres programmes manipulent cette base donnees en parallele?

Julien

Bonjour,


Oui, cette fonction est valable par connexion.

Olivier.