if you are not posting the actual code that you are having a problem with, the replies you get may not have anything to do with the problem.
here's example code (tested with faked data from the SELECT query) showing most of the points that i made -
<?php
// initialization
// recursive trim function
function _trim($val)
{
if(is_array($val))
{
return array_map('_trim',$val);
} else {
return trim($val);
}
}
session_start();
// make database connection here...
$table_name = 'your_table';
$error = []; // an array to hold user/validation errors
$post = []; // an array to hold a trimmed working copy of the form data
// get all subject data
$sql = "SELECT id, subject_name FROM tbl_subjects_secondary";
$stmt=$pdo->query($sql);
$subject_data = $stmt->fetchAll();
// post method form processing
if($_SERVER['REQUEST_METHOD'] === 'POST')
{
// trim all the input data at once
$post = _trim($_POST);
// loop over the subject ids and validate the corresponding form data
foreach(array_column($subject_data,'id') as $key)
{
if($post['test_score'][$key] === '')
{
$error['test_score'][$key] = "Test Score Field is Required";
}
if($post['exam_score'][$key] === '')
{
$error['exam_score'][$key] = "Exam Score Field is Required";
}
}
// if no errors, use the submitted data
if(empty($error))
{
$sql = "INSERT INTO $table_name (
subject_id,
test_score,
exam_score
) VALUES (
?,
?,
?
)";
$stmt = $pdo->prepare($sql);
foreach(array_column($subject_data,'id') as $key)
{
$stmt->execute([
$key,
$post['test_score'][$key],
$post['exam_score'][$key]
]);
// note: error handling for this query is not included with this example code
}
}
// if no errors, success
if(empty($error))
{
// if you want to display a one-time success message, store it in a session variable, then test, display, and clear that variable in the html document
$_SESSION['success_message'] = 'You have successfully inserted the subject scores';
// redirect to the exact same url of the current page to cause a get request - PRG Post, Redirect, Get.
die(header("Refresh:0"));
}
}
// get method business logic - get/produce data needed to display the page
// get all subject data - located above the post method form processing since it is also used by the validation logic
// html document
?>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>Multi-row Insert Example</title>
</head>
<body>
<?php
// display and clear any success message
if(isset($_SESSION['success_message']))
{
echo '<p>'.$_SESSION['success_message'].'</p>';;
unset($_SESSION['success_message']);
}
?>
<?php
// display the form
?>
<form method="post">
<table class="table table-borderless">
<thead>
<tr>
<th>SN</th>
<th>Subject</th>
<th>Continuous Assessment Score</th>
<th>Examination Score</th>
</tr>
</thead>
<tbody>
<?php
$i = 1;
foreach($subject_data as $row)
{
?>
<tr>
<th><?= $i++ ?></th>
<td><input type="text" class="form-control border-0" readonly value="<?=$row['subject_name']?>"></td>
<td><input type="number" name="test_score[<?=$row['id']?>]" class="form-control" value="<?=htmlentities($post['test_score'][$row['id']]??'',ENT_QUOTES)?>"><span style="color: red; font-size: .8em;"><?= $error['test_score'][$row['id']]??'' ?></span></td>
<td><input type="number" name="exam_score[<?=$row['id']?>]" class="form-control" value="<?=htmlentities($post['exam_score'][$row['id']]??'',ENT_QUOTES)?>"><span style="color: red; font-size: .8em;"><?= $error['exam_score'][$row['id']]??'' ?></span></td>
</tr>
<?php
}
?>
<tr>
<td></td><td></td>
<td colspan="2"><button type="submit" class="btn btn-primary w-50">Save</button></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
this produces valid markup, validation per field, and repopulates the field values upon a validation error.