Discussion:
Problème entre CGI et DBI ?
(trop ancien pour répondre)
Thierry
2010-09-13 12:18:48 UTC
Permalink
Bonjour, j'ai un gros problème de CGI incompréhensible (enfin, pour moi):

Dans une page HTML, j'ai un formulaire pour uploader un fichier ainsi qu'un
commentaire.
Ce formulaire appel un script Perl qui récupère le fichier et le
commentaire. Après avoir stocké le fichier (fichier_temp) sur le serveur, le
nom de ce fichier et le commentaire sont répertoriés dans une base MySQL.

Chez moi, sur mon serveur, aucun problème.
Par contre, sur le serveur hébergé, il y a un gros problème que j'ai eu du
mal à comprendre:
Quand la taille du fichier dépasse une certaine limite (env. 1,7Mo), si le
commentaire contient des caractères accentués, ils ne sont pas stockés
correctement dans la base, comme si elle n'était pas configurée en UTF-8
("systÚme" au lieu de "système", par exemple). Alors que si le fichier est
plus petit, aucun de problème.

J'ai essayé d'isoler le problème et c'est dès que la ligne "$query=new CGI;"
est présente qu'il se produit.
Si je supprime toutes les lignes entres "$dbh->do("set names 'utf8'");" et
"$dbh->do(qq{insert into documents (nom, commentaire) values ("$nom",
"$comm")});" et quelque soit la taille du fichier, les accents sont stockés
correctement. Le simple fait d'ajouter la ligne "$query=new CGI;", même sans
les autres, provoque le problème.

Je suis dans la quatrième dimension depuis 2 jours, si vous avez une idée,
n'hésitez surtout pas...

PS: Même si je remplace "$comm" par "système" dans la ligne
"$dbh->do(qq{insert into documents (nom, commentaire) values ("$nom",
"$comm")});", le problème se produit aussi, alors que le fichier upload.pl
est codé en UTF-8.

En résumé:
Partie HTML:

<form action="/cgi-bin/upload.pl" method="post"
enctype="multipart/form-data" accept-charset="utf-8">
<input type="file" name="fichier">
<br>
Commentaire:<input type="text" name="comm">
</form>

--------------------------------------------------------

Partie Perl (script upload.pl):

use CGI;
use DBI;
$dbh=DBI->connect("DBI:mysql:xxxx",'xxxx','xxxx');
$dbh->do("set names 'utf8'");

$query=new CGI;
$nom=$query->param('fichier');
$comm=$query->param('comm');
$upload_filehandle = $query->upload("fichier");
open (UPLOADFILE, ">fichier_temp");
binmode UPLOADFILE;
while (<$upload_filehandle>)
{
print UPLOADFILE;
}
close UPLOADFILE;

$dbh->do(qq{insert into documents (nom, commentaire) values ("$nom",
"$comm")});
$dbh->disconnect;

---------------------------------------------

Les serveurs:

Chez moi:
Apache/2.0.54
Linux Fedora Core 4
mysql Ver 14.7 Distrib 4.1.11, for redhat-linux-gnu (i386)
This is perl, v5.8.6 built for i386-linux-thread-multi

Chez l'hébergeur:
Apache: Server version: Apache/1.3.41 (Unix)
Mysql: Server version: 5.0.51a Source distribution
This is perl, v5.8.8 built for i386-freebsd-64int
FreeBSD 5.5-RELEASE-p20
Patrick Texier
2010-09-14 16:03:13 UTC
Permalink
Post by Thierry
Je suis dans la quatrième dimension depuis 2 jours, si vous avez une idée,
n'hésitez surtout pas...
Il semble que vous ne connaissez rien à Perl et sans doute pas grand
chose à la gestion des jeux de caractères dans MySql.

Message d'hier sur fr.comp.lang.perl :
Message-ID: <4c8e16a5$0$5434$***@reader.news.orange.fr>
--
Patrick Texier

vim:syntax=mail:ai:ts=4:et:tw=72
Loading...