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

发布于 2024-12-04 05:13:32 字数 1286 浏览 1 评论 0原文

此问题与以下内容相关:

无法使用 jQuery AJAX 将 null 传递到服务器。服务器收到的值是字符串“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));

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

我的情况的问题是我无法使用 file_get_contents('php://input') 访问 $_POST ,更重要的是,我无法使用 $_POST 因为我正在使用 HMVC 。

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

This question is related with:

Cannot pass null to server using jQuery AJAX. Value received at the server is the string "null"

But I'm asking it again because the solution in that question is very ugly, and I think must be a better one.

PROBLEM
When you send data with jQuery Ajax to PHP using POST you get strings "false"(string) instead of false(bool), "true" instead of true(bool) and "null" instead of NULL:

SOLUTION
(proposed in the above question):
convert the data to JSON before send it with jQuery, and then decode that data in PHP.
With code:

Javascript code:

$.ajax
(
   {
      url     : <server_url>,
      dataType: 'json',
      type    : 'POST',
      success : receiveAjaxMessage,
      data    : JSON.stringify
      (
         {
            valueTrue : true,
            valueFalse: false,
            valueNull : null
         }
      )
   }
);

PHP code:

var_dump(json_decode(file_get_contents('php://input'), true));

To me that's not a solution, only an ugly hack.

The problem in my situation is that I can't use file_get_contents('php://input') to access the $_POST, even more, I can't use $_POST because I'm using HMVC.

And I know I can fix it checking those "false", "true" and "null" in PHP, or sending 1 and 0 instear true and false in jQuery.
But I think this must be a really common problem, and jQuery is a really common framework, so I'm pretty sure there's a better and elegant way to send the data with the right type in jQuery.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

深海夜未眠 2024-12-11 05:13:33

根据我的经验,如果您在 jQuery ajax 调用中进行

dataType: 'json'

contentType: 'application/json'

JSON.stringify,然后在发送数据之前将其作为可解析的 javascript 对象到达服务器。或者在我的例子中,我使用 NodeJS 服务器端,它作为 Javascript 对象到达,具有正确的布尔值,而不是字符串布尔值。但是,如果我遗漏了内容类型属性,那么事情就会变得很糟糕,包括布尔值。

In my experience if you have

dataType: 'json'

and

contentType: 'application/json'

in your jQuery ajax call, and JSON.stringify your data before you send it will arrive at the server as a parse-able javascript object. Or in my case I'm using NodeJS serverside and it arrives as a Javascript object, with correct booleans, not string bools. But if I leave out the content type attribute then things get all goofed up including the bools.

乞讨 2024-12-11 05:13:33

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

如果您确实希望 PHP 看到 0 或 1,您可以

 valueTrue : true ? 1 : 0

在 AJAX 调用中使用。

Because HTTP is a text protocol with no concept of booleans or integers everything must be stringified. Comparing strings on the server side is the normal way to deal with booleans.

If you really really want PHP to see a 0 or 1 you can use

 valueTrue : true ? 1 : 0

in your AJAX call.

奶茶白久 2024-12-11 05:13:33

我遇到了同样的问题。我通过发送 1 或 0 表示布尔值来解决这个问题。

$.ajax 中,我做了 data : {field_name: field ? 1:0}

I ran into the same issue. I solved it by sending a 1 or 0 for booleans.

In the $.ajax I did data : {field_name: field ? 1 : 0}

堇色安年 2024-12-11 05:13:33

我尝试在控制器的模型中使用布尔对象而不是原始布尔类型,并且它有效。

我有 contentType:'application/json; charset=utf-8' 数据类型为“POST”。

I tried using Boolean object instead of primitive boolean type in the model at controller and it worked.

I have contentType : 'application/json; charset=utf-8' and data type as "POST".

暮光沉寂 2024-12-11 05:13:33

如果您不会在服务器上处理类型转换,那么您必须发送您期望的内容。

而不是:

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

If you will not handle the type conversion on the server then you must send what you expect.

Instead of:

     {
        valueTrue : true,
        valueFalse: false,
        valueNull : null
     }

Use:

     {
        valueTrue : 'TRUE',
        valueFalse: 'FALSE',
        valueNull : 'NULL'
     }

A ternary operator is pretty clear...

 valueTrue: (myvar ? 'TRUE' : 'FALSE')

But probably clearer is to append ".toString().toUpperCase()" to the variables :

 valueTrue : myvar.toString().toUpperCase();

However that will not work if myvar is null...

This example shows a converter function you can use before sending data.

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文