ОШИБКА blocked by CORS при создании класса PHP

138
24 января 2022, 00:10

Есть такой код

document.querySelector('#sellForm').addEventListener('submit', function(e) { 
  e.preventDefault(); 
  let bodySell = new FormData(this); 
  bodySell.append('action', 'sell'); 
 
  fetch('http://colorshop/core/core.php', { 
    method: 'post', 
    mode: 'cors', 
    credentials: 'include', 
    body: bodySell 
  }).then(response => { 
    return response.text(); 
  }).then(res => { 
    this.reset(); // очищаем поля формы  
    console.log(res); 
  }); 
});

<form id="sellForm" enctype="multipart/form-data"> 
  <input type="file" name="file" id="createImg" class="inputfile" accept="image/*" /> 
  <label for="createImg">Выберети файл</label><br> 
  <input name="name" type="text" placeholder="Название" id="createName"><br> 
  <textarea name="descr" id="createDescr" cols="30" rows="10" placeholder="Описание"></textarea><br> 
  <input name="cost" type="number" placeholder="Цена" id="createCost"> 
 
  <input type="submit" id="goCreate" /> 
</form>

При отправке(даже еще не отправляя, просто открыв вкладку с этим скриптом) вылазит такая ошибка

в php выполняется такой код:

<?php 
    cors(); 
    session_start();//session 
    error_reporting(E_ALL);//show all errors 
 
    // auto load classes 
    spl_autoload_register(function ($class_name) { 
        include './classes/' . $class_name . '.php'; 
    }); 
 
    $do = new Do(); 
 
    switch ($action) { 
        case 'sell': 
            $name = $_POST['name']; 
            $descr = $_POST['descr']; 
            $cost = $_POST['cost']; 
             
            $do->doSell($_FILES, $name, $descr, $cost); 
            break; 
    }  
 
    function cors() { 	 
        if (isset($_SERVER['HTTP_ORIGIN'])) { 
            header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
            header('Access-Control-Allow-Credentials: true'); 
            header('Access-Control-Max-Age: 86400'); 
        } 
 
        if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
 
            if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 
                header("Access-Control-Allow-Methods: GET, POST, OPTIONS");          
 
            if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
                header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 
        } 
    } 
?>

В нем создается экземпляр класса Do

require_once('connect.php'); 
 
class Do extends Connect { 
  // получить соединение с бд 
  protected $conn; 
 
  public 
  function doSell($file, $name, $descr, $cost) { 
    $conn = parent::conn(); 
 
    $file_name = $file['file']['name']; 
    $file_size = $file['file']['size']; 
    $file_tmp = $file['file']['tmp_name']; 
    $seller = $_SESSION['userName']. 
    ':'.$_SESSION['userId']; 
 
    if ($file_size < 2097152) { 
      echo time(); 
      move_uploaded_file($file_tmp, 'goods/'.$file_name); 
 
      $sel = $conn - > query("INSERT INTO `goods` (`name`, `descr`, `cost`, `img`, `seller`) VALUES ('$name', '$descr', '$cost', 'img', '$seller')"); 
    } else echo 'img'; 
  } 
}

В целом не важно, что в нем находится, ведь даже если я напишу в нем echo 123, то он всё равно выдается ошибку. Если не создавать экземпляр, то всё окей

Для справки напишу, что в том же месте, что и Do, создаются и другие экземпляры классов, которые работает правильно.

Добавлю еще видео, которое демонстрирует, что без класса Do всё работает(так же есть и другие классы) вот ссылка

https://vk.com/im?peers=435058534_-123083697&sel=458561605&z=video261429253_456239116%2F6603a54a5fe58cd7dd

Answer 1

Возможно проблема в порядка вызова, session_start

https://www.php.net/manual/ru/function.session-start.php

Замечание:

Для использования сессий на основе cookie, функция session_start() должна быть вызвана перед выводом чего бы то ни было в браузер.

переставьте

cors(); session_start();//session

на

session_start();//session cors();

Answer 2

Так же нужно разрешить заголовок Access-Control-Allow-Origin.

Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»

https://developer.mozilla.org/ru/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin

    function cors() {   
      if (isset($_SERVER['HTTP_ORIGIN'])) {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');
     }

возможно проблема в этом куске кода, уберите проверку. Убедитесь что Access-Control-Allow-Origin, добавляется в header

Answer 3

А что у вас в $_SERVER['HTTP_ORIGIN']? Попробуйте использовать:

header("Access-Control-Allow-Origin: *");

вместо:

header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");

Возможно, браузер не отправляет Origin. Или сервер настроен так, что не заполняет переменную $_SERVER['HTTP_ORIGIN'].

Answer 4

Хохо, ответ был скрыт в названии класса. Я поменял название на ToDo, и был удивлен, что всё заработало. Я так и не понял как связана ошибка с названием класса

READ ALSO
Расширение функций в Ember Glimmer компонентах

Расширение функций в Ember Glimmer компонентах

В классических компонентах можно было не только переопределять, но и расширять функции

166
Помогите с регулярным выражением,

Помогите с регулярным выражением,

Есть строка вида: "1) Решил за 30 сек2) Решил за 10 сек

90
что возвращает return this?

что возвращает return this?

Возвращается ссылка на себяЭтот "шаблон" позволяет писать такой код:

101
Помогите с запросом пожалуйста, поиск по первым символам в строке

Помогите с запросом пожалуйста, поиск по первым символам в строке

Суть проблемы есть столбец в базе в нем записаны строки 0004 68 0C 33 03 C2 50 A3 E9 мне необходимо искать по первым символам 0004Есть такой запрос

121