如何改进PHP代码以将数据插入MySQL?

如何改进PHP代码以将数据插入MySQL?,php,mysql,mysqli,Php,Mysql,Mysqli,我是PHP的初学者,想知道我的函数是否写得很好 我正在创建一个测验应用程序,并具有以下表格:用户、课程、测验(存储教授id、课程id和测验名称的位置)、问题、测验问题、答案。请注意,一个问题可以有多个正确答案 所以,我写了一个脚本,接收测验的名称、创建测验的教授的用户名、课程、问题、问题的要点、答案以及答案是否正确等参数 我的问题是我是否正确地实现了它,因为我不确定是否使用外键 首先,我必须从用户表中找到教授的id,然后从课程中找到课程的id,然后从测验中找到测验的id,然后检查表中是否已经存在

我是PHP的初学者,想知道我的函数是否写得很好

我正在创建一个测验应用程序,并具有以下表格:用户、课程、测验(存储教授id、课程id和测验名称的位置)、问题、测验问题、答案。请注意,一个问题可以有多个正确答案

所以,我写了一个脚本,接收测验的名称、创建测验的教授的用户名、课程、问题、问题的要点、答案以及答案是否正确等参数

我的问题是我是否正确地实现了它,因为我不确定是否使用外键

首先,我必须从用户表中找到教授的id,然后从课程中找到课程的id,然后从测验中找到测验的id,然后检查表中是否已经存在该问题。根据上一次检查,如果它不存在,我将插入它以及它的答案,但是如果它已经存在,我将选择它的id并在特定表中插入答案

public function insert_question($quiz_name,$professor,$course,$question,$points,$answer,$is_correct)
        {       
            $query = "select id from users where username ='$professor'";
            $result = mysqli_query($this->connection, $query);
            if(mysqli_num_rows($result)>0){
                $row=mysqli_fetch_array($result);
                $professor_id = $row['id']; 
            }else{
                $json['error'] = 'professor not found';
            }

            $query = "select id from courses where course ='$course'";
            $result = mysqli_query($this->connection, $query);
            if(mysqli_num_rows($result)>0){
                $row=mysqli_fetch_array($result);
                $course_id = $row['id'];    
            }else{
                $json['error'] = 'course not found';
            }

            $query = "select id from quizzes where professor_id ='$professor_id' and course_id = '$course_id'";
            $result = mysqli_query($this->connection, $query);
            if(mysqli_num_rows($result)>0){
                $row=mysqli_fetch_array($result);
                $quiz_id = $row['id'];          
            }else{
                $json['error'] = 'quiz not found';
            }

            $query = "select id from questions where question ='$question'";
            $result = mysqli_query($this->connection, $query);
            if(mysqli_num_rows($result)>0){
                //question already exists so we need to add its answers
                $row=mysqli_fetch_array($result);
                $question_id = $row['id'];

                $query = "insert into answers (question_id, answer, isCorrect) values ('$question_id','$answer','$is_correct')";
                $insertedA = mysqli_query($this -> connection, $query);
                if($insertedA == 1 ){
                    $jsonA['success'] = 'answer added';
                }
                else{
                    $jsonA['error'] = 'answer couldn\'t be added';
                }   

            }else if(mysqli_num_rows($result)==0){
                    //insert the actual question
                    $query = "insert into questions (question, points) values ('$question','$points')"; 
                    $insertedQ = mysqli_query($this -> connection, $query);
                    if($insertedQ == 1 ){
                        $jsonQ['success'] = 'question added';
                        $last_question_id = mysqli_insert_id($this -> connection); //id of the question i just inserted
                        echo $last_question_id;
                    }
                    else{
                        $jsonQ['error'] = 'question couldn\'t be added';
                    }


                    //insert into quizzes_questions
                    $query = "insert into quizzes_questions(quiz_id, question_id) values ('$quiz_id','$last_question_id')"; 
                    $insertedQQ = mysqli_query($this -> connection, $query);
                    if($insertedQQ == 1 ){
                        $jsonQQ['success'] = 'queestionQuizz added';
                    }
                    else{
                        $jsonQQ['error'] = 'questionQuizz couldn\'t be added';
                    }

                    $query = "insert into answers (question_id, answer, isCorrect) values ('$last_question_id','$answer','$is_correct')";
                    $insertedA = mysqli_query($this -> connection, $query);
                    if($insertedA == 1 ){
                        $jsonA['success'] = 'answer added';
                    }
                    else{
                    $jsonA['error'] = 'answer couldn\'t be added';
                    }   

                }else{
                $json['error'] = 'something wrong';
            }

                echo json_encode($json);
                echo json_encode($jsonA);
                echo json_encode($jsonQ);
                echo json_encode($jsonQQ);

                mysqli_close($this->connection);

        }
运行那些select STATAMENT查找ID,然后像那样使用它们,可以吗?有没有更简单的方法可以做到这一点,因为我可能有很多脚本,其中我必须找到教授的id,这意味着我必须在每个文件中复制粘贴此代码


另外,我已经阅读了关于准备好的语句,我是否应该对函数中的每个参数使用它们,因为它们都是用户输入的?

首先,使用函数而不是多个if/else块

我将把
mysqli\u fetch\u array
调用放入一个单独的函数中,以及教授、课程和问题的单独方法中

此外,使用语句准备(优化和保护)查询:

您还可以查看当前的查询构建器(如条令)来使用它,或者仅仅从它的结构中得到启发:

看起来是这样的:

function fetch($query, $statements) {
   $q = mysqli_prepare($this->connection, $query);

   foreach($statements as $ statement) {
      mysqli_stmt_bind_param($q, $statement);
   }

   $res = mysqli_stmt_execute($q);
   return mysqli_num_rows($res) > 0 ? $res : null;

}

function getProfessor($professor) {
   $res = $this->fetch("select id from users where username = ? LIMIT 1", array($username));
   return $res ? mysqli_fetch_array($res)['id'] : null;
}

...
然后在主函数中,您可以测试professor是否为null

 $professor = $this->getProfessor($profName);
 if (!$professor) {
   // errors
 } else {
   // succeed
 }
记住,函数应该只满足一个目的,并且应该最小化if/else,更不用说嵌套的if了


这里有一篇有趣的文章解释了一些关于软件和web开发的指导原则:

您可以从阅读有关使用的内容开始。