Публикация нулевых значений через AJAX

Используя функцию jQuery $.post, если вы отправляете значение null, оно приходит со стороны сервера как "null". Пример:

JavaScript:

$.post('test.php', { foo : null });

PHP:

var_dump($_POST['foo']); // string(4) "null"

Я понимаю, почему это так, но задавался вопросом, как лучше всего преодолеть ограничения? Если вы:

  • Пропустите все переменные в JS, прежде чем отправлять их и заменить пустой строкой?
  • Интерпретировать "null" как null на стороне сервера?
  • Не отправлять эту переменную вообще?
  • Что-то еще?

Ответы

Ответ 1

Я бы закодировал его в JSON.

например:.

$.ajax({
  url: 'test.php',
  type: 'POST',
  data: JSON.stringify({foo : null}),
  contentType: "application/json",
  success: function(data) {
    // ...
  }
});

Вы можете использовать json_decode на сервере, и типы будут сохранены:

$msg = json_decode(file_get_contents("php://input"));
var_export($msg->foo); // NULL

Ответ 2

Попробуйте преобразовать объект javascript в JSON с помощью

$.post('test.php', JSON.stringify({ foo : null }));

Ответ 3

  • Это не будет хорошей идеей производительности, особенно если задействованы большие группы переменных.
  • Возможно. Это может быть сделано путем поиска всех ожидаемых значений и игнорирования чего-либо еще. прямой перевод "null" -> null может быть опасным при вводе пользователя.
  • Это приведет к тому, что переменная не будет установлена. тогда можно было бы использовать! isset() для этой переменной. Это был бы мой выбор.

Если вы не хотите конвертировать между JSON, я бы использовал параметр 3 и просто не отправлял переменные, которые являются нулевыми, а затем используйте if (!isset($_POST['my-var']))

Ответ 4

У меня просто была эта проблема, которую я решил более просто, возможно, для вас это тоже будет. В вашем php файле вы можете сделать это

if ($_POST[var] == 'null'){ $_POST[var] = NULL; }

Ответ 5

Это странное исправление, чтобы получить Dates сообщение правильно в C# MVC:

$.post(url, JSON.parse(JSON.stringify({ ListOfObjWithDates: listOfObjWithDates })), ...