来自 jQuery Ajax 的 Bool 参数在 PHP 中作为文字字符串“false”/“true”接收
Posted
技术标签:
【中文标题】来自 jQuery Ajax 的 Bool 参数在 PHP 中作为文字字符串“false”/“true”接收【英文标题】:Bool parameter from jQuery Ajax received as literal string "false"/"true" in PHP 【发布时间】:2011-11-16 13:29:45 【问题描述】:这个问题与:
Cannot pass null to server using jQuery AJAX. Value received at the server is the string "null"
但我又问了一次,因为那个问题的解决方案非常丑陋,我认为必须是更好的解决方案。
问题 当您使用 POST 使用 jQuery Ajax 将数据发送到 php 时,您会得到字符串“false”(字符串)而不是 false(bool)、“true”而不是 true(bool)和“null”而不是 NULL:
解决方案 (在上述问题中提出): 在使用 jQuery 发送数据之前将数据转换为 JSON,然后在 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));
对我来说,这不是一个解决方案,只是一个丑陋的 hack。
我的情况的问题是我不能使用file_get_contents('php://input') 来访问$_POST,更重要的是,我不能使用$_POST,因为我使用的是HMVC。
而且我知道我可以修复它检查 PHP 中的“false”、“true”和“null”,或者在 jQuery 中发送 1 和 0 来区分 true 和 false。 但我认为这一定是一个非常普遍的问题,而 jQuery 是一个非常常见的框架,所以我很确定在 jQuery 中有一种更好更优雅的方式来发送具有正确类型的数据。
【问题讨论】:
上次我检查过,不管它是作为字符串发送还是真的是这样:codepad.viper-7.com/otQet7 jQuery 不是纯粹的魔法,它必须遵守 html 规范,所有内容都作为字符串发送,就像 POST 和 GET 一样。类型转换是服务器端问题。 那是因为你在开玩笑,PHP 中任何不为空的字符串都会被强制转换为 true,请改为检查:codepad.viper-7.com/aL9P5E @Quaternion 我知道它必须作为字符串发送,但是 jQuery 可以将 false 转换为“0”而不是“false” 不可以,因为 jQuery 是库,但字符串转换是由 Java Script 定义的。 【参考方案1】:如果您不处理服务器上的类型转换,那么您必须发送您期望的内容。
代替:
valueTrue : true,
valueFalse: false,
valueNull : null
用途:
valueTrue : 'TRUE',
valueFalse: 'FALSE',
valueNull : 'NULL'
三元运算符很清楚...
valueTrue: (myvar ? 'TRUE' : 'FALSE')
但可能更清楚的是将“.toString().toUpperCase()”附加到变量中:
valueTrue : myvar.toString().toUpperCase();
但是,如果 myvar 为空,这将不起作用...
此示例显示了您可以在发送数据之前使用的转换器功能。
<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>
【讨论】:
也许null值是最难转换的,但我认为解决方案是在JS端(jQuery)将(bool)false转换为(string)“0”。在 PHP 中,字符串“0”等于 false(但“false”等于 true)。 mmm... 再次阅读您的回复我认为您误解了我的问题,当我说在 PHP 中我收到的是“false”而不是 FALSE 我指的是 (string)"false" (bool)FALSE,不是将字符串“false”转换为大写,而是将其转换为真正的 bool 类型(FALSE、false,甚至 0 和“0”或“”,但不是“false”、“FALSE” , 或 PHP 中的“任何不同于空或 0 的字符串”)。 那么我不知道你为什么在你的问题中显示任何 JS,如果它不是解决方案的一部分。我们可以从客户端发送的只是字符串。我展示了如何包装布尔值和 null 来发送你想要的任何东西。除此之外,您还有服务器端问题。 我知道我可以用一百万种方法解决这个问题。我的英语不太好,但我试图清楚地表明我正在寻找一个优雅的解决方案,因为我觉得这是一个非常普遍的问题(我放了一个指向完全相同问题的链接,但解决方案很丑陋)。使用优雅的解决方案,我的意思是 jQuery 中的原生内容,例如我们可以设置的一些标志,以便 jQuery 将 (bool)false 转换为 (string)"0" 而不是 (string)"false"。【参考方案2】:我遇到了同样的问题。我通过为布尔值发送 1 或 0 来解决它。
在$.ajax
我做了data : field_name: field ? 1 : 0
【讨论】:
它仍然在服务器端解析为字符串“1”或“0”。 @Adam 没错,但是 PHP 会自动将“1”和“0”转换为布尔值,但不会转换“true”和“false”。【参考方案3】:因为 HTTP 是一个没有布尔或整数概念的文本协议,所以所有内容都必须被字符串化。在服务器端比较字符串是处理布尔值的正常方式。
如果你真的想让 PHP 看到 0 或 1,你可以使用
valueTrue : true ? 1 : 0
在您的 AJAX 调用中。
【讨论】:
这个答案并不可靠。 JSON 字符串myBoolean: true
也是文字文本,因此可以通过 HTTP 传输。无需像myBoolean: "true"
那样添加额外的连字符。前者正确,服务器会将myBoolean
解释为布尔类型,而后者错误,myBoolean
等于字符串值。这只是 jQuery 转换例程中的一个错误。 “HTTP 是一种文本协议”这一论点并不重要。【参考方案4】:
根据我的经验,如果你有
dataType: 'json'
和
contentType: 'application/json'
在您的 jQuery ajax 调用中,在您发送数据之前 JSON.stringify 将作为可解析的 javascript 对象到达服务器。或者在我的情况下,我使用的是 NodeJS 服务器端,它作为 Javascript 对象到达,带有正确的布尔值,而不是字符串布尔值。但是,如果我省略了内容类型属性,那么事情就会变得一团糟,包括布尔值。
【讨论】:
也许值得一提的是,jQuery 的 AJAX 参数的名称是以一种非常不幸和令人困惑的方式选择的。在语义上,一方面参数contentType
和data
以及另一方面dataType
和content
形成一个逻辑组。为了将内容从客户端传输到服务器,有效负载被放入data
,数据类型由contentType
指定。在相反的方向,为了从服务器接收一些东西,payload 被放入content
并且预期的类型由dataType
指定。哎呀!【参考方案5】:
我尝试在控制器的模型中使用布尔对象而不是原始布尔类型,并且它起作用了。
我有 contentType : 'application/json; charset=utf-8',数据类型为“POST”。
【讨论】:
以上是关于来自 jQuery Ajax 的 Bool 参数在 PHP 中作为文字字符串“false”/“true”接收的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Firefox 中解码来自 jQuery $.ajax 请求的 XML 响应
使用循环在 HTML 中显示来自 jQuery.ajax 的 json 数据
我如何在 jquery 中使用来自 ajax 的新复选框? [复制]