Параметр Bool из jQuery Ajax получен как буквальная строка «false» / ​​«true» в PHP

Этот вопрос связан с:

Невозможно передать значение null серверу с помощью jQuery AJAX. Значение, полученное на сервере, представляет собой строку «null»

Но я спрашиваю об этом снова, потому что решение в этом вопросе очень уродливо, и я думаю, должно быть, лучше.

ПРОБЛЕМА
Когда вы отправляете данные с помощью jQuery Ajax на PHP с помощью POST, вы получаете строки «false» (string) вместо false (bool), «true» вместо true (bool) и «null» вместо NULL:

РЕШЕНИЕ
(предлагается в вышеуказанном вопросе): преобразуйте данные в 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)); 

Для меня это не решение, а только уродливый хак.

Проблема в моей ситуации заключается в том, что я не могу использовать file_get_contents ('php: // input') для доступа к $ _POST, тем более, я не могу использовать $ _POST, потому что я использую HMVC.

И я знаю, что могу исправить это, проверяя эти «ложные», «истинные» и «нулевые» в PHP или отправляя 1 и 0 в true и false в jQuery.
Но я думаю, что это должна быть очень распространенная проблема, и jQuery – действительно общая структура, поэтому я уверен, что есть лучший и элегантный способ отправить данные с правильным типом в jQuery.

    По моему опыту, если у вас есть

     dataType: 'json' 

    а также

     contentType: 'application/json' 

    в вашем jQuery ajax-вызове и JSON.stringify ваши данные, прежде чем отправлять их, прибудет на сервер как анализируемый javascript-объект. Или в моем случае я использую NodeJS serverside и он появляется как объект Javascript с правильными логическими, а не строковыми bools. Но если я не укажу атрибут типа контента, тогда все будет запущено, включая bools.

    Поскольку HTTP – это текстовый протокол без понятия логических или целых чисел, все должно быть сжато. Сравнение строк на стороне сервера – это обычный способ справиться с булевыми.

    Если вы действительно хотите, чтобы PHP видел 0 или 1, вы можете использовать

      valueTrue : true ? 1 : 0 

    в вашем вызове AJAX.

    Я столкнулся с тем же вопросом. Я решил это, отправив 1 или 0 для булевых.

    В $.ajax я сделал data : {field_name: field ? 1 : 0} data : {field_name: field ? 1 : 0}

    Если вы не будете обрабатывать преобразование типов на сервере, вы должны отправить то, что ожидаете.

    Вместо:

      { 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> 

    Я попытался использовать Boolean-объект вместо примитивного логического типа в модели на контроллере, и он сработал.

    У меня есть contentType: 'application / json; charset = utf-8 'и тип данных как «POST».