Problème complexe formulaire

Eléphanteau du PHP | 15 Messages

22 oct. 2008, 22:55

Bonjour à tous,

J'ai un problème et ne sachant pas trop où poster je pose ma question ici. J'ai fait un site intégrant une partie en français et une partie en russe (alphabet cyrillique). L'affichage du site en latin et en cyrillique ne posent pas de problème les formulaires réalisés dans les deux langues non plus, les envois des variables des formulaires passent par un script PHP que voici et tout va bien :
<?php
$TO = "[email protected]";

$subject = "Retour formulaire RU";

$h = "From: Mon site";

$message = "";

while (list($key, $val) = each($HTTP_POST_VARS)) {
  $message .= "$key : $val\n";
}

mail($TO, $subject, $message, $h);

header("Location:  [ Lien ]");

?>
Mon problème est le suivant. Lorsque mes visiteurs remplissent le formulaire en russe les caractères affichés dans le mail ne sont plus en cyrillique mais en une suite de caractères incompréhensibles. J'ai essayé de modifier le charset de la page html du formulaire ainsi que de la page PHP d'envoi de variables rien n'y fait les caractères ne s'affichent pas en russe. Alors j'ai pensé à une solution alternative qui serait d'enregister les réponses des formulaires russes sur un fichier TXT et de l'envoyer à mon mail via un fichier joint. Est-ce que vous pensez que celà peut fonctionner sachant que si je tape un notepad en russe sur mon ordinateur tout marche bien ? Si oui étant gros débutant pourriez-vous m'indiquer le code a rajouter pour faire celà ?

Merçi d'avance vous me retireriez une grosse épine du pied.

Eléphanteau du PHP | 26 Messages

23 oct. 2008, 09:02

Salut,

Je pense qu'il faut que tu définisse le charset dans le mail pour que ça passe en cyrilique.
ex:
$headers  = 'MIME-Version: 1.0' . "\r\n";
     $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

     // En-têtes additionnels
     $headers .= 'To: Mary <[email protected]>, Kelly <[email protected]>' . "\r\n";
     $headers .= 'From: Anniversaire <[email protected]>' . "\r\n";
     $headers .= 'Cc: [email protected]' . "\r\n";
     $headers .= 'Bcc: [email protected]' . "\r\n";

     // Envoi
     mail($to, $subject, $message, $headers);

ViPHP
ViPHP | 4674 Messages

23 oct. 2008, 13:50

Hey :),

Et moi je pense qu'il serait bon d'utiliser unicode pour un peu plus d'uniformité. Peut-être se tourner vers UTF-8. Est-ce que ça te cause ou pas du tout ?
De cette façon, tu n'aurais plus de problèmes pour passer d'un encodage à l'autre car UTF-8 couvre un très grand nombre d'encodage (sinon passe à UTF-16, mais je doute que tu en es besoin :)).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 15 Messages

23 oct. 2008, 18:50

Oui j'ai bien entendu parler de la modification du charset. Le problème c'est que je ne connais rien au PHP et je suis totalement incapable d'en modifier une virgule et encore moi d'en faire une ligne.

Donc je vais abuser mais commer définir l'UTF-8. Quoi écrire et où ? Dans le script? dans le formulaire ?

C'est la galère complète celà plusieurs semaines que je suis dessus et je n'ai rien réussi à faire même pas envoyer un fichier txt pour voir si par ce biais les cractères russes passeraient mieux.

On est prêt à acheter si il le faut un script tout fait car on a pas pu lançer le site à cause de ça et on a tout une équipe bloquée, ça commençe à chaud.

ViPHP
ViPHP | 4674 Messages

23 oct. 2008, 18:58

Le problème quand on change d'encodage, c'est qu'il faut connaître un minimum.
Tape « utf-8 » dans Google (si tu es en France) et t'auras déjà pas mal de truc à savoir. Il faut modifier l'encodage des pages, de la base de données etc. Ça dépend de ce qui est fait, à faire etc.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 15 Messages

23 oct. 2008, 19:29

Merci pour ta réponse. J'ai fait des recherches en ce sens mais le problème c'est c'est souvent un travail fond il faut apprendre complètement le PHP pour s'en sortir et là je n'ai plus le temps je suis dans l'urgence absolue. J'aimerais bien essayer le transfert des données sur un fichier txt et l'envoyer au mail pour voir si comme ça ça fonctionnerait il parait que c'est hyper simple à faire mais celà fait des dizainnes d'heures que je cherche partout que je ne lis que des messages de gens qui me disent que c'est hyper simple mais jamais la ligne de code à ajourter pour que celà marche.

Je nage complètement et je n'en peux plus d'être bloqué depuis des semaines pour deux lignes codes à ajouter sans rien trouvé sur internet.

Om m'a dit qu'il fallait rajouter ça : $fp = fopen("fichier.txt","w+" );

Si je fais mon code comme ça est que je peux envoyer un fichier texte avec les données de mon formulaire ?????
<?php 
$TO = "[email protected]"; 

$subject = "Retour formulaire RU"; 

$h = "From: Mon site"; 

$message = ""; 

while (list($key, $val) = each($HTTP_POST_VARS)) { 
$message .= "$key : $val\n"; 
} 

mail($TO, $subject, $message, $h); 

header("Location: [ Lien ]"); 

$fp = fopen("fichier.txt","w+" );

?>

ViPHP
ViPHP | 4674 Messages

24 oct. 2008, 00:24

Si la solution que tu sous-entends est de mettre le texte dans un fichier joint, je te préviens que cela ne va pas résoudre ton problème, loin de là …

Le problème c'est que la solution demande des connaissances en Informatique. Désolé de te l'apprendre, mais pour programmer, il faut être programmeur.

Oui, le problème que j'ai soulevé est un problème de fond, mais les problèmes d'encodage ne sont jamais très joyeux … Si tu as une autre solution, je veux bien t'aider dans l'urgence, mais ce serait une bidouille qui ne serait pas toujours fonctionnelle. La solution de ludwig serait la bonne dans ce cas. En fonction de la langue, tu redéfinis l'encodage de ton mail. Ça t'oblige à gérer plusieurs encodages ce qui est très ennuyeux (mais urgence pour urgence). De plus, c'est nettement plus simple que d'ajouter un fichier en pièce jointe (comme tu n'as aucune connaissance, on va faire avec les moyens du bord). Regarde sa réponse et revient avec de nouvelles questions :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 15 Messages

25 oct. 2008, 00:39

Merci pour ton message. Je suis bien d'accord que pour programmer il faut être programmeur c'est un métier. C'est pour celà que je me suis permis de poster dans différent forum débutants pour le PHP. Le problème c'est qu'un peu partout on m'a dit comment faire qu'elle fonction utiliser mais jamais la syntaxe qui va avec comme si celà aller de soit. On me dit souvent "utilise la fonction truc machin que tu adapte à ton code et c'est bon je l'ai déjà fait". Mais mon problème est justement COMMENT ecrire la fonction trucmachin dans mon code je suis incapable de l'adapter en PHP ?

Il y a une syntaxe très précise à respecter ce n'est pas à toi que je vais l'apprendre et en lisant sur des forums certaines corrections de codes PHP qui ne fonctionnaient pas pour une virgule mal placée fait par des gens ayant beaucoup plus d'expérience que moi, je me dis qu'à mon niveau je n'y arriverais jamais.

C'est pour celà que j'ai demandé un peu partout si quelqu'un connaissait un code éventuellement à acheter ou même quelqu'un qui pourrait nous sortir de cette merde que l'on est prêt à rémunérer.

Notre problème c'est que ce site qui est bloqué depuis des semaines à cause de cet envoi de caractères cyrilliques n'est pas un site d'amateurs de champignons ou de phillatelistes mais un site professionnel dont toute une équipe se trouve bloquée. Mais c'est de ma faute j'ai fait le site très vite sans problème maitrisant tout de même un peu le html et en me lançant dans cette opération je n'ai pas imaginé une seconde être bloqué par l'envoi des caractères cyrilliques dans les formulaires de mail car sur notre premier site (en français) tout c'est très bien passé.

Mes souvenirs de programmation remontent à plus de 20 ans lorsque je voulais en faire mon métier et qu'à l'époque je maitrisais totalement le basic et l'assembleur sur processeur Z80 (les seniors s'en souviendront). Depuis j'ai prit une autre voie et tout perdu même si quelques reflexes restent.

Bref pour revenir à mon problème j'ai vu une partout qu'il fallait que je définisse le charset car le mail. Voilà mon code modifié. j'ai mis au pif la ligne de comme indiquée par ludwig en modifiant le charset je vais faire un essai pour voir sans grand espoir.
<?php 
$headers .= 'Content-type: text/html; charset=utf-8'. "\r\n";

$TO = "[email protected]"; 
$subject = "Retour formulaire RU"; 
$h = "From: Mon site"; 
$message = ""; 
while (list($key, $val) = each($HTTP_POST_VARS)) { 
  $message .= "$key : $val\n"; 
} 
mail($TO, $subject, $message, $h); 
header("Location:  [ Lien ]"); 
?>
En passant on m'a dit ailleurs que mon de PHP était obsolète par le message suivant :

"Bonjour,

Tout d'abord jette ton code PHP à la poubelle (voire même à la déchetterie) car il est complètement obsolète (utilisation de $HTTP_POST_VARS au lieu de $_POST) et parce qu'il n'est pas sécurisé du tout.

Avec ce code, du fait qu'il n'y ait aucune vérification sur les champs postés, on peut faire passer tout et n'importe quoi dans le message. De même, le header "From" doit contenir une adresse e-mail.

Je t'invite donc tout d'abord à recoder proprement ton formulaire en ajoutant des vérifications puis on regardera pour ce problème de charset. Tu devras très certainement encoder tes fichiers en utf-8 pour gérer les caractères cyrilliques."

Volià je t'ai soumis toutes les données du problème encore merci pour ton aide.

ViPHP
ViPHP | 4674 Messages

25 oct. 2008, 00:53

Bien, on va se retrousser les manches donc …
Premièrement, oui ton code est obsolète. On n'utilise plus while(list() = each()) mais foreach() qui est bien plus rapide. Ensuite, on n'utilise plus non plus $HTTP_POST_VARS mais $_POST. Et le tout, depuis un moment déjà. Pour l'en-tête From du mail, ça se discute mais bon, on va résoudre ça hein :).

Deuxièmement, tu as deux solutions qui s'offrent à toi. La première consiste à faire un travail propre qui sera pérenne mais il te prendra un peu de temps (fonction du travail déjà existant et de ta motivation). La seconde consiste à faire un travail dégueulasse, c'est un chewing-gum sur une fuite d'un générateur nucléaire, mais ça permettrait de te débloquer temporairement. Néanmoins, c'est même pas dit que ça marche …

Ce que je te préconise donc, c'est de passer tout le site en unicode ; on prendra utf-8. J'aimerais savoir en quel encodage sont les pages actuellement, si ce sont des pages dynamiques ou statiques (PHP ou uniquement HTML ?), si tu utilises une base de données, et si tu as des notions d'encodage.
On va commencer par là.

Maintenant, juste pour informations, si ta page est encodée en latin1 (iso-8859-1(5)) et que tu encodes ton mail dans un autre encodage, ça ne changera rien. Les données sont envoyées en latin1 et à moins de modifier les bits de parités, faire des décalages, regrouper et redécouper les bits suivants, tu ne peux pas changer l'encodage comme ça. Donc je préfère modifier l'encodage général où tu seras sûr de ne plus avoir de problème.

Otes moi d'un doute, tu ne travailles pas en PHP 4 :-k ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 15 Messages

25 oct. 2008, 02:35

Encore merci à toi de m'aider. Je vais essayer de répondre a tes questions avec la plus grande précision possible.

- Les pages en français ont en entête de la page hml le charset 8859-1. pour la page html destinée à gérée le fomulaire j'ai défini le charset en utf-8 après les différentes lectures que j'ai pu faire sur le web. En résumé le charset défini en début de chaque page est 8859-1 pour les pages en français et en anglais et en utf-8 pour les pages en russe et en ukrainien. La chose que je ne comprend pas c'est que lorsque j'essaye de définir le charset en 8859-1 pour des pages russe les textes russe du site s'affichent correctement. Il n'y a que l'envoi des mails qui pose problème J'ai essayé plusieurs charset dont j'ai trouvé les références ici :

http://www.referencement-team.com/metat ... arset.html

J'ai même lu des messages qui me disait d'utiliser un charset russe ou le 8859-5 mais on m'a plus conseillé l'utf-8 ou le koi8-r.

Le code de la page formulaire commence comme ça :

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Ca ne donne rien avec cette définition.

Toutes les pages du site sont statiques (html) et je n'emploie le PHP que pour l'envoi de formulaires. Le script PHP est appelé dans le formulaire.

La chose que je n'arrive pas à savoir lorsque l'on me parle de l'encodage du mail c'est de savoir à quel moment ça se fait cet encodage, au niveau du html ou du PHP ?

Par essai j'ai défini le charset UTF-8 aussi dans la page PHP d'envoi du mail. pas de résultat non plus.
Je ne sais pas si c'est du PHP4. Je fais le site avec le Dreamweaver CS3.


J'ai essayé la correction du code PHP que tu m'as indiqué mais tu dois voir a quel point je suis nul car ce code me génère une erreur. Voilà la ligne modifiée :
foreach($_POST)) {
  $message .= "$key : $val\n";
}

à la place de :

while (list($key, $val) = each($HTTP_POST_VARS)) { 
  $message .= "$key : $val\n"; 
} 

J'espère que ces réponses te parlerons. A+

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 oct. 2008, 09:07

Modération :
LaurentLB, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 4674 Messages

25 oct. 2008, 13:56

Je vais commencer par la correction du code (même si ce ne sera pas le final) :
foreach($_POST as $key => $value)
    var_dump($key, $value);
Regarde le comportement de ce code. Et n'hésite pas à aller lire le manuel : La boucle foreach.

L'encodage intervient à plusieurs endroits.
En tout premier lieu, comme tes pages sont toutes statiques (on va gagner vachement de temps), il faut que tes fichiers soient encodés en utf-8.
Ensuite, tu dois avoir un charset (un character set soit un ensemble de caractère) unicode, donc on prendra utf-8.
Enfin, comme certains navigateurs ont du mal de comprendre le charset HTML, on va le donner en en-tête HTTP.
Accessoirement, on redéfinit aussi le charset du mail pour certains outils de messagerie.

Ah oui, avant de continuer, laisse tomber le koi8-r. Le but d'unicode est d'uniformiser les codes justement. On ne va pas en gérer 50, ce serait une vraie galère.

Bien, c'est parti.
Tu travailles avec Dreamweaver … hmmm il faut que tu trouves l'encodage qu'il utilise dans les fichiers. Une fois que tu le connais, il faut modifier l'encodage de tous les fichiers. Pour ça :

Code : Tout sélectionner

iconv -f [encodage de départ] -t utf-8 [fichier(s)] > test.html
Si tu n'es pas sûr que iconv comprenne ton encodage de départ, regarde s'il existe dans la liste :

Code : Tout sélectionner

iconv -l
Et enfin, [fichier(s)] sera remplacé par un seul fichier histoire de tester si ça marche, et le résultat sera enregistré dans test.html. On verra pour le faire sur tous les fichiers plus tard.
Ça, ça fonctionne sous Unix (Linux, BSD, Mac), mais je doute que la commande existe sur Windows …
Je suis allé sur iconv.org car il met en place une interface graphique Web pour faire ça au lieu de le faire en ligne de commande, et je suis tombé sur Charco. Je ne l'ai pas testé mais c'est un programme qui fait la même chose que ma ligne de commande sauf que c'est un programme avec une interface graphique et il existe sous Win, Mac et Linux. Je viens de le tester en fait, ça marche bien et c'est très simple à utiliser. Tu devrais t'y retrouver.
Ah oui, une fois que c'est fait, modifie l'encodage de Dreamweaver pour qu'il lise et écrive les fichiers en utf-8, ce sera mieux …

Maintenant que tes fichiers ont le bon encodage, tu peux écouter Doxology (al Dios De Bondad) sur le live in Switzerland de Abe Laboriel & Friends, et danser un peu. Prend un thé (ou un café pour les autres là) et on y retourne.

Il faut préciser sur chaque page que le contenu HTML est codé en utf-8. Pour ça :

Code : Tout sélectionner

<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> <meta http-equiv="content-script-type" content="text/javascript; charset=utf-8" /> <meta http-equiv="content-style-type" content="text/css; charset=utf-8" />
devrait suffir (tu utilises XHTML 1.0, j'ai donc mis un contenu application/xhtml+xml, ce n'est pas obligatoire, mais … bref … bon, ce n'est pas ton problème actuellement).

Histoire d'être vraiment sûr que le fichier soit envoyé en utf-8, on peut envoyer une en-tête HTTP. Normalement, comme le fichier est enregistré en utf-8, et que le code HTML spécifie bien (confirme) que c'est de l'utf-8, on ne devrait pas avoir de soucis, mais bon … mieux vaut prévoir que guérir hein. … … Je réfléchissais et je me disais qu'on n'allait pas faire ça tout de suite. Si et seulement si on n'aura encore des problèmes. Car sur mon site, je n'envoie pas l'en-tête et tout passe très bien. On verra. Ça t'évite du travail pour l'instant et ce n'est a priori pas obligatoire. On zap ça pour l'instant.

À ce stade, il faut vérifier que tes pages s'affichent bien. Si c'est le cas, on continue, sinon, bah revient sur le forum, dis nous exactement ce que tu as fait etc.
Donc, si on continue, on va s'attaquer au formulaire.
Voici le code à utiliser :
$to      = '[email protected]';
$subject = 'Sujet du mail';
$message = 'Notre message';
$headers = 'From: [email protected]' . "\r\n" .
           'Reply-To: [email protected]' . "\r\n" .
           'Content-Type: text/plain; charset=utf-8' . "\r\n";
mail(…);
Si $message est constitué des valeurs du formulaire, on aurait :
$message = null;
foreach($_POST as $key => $value)
    $message .= $key . ' : ' . $value . "\n";
Attention, on devrait utilisé base64 ou quoted-printable pour passer de l'unicode mais je ne suis plus sûr du cas d'utilisation. J'aimerais qu'on me confirme ça :). J'avais en mémoire que ça ne concernait que les en-têtes MIME …
On va faire sans pour l'instant et observer.

Il te faut PHP 4.0.6 au minimum, donc vérifie ta version de PHP :
var_dump(phpversion());
ou
phpinfo();
Tu as 3 étapes, commence par la première bien évidemment et n'hésite pas à revenir poser des questions.
Une fois que tout ça sera fait, il faudra toujours travailler avec utf-8, c'est à dire que tous tes éditeurs de page HTML, de texte, de n'importe-quoi-qui-te-sert-à-programmer devra utiliser utf-8. De cette façon, plus aucun problème d'encodage :).

J'aimerais aussi que tu conserves toujours à l'esprit que ce genre de problème n'a pas une seule façon de se résoudre. Beaucoup d'événements et d'éléments interviennent. L'environnement de développement y joue un rôle important et comme je ne le connais pas, c'est pas simple. Je t'ai donné ici un mode d'emploi générique et j'espère qu'il fonctionnera …
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 15 Messages

26 oct. 2008, 05:20

Merci beaucoup pour ce long message. Je rentre du boulot mais dès dimanche je m'y mets en essayant de suivre pas à pas ce que tu medis. Je vais inevitablement revenir pour beaucoup beaucoup de questions mais au moins ça me fera une bonne formation.

A dimanche dans la journée.

ViPHP
AB
ViPHP | 5818 Messages

26 oct. 2008, 07:53

Faudra ensuite éventuellement penser à protéger tes entêtes de mail ...

Je laisse HyWaN continuer ses explications.

Juste une remarque concernant Dreamweaver :
Comme l'a déjà dit HyWaN pour ne pas avoir de souci il est préférable d'écrire ton code dans un nouveau document dont le codage par défaut est l'UTF-8. Pour ce faire : menu "Edition" puis "Préférences", Catégorie "Nouveau document" et dans codage par défaut tu choisis Unicode UTF-8. Ne touche à rien d'autre, et surtout n'inclue pas la signature unicode (BOOM).

A savoir que si tu laisse ce réglage dans les préférences toutes tes prochaines pages seront codées en UTF-8... Cela dit ce serait aussi bien si tu fait d'autres réalisations, comme ça plus de problème que ce soit pour du Russe, de l'Allemand, du Chinois etc.
Histoire d'être vraiment sûr que le fichier soit envoyé en utf-8, on peut envoyer une en-tête HTTP...
C'est vrai que ça coute pas grand chose un petit
header('Content-type: text/html; charset=UTF-8');

d'autant que si le serveur envoie une entête iso elle prendra le pas sur l'entête html :-k

Attention, on devrait utilisé base64 ou quoted-printable pour passer de l'unicode mais je ne suis plus sûr du cas d'utilisation. J'aimerais qu'on me confirme ça
Je peux rien te confirmer "officiellement" mais d'après mes essais
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-type: text/plain; charset=UTF-8\n";
//$headers .= "Content-Transfer-Encoding: 64bit";
//$headers .= "Content-Transfer-Encoding: 8bit";
Que l'on mette l'une ou l'autre des lignes Content-Transfer-Encoding, ça fonctionne et cela fonctionne même si l'on en met aucune.
Enfin bon c'est juste empirique rien de plus (je me garderai bien d'en faire une règle générale).

ViPHP
ViPHP | 4674 Messages

26 oct. 2008, 12:07

Ok, bah on va faire sans pour l'instant et observer le comportement.

Concernant la protection des mails, j'avais oublié, mais on va y venir. C'est un problème secondaire/annexe.

Merci AB pour ta démarche de modification d'encodage dans Dreamweaver. Mes souvenirs de Dreamweaver remonte à mes débuts du Web, c'était au millénaire précédent :D. Bref, j'ai plus de souvenirs et ça a sûrement changé.

Au passage, tu changes l'encodage une fois avoir convertis tes fichiers. Si tu ouvres un fichier en latin1 alors qu'il est censé l'ouvrir en utf-8, tu auras n'importe quoi. Et si tu l'enregistres, ça va mettre un bordel pratiquement irréparable. Donc fait une sauvegarde de tout ça avant :).

Et c'est plutôt BOM que BOOM non ;-) (note, ça m'a bien fait rire car le BOM c'est un peu un pétard dans ton code …).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).