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

$dbh->quote("t"): erreur sur interprétation dans MySQL

2 réponses
Avatar
ctobini
Bonjour,

Je suis en train d'=E9crire un script DBI de connection vers une base
MySQL 5.0.

J'ai utilis=E9 dans le shell MySQL la commande LOAD DATA LOCAL INFILE
qui marche correctement.

En revanche, lorsque je saisi :

my $sth =3D $dbh->do
(
sprintf
(
"
LOAD DATA LOCAL INFILE %s
INTO TABLE cel_tmp
FIELDS TERMINATED BY '\t'
ENCLOSED BY ''
LINES TERMINATED BY '\n'
",
$dbh->quote($name),
$dbh->quote("\t"),
$dbh->quote("''"),
$dbh->quote("\n")
"
)
) ;

J'ai comme message d'erreur :

DBD::mysql::db do failed: Duplicate entry '102-2_GW.CEL' for key 2
at ./feed_cels_load.pl line 15.

Je pense que sprintf et $dbh->quote font que les argument ne sont pas
bien pass=E9s =E0 MySQL.

Sauriez-vous comment y rem=E9dier ?

En vous remerciant,

C=2E Tobini

2 réponses

Avatar
Jean-Baptiste Mazon
(sans aller chercher trop profond côté DBI, j'y connais rien)

ctobini writes:
sprintf
(
"
LOAD DATA LOCAL INFILE %s
INTO TABLE cel_tmp
FIELDS TERMINATED BY 't'
ENCLOSED BY ''
LINES TERMINATED BY 'n'
",
$dbh->quote($name),
$dbh->quote("t"),
$dbh->quote("''"),
$dbh->quote("n")
"
)
) ;


En remplaçant pour simplifier quote par uc, le code est plus ou moins
équivalent au suivant:

printf '%s machin bidule', uc 'truc', uc 'machin', uc 'bidule';
-> TRUC machin bidule

L'effet recherché serait à mon sens obtenu avec ce genre d'appel:

printf '%s %s %s', uc 'truc', uc 'machin', uc 'bidule';
-> TRUC MACHIN BIDULE

Avatar
ctobini
Bonjour et merci de la réponse,

Je me suis trompé sur l'erreur, désolé.

En fait le problème est que :

$dbh->quote("t");

ne reconnait pas t dans la requête SQL, il y a un problème de
formatage apparement.

C. Tobini

En remplaçant pour simplifier quote par uc, le code est plus ou moins
équivalent au suivant:

printf '%s machin bidule', uc 'truc', uc 'machin', uc 'bidule';
-> TRUC machin bidule

L'effet recherché serait à mon sens obtenu avec ce genre d'appel:

printf '%s %s %s', uc 'truc', uc 'machin', uc 'bidule';
-> TRUC MACHIN BIDULE