0

How do I propagate variables of an instance of an object from mySQL data using php? Here is my object in pseudo code:

exam:{
         questions:[
             question:{
                 questionID: string
                 questionTest: string
                 categoryID: string
                 correctAnswerID: string
                 chosenAnswerID: string
                 answers:[
                     answer:{
                         answerID = string
                         answerText = string
                         isTrue = bool
                     }
                     answer:{}
                 ]
             }
             question:{}
         ]
         categoryID: string
     } 

Here are the corespondant clases (there is a big chance that the syntax is wrong, I am new to php):

class ExamClass
{
    // property declaration
    public $questions = 'a default value';
    public $categoryID = 'a default value';
}

class QuestionClass
{
    // property declaration
    public $questionID = 'a default value';
    public $questionTest = 'a default value';
    public $categoryID = 'a default value';
    public $correctAnswerID = 'a default value';
    public $chosenAnswerID = 'a default value';
    public $answers = 'a default value';
}

class AnswersClass
{
    // property declaration
    public $answerID = 'a default value';
    public $answerText = 'a default value';
    public $isTrue = 'a default value';
}

And here is the php code that extracts the data from the data base:

<html>
<body>

<?php
    /*

     exam:{
         questions:[
             question:{
                 questionID: string
                 questionTest: string
                 categoryID: string
                 correctAnswerID: string
                 chosenAnswerID: string
                 answers:[
                     answer:{
                         answerID = string
                         answerText = string
                         isTrue = bool
                     }
                     answer:{}
                 ]
             }
             question:{}
         ]
         categoryID: string
     }

     */

    class ExamClass
    {
        // property declaration
        public $questions = 'a default value';
        public $categoryID = 'a default value';
    }

    class QuestionClass
    {
        // property declaration
        public $questionID = 'a default value';
        public $questionTest = 'a default value';
        public $categoryID = 'a default value';
        public $correctAnswerID = 'a default value';
        public $chosenAnswerID = 'a default value';
        public $answers = 'a default value';
    }

    class AnswersClass
    {
        // property declaration
        public $answerID = 'a default value';
        public $answerText = 'a default value';
        public $isTrue = 'a default value';
    }


    header('Content-Type: text/html; charset=utf-8');
    $con=mysqli_connect("localhost","root","root","Theory");
    // Check connection
    if (mysqli_connect_errno())
    {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    $result = mysqli_query($con,"SELECT `questions`.`questionID` AS questionID,
                           `questions`.`questionText` AS questionText,
                           `questions`.`categoryID` AS categoryID,
                           `answers`.`answerID` AS answerID,
                           `answers`.`answerText` AS answerText,
                           `answers`.`isTrue` AS isTrue
                                 FROM `questions`,`answers`
                                 WHERE `questions`.`questionID` = `answers`.`questionID`
                                 AND `questions`.`categoryID` = 2");

    if (!$result)
    {
        die('Error: ' . mysqli_error($con));
    }

   $rows = array();
   while($r = mysqli_fetch_assoc($result)) {
        $rows[] = $r;
   }
   print json_encode($rows);

    mysqli_close($con);
    ?>

</body>
</head>

And this is how the currently extracted data looks:

[
  {
    "questionID": "2",
    "questionText": "question text 2",
    "categoryID": "2",
    "answerID": "1",
    "answerText": "answer text 1",
    "isTrue": "0"
  },
  {
    "questionID": "2",
    "questionText": "question text 2",
    "categoryID": "2",
    "answerID": "2",
    "answerText": "answer text 2",
    "isTrue": "1"
  },
  {
    "questionID": "2",
    "questionText": "question text 2",
    "categoryID": "2",
    "answerID": "3",
    "answerText": "answer text 3",
    "isTrue": "0"
  },
  {
    "questionID": "2",
    "questionText": "question text 2",
    "categoryID": "2",
    "answerID": "4",
    "answerText": "answer text 4",
    "isTrue": "0"
  }
]
4

2 回答 2

1

从您的评论看来,您似乎在询问如何使用数据库中的数据来水合这些对象。与其从数据库转到 JSON,不如转到一个对象中,看看mysqli_fetch_object.

mysqli_fetch_object()您可以指定一个类以使用来自查询的数据进行初始化。在你的情况下:

$result = mysqli_query('SELECT * FROM Answers;');
while ($answer = mysqli_fetch_object($result, 'AnswersClass')) {
  var_dump($answer);
}

注意:我今天已经回答了您的其他问题之一,您似乎是从其中一些事情开始的。我鼓励您阅读有关Data MapperActive Record Patterns 的内容。

于 2013-07-16T19:00:47.057 回答
0

这应该会给你一些关于如何将你的数据源映射到你的类的想法。

  class Exam
  {
      // property declaration
      public $questions = array();
      public $categoryID;
  }

  class Question
  {
      // property declaration
      public $questionID;
      public $questionTest;
      public $categoryID;
      public $correctAnswerID;
      public $chosenAnswerID;
      public $answers = array();
  }

  class Answer
  {
      // property declaration
      public $answerID;
      public $answerText;
      public $isTrue;
  }


  class ExamBuilder{
     public function buildExam($data){
        $e = new Exam();
        $e->categoryID = $data->categoryID;
        $this->addQuestions($data->questions, $e);
        return $e;
     }

     protected function addQuestions ($questions, Exam $exam){
        foreach ($questions as $question){
           $q = new Question();
           $q->questionID = $question->questionID;
           $q->questionTest = $question->questionTest;
           $q->categoryID = $question->categoryID;
           $q->correctAnswerID = $question->correctAnswerID;
           $q->chosenAnswerID = $question->chosenAnswerID;
           $this->addAnswers($question->answers, $q);
           $exam->questions[] = $q;
        }
     }

     protected function addAnswer($answer, Question $question){
        $a = new Answer();
        $a->answerID = $a->anwerID;
        $a->answerText = $answer->answerText;
        $a->isTrue = $answer->isTrue;
     }
  }

使用

 $builder = new ExamBuilder();
 $exam = $builder->buildExam($data);
于 2013-07-16T19:32:47.163 回答