it-swarm.it

Parametro Bool da jQuery Ajax ricevuto come stringa letterale "false"/"true" in PHP

Questa domanda è correlata a:

Impossibile passare null al server usando jQuery AJAX. Il valore ricevuto sul server è la stringa "null"

Ma lo sto chiedendo di nuovo perché la soluzione in questa domanda è molto brutta, e penso che debba essere migliore.

PROBLEMA 
Quando invii dati con jQuery Ajax a PHP usando POST ottieni stringhe "false" (stringa) invece di false (bool), "true" invece di true (bool) e "null "invece di NULL:

SOLUZIONE 
(proposto nella domanda precedente): converti i dati in JSON prima di inviarli con jQuery e poi decodificarli in PHP . Con codice:

Codice Javascript:

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

Codice PHP:

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

Per me non è una soluzione, solo un brutto scherzo. 

Il problema nella mia situazione è che non posso usare file_get_contents ('php: // input') per accedere a $ _POST, ancora di più, non posso usare $ _POST perché sto usando HMVC.

E so che posso aggiustarlo controllando quei "falsi", "veri" e "null" in PHP, o inviando 1 e 0 instear vero e falso in jQuery.
Ma penso che questo sia un problema molto comune, e jQuery è un framework molto comune, quindi sono abbastanza sicuro che ci sia un modo migliore ed elegante per inviare i dati con il tipo giusto in jQuery. 

35
Enrique

Nella mia esperienza se lo hai

dataType: 'json'

e

contentType: 'application/json'

nella tua chiamata jQuery ajax e JSON.stringify i tuoi dati prima di inviarli arriveranno al server come un oggetto javascript analizzabile. O nel mio caso sto usando NodeJS serveride e arriva come un oggetto Javascript, con booleani corretti, non booleazi di stringhe. Ma se tralascio l'attributo del tipo di contenuto, allora le cose si complicano, compresi i bool.

37
skinneejoe

Poiché HTTP è un protocollo di testo senza alcun concetto di valori booleani o interi, tutto deve essere unificato. Confrontare le stringhe sul lato server è il modo normale per gestire i booleani.

Se vuoi davvero PHP vedere uno 0 o 1 puoi usarlo 

 valueTrue : true ? 1 : 0

nella tua chiamata AJAX.

15
codelove

Ho incontrato lo stesso problema. L'ho risolto inviando un 1 o 0 per i booleani.

Nel $.ajax ho fatto data : {field_name: field ? 1 : 0}

2
Ariel

Se non gestirai la conversione del tipo sul server, dovrai inviare ciò che ti aspetti.

Invece di:

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

Uso:

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

Un operatore ternario è abbastanza chiaro ... 

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

Ma probabilmente è più chiaro aggiungere ".toString (). AUpperCase ()" alle variabili:

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

Tuttavia, ciò non funzionerà se myvar è nullo ...

Questo esempio mostra una funzione del convertitore che è possibile utilizzare prima di inviare i dati.

<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

Ho provato ad usare l'oggetto booleano invece del tipo booleano primitivo nel modello al controller e ha funzionato. 

Ho contentType: 'application/json; charset = utf-8 'e tipo di dati come "POST".

0
loki_dev