Server : Charset ? Header() ? .htacces ?

maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010 - 13 févr. 2010 à 14:02
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010 - 14 mars 2010 à 13:25
Bonjour,

Cela fait plusieurs jours que je m'arrache les cheveux sur un problème que je rencontre sur mon hébergement.

J'ai développer un sondage web sur Easy PHP -> Tout marche très bien.

J'ai migré vers mon hébergeur et la j'ai beaucoup de problèmes notamment sur l'interprétation des fichiers par le serveur : les caractères ne s'affichent pas correctement et header() de PHP fonctionne sur les pages d'un sous dossier mais pas sur celle de l'index principal.

J'ai par moment une même page qui s'affiche correctement dans un type de codage et a d'autre moment elle s'affiche n'importe comment -> lorsque je remplace successivement un même dossier. A noter que c'est indépendant de si je rafraichi ou arrive sur la page pour la "première fois".

Hors-mi ce problème là, ce qui m'embête le plus c'est que sur certaines pages la fonction PHP header(); fonctionne très bien et sur l'index principal je me retrouve à tout les coups dans le exit("");

Bout de code de l'index principal -> redirection via header()
   
<?php    
//Start Session, controle and references
 session_start();

    if ( isset($_POST)&&(isset($_POST['Langue'])))
      {
         extract($_POST);  // Variable extraction of the global post table
         $_SESSION['ip_addr']=  $_SERVER['REMOTE_ADDR'];
         $_SESSION['langue']=$Langue;

         if($_SESSION['langue']=='Français')
         {
             header('Location: ./francais/index.php');
             exit('Erreur de chargement du questionnaire en '.$_SESSION['langue']);
         }
         else if($_SESSION['langue']== "English")
         {
             header('Location: ./english/index.php');
             exit('Loading error for the '.$_SESSION['langue'].' survey');
         }
      }
  ?>


J'ai donc vérifié ce code mais rien d'anormal à priori... Et cela ne peut pas être le contrôle Fran ç ais (où il va falloir que je force la value dans le select de mon code html à fran c ais afin de limiter les problèmes) car je me retrouve dans le Exit => le if fonctionne bien. De plus je n'affiche rien sur le document avant l'appel de header() (ce qui aurait pu tout expliquer) à moins que le extract écrive lui..?

J'ai donc déduit que c'est à un problème de codage que j'ai à faire...
J'ai tenté de déclarer le Charset ( : <?xml : ?>/ <meta :>), j'ai encodé mes pages en Unicode et en DOS (sous context, bien que je ne sais pas ce qu'ils entendent pas DOS=iso-8859-1? Latin-1? CP1252?).
Mais rien à faire...

C'est un hébergeur payant et plutôt bien réputé, donc je ne penses pas que l'erreur vienne d'eux (sauf s'ils ont imposé des limites pour la sécurité, mais dans ce cas le header() ne marcherait pas dans les pages php du sous-dossier). Quoi qu'il en soit je leur ai quand même écrit et attends leur réponse. A ajouter que dans ma session ftp je peux modifier le dossier log propre à mon hébergement.

[b]Bref, avez vous des idées de solution à mon/mes problèmes ?
Savez vous comment identifier l'encodage d'un fichier sous windows ? (puisque rebooter sous linux à chaque fois risque d'être laborieux)
Savez vous quelle peut être mon erreur dans le code php ?/b

Merci d'avance pour toute réponse car là je suis vraiment bloqué...

A bientot.

9 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
14 févr. 2010 à 12:08
Salut,

Quelques petites remarques :

les caractères ne s'affichent pas correctement

Essaye de commencer tes pages par header('Content-Type: text/html; charset=utf-8'); en remplaçant utf-8 par ton encodage bien entendu.

extract($_POST);

C'est à proscrire. Je t'invite à lire l'avertissement mis dans la documentation de PHP.

sur certaines pages la fonction PHP header(); fonctionne très bien et sur l'index principal je me retrouve à tout les coups dans le exit("");

header() n'interrompt pas le flux d'exécution, tu tombera toujours sur la ligne suivante. La plupart du temps c'est invisible vu que ton navigateur change de page immédiatement après avoir reçu le header lui demandant d'en changer, mais la suite est bien exécutée, d'où l'intéret du exit() afin d'empêcher que la suite en soit exécutée.

Après pour ce qui est de ton soucis de header dans les pages situées dans un sosu dossier je n'ai pas très bien compris ton problème.
0
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010
14 févr. 2010 à 14:34
Merci TychoBrahe,

Je vais essayer tout ça dès que possible.
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
14 févr. 2010 à 14:35
Salut,

isset($_POST)

=> il me semble que c'est inutile, $_POST étant une superglobale toujours accessible
(je sais, ça ne règle pas ton pb )

Tu n'es pas assez précis sur ton pb :
lorsque tu dis "je me retrouve à tout les coups dans le exit(""); " duquel parles tu ?
une des redirections fonctionne t elle ou restes tu sur un des messages des exit() ?

Pour lever le doute sur l'encodage tu devrais peut être faire un :
echo $_SESSION['langue'];
et voir du côté de mb_detect_encoding et du php.ini

Cordialement,

Kohntark -
0
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010
14 févr. 2010 à 17:13
= >
TychoBrahe


Après pour ce qui est de ton soucis de header dans les pages situées dans un sosu dossier je n'ai pas très bien compris ton problème.


En fait ce que je disais, c'est que dans les sous-dossiers la redirection fonctionne correctement.

L'arboressence est la suivante : (description des dossiers typée XML pour être plus clair)

<sondage>
         index.php
         <francais>index.php, etape2.php, etape3.php, ...</francais>
         <english>index.ph, ...</english>
</sondage>


Donc pour clarifier (dans le cas d'un sondage en francais seulement, puisque ce sera le même en traduit pour la version englaise qui viendra plutard) : [list]
[*] les redirections de <francais>index.php</francais> vers <francais>etape2.php</francais> ou de <francais>index.php</francais> vers <sondage>index.php</sondage> fonctionnent bien.
[*] Mais pas la redirection de <sondage>index.php</sondage> vers <francais>index.php</francais> ne fonctionne pas.
/list

Essaye de commencer tes pages par header('Content-Type: text/html; charset=utf-8'); en remplaçant utf-8 par ton encodage bien entendu.



(1*)J'ai encodé le code sous ConTEXT en unicode, donc à priori c'est bien du UTF-8, j'ai posé le header et j'ai supprimé le extract en adressant directement de $_POST[]. Je l'ai fait tourner sous EasyPHP et j'ai retrouvé le même problème que sur le server. Ce qui confirme donc que l'erreur vient à priori de moi. Voici ce que j'ai constaté :

(1*= >)EasyPHP n'interprete plus le code comme il faut : les CSS ne fonctionnent plus et le bout de code PHP (que j'ai ajouté pour suivre la variable) dans la page s'affiche tel quel ou presque (le code en question ci-dessous :)
<?php echo "".$_SESSION['langue']; ?>

et ce qui s'affiche est quelque chose comme ce qui suit :
".$_SESSION['langue']; (il n'y a pas tout le code php, seulement la fin)

(2*)Ensuite lorsque je met en commentaire les modifications la page s'affiche n'importe comment (une sorte de chinois, japonais, sumérien... plein d'idéogrammes exotiques quoi).

La je viens de supprimer la mise en commentaire et rétablit le code comme en (1*) et la page s'affiche correctement hors-mi les caractères accentués qui s'affichent sous la fameuse forme <?> (propre à linux de mémoire).

Bref, trois choses :
[list]

[*] Comment être sur de l'encodage du texte ? (là, pour le cas d'une page php, en lisant le poste de kohntark je viens d'avoir une réponse) Où dans windows peut on vérifier l'encodage d'un fichier texte ?

[*] Le codage des caractères spéciaux sous la forme : &#NNNN; est elle obligatoire ? Car en effet je n'ai pas codé mes caractères spéciaux avec cette notation et pourtant tout marchait bien jusqu'alors.

[*] Les déclarations de codage sont elles enregistrées par le serveur (ou EasyPHP en l'occurrence) ? Comment cela se passe t-il ? Le serveur identifie l'encodage et lorsque l'on déclare l'encodage, il enregistre ce changement. Si on supprime cette déclaration, l'interprétation de l'encodage ne change pas pour le serveur ?
/list

=>
kohntark


lorsque tu dis "je me retrouve à tout les coups dans le exit(""); " duquel parles tu ?
une des redirections fonctionne t elle ou restes tu sur un des messages des exit() ?


En fait dans les deux cas. Mais pour l'instant je me concentre surtout sur le cas du Français. Aucune des deux redirections ne fonctionnent.

Pour lever le doute sur l'encodage tu devrais peut être faire un :
echo $_SESSION['langue'];


Justement c'est ce que j'ai fait, dans le cas initial sur EasyPHP comme sur le serveur de l'hébergeur cela s'affiche correctement : avec le "ç".

En revanche dès que je spécifie l'encodage plus rien ne vas (Cf la description plus haut (1*)

mb_detect_encoding et du php.ini


Très pratique : mb_detect_encoding() = > UTF-8. (En revanche je ne comprends pas pourquoi il faut absolument y passer un argument $str puisque l'utilisation la plus courante doit être déterminer l'encodage de la page..? )

Très intéressant le php.ini, il me semble l'avoir déjà utilisé il y a longtemps... Je pense effectivement que j'ai intérêt à y faire un saut sous peu.

=> A priori je me retrouve maintenant sur easy php dans la même configuration que sur le serveur (lorsque j'avais fait la déclaration UTF, non pas via header, mais dans le <xml> et le <html>) et dans ce cas la redirection ne marchait toujours pas. Je vais continuer à chercher, notamment dans la direction du php.ini ...

Merci encore pour vos réponses.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010
14 févr. 2010 à 21:14
Juste une chose, comment tu modifies le php.ini si tu n'as pas accès au fichier : mon hébergement est partagé, par conséquent j'ai juste possibilité de consulter un info.php qui me donne ce qui est activé et ce qui ne l'est pas. J'ai rien trouvé sur le header(). Y a il moyen de modifier et consulter le php.ini d'une autre façon ?

Sinon, une autre question me vient : comment vérifier que l'encodage d'un texte ne comporte pas d'erreur ?
0
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010
15 févr. 2010 à 11:29
Je suis allé faire un tour sur d'autre topic en espérant y apporter des réponses mais en testant un code j'ai remarqué que l'affichage était aussi incohérent que ceux de mes codes :

code :

<?php header('Content-Type: text/html; charset=  utf-8'); ?>
<!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" />
    <title>Document sans titre</title>
  </head>
  
  
    <form id="aaa" name="form1" method="post" action="ess_bout.php">
    
    </form>
    
    
    <?php
    if(isset($_POST['button2008']))
    {
    echo 'ok '.'
';
    $champ = $_POST['button2008'];
    echo $champ;
    }
    else
    {
    echo 'nok '.'
';
    $champ =  $_POST['button2008'];
    echo $champ;
    }
    
    ?>
  
</html>


affichage (sous FireFox) :

'; $champ = $_POST['button2008']; echo $champ; } else { echo 'nok '.'
'; $champ = $_POST['button2008']; echo $champ; } ?>
0
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010
15 févr. 2010 à 11:59
J'ai ré-encodé avec notepad++ qui a identifié l'encodage en UTF-16. Je l'ai donc encodé en UTF8 et tout fonctionne... En bref, conTEXT c'est bien mais c'est pas encore ca...

Je vérifie pour le problème principal que c'est bien la solution.
0
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010
15 févr. 2010 à 12:04
A priori ca ne résout pas le problème de la redirection.
0
maximelien Messages postés 40 Date d'inscription jeudi 22 janvier 2009 Statut Membre Dernière intervention 23 juin 2010
14 mars 2010 à 13:25
J'ai finalement trouvé quelques temps après, je prend le temps de vous donner la réponse au problème :

Mon hébergement ne lisait pas correctement les fichiers UTF-8 avec BOM.

Par conséquent dès que j'utilisais un header ou une session (via Cookies), leur interpretation étant équivalente à une écriture (invisible) du BOM , ceci fermait l'entête HTTP et empêchait l'utilisation des fonction précités.

La solution : utiliser un codage sans BOM (type UTF-8 sans BOM), ANSI (=ASCII), UTF8 as ANSI ou type DOS [noms donnés par les éditeurs de texte].

En bref, c'était un problème de Char-set.
0