Perl - DBI - use strict
Le
Eric BERTHOMIER
Bonjour,
voici un petit programme qui me permet (pour test) d'insérer des
éléments dans une base de données. Un de ces éléments est NULL /
undef.
Mon problème est qu'avec DBI / prepare et DBI / exec, j'arrive à
réaliser ma requête tandis qu'avec DBI / do strict me refuse la
commande.
Merci d'avance.
#!/usr/bin/perl -w
use strict;
use DBI;
my $database="essai";
my $login="essai";
my $mdp="essai";
my$hostname="localhost";
my $id_auteur=undef;
my $dbh_sql = DBI->connect("DBI:mysql:database=$database;host=
$hostname", $login, $mdp) or die "Echec connexion base mysql";
my $sth = $dbh_sql->prepare(qq{
INSERT INTO essai (idAuteur) VALUES (?)
});
$sth->execute($id_auteur);
$dbh_sql->do (qq {
INSERT INTO essai (idAuteur) VALUES ($id_auteur)
}) or die $dbh_sql->errstr();
$dbh_sql->disconnect;
voici un petit programme qui me permet (pour test) d'insérer des
éléments dans une base de données. Un de ces éléments est NULL /
undef.
Mon problème est qu'avec DBI / prepare et DBI / exec, j'arrive à
réaliser ma requête tandis qu'avec DBI / do strict me refuse la
commande.
Merci d'avance.
#!/usr/bin/perl -w
use strict;
use DBI;
my $database="essai";
my $login="essai";
my $mdp="essai";
my$hostname="localhost";
my $id_auteur=undef;
my $dbh_sql = DBI->connect("DBI:mysql:database=$database;host=
$hostname", $login, $mdp) or die "Echec connexion base mysql";
my $sth = $dbh_sql->prepare(qq{
INSERT INTO essai (idAuteur) VALUES (?)
});
$sth->execute($id_auteur);
$dbh_sql->do (qq {
INSERT INTO essai (idAuteur) VALUES ($id_auteur)
}) or die $dbh_sql->errstr();
$dbh_sql->disconnect;

Poser une question


Le message d'erreur est explicite je pense, il doit indiquer qu'on chercher à concaténer
une variable indéfinie. Il faudrait utiliser $id_auteur à la chaîne vide ('') par exemple
pour pouvoir le concaténer.
--
Denis Dordoigne
Membre de l'April - promouvoir et défendre le logiciel libre - april.org
Rejoignez maintenant plus de 5 000 personnes, associations,
entreprises et collectivités qui soutiennent notre action
Qu'est-ce qui te pose probleme, que ca marche, ou que ca ne marche pas ?
prepare/execute est toujours une excellente idee (proscrire do quand on
peut, SURTOUT avec une chaine variable).
Apres, si ca ne devrait pas marcher, il faudrait sans doute avoir les
contraintes qui vont bien dans le schema de la base. C'est un bout qui
varie pas mal selon les bases, mais specifier un NOT NULL lors de la
definition d'une cle n'a jamais fait de mal (a ma connaissance) meme si c'est
redondant sur certaines DB.
est donc :
INSERT INTO essai (idAuteur) VALUES (NULL)
or, comme $id_auteur est undef, la requete qui est executee sera donc :
INSERT INTO essai (idAuteur) VALUES ()
le serveur mysql va donc t'envoyer un message d'insulte.
dans le cas de prepare + execute, ca marche, parce que la fonction
execute "convertit" la valeur perl undef en valeur mysql NULL pour
executer la requete.
C'est bien ça. Ma problématique c'est que je ne peux pas écrire
$idAuteur = NULL avec l'option use strict;
Après il est vrai que je peux passer par prepare et execute mais
j'aurai aimé comprendre le fond du problème, c'est à dire, dans la
fonction do, convertir undef en NULL.
tu peux faire pareil avec la fonction do() :
$dbh->do( 'INSERT INTO essai (idAuteur) VALUES (?)', undef, undef );
lis la doc pour connaitre les parametres de la fonction :
http://search.cpan.org/~timb/DBI-1.616/DBI.pm
autre methode (moins bonne), c'est d'affecter la chaine 'NULL' dans
$idAuteur :
$idAuteur = 'NULL';
$dbh->do( 'INSERT INTO essai (idAuteur) VALUES ($idAuteur)' );
c'est d'ailleurs ce qui se produit quand tu ecris $idAuteur = NULL sans
use strict; comme perl n'a aucune idee de ce que signifie NULL, il
affecte la chaine 'NULL' a $idAuteur. les experts perl me corrigeront.