使用 Codeigniter 3 使用 fetch 将数据发送到控制器时数据变为空

Data becomes null when sending data to controller using fetch using Codeigniter 3

我有数据要从视图发送到控制器。我正在尝试使用 fetch 来发送它。数据已成功发送,状态为 200,并且数据位于网络上的请求负载中。但是当我想尝试在数据控制器中显示它时,它输出 null。有没有人有办法让控制器中的数据不为空?

这是我的脚本:

<?php
defined('BASEPATH') or exit('No direct script access allowed');
?>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <title>Welcome to CodeIgniter</title>
</head>

<body>

    <div id="container">
        <h1>Welcome to CodeIgniter!</h1>

        <div id="body">

        <button id="kirimkecontroller">Kirim</button>

        <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo (ENVIRONMENT === 'development') ?  'CodeIgniter Version <strong>' . CI_VERSION . '</strong>' : '' ?></p>
    </div>
    <script>
        // var data = {
        //  'testing': 'isi testing'
        // }

        let formData = new FormData()
        formData.append('testing', 'isi testing')

        const button = document.querySelector('#kirimkecontroller')
        button.addEventListener('click', () => {
            fetch("<?= base_url(); ?>/welcome/kiriman_dari_fetch", {
                    method: "POST",
                    mode: 'no-cors',
                    headers: {
                        "Content-Type": "application/json"
                    },
                    body: formData,

                }).then(res => console.log('sukses ', res.status))
                .catch(e => console.log('gagal ', e));

            window.open("<?php echo base_url(); ?>welcome/kiriman_dari_fetch", '_blank');
        })
    </script>


</body>

</html>

这是我在控制器中的脚本:

<?php
defined('BASEPATH') or exit('No direct script access allowed');

class Welcome extends CI_Controller
{

    public function index()
    {
        $this->load->view('welcome_message');
    }

    public function kiriman_dari_fetch()
    {
        $testing = $this->input->post('testing');
        echo json_encode($testing); // null
    }
}

输出为null

在检查元素 > 网络中:

如何从那里获取数据到控制器?

public function kiriman_dari_fetch()
    {
        $testing['status'] = $this->input->post('testing');
        echo json_encode($testing); // null
    }

并尝试使用 ajax

$('.kirimkecontroller').click(function(){
      $.ajax({
          type: 'POST',
          url: '<?= base_url(); ?>/welcome/kiriman_dari_fetch',
          dataType: 'json',
          data: formData,
          success: function (response) {
              console.log('sukses ', response.data.status)
              window.open("<?php echo base_url(); ?>welcome/kiriman_dari_fetch", '_blank');
          }
      })
    })

把这个放在你的头标签中

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

据我了解,您的问题是您正在尝试向该控制器发送 POST 请求,并希望在之后在新选项卡上显示 post 的数据,对吧?

如果是,请记住这是两个单独的请求:当您通过获取或 jquery 发送 POST 请求时,控制器已经收到您的数据并通过以下方式响应该请求:

echo json_encode($testing);

因此您可以在“检查元素”>“网络”中看到响应:

但是当你打开一个新的空白时window,它是一个不同的GET请求,所以当你尝试打印它时有空值。 您可以使用以下代码段进行检查:

public function kiriman_dari_fetch()
{
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $testing = $this->input->post('testing');
        echo json_encode($testing);
    } else {
        $data = array();
        $data['request_type'] = 'THIS IS GET';
        $this->load->view('welcome_message', $data); // change welcome_message to another of your views
    }
}

添加 $request_type 查看以检查 GET 或 POST 请求:

<body>

    <div id="container">
        <h1>Welcome to CodeIgniter!</h1>

        <div id="body">

            <button id="kirimkecontroller">Kirim</button>

            <p><?php echo $request_type; ?></p>
....
</html>

当您在浏览器中打开 URL 时,它会显示“THIS IS GET”

回到您的问题,您可以使用 post 请求的响应,然后通过 jquery 或 html 选择器更新当前视图。