简体   繁体   中英

Creating instance from mySQL data using php

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"
  }
]

From your comments, it seems as though you asking how to hydrate these objects with data with the database. Instead of going to from the database, to JSON, into an object, take a look at mysqli_fetch_object .

With mysqli_fetch_object() you can specify a class to initialize with data from the query. In your case:

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

Note: I answered one of your other questions already today and it seems like you are starting out with some of these things. I would encourage you to read about Data Mapper and Active Record Patterns.

This should give you some ideas on how to map your data source to your classes.

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

To use

 $builder = new ExamBuilder();
 $exam = $builder->buildExam($data);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM