IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[Forum] Paramètres POST récupérés en UNICODE mais ça dépend des fois ?


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 113
    Points : 82
    Points
    82
    Par défaut [Forum] Paramètres POST récupérés en UNICODE mais ça dépend des fois ?
    Bonjour, depuis un script jquery (DataTables) je passe un nom de mois en post à une page PHP.
    Tout se passe bien bien Sauf pour le mois d'Août (à cause de l'accent) et je ne comprends rien du tout à ce qu'il se passe.
    Tout d'abord, voici le js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [...] 
    ajax: 'php/listing_tables.php?nom_utilisateur='+$("#nom_utilisateur").val()+'&date_depense='+$("#date_depense").val();
    [...]
    Voici une partie de la page listing_tables.php lancée en ajax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php session_start(); 
    header( 'content-type: text/html; charset=utf-8' );
    $date_depense=(isset($_GET['date_depense'])?$_GET['date_depense']:'');	
    include "../../../bin/cnx/cnx.php";     
    $requete = "select ID_FACTURE FROM TBL_FACTURE"
    $requete .="WHERE upper(TO_CHAR(TO_DATE(DATE_FACTURE,'DD/MM/YYYY HH24:Mi'),'MM/YYYY')) = TO_CHAR(TO_DATE(('".$date_depense."','Mon YYYY'),'MM/YYYY') ";
    include "../../../bin/cnx/ordres.php";   
    <BOUCLE>
    echo "<br>date_depense	".$date_depense,
    "<br>requete	"$requete;
    include "../../../bin/cnx/dcnx.php";    
    ?>
    Dans le debug de Chrome, tout à l'air ok, et quand je regarde les flux (network) je lis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    "<br>date_depense	":"Août 2016"
    "<br>requete	":"SELECT distinct DATE_FACTURE, LIB_PRODUIT, FOURNISSEUR, MONTANT, ID_FACTURE 
    			FROM   (select  DATE_FACTURE
    				, TP.LIB_PRODUIT
    				, TFO.LIB_FOURNISSEUR||' ('||ADRESSE_FOURNISSEUR||')' AS FOURNISSEUR
    				, TF.MONTANT AS MONTANT
    				, TF.ID_FACTURE
    				, TS.NUM_AGENT
    		from     TBL_GESTRES_FACTURE        TF  
    				, TBL_GESTRES_PRODUIT       TP  
    				, TBL_GESTRES_FOURNISSEUR   TFO
    				, TBL_GESTRES_AGENT         TT
    				, TBL_AGENTS                TS
    		where   TF.ID_PRODUIT        = TP.ID_PRODUIT 
    		AND     TF.ID_FOURNISSEUR    = TFO.ID_FOURNISSEUR
    		AND     TF.ID_AGENT = TT.NUM_AGENT
    		AND     TT.NUM_AGENT = TS.NUM_AGENT
    		AND     TS.ANTENNE||NVL(TS.PROXIMITE,'0') like '00'
                    AND 	upper(TO_CHAR(TO_DATE(DATE_FACTURE,'DD/MM/YYYY HH24:Mi'),'MM/YYYY')) 
                            = TO_CHAR(TO_DATE(('Août 2016','Mon YYYY'),'MM/YYYY') ) WHERE 1=1 "
    mais la requête ne me renvoie rien alors que si je la copie dans toad j'ai bien une ligne.

    Depuis le debug de chrome, je lance la page appelée depuis le js dans un onglet du navigateur (clic droit + "open link in a new tab") :
    J'ai donc ceci :
    [/CODE]

    et dans le Network Chrome, je lis
    "date_depense":"Ao\u00fbt"
    soit le û au format unicode ...

    Dans la page PHP, j'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date_depense=htmlentities((isset($_GET['date_depense'])?$_GET['date_depense']:''))
    j'obtient
    Août
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date_depense=htmlentities(utf8_encode((isset($_GET['date_depense'])?$_GET['date_depense']:'')));
    j'obtient
    AoÃ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date_depense=htmlentities(utf8_decode((isset($_GET['date_depense'])?$_GET['date_depense']:'')));
    j'obtient
    Août
    mais en chargeant tout depuis le JS, la requête ne renvoie rien, et dans le débug je lis que
    "date_depense":"Ao&ucirc;t"
    Mes fichiers js et php sont en utf8 sans BOM.
    Je craque ...
    HELP ME PLEASE !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tes données ici sont dans l'URL et non en POST.
    Tu devrais utiliser encodeURIComponent() quand tu construis tes URL en Javascript.
    De manière générale, c'est beaucoup, beaucoup plus efficace de transmettre le numéro d'un mois que son nom en français.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 113
    Points : 82
    Points
    82
    Par défaut I tried hard but ...
    Merci pour ta réponse. Si j'ai bien compris, il faudrait que je fasse un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var res = encodeURIComponent("php/listing_tables.php?nom_utilisateur='+$("#nom_utilisateur").val()
    															+'&date_depense='+$("#date_depense").val());
    puis, un peu plus loin dans mon appel AJAX faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [...]
    ajax : res,
    [...]
    Ça ne fonctionne pas, car il encode mon url avant et l'ajax ne comprend plus.
    Je suis d'accord avec toi sur le fait de transmettre des chiffres plutot que des lettres. Mais pour mes dates, j'utilise DatePicker et je ne maîtrise pas les échanges intrinsèque au plug in. Avec un select çeut été possible.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est les valeurs qui faut encoder, pas l'url entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var res = 'php/listing_tables.php?nom_utilisateur='+encodeURIComponent($("#nom_utilisateur").val())
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 113
    Points : 82
    Points
    82
    Par défaut same player shoot again.
    Je viens d'essayer ... ça ne marche toujours pas.
    :/
    Je ne comprends pas !

    La requête semble pourtant bien construite et quand dans le débug de Chrome je fais juste un copié collé de la requête ça me renvoie bien quelque chose dans toad.
    Le problème vient de la récupération des paramètres de l'url par la page php, parce que le "postage" des infos du JS est correct.

    Quand je récupère les infos postées par le JS avec encodeURIComponent j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://MonServeur/Gestion_tresorerie/php/listing_tables.php?nom_utilisateur=HOUP&date_depense=Ao%C3%BBt%202016
    Lorsque j'affiche la réponse codée en json depuis mon fichier JS j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_depense	":"Août 2016"
    pourtant aucun résultat ne s'affiche.

    Maintenant, j’exécute cette même page en "stand alone" j'obtient ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_depense":"Ao\u00fbt 2016"
    et donc ma requête ne renvoie rien.


    Que la réponse de la requête ne soit pas la même je peux comprendre ; en Ajax la réponse est "encapsulée" en json alors qu'en stand alone c'est juste du texte à afficher par des echo.
    Mais que l'interprétation des variables passées en paramètre soit différente selon qu'on les execute en AJAX ou en "stand alone" ça je pige vraiment pas.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Déjà comme je t'ai dit, tu te compliques la vie avec tes données littérales, qui contiennent en plus des accents.
    Surtout qu'ensuite tu fais une conversion par le SGDB du mois, écris littéralement toujours, en français en plus.
    Bref, que des sources de problème.

    Évidemment techniquement ça peut fonctionner si tout est dans le bon encodage et que le SGDB accepte les mois en français. Même si, je le répète, c'est vraiment se compliquer la vie et ça n'est pas portable du tout.

    Si tu persistes, il te reste à
    - valider que la requête est exécutée correctement si tu écris le mois manuellement depuis PHP
    - contrôler point par point, tous les encodages (fichiers PHP, page HTML, connexion au SGDB)
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2009
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 113
    Points : 82
    Points
    82
    Par défaut Je voudrais juste comprendre
    J'ai été obligé de contourner le problème en utilisant un input hidden qui récupère le mois et l'année au format numérique, tandis que le datePicker reste au format "Mois Année".
    Ça fonctionne comme ça mais je trouvais l'astuce un peu "mamailloute".


    Mais je persiste.

    Et j'ai déjà :
    - validé le fait que la requête s'exécute correctement quand j'écris le mois manuellement depuis PHP
    - contrôlé tous les encodages (fichiers PHP, page HTML, connexion au SGDB, fichier js). Ils sont tous en UTF8 sans Bom.

    En fait je voudrais juste comprendre.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Pour décoder côté php, des valeurs javascript encodées avec encodeURIComponent, utilises urldecode().

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/03/2017, 22h09
  2. Réponses: 9
    Dernier message: 30/03/2011, 11h15
  3. Passer des paramètres POST automatiquement
    Par webrider dans le forum Langage
    Réponses: 5
    Dernier message: 29/11/2006, 21h15
  4. Passage de paramètres POST par un bouton
    Par damjal dans le forum Langage
    Réponses: 7
    Dernier message: 07/10/2005, 17h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo