GNT sans publicité, site mobile, fonctionnalitées exclusives...

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;
Lire les 9 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Denis Dordoigne
Le #23206641
Bonjour,

my $id_auteur=undef;
(...)
$dbh_sql->do (qq {
INSERT INTO essai (idAuteur) VALUES ($id_auteur)



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
espie
Le #23207221
In article 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;



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.
luc2
Le #23208361
tu veux donc inserer NULL dans la base. la requete que tu veux executer
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.
Eric BERTHOMIER
Le #23211051
On 16 mar, 06:00, luc2
tu veux donc inserer NULL dans la base. la requete que tu veux executer
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.
luc2
Le #23211411
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.
Publicité
Suivre les réponses
Poster une réponse
Anonyme