Я хочу опубликовать данные с запросом ajax, но он сказал, что внутренний сервер. Я пытался добавить метаданные и X-CSRF-TOKEN, но все равно не работал. Пожалуйста, взгляните на мой код
Аякс код:
$("#firstForm").on("submit", (e)=>{
e.preventDefault()
let dataString = $(this).serialize();
let email = document.getElementById("emailInput").value
let password = document.getElementById("passwordInput").value
var token = $('meta[name = "csrf-token"]').attr('content');
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': token
}
});
$.ajax({
type: 'POST',
url: '/register/create',
data: dataString,
dataType: 'json',
}).done(function(response){
console.info("Done");
});
return false;
})
HTML-форма:
<form class = "mt-5 text-start" id = "firstForm" method = "post">
<label class = "text-white main-font">Email</label>
<input type = "email" name = "email" id = "emailInput" class = "form-control mb-2" placeholder = "Enter your email here">
<label class = "text-white main-font">Password</label>
<input type = "password" name = "password" id = "passwordInput" class = "form-control password mb-2" placeholder = "Enter your password here">
<i class = "d-none fa-solid fa-eye fs-5 eye" onclick = "eyeOpen()"></i>
<i class = "fa-solid fa-eye-slash fs-5 eye" onclick = "eyeClose()"></i>
<div class = "form-check text-start mb-5">
<input class = "form-check-input" type = "checkbox" value = "" id = "flexCheckDefault">
<label class = "form-check-label text-white" for = "flexCheckDefault">
I've agree to the terms and conditions!
</label>
</div>
<button id = "firstBtn" class = "mb-3 mt-5 btn btn-lg btn-danger text-white main-font w-100">Next</button>
</form>
Маршрут Ларавела:
Route::post('register/create', [AccountController::class, 'create']);
Контроллер Laravel:
public function create(Request $request) {
$user = new User;
$user->email = $request->email;
$user->password = Hash::make($request->password);
$user->save();
return view('accounts.login');
}
Ошибка:
[2022-11-22 13:18:23] local.ERROR: SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (SQL: insert into `users` (`email`, `password`, `updated_at`, `created_at`) values (?, $2y$10$uwsmx9lDw4z9a0tGwUjBWeNM8zfNEkoa7oREGdCBgxTkF3Owlo5Uy, 2022-11-22 13:18:23, 2022-11-22 13:18:23)) {"exception":"[object] (Illuminate\\Database\\QueryException(code: HY000): SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (SQL: insert into `users` (`email`, `password`, `updated_at`, `created_at`) values (?, $2y$10$uwsmx9lDw4z9a0tGwUjBWeNM8zfNEkoa7oREGdCBgxTkF3Owlo5Uy, 2022-11-22 13:18:23, 2022-11-22 13:18:23)) at C:\\xampp\\htdocs\\dating\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:712)
Я нашел логи, но что мне с ними делать?
Читай их? Найдите информацию, что вызвало ошибку...?
Там вроде более 2к строк. Как читать и что искать?
Ошибка обычно ближе к концу. Если есть трассировка стека (с номерами в начале строк), то посмотрите, где находится #0
. Если это журнал Laravel, посмотрите на последнюю строку с отметкой времени.
Вы можете прийти поболтать? я не могу отправить сюда ошибку
Вы можете отредактировать свой пост и добавить туда ошибку
Я изменил. Взгляни, пожалуйста
Field 'name' doesn't have a default value
- Либо передайте что-нибудь вместо имени, либо сделайте поле в таблице пользователей обнуляемым.
Я попытался снова добавить nullable, mirgate и новую базу данных, а также отправить данные имени, но на этот раз он показывает «Нарушение ограничения целостности: 1048 Столбец« электронная почта »не может быть нулевым».... Я проверил запрос сообщения об ошибке и обнаружил, что данные электронной почты и пароля являются нулевыми. Но я не могу найти ошибку в моем коде для этого
Похоже, что форма не дает никаких данных. У меня есть console.info данные, но все они не определены
при создании нового пользователя поле Имя является обязательным, и ошибка также говорит о том, что имя не имеет значения.
попробуйте добавить заполненную форму для имени и отправить ее через ajax. так
<form class = "mt-5 text-start" id = "firstForm" method = "post">
@csrf
<label class = "text-white main-font">Name</label>
<input type = "text" name = "name" id = "name" class = "form-control mb-2" placeholder = "Enter your Name here">
<label class = "text-white main-font">Email</label>
<input type = "email" name = "email" id = "emailInput" class = "form-control mb-2" placeholder = "Enter your email here">
<label class = "text-white main-font">Password</label>
<input type = "password" name = "password" id = "passwordInput" class = "form-control password mb-2" placeholder = "Enter your password here">
<i class = "d-none fa-solid fa-eye fs-5 eye" onclick = "eyeOpen()"></i>
<i class = "fa-solid fa-eye-slash fs-5 eye" onclick = "eyeClose()"></i>
<div class = "form-check text-start mb-5">
<input class = "form-check-input" type = "checkbox" value = "" id = "flexCheckDefault">
<label class = "form-check-label text-white" for = "flexCheckDefault">
I've agree to the terms and conditions!
</label>
</div>
<button id = "firstBtn" class = "mb-3 mt-5 btn btn-lg btn-danger text-white main-font w-100">Next</button>
</form>
а также измените свой контроллер следующим образом
public function create(Request $request) {
$user = new User;
$user->name= $request->name;
$user->email = $request->email;
$user->password = Hash::make($request->password);
$user->save();
return view('accounts.login');
}
измените свой ajax следующим образом
let dataString = $(this).serialize();
$.ajax({
type: "post",
url: '/register/create',
data: dataString, // serializes the form's elements.
success: function(data) {
console.info(data);
},
error: function(data) {
console.info(data['message']);
},
});
Я пробовал это. Теперь форма не дает никаких данных, даже если я ввожу данные. Но данные можно вывести с помощью getElementById().value. Я сериализую данные формы с помощью jquery и отправляю их как данные. Я думаю, что это главная проблема сейчас. Как мне это исправить? Должен ли я избавиться от сериализации?
Я обновил свой ответ, проверьте форму и ajax
Когда я использовал ваш ответ, он сказал, что метод 405 не разрешен. Я видел, что у ajax есть метод удаления. Моя первоначальная форма предназначена для публикации данных. Итак, я изменил его на пост. Затем он сказал 419 неизвестную ошибку статуса, которая может быть связана с отсутствием X-CSRF-TOKEN. Итак, я добавил это тоже. Затем он сказал, что 500 внутренняя ошибка сервера, и предупреждение, которое вы сделали, сказало, что не определено, что является текущей проблемой.
Я добавил X-CSRF-TOKEN в виде @csrf. после удаления оповещения какую ошибку выдает? а также, пожалуйста, удалите заголовки из ajax, я обновил свой ajax, вы можете проверить новое обновление
Это наконец решено сейчас. Я специально закодировал функцию сериализации, чтобы получить шкафную строку данных в качестве возврата функции сериализации Jquery. Спасибо за ваш ответ в любом случае
Рад был помочь. если вам нравится ответ, голосование будет оценено
Я проверил сообщения об ошибках файла laravel.log. Обнаружено, что сериализация Jquery возвращает пустую строку. Итак, я специально закодировал функцию сериализации, чтобы получить строку данных шкафа как Jquery.
let dataString = "email = " + document.getElementById("emailInput").value + "&password = " + document.getElementById("passwordInput").value
Ошибка 500 — это общее сообщение об ошибке, которое охватывает почти все, что может пойти не так с PHP-скриптом. Проверьте журналы ошибок вашего сервера, чтобы узнать точное сообщение об ошибке. Для Laravel также проверьте журналы в
storage/logs/