it-swarm.com.de

Bool-Parameter von jQuery Ajax als Literalzeichenfolge "false"/"true" in empfangen PHP

Diese Frage bezieht sich auf:

Kann mit jQuery AJAX keine Nullwerte an den Server übergeben. Vom Server empfangener Wert ist die Zeichenfolge "null"

Aber ich frage es noch einmal, weil die Lösung in dieser Frage sehr hässlich ist und ich denke, es muss eine bessere sein.

PROBLEM 
Wenn Sie Daten mit jQuery Ajax mit PHP an POST senden, erhalten Sie die Zeichenfolgen "false" (Zeichenfolge) anstelle von "false" (bool), "true" anstelle von "true" (bool) und "null" "statt NULL:

LÖSUNG 
(in der obigen Frage vorgeschlagen): Konvertieren Sie die Daten in JSON, bevor Sie sie mit jQuery senden, und dekodieren Sie diese Daten dann in PHP . Mit Code:

Javascript-Code:

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

PHP-Code:

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

Für mich ist das keine Lösung, nur ein hässlicher Hack. 

Das Problem in meiner Situation ist, dass ich file_get_contents ('php: // input') nicht verwenden kann, um auf $ _POST zuzugreifen. Außerdem kann ich $ _POST nicht verwenden, da ich HMVC verwende.

Und ich weiß, dass ich es korrigieren kann, indem ich diese "false", "true" und "null" in PHP überprüfe oder 1 und 0 in jQuery als wahr und falsch sende.
Aber ich denke, dass dies ein sehr häufiges Problem sein muss, und jQuery ist ein sehr allgemeiner Rahmen. Ich bin mir ziemlich sicher, dass es eine bessere und elegantere Methode gibt, um die Daten mit dem richtigen Typ in jQuery zu senden. 

35
Enrique

In meiner Erfahrung, wenn Sie haben

dataType: 'json'

und

contentType: 'application/json'

in Ihrem jQuery-ajax-Aufruf und JSON.stringify werden Ihre Daten vor dem Senden als parse-fähiges Javascript-Objekt auf dem Server angezeigt. Oder in meinem Fall verwende ich NodeJS serverside und kommt als Javascript-Objekt mit korrekten Booleans und nicht als String-Bools an. Wenn ich jedoch das Attribut für den Inhaltstyp weglasse, werden die Dinge einschließlich der Bool-Dateien komplett vermasselt.

37
skinneejoe

Da HTTP ein Textprotokoll ohne Konzept von Booleans oder Ganzzahlen ist, muss alles stringifiziert werden. Der Vergleich von Strings auf der Serverseite ist der normale Umgang mit Booleans.

Wenn Sie wirklich wollen, dass PHP eine 0 oder 1 anzeigt, können Sie sie verwenden 

 valueTrue : true ? 1 : 0

in Ihrem AJAX Aufruf.

15
codelove

Ich bin auf die gleiche Ausgabe gestoßen. Ich habe es gelöst, indem ich eine 1 oder 0 für Booleaner sendete.

Im $.ajax habe ich data : {field_name: field ? 1 : 0}

2
Ariel

Wenn Sie die Typkonvertierung auf dem Server nicht durchführen, müssen Sie senden, was Sie erwarten.

Anstatt:

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

Benutzen:

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

Ein ternärer Operator ist ziemlich klar ... 

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

Aber wahrscheinlich ist es klarer, ".toString (). ToUpperCase ()" an die Variablen anzuhängen:

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

Das funktioniert jedoch nicht, wenn myvar null ist ...

Dieses Beispiel zeigt eine Konvertierungsfunktion, die Sie vor dem Senden von Daten verwenden können.

<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

Ich habe versucht, ein boolesches Objekt anstelle eines primitiven booleschen Typs im Modell am Controller zu verwenden, und es hat funktioniert. 

Ich habe contentType: 'application/json; charset = utf-8 'und Datentyp als "POST".

0
loki_dev