11486 sujets

JavaScript, DOM et API Web HTML5

bonjour,

j'ai un retour json qui ne passe pas, sur une requête oracle.

Après avoir cherché Smiley biggol , j'ai réussi a circonscrire le bug car la requête directe en base passe sans soucis.

il s’avère que sur un des champs contient le symbole ° apparaît sur un enregistrement, ce qui fais planté l’interprétation du JSON dans le javascript. J'ai cherché partout sur le net mais impossible de trouvé une méthode pour que le json renvoyé par mon fichier php soit correctement interprété dans javascript.

je n'ais pas de code particulier a fournir, mais je pense que cela doit pouvoir être géré au niveau php.

Avez vous une piste pour intercepté ce type de caractère afin que l'interpretation puissent passer normalement.

cordialement.
Modifié par palouf34 (27 Sep 2017 - 10:09)
Salut,

Pas de solution miracle.
Le JSON doit être encodé en UTF8.
As tu bien encodé ta chaine avant la transformation ?
Il y a aussi pas mal de fonction de transformation de caractères, html_entities et autre qui peuvent transformer ton ° en autre chose de valide Smiley cligne
bonjour,

merci pour l'idée, je fais bien une function que je viens d'appliquer.


j'ai donc tenté de l'appliqué pour l'instant sur le champ en question lors de la boucle.
Je ne suis plus bloqué, donc il ya du mieux, mais le champ se retrouve vide.

j'ai tenté un "html_entities" directement sur l'affectation mais cela ne change rien.
la fonction utf8_encode provoque la même erreur.

la je ne vois pas quelle convertion je peux réaliser sur mon champ.


voici la fonction qui me permet de vérifier le contenu de la variable
function verifyInput($var)
{
    $var = trim($var);
    $var = stripcslashes($var);
    $var = htmlspecialchars($var);
    return $var;
}


une seconde piste, merci.
Modérateur
1) Comment est généré le JSON?

2) Quels sont les encodages: de la DB, des en-têtes HTTP, des fichiers php, etc?

3) «la fonction utf8_encode provoque la même erreur.» Quelle erreur?
1) je généré je le json via 2 array dont un est remplis via un boucle avec le données venant de la BDD oracle.
2) le fichier PHP qui génère l'html contient bien la balise pour l'utf8
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
.
mes fichiers sont édités avec visual studio code dont le paramétrage d'encodage est bien utf8
 // Encodage du jeu de caractères par défaut à utiliser durant la lecture et l'écriture des fichiers.
  "files.encoding": "utf8",

Pour ce qui est de la base de donnée je suppose qu'elle est en UTF8 car la requête que j'execute avec sqlplus passe sans soucis. mais impossible de vérifiez vraiment car j'ai pas vraiment la mains sur serveur oracle.

3) l'erreur que j'obtient sans ma function est "unknow". Je suppose que le json_encode échoue lamentablement a cause de ce caractère "°". Si je passe ma function "verifyInput()" alors mon champ est vide, le nettoyage a été radical mais la traitement vas jusqu'au bout.
Modérateur
palouf34 a écrit :
1) je généré je le json via 2 array dont un est remplis via un boucle avec le données venant de la BDD oracle.

Certes, mais le JSON est généré comment? avec json_encode?

palouf34 a écrit :
l'erreur que j'obtient sans ma function est "unknow". Je suppose que le json_encode échoue lamentablement a cause de ce caractère "°".

Non utf8_encode n'est pas censé échouer à cause d'un caractère. Seulement «unknown» n'est pas un message d'erreur php, soit il manque de détails dans votre réponse soit votre code a ses propre gestion d'erreurs.

2) Et quel est l'encodage renvoyée dans la requête sur le json? (Outils de développements > réseaux )

p.s. : json et javascript gèrent parfaitement bien les caractères et les encodages lorsque ceux-ci sont gérés correctement. Un caractère comme le degré (°) ne doit pas poser de problèmes.
mon json est généré avec la commande suivante:


echo json_encode(array('succes'=>$array1,'data'=>$array2),JSON_UNESCAPED_UNICODE );


voici le var_dump de ma requete sql qui remplis l'array2 en désactivant le retour json.

objectifListeSorties.php:98:
array (size=22)
  0 => string '382' (length=3)
  'PRCLEUNIK' => string '382' (length=3)
  1 => string 'produit (+4?C)' (length=35)
  'PRNOM' => string 'produit (+4?C)' (length=35)
  2 => string '6003307' (length=7)
  'REFERENCE' => string '6003307' (length=7)
  3 => string '4010' (length=4)
  'SERVICE' => string '4010' (length=4)
  4 => string '1' (length=1)
  'QUANTITE' => string '1' (length=1)
  5 => string '20170322' (length=8)
  'TO_CHAR(B.DATEMVT,'YYYYMMDD')' => string '20170322' (length=8)
  6 => string '1034' (length=4)
  'HEUREMVT' => string '1034' (length=4)
  7 => string '6' (length=1)
  'MONTANT_HT' => string '6' (length=1)
  8 => string '6,42' (length=4)
  'MONTANT_TTC' => string '6,42' (length=4)
  9 => string '0' (length=1)
  'A.PRIXVALORISATIONT2A*B.QUANTITE' => string '0' (length=1)
  10 => string '955376' (length=6)
  'MVTCLEUNIK' => string '955376' (length=6)


voici le var_dump de l'array 1

objectifListeSorties.php:121:
array (size=8)
  'dateDebutLot' => string '2017-03-22' (length=10)
  'dateDebutLotError' => string '' (length=0)
  'dateFinLot' => string '2017-03-22' (length=10)
  'dateFinLotError' => string '' (length=0)
  'download' => string 'non' (length=3)
  'downloadError' => string '' (length=0)
  'isSucces' => boolean true
  'ufSelection' => string '0' (length=1)



et pour finir la partie qui controle en cas d'erreur sur le json

error: function(result){
          // console.log(result)
          var erreur= result.responseText;
          console.log(erreur);
          $("#tableauListSortie").html("");
          $("#messageErreur").html("<span id=\"clignote\" style=\"color:red\"><p>Erreur rencontré ! "+erreur+"</p></span><br>");
          //alert( result['codePharma'] );
          //alerte(postdata);
          postdata="";
        }



Ma base oracle a ces paramétres:

 
select * from NLS_DATABASE_PARAMETERS ;


NLS_LANGUAGE	AMERICAN
NLS_TERRITORY	AMERICA
NLS_CURRENCY	$
NLS_ISO_CURRENCY	AMERICA
NLS_NUMERIC_CHARACTERS	.,
NLS_CHARACTERSET	WE8ISO8859P15
NLS_CALENDAR	GREGORIAN
NLS_DATE_FORMAT	DD-MON-RR
NLS_DATE_LANGUAGE	AMERICAN
NLS_SORT	BINARY
NLS_TIME_FORMAT	HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT	DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT	HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT	DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY	$
NLS_COMP	BINARY
NLS_LENGTH_SEMANTICS	BYTE
NLS_NCHAR_CONV_EXCP	FALSE
NLS_NCHAR_CHARACTERSET	AL16UTF16
NLS_RDBMS_VERSION	11.2.0.4.0


et

SELECT * FROM NLS_SESSION_PARAMETERS ;

NLS_LANGUAGE	FRENCH
NLS_TERRITORY	FRANCE
NLS_CURRENCY	€
NLS_ISO_CURRENCY	FRANCE
NLS_NUMERIC_CHARACTERS	, 
NLS_CALENDAR	GREGORIAN
NLS_DATE_FORMAT	DD/MM/RR
NLS_DATE_LANGUAGE	FRENCH
NLS_SORT	FRENCH
NLS_TIME_FORMAT	HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT	DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT	DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY	€
NLS_COMP	BINARY
NLS_LENGTH_SEMANTICS	BYTE
NLS_NCHAR_CONV_EXCP	FALSE

Modifié par palouf34 (28 Sep 2017 - 09:10)
j'ai trouvé une solution temporaire en parsant le champ avec utf8_decode, ce qui permet de transformé le ° en ? sur le retour.

C'est pas encore satisfaisant, je continu à chercher une solution beaucoup plus propre pour avoir le bon caractère.
au final j'ai trouvé mon bug.

lors de ma connexion a mon serveur oracle je ne spécifiait pas l'encode ce qui foutais la merde dans le retour de la requête.

j'ai juste rajouté 'UTF8' a mon instruction "oci_connect" et tout rentre dans l'ordre.