8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un gros soucis causé par un changement d'offre d'hébergement chez l'un de mes clients.

Je pense que les versions SQL ET PHP ont été mises à jour et je me retrouve avec un problème que j'avais résolu, mais cette fois qui est retourné à l'envers ... C'est assez difficile à expliquer.

Dans une page PHP où j'insère des données dans la BDD (ajout d'actualité ou de news), :

<?php
 
//Vérification des paramètres
 
mysql_set_charset('utf8');
 
$sql = INSERT INTO ...
 
?>


Dans l'ancienne version je faisais ceci avec " mysql_set_charset('utf8'); ".

Depuis le changement de l'offre d'hébergement, tous les champs contenant des accents ne s'affichent plus et aucune erreur PHP n'est affichée. En gros c'est tout blanc !

Ma question, c'est comment inverser ce " mysql_set_charset('utf8'); " pour pouvoir lire le contenu avec les caractères spéciaux, sans avoir besoin de tout ré-envoyer (environ 800 à 1000 envois) ?

Merci
Modifié par enls (19 Mar 2014 - 20:41)
Bonjour @enls,

Tu peux afficher ponctuellement les erreurs php sur ton fichier qui pose problème en copiant ce code tout en haut de ton fichier :
<?php
ini_set('display_errors', 1);
error_reporting(e_all);
?>
Hello,

enls a écrit :
tous les champs contenant des accents ne s'affichent plus et aucune erreur PHP n'est affichée.
(...)
pour pouvoir lire le contenu avec les caractères spéciaux, sans avoir besoin de tout ré-envoyer (environ 800 à 1000 envois) ?


Je ne comprends pas où est le souci exactement : dans le code que tu donnes, c'est une insertion, mais tu dis que plus rien ne s'affiche, et en même temps tu dis qu'il faudrait trouver une solution sans avoir besoin de tout renvoyer. Alors au final, le problème se situe dans l'insertion ou dans l'extraction des données ?

La première question à se poser, c'est : comment est-ce que c'est dans la base de données ? Est-ce qu'il y a bien les accents ? Est-ce que l'enregistrement des données a bien fonctionné ?

La deuxième question : à l'affichage, est-ce que ça concerne les nouvelles insertions, ou les anciennes, ou les deux ?
Salut! merci je vais essayer. Mais je pense qu'il n' y a pas d'erreur PHP. Ce sont + des erreurs d'encodage avec UTF8. Je vais essayer tout de même
Modifié par enls (09 Mar 2014 - 12:26)
Nyleor a écrit :
Hello,



Je ne comprends pas où est le souci exactement : dans le code que tu donnes, c'est une insertion, mais tu dis que plus rien ne s'affiche, et en même temps tu dis qu'il faudrait trouver une solution sans avoir besoin de tout renvoyer. Alors au final, le problème se situe dans l'insertion ou dans l'extraction des données ?

La première question à se poser, c'est : comment est-ce que c'est dans la base de données ? Est-ce qu'il y a bien les accents ? Est-ce que l'enregistrement des données a bien fonctionné ?

La deuxième question : à l'affichage, est-ce que ça concerne les nouvelles insertions, ou les anciennes, ou les deux ?


En fait, dans la base de données, tout y est. C'est bien dans la lecture de la BDD qu'il y a un soucis


Pour les nouvelles insertions, j'ai enlevé "mysql_set_charset('utf8');" juste avant l'insertion (voir le code que j'ai mis plus haut), et ça fonctionne.
Modifié par enls (12 Mar 2014 - 13:49)
Raphi a écrit :
Bonjour @enls,

Tu peux afficher ponctuellement les erreurs php sur ton fichier qui pose problème en copiant ce code tout en haut de ton fichier :
&lt;?php
ini_set('display_errors', 1);
error_reporting(e_all);
?&gt;


Rien ne s'est affiché. C'est donc bien, pas une erreur php ...
Modifié par enls (09 Mar 2014 - 12:36)
Dans ce genre de cas, il te faut faire un petit script isolé où tu vas pouvoir tester plusieurs choses pour déceler le problème.

Fais-toi donc un fichier qui contient ce code :
<html>...<meta http-equiv="Content-Type" content="text/html" charset="utf-8" /><?php
var_dump($bdd->query('SELECT `champ` FROM `table` LIMIT 1')->fetchColumn();
?>


Où `champ` est un champ qui contient des accents, et qui ne s'affiche pas dans ton script principal. Ensuite tu fais des utf8_encode() ou utf8_decode() à tout va, tu changes l'encodage du fichier, celui du charset HTML, etc. et tu regardes ce que ça donne.
Administrateur
Bonjour,

1: merci de supprimer le "urgent" du titre, ça n'a rien à y faire et nous n'aimons pas ça.

2: as-tu lu Comment diagnostiquer un problème d'encodage ISO ou UTF-8 ? qu'avait écrit Necromantik et l'astuce de Florent V. dont le lien est dans le lien précédent ?
Il y a un petit travail d'enquête minutieuse à faire pour voir où est le (ou les !) problème(s), c'est-à-dire prendre le temps d'éliminer une à une les hypothèses et sources d'erreurs possibles.
C'est aussi important de savoir d'où ne vient pas le problème que de savoir d'où il vient... C'est très facile de foirer quelque chose qui était bien encodé avant qu'on s'y intéresse Smiley lol
Nyleor a écrit :
Dans ce genre de cas, il te faut faire un petit script isolé où tu vas pouvoir tester plusieurs choses pour déceler le problème.

Fais-toi donc un fichier qui contient ce code :
&lt;html&gt;...&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html&quot; charset=&quot;utf-8&quot; /&gt;&lt;?php
var_dump($bdd-&gt;query('SELECT `champ` FROM `table` LIMIT 1')-&gt;fetchColumn();
?&gt;


Où `champ` est un champ qui contient des accents, et qui ne s'affiche pas dans ton script principal. Ensuite tu fais des utf8_encode() ou utf8_decode() à tout va, tu changes l'encodage du fichier, celui du charset HTML, etc. et tu regardes ce que ça donne.


Ce script n'affiche rien, même en enlevant la "LIMIT". utf8_encode() et decode ne change rien non plus. J'avais déjà utilisé ça pour un autre site avec un envoi sur facebook. Source d'ennui tout ça.
Bon rien n'a changé Smiley decu

--

Felipe a écrit :
Bonjour,

1: merci de supprimer le &quot;urgent&quot; du titre, ça n'a rien à y faire et nous n'aimons pas ça.


Je n'ai pas encore trouvé comment faire pour enlevé ça, mais mon problème reste cependant urgent ...

Felipe a écrit :
2: as-tu lu Comment diagnostiquer un problème d'encodage ISO ou UTF-8 ? qu'avait écrit Necromantik et l'astuce de Florent V. dont le lien est dans le lien précédent ?
Il y a un petit travail d'enquête minutieuse à faire pour voir où est le (ou les !) problème(s), c'est-à-dire prendre le temps d'éliminer une à une les hypothèses et sources d'erreurs possibles.
C'est aussi important de savoir d'où ne vient pas le problème que de savoir d'où il vient... C'est très facile de foirer quelque chose qui était bien encodé avant qu'on s'y intéresse Smiley lol


Le lien donné est intéressant, mais ça ne va pas résoudre mon problème. Je préfèrerais avoir des " é " plutot que rien !

Si je trouve la solution, je vous tiens au jus.
enls a écrit :
Ce script n'affiche rien, même en enlevant la &quot;LIMIT&quot;. utf8_encode() et decode ne change rien non plus


Comment ça ce script ne t'affiche rien ? La fonction var_dump() te renvoie quelque chose obligatoirement. S'il n'y a pas de résultat, elle te renvoie "boolean false" ; s'il y a quelque chose il te renvoie le résultat (et si le résultat est vide, il te renvoie quand même le type, la taille, etc.)...
Nyleor a écrit :


Comment ça ce script ne t'affiche rien ? La fonction var_dump() te renvoie quelque chose obligatoirement. S'il n'y a pas de résultat, elle te renvoie &quot;boolean false&quot; ; s'il y a quelque chose il te renvoie le résultat (et si le résultat est vide, il te renvoie quand même le type, la taille, etc.)...


lol. En effet, j'ai recopié ton post, et il manquait une paranthère. J'ai pris l'exemple dans le manuel de var_dump(); et en effet, ça retourne bien quelquechose.

En utilisant cette fonction, j'ai toujours un résultat. Mais c'est logique, parce que les données sont aussi dans la base ...

C'est le fait que ça ne soit pas lu du tout que je ne comprends pas. Ce blanc ...
Voilà autre chose.

Je fais ma requête avec while( $resultat = mysql_fetch_array( $requete ) ) ...
-> Là, le résultat ne s'affiche pas s'il y a un ou plusieurs caractères spéciaux.

En revanche, si je fais ma requête avec while( $resultat = mysql_fetch_object( $requete ) ) ...
-> Là, le résultat s'affiche correctement

Que comprendre ?
Commence déjà par demander clairement l'affichage des erreurs php et SQL; ça résoudra d'abord ton problème de pages blanches aléatoires qui ne fait que compliquer la situation.

Pour php: regarde du côté de display_errors, error_reporting et compagnie
Pour MySQL: tu sembles utiliser les anciennes fonctions mysql_*; regarde donc mysql_error; cela dit, on recommande de ne plus utiliser ces fonctions et d'opter pour PDO ou mysqli à la place. Si ton hébergeur est un peu tatillon, il peut en avoir désactivé quelques-unes.
Bonsoir QuentinC.

Je n'ai aucune erreur ni en PHP ni en SQL car c'est un problème d'encodage (UTF-8) qui est la source du problème.
Je pense que c'est le passage de PHP 5.2 à 5.4 qui est la cause du problème.

J'essaie maintenant de "renverser" ce que j'ai fais par le passé. Mais je crois que c'est peine perdue...


QuentinC a écrit :
Pour MySQL: tu sembles utiliser les anciennes fonctions mysql_*; regarde donc mysql_error; cela dit, on recommande de ne plus utiliser ces fonctions et d'opter pour PDO ou mysqli à la place. Si ton hébergeur est un peu tatillon, il peut en avoir désactivé quelques-unes.


Oui, j'ai bien compris qu'un jour il fallait s'y mettre, mais modifier tous les fichiers qui font appel aux BDD... Smiley sweatdrop Je vais devoir le faire quand même Smiley confus
Non mais ton truc de des fois ça fait page complètement blanche et des fois ça marche, ça arrive typiquement quand il y a une erreur non affichée. Alors soit tu actives l'affichage de toutes les erreurs pour être vraiment sûr qu'il n'y a vraiment rien de chez rien, soit tu vas regarder dans les logs si tu y as accès.

Sinon, pour arriver à bout des bugs d'encodage, il faut être très méthodique: vérifie à chaque étape quel encodage entre, quel encodage sort, que les fonctions de traitements travaillent bien avec des données qui sont dans l'encodage auquel elles s'attendent... il faut vraiment contrôler toute les étapes une par une et s'assurer que l'encodage est partout le même du début jusqu'à la fin, et sinon agir dans l'ordre de circulation normal des données. Si tu n'es pas méthodique, soit ça marchera une fois sur deux, soit à la prochaîne modif tu vas de nouveau tout casser parce que tu as résolu ton problème uniquement par chance parce qu'il y avait deux erreurs qui se compensaient l'une l'autre.

A contrôler dans l'ordre , deux fois, d'abord de 1 à 6, puis de 6 à 1 :
1 - L'encodage des données effectivement stockées dans la base
2 - L'encodage indiqué pour le stockage des champs / des tables / des bases dans les schémas
3 - L'encodage utilisé pendant la communication entre php et le serveur SQL
4 - Les fonctions php utilisées pour manipuler les chaînes reçues de la base
5 - L'encodage indiqué au navigateur grâce aux en-têtes HTTP
6 - L'encodage dans lequel le navigateur affiche effectivement la page et/ou envoie les données de formulaire

Note pour 5 et 6 et IE: il y a des bugs qui font que certaines fois, IE interprète systématiquement du contenu incorrectement en ISO-8859-X même si UTF-8 est bien spécifié partout. De quoi devenir encore plus fou...

Bonne chance.