Abfarge in Abfrage ??

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Abfarge in Abfrage ??

    Hallo.. Ich arbeite an einem Quiz. Erst werden die Fragen aus der DB selektiert, und mit einer while() schleife ausgegeben. Danach werden aus einer anderen Tabelle die Antworten herausgesucht. Mein code ist folgender:
    PHP-Code:
    $fragen $db->query("SELECT questid, quest FROM q_quests ORDER BY questid ASC");
            while(
    $row=$db->fetch_array($fragen))
            {
                
    $antw=$db->query("SELECT ansid, answer FROM q_answers WHERE questid = ".$row['questid']." ORDER BY ansid ASC");
                while(
    $row2=$db->fetch_array($antw))
                {
                    eval (
    "\$ans .= \"".gettemplate("ansbit")."\";");
                }
                eval (
    "\$main .= \"".gettemplate("questbit")."\";");
                unset(
    $row2);
            } 
    Naja, mein Problem ist, dass bei der ersten Frage korrekt die Antworten angezeigt werden, bei der zweiten allerdings auch die von der ersten und die von der zweiten usw. Das Ergebnis wird also irgendwie nicht gelöscht.. Ich habe mit unset($row2) ja schon die var gelöscht... Wo liegt der Fehler? MfG Oli

  • #2
    schön dass du ne DB-Class verwendest und wir kein stück code davon kennen. Ideale Vorraussetzungen.

    Vermute mal schlechte Klasse.

    Du solltest dir lieber überlegen das in einen Query zu lösen. so macht man das beim besten Willen nicht.

    Kommentar


    • #3
      ahja, nett, dass du dich gleich einem so freundlichen Ton bedienst.
      Tut mir Leid, dass ich nicht darauf gekommen bin, meine DB Klasse hier zu posten, und dass ich zu doof bin, das in einem Query zu lösen.

      PHP-Code:
      function query($query) {
          if(
      $this->db_status == "connected")
          {
              if(!
      $this->result mysql_query($query))
                  {
                      
      $this->errormessage mysql_error();
                      
      $this->errornumber mysql_errno();
                      
      $this->query $query;
                      return 
      0;
                  }
             else
                 {
                             return 
      $this->result;
                 }
          }
          else
              {
                     return 
      0;
              }
          } 
      PHP-Code:
      function fetch_array($result) {
               if(!
      $result)
                         {
                           
      $this->errormessage "Result is empty.";
                           
      $this->errornumber 99;
                           return 
      0;
                      }
                      else
                      {
                         return 
      mysql_fetch_array($result);
                      }
          } 
      Ich habe außerdem unter unset() noch ein free_result gemacht. Die fkt
      PHP-Code:
      function free_result($result) {
               if(!
      $result)
                         {
                           
      $this->errormessage "Result is empty.";
                           
      $this->errornumber 99;
                           return 
      0;
                      }
                      else
                      {
                         return 
      mysql_free_result($result);
                      }
          } 
      Ich bin noch Anfänger, also bitte motzt mich nciht dafür an.

      Kommentar


      • #4
        zu 1) über sowas sollte man vor dem Posten doch bitte man nachdenken
        zu 2) das war einfach ein tipp. kannst natürlich gerne pro Seite 100 oder 1000 Abfragen abschicken. Im Moment macht es sicher noch nichts. Es war einfach ein Hinweis in der Zukunft probleme direkt zu vermeiden.
        zu "zu doof in einem Query") dann guck ins mysql-forum. da ist ein WICHTIG drin.

        BTW: kann es sein, dass deine FKT eigentlich nur aliasse enthält?
        ein freundlichgemeinter Tipp: nach return wird die FKT beendet. vielleicht hilft das ein bisschen mehr struktur reinzubringen. dann siehst du auch, dass du eigentlich nur aliasse definiert hast.
        Zuletzt geändert von TobiaZ; 21.11.2003, 14:57.

        Kommentar


        • #5
          Ok, JOINS kannte ich schon, aber ich wusste nicht, dass das auch mit mehreren Abfragen geht.

          Ich hab es jetzt so:
          PHP-Code:
          $fragen $db->query("SELECT Q.questid, Q.quest FROM q_quests Q LEFT JOIN q_answers A ON Q.questid=A.questid ORDER BY Q.questid, A.ansid ASC");
                  while(
          $row=$db->fetch_array($fragen))
                  {
                          eval (
          "\$ans .= \"".gettemplate("ansbit")."\";");
                      eval (
          "\$main .= \"".gettemplate("questbit")."\";");
                  }
                  echo 
          $db->error(); 
          Es wird jetzt jede Frage so oft angezeigt, wie die Anzahl der dazugehörigen Antworten ist. Lustigerweise kommt pro Frage immer eine Antwort dazu. Also
          Frage 1 : Antwort 1
          Frage 1 : Antwort 1,2
          Frage 1 : Antwort 1,2,3
          Frage 1 : Antwort 1,2,3,4
          Frage 2 : Antwort 1,2,3,4[5: Antwort 1 der neuen Frage(Frage2)]
          usw.

          Es werden also bei jeder Frage alle Antworten angezeigt...
          Den Erklär Thread für JOINS hab ich irgendwie nciht so ganz verstanden...

          EDIT:
          hm, das versteh ich jetzt nicht so ganz mit deinen Aliassen... ABer ich denke, daran liegt es nicht, oder...?

          Kommentar


          • #6
            muss ganz ehrlich sagen, dass ich mich bis jetzt nicht darum gekümmert habe, was du machen willst. ich arbeite heute problemorientiert.

            aber ich wusste nicht, dass das auch mit mehreren Abfragen geht
            was denn sonst

            In deinem Fall hilft dir denke ich GROUP BY, bzw. DISTINCT weiter

            Kommentar


            • #7
              Okay, du willst also

              Frage?
              [ ] antwort_1
              [ ] antwort_n

              ausgeben.

              du könntest jetzt temporär die frageid speichern und dann immer vergleichen, wenn die neue frageid != der alten ist, wird die frage ausgegeben.

              ist es bei einen quiz nicht vielleicht besser jede frage auf eine seite zu bauen?

              Kommentar


              • #8
                hm, also ich wollte die eigentlich untereinander anzeigen lassen, da die Fragen eh nicht lang sind und es immer nur 4 Antworten gibt.

                DISTINCT bringt ncihts, das selektiert doch nur Einträge, die identisch sind, oder? Das ist mir ja eigentlich egal, weil alle verschieden sind...

                SELECT
                Q.questid, Q.quest, A.ansid, A.answer
                FROM
                q_answers A
                LEFT JOIN
                q_quests Q
                USING(questid)
                ORDER BY
                Q.questid, A.ansid ASC");

                Also so siehts jetzt bei mir aus. Aber es wär auch nicht schlimm, meinen ersten Post zu nehmen, weil es eh nur 10 Fragen mit je 4 Antworten sind.
                Aber auch der will ja nicht so richtig... Wie müsste das denn richtig heißen?
                PHP-Code:
                $fragen $db->query("SELECT questid, quest FROM q_quests ORDER BY questid ASC");
                        while(
                $row=$db->fetch_array($fragen))
                        {
                            
                $antw=$db->query("SELECT ansid, answer FROM q_answers WHERE questid = ".$row['questid']." ORDER BY ansid ASC");
                            while(
                $row2=$db->fetch_array($antw))
                            {
                                eval (
                "\$ans .= \"".gettemplate("ansbit")."\";");
                            }
                            eval (
                "\$main .= \"".gettemplate("questbit")."\";");
                            unset(
                $row2);
                        } 

                Kommentar


                • #9
                  ich hatte noch ne zweite antwort gegeben.

                  Kommentar


                  • #10
                    Naja, von dem habe ich irgendwie gar nichts verstanden, und um dich nicht zu verärgern dachte ich mir, nehm doch deine erste Variante, die ist vielleicht einfacher... :\

                    Kommentar


                    • #11
                      nee, ist leider nicht einfacher. weil falsch. bzw nicht für deinen fall geeignet. war da noch nicht ganz wach

                      also

                      alle antworten mit fragen auslesen.

                      dann ausgeben.

                      $tmp = '';
                      while(nächsteantwort) {

                      if $tmp != aktuelle frage {

                      echo $frage;
                      $tmp = aktuelle frage;

                      }

                      echo aktuelle antwort;

                      }

                      Kommentar


                      • #12
                        hm... also ich weiß echt nicht weiter... ich hab zwar verstanden, was du mit $tmp meinst, aber was für eine Abfrage soll ich jetzt benutzen?

                        Kommentar


                        • #13
                          n join, der alles ausließt.

                          Kommentar


                          • #14
                            der ganze code nochmal:
                            PHP-Code:
                            $fragen $db->query("SELECT DISTINCT(A.ansid),Q.questid, Q.quest, A.answer FROM q_answers A LEFT JOIN q_quests Q USING(questid)  ORDER BY Q.questid, A.ansid ASC");
                                    if(!
                            $tmp$tmp "";
                                    while(
                            $row=$db->fetch_array($fragen))
                                    {
                                            if(
                            $tmp != $row[questid])
                                            {
                                                eval (
                            "\$ans .= \"".gettemplate("ansbit")."\";");
                                            }
                                            else
                                            {
                                                eval (
                            "\$ans .= \"\";");
                                            
                                    eval (
                            "\$main .= \"".gettemplate("questbit")."\";");
                            $tmp $row[questid];
                                    
                                    }echo 
                            $db->error(); 

                            das geht immernoch nicht richtig...

                            Kommentar


                            • #15
                              hatten wir das mit dem distinct nicht abgehakt???

                              Kommentar

                              Lädt...
                              X