使用php从mySQL数据创建实例
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"
}
]
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);
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.