web-dev-qa-db-fra.com

Paramètre Bool de jQuery Ajax reçu sous forme de chaîne littérale "false"/"true" dans PHP

Cette question est liée à:

Impossible de transmettre la valeur null au serveur à l'aide de jQuery AJAX. La valeur reçue sur le serveur est la chaîne "null"

Mais je le demande encore parce que la solution à cette question est très laide et je pense que ce doit être une meilleure.

PROBLÈME 
Lorsque vous envoyez des données avec jQuery Ajax à PHP en utilisant POST, vous obtenez des chaînes "false" (chaîne) au lieu de false (bool), "true" au lieu de true (bool) et "null "au lieu de NULL:

SOLUTION 
(proposé dans la question ci-dessus): convertissez les données au format JSON avant de les envoyer avec jQuery, puis décodez ces données en PHP . Avec le code:

Code Javascript:

$.ajax
(
   {
      url     : <server_url>,
      dataType: 'json',
      type    : 'POST',
      success : receiveAjaxMessage,
      data    : JSON.stringify
      (
         {
            valueTrue : true,
            valueFalse: false,
            valueNull : null
         }
      )
   }
);

Code PHP:

var_dump(json_decode(file_get_contents('php://input'), true));

Pour moi, ce n'est pas une solution, seulement un bidouillage laid. 

Le problème dans ma situation est que je ne peux pas utiliser file_get_contents ('php: // input') pour accéder à $ _POST, encore plus, je ne peux pas utiliser $ _POST parce que j'utilise HMVC.

Et je sais que je peux le réparer en vérifiant ces "false", "true" et "null" en PHP, ou en envoyant 1 et 0 instear true et false dans jQuery.
Mais je pense que cela doit être un problème très courant et que jQuery est un cadre vraiment commun, je suis donc presque sûr qu'il existe un moyen plus élégant et plus élégant d'envoyer des données avec le bon type dans jQuery. 

35
Enrique

Dans mon expérience si vous avez

dataType: 'json'

et

contentType: 'application/json'

dans votre appel ajax jQuery et JSON.stringifier vos données avant de les envoyer arriveront sur le serveur sous la forme d'un objet javascript analysable. Ou dans mon cas, j'utilise NodeJS serveride et il arrive sous forme d'objet Javascript, avec des booléens corrects, pas de bool string. Mais si je laisse de côté l'attribut de type de contenu, les choses vont mal, y compris les bool.

37
skinneejoe

Comme HTTP est un protocole texte sans concept de booléens ni d’entiers, tout doit être stratifié. La comparaison des chaînes côté serveur est le moyen habituel de traiter les booléens.

Si vous voulez vraiment PHP voir un 0 ou un 1, vous pouvez utiliser 

 valueTrue : true ? 1 : 0

dans votre AJAX appel.

15
codelove

J'ai rencontré le même problème. Je l'ai résolu en envoyant un 1 ou un 0 pour les booléens.

Dans le $.ajax j'ai fait data : {field_name: field ? 1 : 0}

2
Ariel

Si vous ne gérez pas la conversion de type sur le serveur, vous devez alors envoyer ce que vous attendez.

Au lieu de:

     {
        valueTrue : true,
        valueFalse: false,
        valueNull : null
     }

Utilisation:

     {
        valueTrue : 'TRUE',
        valueFalse: 'FALSE',
        valueNull : 'NULL'
     }

Un opérateur ternaire est assez clair ... 

 valueTrue : myvar ? : 'TRUE' : 'FALSE';

Mais il est probablement plus clair d'ajouter ".toString (). ToUpperCase ()" aux variables:

 valueTrue : myvar.toString().toUpperCase();

Cependant, cela ne fonctionnera pas si myvar est null ...

Cet exemple montre une fonction de conversion que vous pouvez utiliser avant d’envoyer des données.

<html>
    <head>
        <script>
            function myConverter(toUpper){
                if (toUpper != null){
                   return toUpper.toString().toUpperCase(); 
                }
                return 'NULL';
            }
            //tests
            alert(myConverter(null));
            alert(myConverter(true));
            alert(myConverter(false));
        </script>
    </head>
    <body>
    </body>
</html>
0
Quaternion

J'ai essayé d'utiliser un objet booléen au lieu d'un type booléen primitif dans le modèle du contrôleur et cela a fonctionné. 

J'ai contentType: 'application/json; charset = utf-8 'et le type de données "POST".

0
loki_dev