【问题标题】:Pass Boolean Values from Ajax to PHP将布尔值从 Ajax 传递到 PHP
【发布时间】:2020-04-09 09:20:46
【问题描述】:

我已经阅读了大量关于该主题的问题,但没有一个能够解决我的特定问题——我想我在 JS 中格式化对象数组的方式有问题。这是我的 Ajax 函数:

var marketing_prefs = [];

$('#save-marketing-prefs input').each(function() {
  var tmp_array = {};
  tmp_array['marketing_permission_id'] = $(this).val();

  if ($(this).prop('checked')) {
    tmp_array['enabled'] = 1;
  } else {
    tmp_array['enabled'] = 0;
  }

  marketing_prefs.push(tmp_array);
})

console.log(marketing_prefs);

$.ajax({
  dataType: 'json',
  type: 'POST',
  url: ajax_object.ajaxurl,
  data: {
    action: 'acrew_save_mc_marketing_prefs',
    marketing_prefs: marketing_prefs
  },
  success: function(response) {
    console.log('#####', response);
  },
  error: function(response) {
    console.error('!!!!!', response);
  }
});

我正在做的是循环一个带有三个复选框的简单表单,并创建一个对象数组,然后这些对象将转到 Mailchimp。我的数据完好无损,但问题是我的布尔值作为字符串传入 PHP。我已经从使用“true”和“false”的 true 和 false 切换到使用 1 和 0 但它们也作为字符串出现。

我想我可以遍历数据并在 PHP 中构建一个新数组,但是当数据到达时,它非常接近正确,似乎它必须是不必要的。

如何以非字符串形式获取我的数据?

【问题讨论】:

  • GET/POST 数据没有任何指定数据类型的方法,一切都是字符串。
  • 谢谢,@Barmer。是的,我在旅行中发现了这一点,但在接收端传递 1 和 0 可能会更好/更容易解释为 bool。
  • @KevinNugent 为什么你到底想要这个?

标签: php json ajax mailchimp


【解决方案1】:

POST 数据作为简单的name=value 对发送,没有指定数据类型的语法,所有内容都被解析为字符串。

您可以调用intval($_POST['marketing_prefs'][$i]['enabled'])将其转换为整数。

另一种选择是将 marketing_prefs 数组转换为 JSON。

$.ajax({
  dataType: 'json',
  type: 'POST',
  url: ajax_object.ajaxurl,
  data: {
    action: 'acrew_save_mc_marketing_prefs',
    marketing_prefs: JSON.stringify(marketing_prefs)
  },
  success: function(response) {
    console.log('#####', response);
  },
  error: function(response) {
    console.error('!!!!!', response);
  }
});

然后在PHP中你可以这样做:

$marketing_prefs = json_decode($_POST['marketing_prefs'], true);

【讨论】:

  • 所以当我对数据进行字符串化时,它看起来像这样:[{\"marketing_permission_id\":\"4af4cbc99a\",\"enabled\":1},{\"marketing_permission_id\":\"61800c79a5\",\"enabled\":1},{\"marketing_permission_id\":\"09a72e340f\",\"enabled\":1}]
  • 这就是为什么你需要在 PHP 中调用json_decode()
  • 当我 intval 它只返回 0。
  • 只有在字符串化两次时才会看到转义的反斜杠。
  • 你如何看待这个结果?
【解决方案2】:

正如 Barmar 所说,由于 GET/POST 不能指定数据类型(这本身就是一种咆哮),因此一种方法是强制转换它。

非常粗略的例子:

var_dump((bool) <variable>);

问题是,如果它不是“真”、“空”或我相信 0,它将返回真。我很着急,否则我会更好地为你冲掉它。

【讨论】:

  • 问题是我建议intval() 的原因。
  • 一个非常好的建议,只要你像他现在一样传递数值。如果你想回到真/假,我认为强制转换是唯一的选择,至少在我有限的知识范围内。只要它是 POST 并且值肯定是已知的,cast 就不会太糟糕。不过,我个人会坚持使用整数。
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2012-09-01
  • 2014-10-21
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多