一旦你把一个学生分配给一个老师,你就应该跳出教师循环,这样你就不会试图把这个学生分配给另一个老师。
当你把一个学生分配给一个老师时,你需要增加
$teacher_info['assigned']
.为了做到这一点,迭代变量需要是对数组元素的引用;否则,您将获得阵列的副本,这不会影响未来的迭代。
在下面的代码中,我已将所有查询转换为准备好的语句。
$conn = mysqli_connect($serverName, $user, $password, $dbName);
if(mysqli_connect_errno()){
echo "Failed to connect to mysqli.".mysqli_connect_errno();
} else {
$insert_assignment_stmt = $conn->prepare("INSERT INTO assignment(student_name, advisor_name, subject) values(?, ?, ?)");
$insert_assignment_stmt->bind_param("sss", $name_student, $name_teacher, $subject);
$update_teacher_stmt = $conn->prepare("UPDATE teachers SET assigned = assigned + 1 WHERE name = ?");
$update_teacher_stmt->bind_param("s", $name_teacher);
$update_student_stmt = $conn->prepare("UPDATE students SET assigned = 1 WHERE name = ?");
$update_student_stmt->bind_param("s", $name_student);
foreach($students_info as &$student_info){
foreach($teachers_info as &$teacher_info){
if($student_info['assigned'] == 0 && $student_info['ee_subject'] == $teacher_info['ee_subject_1_choice'] && $teacher_info['assigned'] < 4 ){
$name_student = $student_info['name'];
$name_teacher = $teacher_info['name'];
$subject = $student_info['ee_subject'];
$insert_assignment_stmt->execute();
$update_teacher_stmt->execute();
$update_student_stmt->execute();
$teacher_info['assigned']++;
break;
}
}
}
}
mysqli_close($conn);