我刚刚开始学习更多高级SQL和PHP,我真的很难找到如何查询我的数据库以进行我正在构建的测验。
最终,我正在尝试返回一个具有以下结构的json对象,它给出了一个问题列表和所有可能的答案作为多维数组:
{
"questions":
[
{
"question": "question text here",
"answers":
[
{ "answer": "answer text here", "points": 10 },
{ "answer": "answer text here", "points": 20 },
{ "answer": "answer text here", "points": 30 },
{ "answer": "answer text here", "points": 40 }
]
},
{
"question": "question text here",
"answers":
[
{ "answer": "answer text here", "points": 10 },
{ "answer": "answer text here", "points": 20 },
{ "answer": "answer text here", "points": 30 },
{ "answer": "answer text here", "points": 40 }
]
}
]
{
...来自我的以下结构的mySQL表:
测验
id | title
1 | quiz title here
quiz_question
id | quiz_id (FK) | question_text
1 | 1 | question text here
2 | 1 | question text here
quiz_answer
id | quiz_question_id (FK) | answer_text | points
1 | 1 | answer text here | 10
2 | 1 | answer text here | 20
3 | 1 | answer text here | 30
4 | 1 | answer text here | 40
...使用以下外键:
quiz_question.quiz_id is FK to quiz.id
quiz_answer.quiz_question_id is FK to quiz_question.quiz_id
...使用以下PHP(最简单的形式,目前只回复我的问题):
//query the db
$query = mysql_query("
SELECT quiz_question.question_text
FROM quiz_question
JOIN quiz ON quiz.id = quiz_question.quiz_id
WHERE quiz.id = 1;
");
$numrows = mysql_num_rows($query);
for ($i = 0; $i < $numrows; $i++) {
$row = mysql_fetch_assoc($query);
$quiz_data[$i] = array("question" => $row["question_text"]);
}
//echo JSON to page
$response = $_GET["jsoncallback"] . "(" . json_encode($quiz_data) . ")";
echo $response;
...在我的JavaScript中使用jQuery的$ .getJSON(),它从我的PHP中获取了一个JSON格式的对象,它让我得到以下内容:
[
{"question":"question text here"},
{"question":"question text here"}
]
所以我的问题是,如何编写我的SQL和PHP来创建像上面那样的多维数组而不是像我现在要回来的单个数组?我需要弄清楚如何将问题和所有相关答案都包含在一个多维数组中。
答案 0 :(得分:5)
你不能完全用mysql检索一个多维数组(至少据我所知)。你将不得不做一些PHP处理。这听起来并不太疯狂。
首先,通过使用问题ID加入quiz_answers
quiz_questions
,更新您的查询以同时选择答案。然后,在你的循环中:
$quiz = array();
while ($row = mysql_fetch_assoc($result)) {
// you don't need to check num_rows
// fetch_assoc returns false after the last row, so you can do this
// which is cleaner
if (!isset($quiz[$row['question_id'])) {
$quiz[$row['question_id']] = array(
'question' => $row['question_text']
, 'answers' => array()
);
}
$quiz[$row['question_id']]['answers'][] = $row['answer_text'];
}
$full = json_encode(array('questions' => $quiz'));
这将为您提供json编码后所需的数组。
请注意,您最终会为每个答案选择一次问题文本/ ID,效率很低。你可以在答案上使用GROUP_CONCAT
,但上面几乎完全相同,你只需要分开答案字符串。
我还建议您使用PDO
或其他一些包装器mysql_*
。
答案 1 :(得分:1)
据我所知,在从数据库中提取结果后,您需要构建多维数组。
您可以对问题和答案进行联接,因此生成的数组看起来像这样:
$results = array(
array( 'question' => 'question 1', 'answer' => 'answer 1', 'points' => 10 ),
array( 'question' => 'question 1', 'answer' => 'answer 2', 'points' => 30 ),
array( 'question' => 'question 2', 'answer' => 'answer 1', 'points' => 20 ),
array( 'question' => 'question 2', 'answer' => 'answer 2', 'points' => 50 )
);
然后从那里你可以通过将问题和答案分组在一起来构建你的json数组。
基本上,php和标准的mysql_query函数不会构建多维数组,所以你必须自己提取数据并自行构建。
答案 2 :(得分:1)
您只需运行查询,然后根据它创建复合数据结构($questions
);例如:
$questions= array();
$rowsQuestions = $gateway->findQuestions($quiz);
foreach($rowsQuestions as $row)
{
$questions[$row->id] = new stdClass;
$questions[$row->id]->question = $row->question_text;
}
$rowsAnswers = $gateway->findAnswers($quiz);
foreach($rowsAnswers as $row)
{
$answer = (object) array(
'answer' => $row->answer_text,
...
);
$questions[$row->quiz_question_id]->answers[] = $answer;
}
答案 3 :(得分:0)
以前的答案都会比我要提出的更好的表现,但本文提供了一个灵活的解决方案,以及#34;加入&#34;结果,特别是当嵌套连接相互构建时。
<强> PHP Rebuild Database Result Array 强>
通过json_encode()
运行结果,将其转换为JSON对象。