Я пытаюсь добавить запись о посещаемости для группы студентов (одного класса), используя модальный Bootstrap.
Ниже приведен код моего bootstrap модального окна (в котором я использовал форма)
<div id = "add_attendance_modal" class = "modal fade">
<div class="modal-dialog mw-100 w-75">
<form action="post" id = "add_attendance_form">
<div class = "modal-content">
<div class = "modal-header">
<h4 class = "modal-title">Add Attendance Record</h4>
<button type = "button" class = "close" data-dismiss="modal">×</button>
</div>
<div class = "modal-body">
<div class ="form-group">
<div class = "row">
<label class = "col-md-4 text-right">Attendance Date</label>
<div class = "col-md-8">
<input type="date" name = "attendance_date" id = "attendance_date" class = "form-control" />
</div>
</div>
</div>
<div class = "form-group" id = "student_details">
<div class = "table-responsive">
<table class = "table table-striped table-bordered">
<thead>
<tr>
<th>Roll Number</th>
<th>Student Name</th>
<th>Present</th>
<th>Leave</th>
<th>Absent</th>
</tr>
</thead>
<tbody>
<?php
foreach($students as $student)
{
?>
<tr>
<td><?php echo $student['username']; ?></td>
<td><?php echo $student['name']; ?>
<input type="hidden" name = "student_id[]" value = "<?php echo $student["id"] ?>">
</td>
<td><input type="radio" name = "attendance_status<?php echo $student['id']; ?>" checked value = "Present" /></td>
<td><input type="radio" name = "attendance_status<?php echo $student['id']; ?>" value = "Absent" /></td>
<td><input type="radio" name = "attendance_status<?php echo $student['id']; ?>" value = "Leave" /></td>
</tr>
<?php }
?>
</tbody>
</table>
</div>
</div>
</div>
<div class = "modal-footer">
<input type="submit" name = "add_attendance_submit" id = "add_attendance_submit" class = "btn btn-success" value = "Add Attendance" />
<button type = "button" class = "btn btn-danger" data-dismiss="modal">Close</button>
</div>
</div>
</form>
</div>
</div>
$ студенты - это массив всех студентов определенного класса ..
Ниже приведен мой код Ajax в Javascript с которым я пытаюсь работать,
$("#add_attendance_form").on('submit', function(event){
event.preventDefault();
$.ajax({
url:"attendance_action.php",
method: "POST",
data: $(this).serialize() + "&action = add_attendance",
dataType: 'json',
beforeSend: function()
{
$("#add_attendance_submit").val("Validating....");
$("#add_attendance_submit").attr('disabled', true);
},
success:function(data)
{
$("#add_attendance_submit").val("Add Attendance");
$("#add_attendance_submit").attr('disabled', false);
if (data.success)
{
$('message_operation').html('<div class = "alert alert-success">'+data.success+'</div>');
$('#add_attendance_modal').modal('hide');
dataTable.ajax.reload();
}
if (data.error)
{
if (data.error_attendance_date != '')
$("#error_attendance_date").text(data.error_attendance_date);
else
$("#error_attendance_date").text('');
}
},
error: function(e)
{
console.log(e);
alert("error");
}
});
});
Это код PHP в Attentionance_action. php
if (isset($_POST['action']) && $_POST['action'] == "add_attendance")
{
$attendance_date = '';
$error_attendance_date = '';
$output = '';
$error = 0;
if ($_POST['attendance_date'] == '')
{
$error_attendance_date = "Attendance Date is Required...";
$error++;
}
else
{
$attendance_date = $_POST['attendance_date'];
}
if ($error > 0)
{
$output = array(
"error" => true,
"error_attendance_date" => $error_attendance_date
);
}
else
{
$student_id = $_POST['student_id'];
$results = check_attendance_records($student_id[0], $attendance_date);
if ($results->rowCount() > 0)
{
$output = array(
'error' => true,
'error_attendance_date' => 'Attendance data already exists on this data'
);
}
else
{
for ($count = 0; $count < count($student_id); $count++)
{
$data = array(
':student_id' => $student_id[$count],
':attendance_status' => $_POST["attendance_status".$student_id[$count].""],
':attendace_date' => $attendance_date
);
$db->insert_to_attendance_table($data, $id); // Where $id is teacher id
}
$output = array(
'success' => 'Data Added Successfully'
);
}
}
echo json_encode($output);
}
И, наконец, вот функция базы данных, используемая в действие посещаемости. php (в случае, если кому-то нужно взглянуть на это) ... Они определены в классе базы данных, объектом которого является $ db.
public function check_attendance_records($student_id, $date)
{
$data = array();
$sql = "select * from junc_attendance where student_id = :student_id AND date = :date";
$stmt = $this->conn->prepare($sql);
$data['classroom_id'] = $classroom_id;
$stmt->execute($data);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
public function insert_to_attendance_table($data, $teacher_id)
{
$class_data = get_classroom_details($teacher_id);
$classroom_id = $class_data['id'];
$sql = "INSERT INTO jnc_attendance(classroom_id, date, student_id, status) VALUES (:attendance_date, :classroom_id, :student_id, :attendance_status)";
$stmt = $this->conn->prepare($sql);
$stmt->execute(['classroom_id' => $classroom_id], $data);
return true;
}
Мне нужны данные в форме json, поэтому я использовал dataType как json.
Я использовал три разных условия, сначала проверяется, пуста ли дата посещаемости ... Второй проверяет, используется ли уже дата посещаемости, а третий - условие успеха, если все проходит. ht. Но функция ajax выдает ошибку при всех условиях и всегда вызывает функцию error вместо success .
Может ли кто-нибудь помочь мне и указать на ошибка? Буду очень благодарен Я попытался использовать команду console.log (e) в поле ошибки, но ничего не понял.
Я также проверил Netwrok из инструментов и данных отправка на сервер выглядит идеально, однако я никогда не получал никакого ответа от сервера в сети, который я должен был получить в виде json.
Данные, отправленные в Activity_action. php (как видно из сети в инструментах) Я не выбрал какую-либо дату, и, следовательно, Activity_date здесь пуста.
attendance_date:
student_id[]: 2
attendance_status2: Present
student_id[]: 3
attendance_status3: Present
student_id[]: 4
attendance_status4: Present
action : add_attendance
Из console.log (e) это то, что я получаю (это довольно длинный ответ, однако я его совсем не понимаю: /)
{readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …}
abort: ƒ (e)
always: ƒ ()
catch: ƒ (e)
done: ƒ ()
fail: ƒ ()
getAllResponseHeaders: ƒ ()
getResponseHeader: ƒ (e)
overrideMimeType: ƒ (e)
pipe: ƒ ()
progress: ƒ ()
promise: ƒ (e)
readyState: 4
responseText: ""
setRequestHeader: ƒ (e,t)
state: ƒ ()
status: 200
statusCode: ƒ (e)
statusText: "OK"
then: ƒ (t,r,i)
__proto__: Object
Я могу открыть любой из них и все go в бесконечный l oop на протокол . Однако не могу понять, почему ... Пытался найти эту ошибку, обнаружил, что мне нужно вернуть мои данные в форме json, но я уже делаю это.
* Это то, что Я получил, при открытии "готово" немного ... Это можно открыть дальше, но похожие поля все еще появляются *
done: ƒ ()
arguments: (...)
caller: (...)
length: 0
name: "add"
prototype:
constructor: ƒ ()
__proto__:
constructor: ƒ Object()
arguments: (...)
assign: ƒ assign()
arguments: (...)
caller: (...)
length: 2
name: "assign"
__proto__: ƒ ()
apply: ƒ apply()
arguments: (...)
bind: ƒ bind()
call: ƒ call()
caller: (...)
constructor: ƒ Function()
length: 0
name: ""
toString: ƒ toString()
Symbol(Symbol.hasInstance): ƒ [Symbol.hasInstance]()
get arguments: ƒ ()
set arguments: ƒ ()
get caller: ƒ ()
set caller: ƒ ()
__proto__: Object
[[FunctionLocation]]: <unknown>
[[Scopes]]: Scopes[0]
[[Scopes]]: Scopes[0]
caller: (...)
create: ƒ create()
defineProperties: ƒ defineProperties()
defineProperty: ƒ defineProperty()
entries: ƒ entries()
freeze: ƒ freeze()
fromEntries: ƒ fromEntries()
getOwnPropertyDescriptor: ƒ getOwnPropertyDescriptor()
getOwnPropertyDescriptors: ƒ getOwnPropertyDescriptors()
getOwnPropertyNames: ƒ getOwnPropertyNames()
getOwnPropertySymbols: ƒ getOwnPropertySymbols()
getPrototypeOf: ƒ getPrototypeOf()
is: ƒ is()
isExtensible: ƒ isExtensible()
isFrozen: ƒ isFrozen()
isSealed: ƒ isSealed()
keys: ƒ keys()
length: 1
name: "Object"
preventExtensions: ƒ preventExtensions()
prototype: {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
seal: ƒ seal()
setPrototypeOf: ƒ setPrototypeOf()
values: ƒ values()
__proto__: ƒ ()
[[Scopes]]: Scopes[0]
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()