Как я могу улучшить свой PHP-код для вставки данных в MySQL? - PullRequest
0 голосов
/ 07 апреля 2019

Я новичок в PHP и хочу знать, хорошо ли написана моя функция.

Я создаю приложение для викторины и у меня есть следующие таблицы: пользователи, курсы, тесты (где prof_id, course_id иquiz_name хранятся), вопросы, quizzes_questions, ответы.Обратите внимание, что вопрос может иметь более одного правильного ответа.

Итак, я написал скрипт, который получает в качестве параметров имя теста, имя пользователя профессора, который его создал, курс, вопрос,вопросы этого вопроса, ответ, и является ли этот ответ правильным или нет.

Мой вопрос заключается в том, правильно ли я его реализовал, поскольку я не совсем уверен в использовании внешних ключей.

Сначала я должен найти идентификатор профессора из таблицы пользователей, затем идентификатор курса из курсов, затем идентификатор теста из викторин и затем проверить, существует ли вопрос в таблице.На основании последней проверки я вставляю ее, если она еще не существует, вместе с ее ответами, но если она уже существует, я выбираю ее идентификатор и выполняю вставку ответов в конкретную таблицу.

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);

        }

Можно ли запустить эти выбранные инструкции, чтобы найти идентификаторы, а затем использовать их таким образом?Есть ли более простой способ сделать это, поскольку у меня может быть много сценариев, в которых мне нужно найти идентификатор профессора, что означает, что мне придется копировать и вставлять этот код в каждый файл?

Кроме того,Я читал о подготовленных выражениях, должен ли я использовать их для каждого параметра, который есть в моей функции, так как все они вводятся пользователем?

1 Ответ

0 голосов
/ 07 апреля 2019

Прежде всего, используйте функции вместо нескольких блоков if / else.

Я бы поместил вызов mysqli_fetch_array в отдельную функцию, а также в отдельные методы для профессора, курса и вопросов

Кроме того, используйте операторы для подготовки (оптимизации и защиты) ваших запросов: https://www.php.net/manual/fr/mysqli.prepare.php

Вы также можете взглянуть на текущие конструкторы запросов, такие как доктрина, чтобы использовать его или просто получить вдохновение от его структуры: https://www.doctrine -project.org /

Это будет выглядеть примерно так:

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 = $this->getProfessor($profName);
 if (!$professor) {
   // errors
 } else {
   // succeed
 }

Помните, что функции должны выполнять только одну цель, и вы должны минимизировать if / elses, не говоря уже о вложенных ifs

Вот интересный текст, объясняющий некоторые рекомендации по программному обеспечению и веб-разработке: https://en.wikipedia.org/wiki/SOLID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...