Flex приложение для тестов


Это от Flex приложение, которое предназначено для занятий. Он обращается к базе данных за вопрос, а затем проверяет, чтобы увидеть, если он был помечен (закладки) уже пользователей. "Вопрос" - это объект, значение и "пятнашки" тоже объект значения.

Я просто хотел разместить его, чтобы увидеть, как она может быть лучше. Он отлично работает, но я чувствую, что так как я новичок в этом деле, это, вероятно, не лучший.

public function getQuestionByNumber($itemNum, $userID) {
    $stmt = mysqli_prepare($this->connection,
          "SELECT
                        questions.id, questions.question_number, questions.chapter_id, questions.section_id, 
                        questions.question_txt, questions.answers, questions.feedbacks, questions.correct_answer, 
                        questions.question_type, questions.module, questions.shuffle_answer,
                        questions.tags
           FROM questions where questions.question_number=?");
      $this->throwExceptionOnError();

      mysqli_stmt_bind_param($stmt, 'i', $itemNum); $this->throwExceptionOnError();

      mysqli_stmt_execute($stmt); $this->throwExceptionOnError();

      $row = new Question();

      mysqli_stmt_bind_result($stmt, $row->id, $row->question_number, $row->chapter_id, $row->section_id, 
                                        $row->question_txt, $row->answers, $row->feedbacks, $row->correct_answer, 
                                        $row->question_type, $row->module, $row->shuffle_answer, $row->tags);


          if (mysqli_stmt_fetch($stmt)) {

              } else {
                          return null;
                  }
            mysqli_stmt_free_result($stmt);     
            mysqli_stmt_close($stmt);

    $stmt2 = mysqli_prepare($this->connection,
          "SELECT
                        id
           FROM tagged where user_id =? && question_number=?");
      $this->throwExceptionOnError();

      mysqli_stmt_bind_param($stmt2, 'ii', $userID, $itemNum);
      $this->throwExceptionOnError();

      mysqli_stmt_execute($stmt2);
      $this->throwExceptionOnError();

      $tag = new Tag();

      mysqli_stmt_bind_result($stmt2, $tag->id);

      if (mysqli_stmt_fetch($stmt2)) {
                  $row->tagged = $tag->id;
                  return $row;
      } else {
                  $row->tagged = 0;
                  return $row;
          }


      mysqli_stmt_free_result($stmt2);
      mysqli_close($this->connection);

}


462
2
задан 22 августа 2011 в 10:08 Источник Поделиться
Комментарии
1 ответ

Вы могли бы объединить два SQL-запроса, так что вам не придется дважды попал в базу данных.

Новый оператор SQL будет что-то вроде этого:

SELECT
q.id, q.question_number, q.chapter_id, q.section_id,
q.question_txt, q.answers, q.feedbacks, q.correct_answer,
q.question_type, q.module, q.shuffle_answer,
q.tags, COALESCE(t.id, 0) As tagged
FROM questions q
LEFT JOIN tagged t ON q.question_number = t.question_number AND t.user_id = ?
WHERE q.question_number=?

Функции coalesce возвращает идентификатор помеченных в таблице, если таковой существует, в противном случае она возвращает 0. Это устраняет необходимость для окончательной, если/другое заявление и дает прямое отображение на $строки->помеченные.

Вы должны также освободить всех результирующих наборов и закрыть все подключения перед выдачей оператор return. Любой код после оператора return, выполняться не будут.

2
ответ дан 22 августа 2011 в 11:08 Источник Поделиться