【问题标题】:$_POST variable empty after AJAX RequestAJAX 请求后 $_POST 变量为空
【发布时间】:2020-05-17 21:24:00
【问题描述】:

我看过很多关于这个问题的帖子,但其中很多都至少有 3 年的历史,似乎没有任何东西可以解决我的问题。我希望有人能帮忙。我创建了一个字符串数组,它们是服务器上文件的路径。我想将该数组传递给 PHP 文件以取消链接指定的文件。问题是当我使用 jQuery 的 ajax() 函数将数组传递给 PHP 文件时,$_POST 变量是空的,所以我不能对数据做任何事情。 URL 很好,在此示例中数组的长度为 1。这是我的代码:

jQuery

$(".remove").click(function() {
    var images = document.getElementsByTagName('img');
    var images2remove = [];

    $(images).each(function() {
        if($(this).hasClass('highlight')) {
            var path = $(this).attr('src');
            images2remove.push(path);
        }

    })

        $.ajax({
        url: 'removeFiles.php',
        type: 'post',
        data: {images : images2remove},  
        contentType: false,
        processData: false,
        success: function(response) {
            if(response != 0) {
              console.log(response);
            }
            else {
                alert('file not removed');
            }
        }
    })
});

还有我的 php

$images = $_POST['images'];
var_dump($images);  // returns array(0){}

我也试过了:

$post = file_get_contents('php://input'); 
var_dump($post) // returns string(15) [object, Object] 

我不太确定该怎么做。根据我看到的示例,我觉得我应该能够使用 $_POST 变量访问该数组的内容。我在这里想念什么?一如既往的感谢!

【问题讨论】:

  • 你在哪里看到$_POST 是空的?是来自console.log(response) 还是其他地方?另外,您的.remove HTML 元素是什么?您并没有阻止默认事件操作,因此如果它是链接或提交按钮,您的页面可能正在导航
  • 为什么会有contentType: false 和processData: false?将这些设置为 false 将是您的问题的原因
  • @phil .remove 只是一个没有链接的类型按钮。
  • contentType: false 是问题所在。简单的修复。谢谢你。我正在从我看到的一篇文章中复制代码,但从未真正考虑过。

标签: php jquery ajax post


【解决方案1】:

查看这个小提琴示例:

https://jsfiddle.net/f7kbL4m2/8/

我不得不将 data 参数更改为 json 以符合异步调用。

在您的 PHP 中

$data = json_decode(stripslashes($_POST['json']));

  // here i would like use foreach:

  foreach($data as $d){
     echo $d;
  }

另外,看看这个answer

从您的 AJAX 调用中删除内容类型和处理数据。

$.ajax({
        url: 'removeFiles.php',
        type: 'post',
        data: {images : images2remove},  
        success: function(response) {
            if(response != 0) {
              console.log(response);
            }
            else {
                alert('file not removed');
            }
        }
    })

内容类型:指明你要发送的数据类型

处理数据:表示jquery应该序列化数据发送到服务器。

查看:https://api.jquery.com/jquery.ajax/

【讨论】:

  • 我不建议让 OP 迁移到 JSON。您只需要说“删除contentType 和processData 选项”
  • json_decode(stripslashes($_POST['json'])) 在这个答案中完全没有必要
  • 我认为通过它发送原始帖子数据不是一个好习惯。对此有很多不同的立场。Here is other discussion。为了回答,我会说你是对的,上面有额外的代码。
  • 发application/x-www-form-urlencoded数据绝对没有错
  • 是的,删除内容类型和流程数据解决了我的问题。
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多