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

Langage PHP Discussion :

JSON : Captation de variable en POST


Sujet :

Langage PHP

  1. #1
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut JSON : Captation de variable en POST
    Bonjour à tous,

    Je reçois sur mon serveur en POST des fichiers batch Json formatés comme 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    {
      "messageId": "19099a24-6477-4640-ba10-5e7ea1e35aa9",
      "acceptedAt": "2025-01-02T17:37:16",
      "sentDate": "2025-01-02T17:37:16",
      "channel": {
        "channelId": "f433d284-b6a5-11ec-a3d5-2cea7f78b3e5",
        "name": "mainAccount",
        "type": "SMS",
        "flow": "TRANSACTIONAL"
      },
      "type": "SMS",
      "direction": "MT",
      "recipient": {
        "to": "33600011122"
      },
      "from": "Expediteur",
      "body": {
        "text": "Bonjour ....",
        "encoding": "GSM7",
        "messagePartCount": 1,
        "length": 121
      },
      "price": {
        "amount": 1,
        "currency": "EUR"
      },
      "status": {
        "deliveryDate": "2025-01-02T17:37:17",
        "value": "DELIVERED",
        "lookup": {
          "mccMnc": "20810",
          "mcc": "208",
          "mnc": "10",
          "country": "France",
          "countryPrefix": "33",
          "isoCountryCode": "FR",
          "network": "Sfr"
        }
      },
      "refClient": "1001",
      "href": "https://sitesms.com/sms/v1/messages/19099a24-6477-..."
    }
    J'ai un code tout simple pour les insérer le résultat dans ma base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    require 'private/db.php.inc';
    require 'private/custom.php.inc';
    $json = file_get_contents('php://input');
    $obj = json_decode($json, true);
     
    $sql = "UPDATE sms SET status=?, dateDeliver=?, length=?, network=?, pays=? WHERE messageId=?";
    $db->prepare($sql)->execute([$obj['status']['value'], $obj['status']['deliveryDate'], $obj['body']['length'], $obj['status']['lookup']['network'],$obj['status']['lookup']['isoCountryCode'], $obj['messageId'] ]);
    Et j'ai constamment dans mon error.log l'erreur suivante :

    PHP Warning: Undefined array key "deliveryDate" in /srv/data/web/vhosts/www.monsite.com/htdocs/sms_return.php on line 8

    Je sèche totalement, lorsque j'exploite ce fichier / mon code en local ca ne pose aucun souci, de plus sur mon serveur l'update se fait correctement avec la bonne date...

    Si vous pouviez m'éclairer...

    Grand merci à vous

    Bel aprèm !

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 698
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 698
    Par défaut
    c'est peut être le client qui envoie un format erroné.
    je vous conseille de tester le contenu de la variable $obj avant de l'utiliser et si une donnée est manquante, vous enregistrez dans un fichier journal toutes les informations : données brutes reçues, date, toutes les informations de $_SERVER, etc.

  3. #3
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Merci pour votre réponse Mathieu.
    Le Json est le fichier posté tel quel ($json).

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Fais ceci pour t'en assurer :

    // ...
    $obj = json_decode($json, true);
    var_dump($obj);
    
    // ...

  5. #5
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Bonsoir,
    Merci à vous ! alors effectivement le var_dump montre que les clés se répètent 2 fois et que ma variable deliveryDate n'apparait que dans la seconde "boucle" (ligne 76) :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    array(13) {
      ["messageId"]=>
      string(36) "6501aac4-baba-4794-ac8c-474e462d1a3f"
      ["acceptedAt"]=>
      string(19) "2025-01-06T18:46:50"
      ["sentDate"]=>
      string(19) "2025-01-06T18:46:50"
      ["channel"]=>
      array(4) {
        ["channelId"]=>
        string(36) "f433d284-b6a5-11ec-a3d5-2cea7f78b3e5"
        ["name"]=>
        string(11) "mainAccount"
        ["type"]=>
        string(3) "SMS"
        ["flow"]=>
        string(13) "TRANSACTIONAL"
      }
      ["type"]=>
      string(3) "SMS"
      ["direction"]=>
      string(2) "MT"
      ["recipient"]=>
      array(1) {
        ["to"]=>
        string(11) "33633388877"
      }
      ["from"]=>
      string(9) "EnteteCLI"
      ["body"]=>
      array(4) {
        ["text"]=>
        string(7) "Message"
        ["encoding"]=>
        string(4) "GSM7"
        ["messagePartCount"]=>
        int(1)
        ["length"]=>
        int(7)
      }
      ["price"]=>
      array(2) {
        ["amount"]=>
        int(1)
        ["currency"]=>
        string(3) "EUR"
      }
      ["status"]=>
      array(2) {
        ["value"]=>
        string(7) "ENROUTE"
        ["lookup"]=>
        array(7) {
          ["mccMnc"]=>
          string(5) "20810"
          ["mcc"]=>
          string(3) "208"
          ["mnc"]=>
          string(2) "10"
          ["country"]=>
          string(6) "France"
          ["countryPrefix"]=>
          string(2) "33"
          ["isoCountryCode"]=>
          string(2) "FR"
          ["network"]=>
          string(3) "Sfr"
        }
      }
      ["refClient"]=>
      string(4) "1001"
      ["href"]=>
      string(77) "https://sms/v1/messages/6501aac4-baba-4794..."
    }
     
    array(13) {
      ["messageId"]=>
      string(36) "6501aac4-baba-4794-ac8c-474e462d1a3f"
      ["acceptedAt"]=>
      string(19) "2025-01-06T18:46:50"
      ["sentDate"]=>
      string(19) "2025-01-06T18:46:50"
      ["channel"]=>
      array(4) {
        ["channelId"]=>
        string(36) "f433d284-b6a5-11ec-a3d5-2cea7f78b3e5"
        ["name"]=>
        string(11) "mainAccount"
        ["type"]=>
        string(3) "SMS"
        ["flow"]=>
        string(13) "TRANSACTIONAL"
      }
      ["type"]=>
      string(3) "SMS"
      ["direction"]=>
      string(2) "MT"
      ["recipient"]=>
      array(1) {
        ["to"]=>
        string(11) "33633388877"
      }
      ["from"]=>
      string(9) "EnteteCLI"
      ["body"]=>
      array(4) {
        ["text"]=>
        string(7) "Message"
        ["encoding"]=>
        string(4) "GSM7"
        ["messagePartCount"]=>
        int(1)
        ["length"]=>
        int(7)
      }
      ["price"]=>
      array(2) {
        ["amount"]=>
        int(1)
        ["currency"]=>
        string(3) "EUR"
      }
      ["status"]=>
      array(3) {
        ["deliveryDate"]=>
        string(19) "2025-01-06T18:46:51"
        ["value"]=>
        string(9) "DELIVERED"
        ["lookup"]=>
        array(7) {
          ["mccMnc"]=>
          string(5) "20810"
          ["mcc"]=>
          string(3) "208"
          ["mnc"]=>
          string(2) "10"
          ["country"]=>
          string(6) "France"
          ["countryPrefix"]=>
          string(2) "33"
          ["isoCountryCode"]=>
          string(2) "FR"
          ["network"]=>
          string(3) "Sfr"
        }
      }
      ["refClient"]=>
      string(4) "1001"
      ["href"]=>
      string(77) "https://sms/v1/messages/6501aac4-baba-4794..."
    }
    Comment faire pour ne capter que les variables de cette seconde boucle ? mes compétences deviennent limitées...
    J'utilisais à la base le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = "UPDATE sms SET status=?, dateDeliver=?, length=?, network=?, pays=? WHERE messageId=?";
    $db->prepare($sql)->execute([$obj['status']['value'], $obj['status']['deliveryDate'], $obj['body']['length'], $obj['status']['lookup']['network'],$obj['status']['lookup']['isoCountryCode'], $obj['messageId'] ]);
    Merci pour votre aide.

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 698
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 698
    Par défaut
    d'où vient ce 2e envoi ? d'après votre code, vous traitez qu'un seul code à chaque fois ?

    c'est bien un autre site qui envoie directement ces données à votre script ?

  7. #7
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Bonjour Mathieu,
    Merci pour votre réponse.
    Ce fichier provient effectivement d'un serveur externe, il me renvoie les infos concernant l'envoi d'un sms, j'update alors en renseignant l'opérateur, la date de réception, ...
    Ce n'est pas un deuxième envoi, c'est le fichier brut renvoyé par le serveur concernant cet envoi.
    Je ne comprends pas pourquoi il y a cette boucle...

    J'aimerais donc traiter les informations à partir de la première boucle où les infos se répètent mais j'ai enfin ma variable deliveryDate qui est présente.

    Je découvre le Json, j'essaye de potasser avant de vous solliciter mais je sèche, rien ne fonctionne ($obj['status'][1]['value'] etc...)

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Gaetan_ Voir le message
    effectivement le var_dump montre que les clés se répètent 2 fois et que ma variable deliveryDate n'apparait que dans la seconde "boucle" (ligne 76) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    array(13) {
        ...
    }
     
    array(13) {
        ...
    }
    Tu nous montres le résultat de 2 var_dump(), le code exécuté ne correspond donc pas au code montré.

  9. #9
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Séb. nous sommes d'accord, c'est pourtant le résultat brut du var_dump reçu.
    Ceci explique aussi le problème :

    Début de lecture du Json qui provoque l'erreur :

    PHP Warning: Undefined array key "deliveryDate" in /srv/data/web/vhosts/www.monsite.com/htdocs/sms_return.php on line 8

    Vient ensuite l'update de ma base qui se fait correctement...

    J'aimerais donc vous l'avez compris squizzer la première partie du Json.

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    J'aimerais donc vous l'avez compris squizzer la première partie du Json.
    Il n'y a pas de première partie ou de deuxième partie de JSON, il y a 2 JSON différents (voir le résultat du var_dump($obj)).
    L'un des JSON est bon, l'autre est mauvais => Il faut ignorer le mauvais
    Tu parles de boucle, je ne vois pas de boucle dans ton code.

    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
    <?php
    require 'private/db.php.inc';
    require 'private/custom.php.inc';
    $json = file_get_contents('php://input');
    $obj = json_decode($json, true);
     
    if (!isset($obj['status']['deliveryDate'])) {
        echo '[DEBUG] ', date('Y-m-d H:i:s.u'), "\r\n";
        print_r($obj);
        echo "JSON incomplet => On l'ignore\r\n";
        exit;
    }
     
    $sql = "UPDATE sms SET status=?, dateDeliver=?, length=?, network=?, pays=? WHERE messageId=?";
    $db->prepare($sql)->execute([$obj['status']['value'], $obj['status']['deliveryDate'], $obj['body']['length'], $obj['status']['lookup']['network'],$obj['status']['lookup']['isoCountryCode'], $obj['messageId'] ]);

  11. #11
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Pardon je me suis alors mal exprimé : j'entends par boucle le corps du Json de la ligne 1 à 76 se répète par la suite de façon plus complète avec cette fameuse variable deliveryDate.

    Il faudrait donc l'interpréter ce fichu Json dès lors qu'il "boucle" ligne 76 où la variable messageId se repète.

    J'avais pensé au (isset($obj['status']['deliveryDate'])) mais dans la mesure ou le sms est en échec seul le statut va être modifié et il n'y aura donc pas de date d'acheminement / ouverture.

  12. #12
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Citation Envoyé par Gaetan_ Voir le message
    le corps du Json
    Il n'y a pas un seul JSON, il y en a deux. Donc ce n'est pas LE corps du JSON, mais il y a un mauvais JSON (le premier) et un bon JSON (le second).
    Si on compare les deux JSON, le statut diffère, passe de "ENROUTE" à "DELIVERED" et le deliveryDate apparait également.
    Comme ton code ne contient pas de boucle, il doit s'agir de deux appels différents à ton script. Le premier est à ignorer (aucune deliveryDate, statut "ENROUTE") et le deuxième doit être traité (deliveryDate présent, statut "DELIVERED").

  13. #13
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 347
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 347
    Billets dans le blog
    17
    Par défaut
    il doit s'agir de deux appels différents à ton script
    Je pense que c'est ça.
    On doit recevoir 1 JSON pour chaque changement d'état successif du SMS => 1 appel par changement d'état
    Il faut réagir en fonction de l'état qui nous intéresse.

  14. #14
    Membre chevronné
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 489
    Par défaut
    Merci pour vos réponses, et oui n'interepeter que si le statut diffère d'"ENROUTE".
    Grand merci
    Bel après midi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoi de variables avec POST
    Par oops! dans le forum Flash
    Réponses: 5
    Dernier message: 06/08/2006, 21h14
  2. passage de variable en POST
    Par bibile dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/07/2006, 19h21
  3. Passage de variables en POST par un lien
    Par Nious99 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/06/2006, 08h52
  4. problème de passage de variables par POST
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 03/05/2006, 13h36
  5. Variable et POST
    Par kanzarih dans le forum Langage
    Réponses: 9
    Dernier message: 30/04/2006, 22h39

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