如何从 mySQL 和 PHP 检索结果为多维数组?

Posted

技术标签:

【中文标题】如何从 mySQL 和 PHP 检索结果为多维数组?【英文标题】:How do I retrieve results as multidimensional array from mySQL and PHP? 【发布时间】:2012-02-06 04:50:22 【问题描述】:

我刚刚开始学习更高级的 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

测验问题

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 来创建一个像上面那样的多维数组,而不是像我现在返回的单个数组?我需要弄清楚如何将问题和所有相关答案包含在一个多维数组中。

【问题讨论】:

$_GET["jsoncallback"]() 是做什么的?它看起来令人毛骨悚然:P @PeeHaa 用于 jsonp 那会在 JS 中运行吗?如果是这样,用户可以执行以下操作:http://url?jsoncallback=alert('something'); callback 【参考方案1】:

您不能仅使用 mysql 检索多维数组(至少据我所知)。您将不得不进行一些 php 处理。这听起来不太疯狂。

首先,通过使用问题 ID 在 quiz_questions 上加入 quiz_answers,更新您的查询以同时选择答案。然后,在你的循环中:

$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,但上述方法几乎仍然可以正常工作,您只需拆分答案字符串。

我还建议您使用PDOmysql_* 之上的其他包装器。

【讨论】:

谢谢。这看起来会满足我的需求。我现在的部分问题是编写 SQL。我现在正在尝试 JOINS,但仍在努力解决它。 好的,所以我可以轻松地为测验问题和答案分别编写 SELECT 语句,但我的问题是,如何将它们组合成一个查询? 就像SELECT whatever FROM quiz JOIN questions ON (quiz.id = questions.quiz_id) JOIN answers ON (questions.id = quiz_question_id);一样简单 这比我想象的要简单,我意识到我已经把事情复杂化了。非常感谢! @Critter 不要忘记接受有助于解决您问题的答案!【参考方案2】:

据我所知,您需要在从数据库中提取结果后构建多维数组。

您可能可以对问题和答案进行连接,因此结果数组将如下所示:

$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 函数不会构建多维数组,因此您必须拉取数据并自己构建。

【讨论】:

这也是一种有趣的方法。关于如何基于此构建多维数组有任何指示吗?我是否必须查看“问题”字符串并在循环遍历它时注意变化?字符串的变化等于一个新的问题。 我只是将 mysql_fetch_assoc 结果合并到一个数组中。它会和 tandu 做同样的检查,在那里你检查问题,他这样做: if (!isset($quiz[$row['question_id'])) 如果我要写出一个完整的例子/解决方案它可能看起来非常相似。 谢谢达斯汀。欣赏它。【参考方案3】:

您只需运行查询,然后基于它创建复合数据结构 ($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;

【讨论】:

【参考方案4】:

前面的答案都将拥有比我将要建议的更好的性能,但本文为“连接”结果提供了一种灵活的解决方案,尤其是在嵌套连接相互构建时。

PHP Rebuild Database Result Array

通过json_encode() 运行结果以将其转换为 JSON 对象。

【讨论】:

以上是关于如何从 mySQL 和 PHP 检索结果为多维数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 php mysql 查询中为 jQuery 自动完成准备多维数组?

使用“mysql_fetch_row”从数据库中检索结果并使用 PHP 和 mysqli 插入数组?

使用 PHP 存储和检索多维数组

将多维数组从mysql层次结构表填充到php

如何将多维PHP数组转换为html表

PHP如何将SQL查询结果转为多维数组,并按查询行输出