Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme Net::MySQL: $mysql->query(q

1 réponse
Avatar
varlog2002
bonjour,

Je débarque dans le monde du développement et plus particulièrement
dans perl.

J'ai un problème de récupération de variable que je veux injecter dans
une base sql. Voici le bout de code:

for my $nom_obj ($np->get_nom_objects())
{
print
'Nom : '.$nom_obj->name()."\n",
'Address : '.$nom_obj->addr()."\n",
'BP : '.$nom_obj->bp()."\n",

$A = $nom_obj->addr();
$N = $nom_obj->name();
$B = $nom_obj->bp();

@fields = ($A,$N,$B);


$mysql->query(qq!
INSERT INTO `matable` (`Nom`, `Address`, `BP`, `X`,
`Y`) VALUES ('$fields[0]', '$fields[1
]', '$fields[2]', '$fields[3]', '', '')
!);
}


Pour chaque $nom_obj je récupère correctement le contenu de Nom,
Address et BP et je les imprime correctement à l'écran.
$nom_obj n'est jamais vide et je peux toujours afficher le Nom mais
parfois Address et/ou BP peuvent être vides.

Jusqu'ici tout va bien, pas de problème au niveau de l'affichage,
j'obtiens un truc du genre
Nom: toto
Address: paris
BP:
Nom: titi
Address:
BP:
Nom: tata
Address: Chartres
BS: 28000

Je veux donc mettre ces valeurs dans une base mysql et là ça se passe
mal: suivant les données que j'ai en entrée, l'enregistrement sql
s'effectue quand il veut bien.
J'ai l'impression que @fields n'est pas toujours bien organisé ou que
les $fields[x] ne sont pas correctement chargés.
Quand ça marche les logs sql montrent clairement la requete et les
données sont bien dans la table, quand ça ne marche pas le code
s'arrète au niveau du INSERT et je n'ai rien d'autre que la connexion
dans les logs sql.

Est-ce la bonne manière pour passer des variables dans le INSERT ?
J'ai raté un truc ? (ça c'est sur)
C'est du code écrit avec les pieds ? (normal, je débute dans le dev ;)
)

Par avance merci pour vos commentaires et votre aide.

1 réponse

Avatar
Maxime Wojtczak
Bonjour,

DBI::Mysql (et non Net::MySQL) disposee d'une fonctionnalité bien
pratique pour ne pas avoir à se poser de problèmes vis à vis du passage
de chaines de caractères dans les requètes MySQL, ca s'appelle les "bind
values" (du moins, je crois que ca s'appelle comme ca).

Ce code

$mysql->query(qq!
INSERT INTO `matable` (`Nom`, `Address`, `BP`, `X`,`Y`)
VALUES ('$fields[0]', '$fields[1]', '$fields[2]', '$fields[3]', '', '')
!);

devient:

$sth=$mysql->prepare('INSERT INTO matable (nom,address,bp,x,y) VALUES
(?,?,?,?,?)');

Cette fonction est à appeller une seule fois, au début de ton algo,
puis, quand cela est necessaire:

$sth->execute($fields[1],$fields[2],$fields[3],'','');

Sinon, si le problème ne vient pas de la, jete un coup d'oeil à
$mysql->errstr, ca peut toujours servir...

Max

Var Log wrote:
bonjour,

Je débarque dans le monde du développement et plus particulièrement
dans perl.

J'ai un problème de récupération de variable que je veux injecter dans
une base sql. Voici le bout de code:

for my $nom_obj ($np->get_nom_objects())
{
print
'Nom : '.$nom_obj->name()."n",
'Address : '.$nom_obj->addr()."n",
'BP : '.$nom_obj->bp()."n",

$A = $nom_obj->addr();
$N = $nom_obj->name();
$B = $nom_obj->bp();

@fields = ($A,$N,$B);


$mysql->query(qq!
INSERT INTO `matable` (`Nom`, `Address`, `BP`, `X`,
`Y`) VALUES ('$fields[0]', '$fields[1
]', '$fields[2]', '$fields[3]', '', '')
!);
}


Pour chaque $nom_obj je récupère correctement le contenu de Nom,
Address et BP et je les imprime correctement à l'écran.
$nom_obj n'est jamais vide et je peux toujours afficher le Nom mais
parfois Address et/ou BP peuvent être vides.

Jusqu'ici tout va bien, pas de problème au niveau de l'affichage,
j'obtiens un truc du genre
Nom: toto
Address: paris
BP:
Nom: titi
Address:
BP:
Nom: tata
Address: Chartres
BS: 28000

Je veux donc mettre ces valeurs dans une base mysql et là ça se passe
mal: suivant les données que j'ai en entrée, l'enregistrement sql
s'effectue quand il veut bien.
J'ai l'impression que @fields n'est pas toujours bien organisé ou que
les $fields[x] ne sont pas correctement chargés.
Quand ça marche les logs sql montrent clairement la requete et les
données sont bien dans la table, quand ça ne marche pas le code
s'arrète au niveau du INSERT et je n'ai rien d'autre que la connexion
dans les logs sql.

Est-ce la bonne manière pour passer des variables dans le INSERT ?
J'ai raté un truc ? (ça c'est sur)
C'est du code écrit avec les pieds ? (normal, je débute dans le dev ;)
)

Par avance merci pour vos commentaires et votre aide.