Есть такой код
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
Возможно проблема в порядка вызова, session_start
https://www.php.net/manual/ru/function.session-start.php
Замечание:
Для использования сессий на основе cookie, функция session_start() должна быть вызвана перед выводом чего бы то ни было в браузер.
переставьте
cors(); session_start();//session
на
session_start();//session cors();
Так же нужно разрешить заголовок 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
А что у вас в $_SERVER['HTTP_ORIGIN']? Попробуйте использовать:
header("Access-Control-Allow-Origin: *");
вместо:
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
Возможно, браузер не отправляет Origin. Или сервер настроен так, что не заполняет переменную $_SERVER['HTTP_ORIGIN'].
Хохо, ответ был скрыт в названии класса. Я поменял название на ToDo, и был удивлен, что всё заработало. Я так и не понял как связана ошибка с названием класса
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В классических компонентах можно было не только переопределять, но и расширять функции
Возвращается ссылка на себяЭтот "шаблон" позволяет писать такой код:
Суть проблемы есть столбец в базе в нем записаны строки 0004 68 0C 33 03 C2 50 A3 E9 мне необходимо искать по первым символам 0004Есть такой запрос