Не удается получить доступ к данным выборки post в контроллере: Codeigniter

#codeigniter #fetch

#codeigniter #выборка

Вопрос:

Я делаю запрос post, используя выборку в моем проекте codeigniter. Запрос выглядит следующим образом

 fetch('myurl/mycontroller', {
    method: 'POST',
    headers: {
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
         testdata: 123,
    })
 }).then((res) => {
    console.log(res);
 }).catch(console.log);
  

Мой контроллер выглядит следующим образом

 class MyController extends CI_Controller
{
    public function mycontroller()
    {
        $data = $this->input->post('testdata');
        return $data . " is the passed data.";
    }
}
  

Но данные не передаются на мой контроллер. Я повторил, $_POST и это дало мне пустой массив. Есть идеи, что я делаю не так? Я использую codeigniter 2 (который, как я знаю, сейчас очень старый)

Комментарии:

1. Можете ли вы опубликовать весь свой контроллер?

2. это весь мой контроллер. Я только что запустил тест и не смог получить данные для публикации

3. Я давно не использовал codeigniter 2. Но я уверен, что контроллер должен быть классом, а не просто функцией.

4. о, я понимаю, что вы имеете в виду, но это функция в контроллере

5. Я не уверен, что проблема здесь в codeigniter-2 или в вашем javascript. Когда вы используете тот же javascript для отправки в новый php-файл, который имеет только print_r($ _POST), это что-нибудь дает?

Ответ №1:

Так что не совсем уверен в фактической причине, но может быть какая-то ошибка с ядром CI codeigniter, которое не анализирует данные, передаваемые контроллеру с помощью выборки. Используя FormData() и axios я смог решить проблему.

  var postData = new FormData();
 postData.append('testdata', 123);
 axios.post('myurl/mycontroller', postData).then(function(response){
     console.log("success:", response);
 }).catch(function(error){
     console.log("error:", error);
 });
  

Ответ №2:

Используйте FormData() для отправки

 var postData = new FormData();
postData.append('testdata', 123);

fetch('myurl/mycontroller', {
    method: 'POST',
    headers: {
        "Content-Type": "application/json"
    },
    body: postData
 }).then((res) => {
    console.log(res);
 }).catch(console.log);
  

Комментарии:

1. Я попробовал это решение и получил тот же результат. Данные не передаются. повторение $_POST по-прежнему является пустым массивом

2. попробуйте это на контроллере $input = json_decode(trim(file_get_contents('php://input')), true); $data = $input['testdata'] и используйте свою выборку

3. я смог решить эту проблему, используя axios вместо выборки

4. @justinS не могли бы вы опубликовать решение, чтобы кто-нибудь мог найти его позже?

Ответ №3:

Это сработало для меня:

 let postData = new FormData();
postData.append('testdata', 123);

fetch('myurl/mycontroller', {
    method: 'POST',
    mode: 'no-cors',
    headers: {
        "Content-Type": "application/json"
    },
    body: postData
 }).then((res) => {
    console.log(res);
 }).catch(console.log);

  

Используйте formData и mode: 'no-cors' в настройках выборки.

Комментарии:

1. Спасибо за ваш ответ. Можете ли вы сказать мне, какую версию Codeigniter вы используете? Тот, над которым я работал, был Codeigniter 2 (я знаю устаревшую версию), но для Codeigniter 2 он не может правильно отформатировать данные post, чтобы серверная часть могла их правильно прочитать. Добавление режима не имело никакого значения.

2. привет @ JustinS, в настоящее время я использую CI v3.1.11. В контроллере, который я использую $this->input->post() для получения данных. Разница может быть в версии.

3. Эта комбинация сработала для меня после нескольких часов ломки головы! Забавно, что я постоянно использую CI 3.1, но это простой PHP-скрипт. Итак, два за один!

Ответ №4:

У меня была аналогичная проблема, позже я исправил ее, не переходя от выборки js. Вот как я это решил.

  • Убедитесь, что в вашем файле маршрутизации есть маршрут Post к вашему контроллеру CI
  • Убедитесь, что ваш URL-адрес fetch api не имеет завершающего ‘/’
 let data = await fetch('https://example.com/api/login', {
              method: 'POST',
              credentials: 'same-origin',
              mode: 'same-origin',
              headers: {
                'Accept':       'application/json',
                'Content-Type': 'application/json',

              },
              body: JSON.stringify({email: 'sample@gmail.com', password: 'crypt887faked'}),
          });

          let response = await data.json();
  

Это сработало для меня. Я надеюсь, что это сработает и для кого-то.