[Perl] Récupérer le résultat d'une requète SQL

Récupérer le résultat d'une requète SQL [Perl] - Perl - Programmation

Marsh Posté le 16-12-2008 à 17:08:45    

:hello:

 

Dans mon code Perl, j'effectue une commande SQL de ce genre :

 
Code :
  1. $sth = $dbh->prepare(insert into `toto` ( `index`, `col2` ) VALUES ( 'val1', 'val2'));
 

Or, dans ma table toto, l'entrée "index" est une clé unique, donc quand on fait une insertion d'une valeur avec un index déjà dans la table, l'insertion ne s'effectue pas et c'est tout à fait normal.

 

Problème 1 : Si l'insertion ne marche pas, mon code plante et ne continue pas :/

 

Problème 2 : Je veux récupérer le message me disant que l'insertion n'a pas eu lieu => ceci permettant d'identifier ce que l'utilisateur doit faire (champ à remplir / changer etc) :d

 

Quelqu'un aurait-il une idée pour solutionner l'un de ces deux problèmes ? :d

 

Merci d'avance !

 

Par ailleurs, la commande :

 
Code :
  1. $sth->execute() or die "Unable to execute query: $dbh->errstr";

ne marche pas également ...


Message édité par Thordax le 16-12-2008 à 17:18:38

---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 16-12-2008 à 17:08:45   

Reply

Marsh Posté le 17-12-2008 à 02:52:52    

Si tu fais un
$dbh->{RaiseError} = 0;
apres la connection, et avant ton prepare, ca plante toujours?
 

Citation :

$sth->execute() or die "Unable to execute query: $dbh->errstr";


Normalement, tu as un message d'erreur accessible avec $dbh->errstr() apres ton prepare, et $sth->errstr() apres to execute. Donc la ca devrait etre $sth->errstr().  
 
A+,


Message édité par gilou le 17-12-2008 à 02:54:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-12-2008 à 11:23:21    

Normalement le prepare() ne devrait pas échouer. C'est le execute() qui devrait échouer. Je ne sais pas si c'est la bonne méthode, mais quand j'ai eu à gérer ce genre de problème j'ai fais comme ça :

if (!$sth->execute($toto)) {
    if ($sth->err eq '23505') {
        # UNIQUE violation: $toto already exists in DB
        ...
    } else {
        # Some other, unrecoverable error
        ...
    }
}


Je pense que le code d'erreur qui indique un conflict sur une donnée UNIQUE (23505 chez moi, avec db2) varie suivant les DB, donc il faut faire le test chez toi pour récupérer le bon code d'erreur.


Message édité par matafan le 17-12-2008 à 11:24:16
Reply

Marsh Posté le 17-12-2008 à 14:01:32    

Merci à vous deux, normalement, la technique matafan devrait fonctionner, je vous tiens au jus si ça merde.


---------------
Atari 520 ST 256 Ko
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed