2012-01-09 7 views
5

मैं अभी PHP के साथ और अधिक उन्नत एसक्यूएल सीखना शुरू कर रहा हूं और मैं वास्तव में यह जानने का प्रयास कर रहा हूं कि मैं अपने प्रश्नोत्तरी के लिए अपने डेटाबेस से पूछताछ कैसे करूं।मैं अपने एसक्यूएल और 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; 

... और का उपयोग कर jQuery के $ .getJSON() मेरी जावास्क्रिप्ट में जो मेरे PHP से मेरी एक JSON स्वरूपित वस्तु हो जाता है जो मेरा पीछा कर वापस हो जाता है:

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

तो मेरे सवाल है, मैं अपने एसक्यूएल और PHP को एक सरणी के बजाय बहुत अधिक की तरह एक बहुआयामी सरणी बनाने के लिए कैसे लिख सकता हूं जैसे कि मैं वर्तमान में वापस आ रहा हूं? मुझे यह पता लगाने की आवश्यकता है कि प्रश्नों और सभी संबंधित उत्तरों को एक बहुआयामी सरणी के रूप में कैसे शामिल किया जाए।

+0

क्या '$ _GET [" jsoncallback "]()' क्या करता है? यह डरावना दिखता है: पी – PeeHaa

+0

@PeeHaa जो jsonp –

+0

के लिए है क्या यह जेएस में चलाया जाता है? यदि ऐसा है, तो क्या उपयोगकर्ता कुछ ऐसा कर सकता है: 'http: // url? Jsoncallback = चेतावनी ('कुछ'); callback'? <- url एन्कोडेड – PeeHaa

उत्तर

5

आप एक बहु-आयामी सरणी विशुद्ध रूप से mysql के साथ (के रूप में मैं जानता हूँ कि कम से कम जहाँ तक) प्राप्त नहीं कर सकता। आपको कुछ PHP प्रसंस्करण करना होगा। यह बहुत पागल नहीं लगता है।

सबसे पहले, प्रश्न आईडी का उपयोग कर 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')); 

यह आपको जेएस एन्कोड किए जाने के बाद इच्छित सरणी देगा।

ध्यान दें कि आप प्रत्येक उत्तर के बाद एक बार प्रश्न टेक्स्ट/आईडी का चयन कर सकते हैं, जो अक्षम है। आप जवाब पर GROUP_CONCAT उपयोग कर सकते हैं, लेकिन इसके बाद के संस्करण अभी भी लगभग हूबहू काम करेंगे, तो आप सिर्फ जवाब स्ट्रिंग को विभाजित करने के लिए है।

मैं यह भी सुझाव देता हूं कि आप PDO या mysql_* पर कुछ अन्य रैपर का उपयोग करें।

+0

धन्यवाद। ऐसा लगता है कि यह मेरी जरूरतों को पूरा करेगा। मेरी समस्या का हिस्सा अभी एसक्यूएल लिख रहा है। मैं अभी जॉइन के साथ प्रयोग कर रहा हूं लेकिन अभी भी इसके चारों ओर अपने सिर को लपेटने के लिए संघर्ष कर रहा हूं। – Critter

+0

ठीक है, तो मैं आसानी से SELECT स्टेटमेंट्स अलग से दोनों प्रश्नोत्तरी सवाल और जवाब के लिए लिख सकते हैं, लेकिन मेरे सवाल है, मैं कैसे उन्हें एक क्वेरी में संयोजित कर सकता हूं? – Critter

+0

'का चयन करें जो कुछ भी प्रश्नोत्तरी पर सवाल JOIN (quiz.id = questions.quiz_id) (questions.id = quiz_question_id) पर जवाब शामिल हों रूप में सरल रूप;' –

1

जहाँ तक मुझे पता है, आपको डेटाबेस से परिणामों को खींचने के बाद बहु-आयामी सरणी बनाने की आवश्यकता होगी। तो फिर वहाँ आप से एक साथ सवाल और जवाब समूहीकरण अपने json सरणी बना सकते हैं

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

:

आप शायद एक, सवाल और जवाब के आधार पर संयोजन तो परिणामी सरणी कुछ इस तरह दिखेगा कर सकता है।

असल में, PHP और मानक mysql_query फ़ंक्शन बहु-आयामी सरणी नहीं बनाएंगे, इसलिए आपको डेटा खींचना होगा और इसे स्वयं बनाना होगा।

+0

यह एक दिलचस्प दृष्टिकोण भी है। इस बारे में कोई संकेतक है कि मैं इस पर आधारित बहु-आयामी सरणी बनाने के बारे में कैसे जा सकता हूं? क्या मुझे 'प्रश्न' स्ट्रिंग को देखना होगा और परिवर्तनों के लिए देखना होगा क्योंकि मैं इसके माध्यम से लूप करता हूं? स्ट्रिंग में एक बदलाव एक नया सवाल बराबर है। – Critter

+0

मैंने सिर्फ mysql_fetch_assoc परिणामों को एक सरणी में समेकित किया है। यह तंदू के समान चेक कर रहा होगा, जहां आप सवाल जांचते हैं, जो वह इसके साथ करता है: अगर (! जारी ($ quiz [$ पंक्ति ['question_id']) अगर मैं एक पूर्ण लिखना चाहता था उदाहरण/समाधान यह शायद बहुत समान दिखता है। –

+0

धन्यवाद डस्टिन। इसकी प्रशंसा करना। – Critter

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

पिछले जवाब सब क्या मैं के बारे में सुझाव देने के लिए कर रहा हूँ से अधिक प्रदर्शन घमंड होगा, लेकिन इस लेख "में शामिल हो गए" परिणामों के लिए एक लचीला समाधान उपलब्ध कराता है, विशेष रूप से के रूप में नेस्ट मिलती है एक-दूसरे से दूर का निर्माण।

PHP Rebuild Database Result Array

भागो json_encode() के माध्यम से परिणाम यह एक JSON ऑब्जेक्ट में बदलने के लिए।

संबंधित मुद्दे