Параметр 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.
Ответы
Ответ 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 и пароль является нулевым, каково мое количество переменных