2012-01-09 39 views
5

Tôi chỉ mới bắt đầu học SQL nâng cao hơn cùng với PHP và tôi thực sự đang cố gắng tìm hiểu cách truy vấn cơ sở dữ liệu của mình cho một bài kiểm tra tôi đang xây dựng.Làm cách nào để truy xuất kết quả dưới dạng mảng đa chiều từ mySQL và PHP?

Cuối cùng, tôi đang cố gắng để trả về một đối tượng json với cấu trúc sau đó mang lại cho tôi một danh sách các câu hỏi và câu trả lời tất cả các khả năng như một mảng đa chiều:

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

... từ tôi bảng mySQL có cấu trúc sau:

đố

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 

... với các phím nước ngoài sau đây:

quiz_question.quiz_id is FK to quiz.id 
quiz_answer.quiz_question_id is FK to quiz_question.quiz_id 

... bằng cách sử dụng PHP sau đây (trong đó là hình thức đơn giản nhất đó là hiện chỉ trả lại câu hỏi của tôi):

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

... và sử dụng jQuery $ .getJSON() trong JavaScript của tôi mà được một đối tượng JSON định dạng của tôi từ PHP của tôi mà được tôi lại như sau:

[ 
    {"question":"question text here"}, 
    {"question":"question text here"} 
] 

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể viết SQL và PHP của tôi để tạo ra một mảng đa chiều như rất ở trên thay vì một mảng duy nhất như tôi hiện đang nhận được trở lại bây giờ? Tôi cần phải tìm ra cách bao gồm các câu hỏi và tất cả các câu trả lời liên quan như một mảng đa chiều.

+0

'$ _GET [" jsoncallback "]()' làm gì? Nó trông đáng sợ: P – PeeHaa

+0

@PeeHaa đó là cho jsonp –

+0

Điều đó có chạy trong JS không? Nếu có, người dùng có thể làm điều gì đó như: 'http: // url? Jsoncallback = alert ('something'); gọi lại? <- url được mã hóa – PeeHaa

Trả lời

5

Bạn không thể truy xuất mảng đa chiều hoàn toàn bằng mysql (ít nhất là theo tôi biết). Bạn sẽ phải thực hiện một số xử lý php. Điều này nghe không quá điên rồ.

Trước tiên, hãy cập nhật truy vấn của bạn để chọn câu trả lời cùng một lúc bằng cách tham gia quiz_answers trên quiz_questions bằng ID câu hỏi. Sau đó, trong vòng lặp của bạn:

$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')); 

Điều này sẽ cung cấp cho bạn mảng bạn muốn sau khi mã hóa được mã hóa.

Lưu ý rằng bạn sẽ chọn văn bản/id câu hỏi một lần cho mỗi câu trả lời, điều này không hiệu quả. Bạn có thể sử dụng GROUP_CONCAT trên các câu trả lời, nhưng ở trên sẽ vẫn hoạt động gần như giống hệt nhau, bạn chỉ cần chia chuỗi câu trả lời.

Tôi cũng khuyên bạn nên sử dụng PDO hoặc một số trình bao bọc khác trên mysql_*.

+0

Cảm ơn bạn. Điều này có vẻ như nó sẽ đáp ứng nhu cầu của tôi. Một phần của vấn đề của tôi bây giờ là viết SQL. Tôi đang thử nghiệm với JOINS ngay bây giờ nhưng vẫn đấu tranh để quấn đầu của tôi xung quanh nó. – Critter

+0

OK, vì vậy tôi có thể dễ dàng viết các câu lệnh SELECT riêng cho cả câu hỏi và câu trả lời cho câu hỏi, nhưng câu hỏi của tôi là, làm cách nào để kết hợp chúng thành một truy vấn? – Critter

+0

Đơn giản như 'CHỌN TỪ câu đố TRÊN câu hỏi TRÊN (quiz.id = questions.quiz_id) THAM GIA câu trả lời ON (questions.id = quiz_question_id); ' –

1

Theo như tôi biết, bạn sẽ cần phải tạo mảng đa chiều sau khi kéo kết quả từ cơ sở dữ liệu.

Bạn có thể có thể làm một tham gia vào các câu hỏi và câu trả lời, vì vậy các mảng kết quả sẽ giống như thế này:

$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) 
); 

Sau đó, từ đó bạn có thể xây dựng mảng json của bạn bằng cách nhóm các câu hỏi và câu trả lời với nhau. Về cơ bản, php và các hàm mysql_query chuẩn sẽ không xây dựng các mảng đa chiều, vì vậy bạn sẽ phải lấy dữ liệu và tự xây dựng nó.

+0

Đây cũng là một cách tiếp cận thú vị. Có bất kỳ con trỏ như thế nào tôi có thể đi về xây dựng mảng đa chiều dựa trên điều này? Tôi có phải nhìn vào chuỗi 'câu hỏi' và xem những thay đổi khi tôi lặp qua nó không? Một thay đổi trong chuỗi bằng một câu hỏi mới. – Critter

+0

Tôi vừa hợp nhất kết quả mysql_fetch_assoc thành một mảng duy nhất. Nó sẽ được kiểm tra tương tự như tandu, nơi bạn kiểm tra câu hỏi, mà anh ta làm với điều này: if (! Isset ($ quiz [$ row ['question_id'])) Nếu tôi viết hết Ví dụ/giải pháp nó có lẽ sẽ trông rất giống nhau. –

+0

Cảm ơn Dustin. Cảm kích điều đó. – Critter

1

Bạn chỉ cần chạy truy vấn của mình và sau đó tạo cấu trúc dữ liệu phức hợp dựa trên nó ($questions); Ví dụ:

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

Các câu trả lời trước đây sẽ có hiệu suất cao hơn những gì tôi định đề xuất, nhưng bài viết này cung cấp giải pháp linh hoạt cho kết quả "được tham gia", đặc biệt là kết nối lồng nhau.

PHP Rebuild Database Result Array

Run kết quả thông qua json_encode() để chuyển đổi nó vào một đối tượng JSON.

Các vấn đề liên quan