来自jQuery Ajax的Bool参数在PHP中作为文字字符串“false”/“true”接收

2022-08-30 11:52:38

这个问题与以下方面有关:

无法使用 jQuery AJAX 将 null 传递给服务器。在服务器上接收的值为字符串“null”

但我再次问这个问题,因为这个问题的解决方案非常丑陋,我认为一定是一个更好的解决方案。

问题
当您使用jQuery Ajax将数据发送到PHP使用POST时,您得到字符串“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));

对我来说,这不是一个解决方案,只是一个丑陋的黑客。

在我的情况下,问题是我不能使用file_get_contents('php://input')来访问$_POST,甚至更多,我不能使用$_POST因为我使用的是HMVC。

我知道我可以修复它,检查PHP中的“false”,“true”和“null”,或者在jQuery中发送1和0的instear true和fals。
但我认为这一定是一个非常普遍的问题,而jQuery是一个非常常见的框架,所以我非常确定在jQuery中有一种更好,更优雅的方式来发送具有正确类型的数据。


答案 1

根据我的经验,如果你有

dataType: 'json'

contentType: 'application/json'

在你的jQuery ajax调用中,JSON.stringify在你的发送之前,你的数据将作为一个可解析的javascript对象到达服务器。或者在我的情况下,我使用的是NodeJS serverside,它作为Javascript对象到达,具有正确的布尔值,而不是字符串bools。但是,如果我省略了内容类型属性,那么包括布尔人在内的所有事情都会变得愚蠢。


答案 2

因为HTTP是一个文本协议,没有布尔值或整数的概念,所以一切都必须字符串化。在服务器端比较字符串是处理布尔值的正常方法。

如果你真的真的想让PHP看到0或1,你可以使用

 valueTrue : true ? 1 : 0

在 AJAX 调用中。


推荐