Этот вопрос связан с:
Невозможно передать значение 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».