2009-07-10 12 views
-2

Ich benutze MySQLi mit PHP (5.2.4) MySQL (5.0.51a) auf Ubuntu 8.04 LAMP.Unerwartete Verdoppelung in mysqli/php

Die relevanten Db-Tabellen sind unter:

Questions 
+----+------------------------------------------------------------------------------------------------------------+ 
| id | question                         | 
+----+------------------------------------------------------------------------------------------------------------+ 
| 1 | What is the correct rate of flow (in millilitres per minute) for a 14<abbr title="Gauge">G</abbr> cannula? | 
| 2 | Which of the following drugs is not an anaesthetic induction agent?          | 
+----+------------------------------------------------------------------------------------------------------------+ 

answers 
+----+--------------------------------------------------------+ 
| id | answer             | 
+----+--------------------------------------------------------+ 
| 1 | 344<abbr title="millilitres per minute">ml/min</abbr>. | 
| 2 | 205<abbr title="millilitres per minute">ml/min</abbr>. | 
| 3 | 98<abbr title="millilitres per minute">ml/min</abbr>. | 
| 4 | 60<abbr title="millilitres per minute">ml/min</abbr>. | 
| 5 | Thiopental sodium          | 
| 6 | Propofol            | 
| 7 | Etomidate            | 
| 8 | Domperidone           | 
+----+--------------------------------------------------------+ 

a_lookup (to associate questions with answers) 
+------+------+ 
| q_id | a_id | 
+------+------+ 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
| 1 | 4 | 
| 2 | 5 | 
| 2 | 6 | 
| 2 | 7 | 
| 2 | 8 | 
+------+------+ 

Ich bin mit MySQLi zum Db verbinden, die folgende (unter Berücksichtigung verwenden, die ich für herausgeschnitten nur die realen Benutzername, Passwort und Datenbanknamen von Platzhalterbit Generika):

<?php 

if (!isset($qtype) && !isset($submitted)) { 

    /* 
    ========================================================================= 
    = queries the database if no specific question-type selected = 
    ========================================================================= 
    */ 

    $mysqli = new mysqli("localhost", "username", "password", "db_name"); 
    if ($result = $mysqli->query(
    "SELECT questions.id as qid, 
     questions.question as question 
    FROM 
     questions;")) { 

     while ($row = $result->fetch_object()) { 
     $i = $row->qid; 

     $q[$i][question] = $row->question; 

     if ($answers = $mysqli->query(
      "SELECT answers.id, answers.answer FROM answers, a_lookup, questions WHERE answers.id=a_lookup.a_id AND '$i'=a_lookup.q_id;")) { 

      while ($row = $answers->fetch_object()) { 

      if (!isset($c)) { 
       $c = 1; 
      } 
      else { 
       $c = $c; 
      } 

      $q[$i][answers][$c] = $row->answer; 

      $c++; 
      } 
     } 
     } 
    } 

    $mysqli->close(); 
} 
elseif (isset($qtype)) { 

    // this part should hopefully be invoked when tags 'question-types' are supported 

} 

?> 

Dies gibt die Fragen, wie erwartet, die print_r unter:

Array 
(
    [1] => Array 
     (
      [question] => What is the correct rate of flow (in millilitres per minute) for a 14G cannula? 
      [answers] => Array 
       (
        [1] => 344ml/min. 
        [2] => 205ml/min. 
        [3] => 98ml/min. 
        [4] => 60ml/min. 
        [5] => 344ml/min. 
        [6] => 205ml/min. 
        [7] => 98ml/min. 
        [8] => 60ml/min. 
       ) 

     ) 

    [2] => Array 
     (
      [question] => Which of the following drugs is not an anaesthetic induction agent? 
      [answers] => Array 
       (
        [9] => Thiopental sodium 
        [10] => Propofol 
        [11] => Etomidate 
        [12] => Domperidone 
        [13] => Thiopental sodium 
        [14] => Propofol 
        [15] => Etomidate 
        [16] => Domperidone 
       ) 

     ) 

Ich bin nur verwirrt, weil ich mit acht Ergebnissen gelandet bin und nicht mit den vier, die ich erwartet habe. Ich bekomme die acht - wie jeder, der etwas über Datenbanken weiß, würde erwarten, ob ich den mysql terminal client oder php's mysql-api benutze.

Was mache ich falsch, um die Duplikate zu erstellen?

Antwort

1

Sie erhalten doppelte Antworten, weil Ihre zweite SQL-Abfrage für beide Fragen-ID entspricht in der Tabelle Fragen:

Versuchen

SELECT answers.id, answers.answer FROM answers, a_lookup, questions WHERE 
answers.id=a_lookup.a_id AND '$i'=a_lookup.q_id AND '$i' = questions.id; 

statt

Auf jeden Fall. Ihre mehreren Tabellen in FROM sind nicht sehr einfach zu folgen. Versuchen Sie stattdessen, JOIN zu verwenden, denn dann vergessen Sie nicht den Filter in einer Tabelle, da Sie in jedem Join einen geben müssen.

1

Sie sollten wirklich nicht Abfragen in einer Schleife so laufen, weil sie sehr ineffizient sein - Sie shoud die Daten in einer Abfrage zu holen, zum Beispiel in der Lage sein:

SELECT Questions.id asquestion_id, Questions.question, answers.id as answer_id, answers.answer 
FROM Questions 
INNER JOIN a_lookup ON (Questions.id = a_lookup.q_id) 
INNER JOIN answers ON (a_lookup.a_id = answers.id) 

Es sollte straightfoward sein Sortieren Sie die Ergebnisse daraus in die gleiche Struktur und es sollte viel schneller sein, z

$result = array(); 
while ($row = $result->fetch_assoc()) { 
    $questionId = $row['question_id']; 
    if (!isset($result[$questionId])) { 
     $result[$questionId] = array('question'=>$result['question'], 'answers' => array()); 
    } 
    $result[$questionId]['answers'][] = $row['answer']; 
}