Как получить данные файла и остальные поля формы?
Есть тестовая форма. Задача заключается в следующем:
Нужна на php написать все проверки,а с помощью js получить с сервера ответ и уже вывести ошибки. В форме есть выбор файла,а так же сделать запись данных в бд без ошибок.
Так вот. Я это делаю с помощью json_encode. Записываю все ошибки в массив и отправляю их ,на js с помощью fetch и response.json() получаю данные. Но файл не передается так как он хранится в массиве FILES ,а передать сразу два массива не получается ,выскакивает ошибка. Как сделать так чтобы и передать ошибки если они есть , и обработать файл ,и запись в бд сделать? Уже всю голову сломал. Что то не понимаю
$(document).ready(function(){
$( "#inputDate" ).datepicker({
monthNames: ['Январь', 'Февраль', 'Март', 'Апрель',
'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь',
'Октябрь', 'Ноябрь', 'Декабрь'],
dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
firstDay: 1,
});
$("#polzunok").slider({
animate: "slow",
range: "min",
value: 0,
slide : function(event, ui) {
$("#result-polzunok").text(ui.value);
$("#send-result-polzunok").val(ui.value);
$("#send-result-polzunok").val($("#polzunok").slider("value"));
}
});
$( "#result-polzunok" ).text($( "#polzunok" ).slider( "value" ));
$("#inputPhone").mask("+7 (999) 999 99 999");
//Обработка данных с сервера
toForm.onsubmit = async (e) => {
e.preventDefault();
let response = await fetch('/php/check.php', {
method: 'POST',
body: new FormData(toForm)
});
let result = await response.json();
if (result.length > 1) {
result.forEach(function(item,i,result) {
document.getElementById("errors").innerHTML = item;
});
}else {
document.getElementById("toForm").style = 'display: none;';
document.getElementById("success").innerHTML = 'Спасибо! Данные успешно отправлены.';
}
console.log(result);
};
//Конец обработки данных
});
$phone = htmlspecialchars($_POST['phone']);
$email = htmlspecialchars($_POST['email']);
$date = htmlspecialchars($_POST['date']);
$file = $_FILES['file'];
$range = htmlspecialchars($_POST['send-result-polzunok']);
$errors = array();
if (!$_POST['check']) {
if ($fio === '') {
$errors[] = 'Заполните поле : ФИО';
} elseif (!preg_match("/^[a-zа-яё\d]{1}[a-zа-яё\d\s]*[a-zа-яё\d]{1}$/i", $fio)) {
$errors[] = 'Поле ФИО не может содержать цифры или знаки';
} elseif ((mb_strlen($fio) > 20 || mb_strlen($fio) < 2)) {
$errors[] = 'ФИО от 2 - х до 20 символов';
}
if ($phone === '') {
$errors[] = 'Номер телефона пуст';
}
if (!empty($file) && $file['error'] === 0) {
$fileTmpPath = $_FILES['file']['tmp_name'];
$fileName = $_FILES['file']['name'];
$fileSize = $_FILES['file']['size'];
$fileType = $_FILES['file']['type'];
$fileNameCmps = explode(".", $fileName);
$fileExtension = strtolower(end($fileNameCmps));
$newFileName = md5(time() . $fileName) . '.' . $fileExtension;
$allowedfileExtensions = array('pdf', 'doc', 'docx');
if (!in_array($fileExtension, $allowedfileExtensions)) {
$errors[] = 'Допустимый формат файла: .doc, .docx, .pdf';
}
move_uploaded_file($fileTmpPath, '/tmp/' . $fileName);
}
if ($range === '') {
$errors[] = 'Количество не выбрано';
} elseif ($range < 20 || $range > 80) {
$errors[] = 'Количество: от 20 до 80';
}
if ($date != '') {
$transferDate = strtotime($date);
$returnDate = date("Y-m-d", $transferDate);
}
if (count($errors) === 1){
$servarName = 'localhost';
$dbName = 'save_form_test';
$userName = 'root';
$passUser = '';
$conn = mysqli_connect($servarName, $userName, $passUser, $dbName);
if (!$conn) {
$errors[] = ("Ошибка подключения к базе: " . mysqli_connect_error());
}else {
mysqli_set_charset($conn, "utf8");
}
$sql = "INSERT INTO save_form (name, phone, email,file,date,rage) VALUES ('$fio','$phone','$email','$file','$returnDate','$range' )";
if (mysqli_query($conn, $sql)) {
// $errors[] = "Запись сделана";
} else {
$errors[] = "Ошибка: " . mysqli_error($conn);
}
mysqli_close($conn);
$to = '[email protected]';
$themeMail = 'Тренинг-форма';
//Сообщение на почту
$msgEmail = "Данные сообщения:\r\n";
$msgEmail .= "Email:" . $email . " \r\n";
$msgEmail .= "Телефон:" . $phone . "\r\n";
$msgEmail .= "Дата:" . $returnDate . " \r\n";
$msgEmail .= "Количество:" . $range . "\r\n";
$mailSend = mail($to, $themeMail , $msgEmail);
if ( $mailSend === true) {
$mailSend;
}else {
$errors[] = 'письмо не отправилось';
}
}
}
echo json_encode($errors);