Подтвердить что ты не робот

Параметр 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.

4b9b3361

Ответ 1

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

dataType: 'json'

и

contentType: 'application/json'

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

Ответ 2

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

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

 valueTrue : true ? 1 : 0

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

Ответ 3

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

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

Ответ 4

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

Вместо:

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

Ответ 5

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

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

Ответ 6

Prafull Patidar и пароль является нулевым, каково мое количество переменных