代码之家  ›  专栏  ›  技术社区  ›  Yerkin

条件不适用于PHP和mysqli

  •  -1
  • Yerkin  · 技术社区  · 2 年前

    我的数据库中有两个表:学生和教师。我试着给每位老师分配4名学生,他们正在写关于老师主题的论文。为此,我创建了第三个表:赋值。我提出了两个条件:如果学生被分配(他或她分配的表值为1),那么代码应该跳过该学生,如果老师有超过3个分配的学生(他或她分配的表值小于4),那么代码应该跳过该老师。这是我尝试过的代码:

    <?php
    
        require('config_teachers.php');
        require('config_students.php');
    
        // We get all the info as associative arrays: $students_info and $teachers_info.
    
        $serverName = "localhost";
        $user = "root";
        $password = "";
        $dbName = "yerkindb";
        
        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 ){
    
                    $conn = mysqli_connect($serverName, $user, $password, $dbName);
    
                    if(mysqli_connect_errno()){
                            
                        echo "Failed to connect to mysqli.".mysqli_connect_errno();
                            
                    } else {
                            
                        $name_student = $student_info['name'];
                        $name_teacher = $teacher_info['name'];
                        $subject = $student_info['ee_subject'];
    
                        $query = "INSERT INTO assignment(student_name, advisor_name, subject) values('$name_student', '$name_teacher', '$subject')";
                                
                        mysqli_query($conn, $query);
    
                        $assigned_teacher = $teacher_info['assigned'];
    
                        $assigned_teacher = $assigned_teacher + 1;
    
                        $query = "UPDATE teachers SET assigned = $assigned_teacher WHERE name = '$name_teacher'";
    
                        mysqli_query($conn, $query);
    
                        $query = "UPDATE students SET assigned = 1 WHERE name = '$name_student'";
    
                        mysqli_query($conn, $query);
    
                        mysqli_close($conn);
                    }
                }
            }
        }
    
    ?>
    

    排队

    if($student_info['assigned'] == 0 && $student_info['ee_subject'] == $teacher_info['ee_subject_1_choice'] && $teacher_info['assigned'] < 4 ){
    

    有我想要指定的条件,但是,当我运行代码时,我会让每个学生被指定给每一位老师,他们的主题与他或她正在写文章的主题相同。

    有人能解释为什么这些条件会被忽略,即使

    $student_info['ee_subject'] == $teacher_info['ee_subject_1_choice']
    

    这种情况并没有被忽视。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Barmar    2 年前

    一旦你把一个学生分配给一个老师,你就应该跳出教师循环,这样你就不会试图把这个学生分配给另一个老师。

    当你把一个学生分配给一个老师时,你需要增加 $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);