web-dev-qa-db-ja.com

PHP=

この質問は次のものに関連しています:

jQuery AJAXを使用してサーバーにnullを渡すことはできません。サーバーで受信される値は文字列「null」です

しかし、その質問の解決策は非常にいため、私はもう一度尋ねています、そして私はより良いものでなければならないと思います。

[〜#〜]問題[〜#〜]
jQuery AjaxでPHPを使用してPOSTを取得すると、false(bool)ではなくstring "false"(string)を取得します。 true(bool)の代わりに "true"およびNULLの代わりに "null":

[〜#〜] solution [〜#〜]
(上記の質問で提案):データをJSONに変換してからjQueryで送信し、そのデータをPHPでデコードします。コード付き:

JavaScriptコード:

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

PHPコード:

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

私にはそれは解決策ではなく、onlyいハックだけです。

私の状況での問題は、file_get_contents( 'php:// input')を使用して$ _POSTにアクセスできないことです。さらに、HMVCを使用しているため、$ _ POSTを使用できません。

そして、PHPで「false」、「true」、「null」をチェックしたり、jQueryで1と0のinstear trueとfalseを送信したりすることで修正できることを知っています。
しかし、これは本当に一般的な問題であるに違いないと思います。jQueryは本当に一般的なフレームワークであるため、jQueryで適切なタイプのデータを送信するより優れたエレガントな方法があると確信しています。

37
Enrique

あなたが持っているなら私の経験では

dataType: 'json'

そして

contentType: 'application/json'

jQuery ajax呼び出しで送信し、データをJSON.stringifyで送信してから、解析可能なjavascriptオブジェクトとしてサーバーに到着します。または、私の場合、NodeJSサーバーサイドを使用しており、文字列ブールではなく、正しいブール値を持つJavascriptオブジェクトとして届きます。しかし、コンテンツタイプ属性を省略すると、boolsを含むすべてのものがおかしくなります。

39
skinneejoe

HTTPはブールまたは整数の概念を持たないテキストプロトコルであるため、すべてを文字列化する必要があります。サーバー側で文字列を比較することは、ブール値を処理する通常の方法です。

PHPで0または1を表示したい場合は、使用できます

 valueTrue : true ? 1 : 0

AJAX呼び出しで。

17
codelove

私は同じ問題に遭遇しました。ブール値に1または0を送信して解決しました。

の中に $.ajax やった data : {field_name: field ? 1 : 0}

2
Ariel

サーバーで型変換を処理しない場合は、期待どおりに送信する必要があります。

の代わりに:

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

使用する:

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

三項演算子はかなり明確です...

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

しかし、おそらくより明確なのは、変数に「.toString()。toUpperCase()」を追加することです。

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

ただし、myvarがnullの場合は機能しません...

この例は、データを送信する前に使用できるコンバーター関数を示しています。

<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>
1
Quaternion

コントローラーのモデルでプリミティブなブール型の代わりにブールオブジェクトを使用してみましたが、うまくいきました。

ContentTypeがあります: 'application/json; charset = utf-8 'および「POST」としてのデータ型。

0
loki_dev