Dynamische Abfrage einer Datenbank

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

  • Dynamische Abfrage einer Datenbank

    Hallo!

    Ich möchte eine einfache Datenbankabfrage durchführen, bei der ich Datensätze mit bestimmten ID angezeigt haben möchte und nur ausgewählte Spalten. Ob die Daten einer Spalte angezeigt werden sollen oder nicht entscheide ich mit Hilfe von Checkboxen. Entweder aktiviert, dann sollen die Daten dargestellt werden oder nicht aktiviert.

    So definiere ich die Checkboxen:

    <td><input type="Checkbox" name="datum" value="1">Datum</td>


    Der PHP und SQL Quelltext sieht folgendermaßen aus:

    foreach($array_proben_id as $key => $wert)
    {
    $query = "SELECT * FROM proben, moosarten, bewuchs, vorkommen
    WHERE proben_id = $wert
    and proben.bewuchs = bewuchs.bewuchs_id \n
    and proben.vorkommen = vorkommen.vorkommen_id;";

    $result = pg_exec($query);
    $n = pg_numrows($result);

    for ($i=0;$i<$n;$i++)
    {
    $f = pg_fetch_object($result);
    if ($_POST[datum] == 1)
    {
    echo "$f->datum ";
    }

    Mein Problem liegt darin, dass die DB aus insgesamt 2600 Datensätzen besteht, ich insgesamt 50 Checkboxen einbauen muss und eine Abfrage dauert schon bei 5 Checkboxen länger als 30 sec.

    Hat Jemand eine Idee, wei ich meine Abfrage beschleunigen kann? Ich glaube nämlich zu viele IF's (für jede Checkbox ein IF) in der Abfrage zu haben.

  • #2
    einfach das Query vor der Abfrage immer um ein AND erweitern...
    Bei Risiken und Nebenwirkungen fragen Sie Dr.Alban

    Kommentar


    • #3
      Danke für die schnelle Antwort!

      Leider verstehe ich diese nicht ganz und weiß nicht wohin mit dem AND.

      Könntest Du mir außerdem sagen was genau ich mit dem AND verknüpfen soll?

      Sorry, wenn ich nicht so schnell mitkomme.

      Kommentar


      • #4
        Mein Problem liegt darin, dass die DB aus insgesamt 2600 Datensätzen besteht, ich insgesamt 50 Checkboxen einbauen muss und eine Abfrage dauert schon bei 5 Checkboxen länger als 30 sec.
        2600 Datensätze sind nicht viel und das er für 5 verschied. Kriteren dann 30 sec braucht ist viel zu lange.

        Mach erstmal eine Manuelle Abfrage ohne Auswahlmöglichkeit,
        falls es dann immer noch so lange dauert überprüfe deine DB/Skripts.

        Könntest Du mir außerdem sagen was genau ich mit dem AND verknüpfen soll?
        PHP-Code:
        WHERE proben_id $wert AND sowieso=das AND spalte2=dies AND etc.... 

        Kommentar


        • #5
          Und wieder: DANKE!

          Vielleicht ist Das wichtig: Ich habe zur Übung den Server auf dem Rechner instaliert, sodass alles lokal abläuft.

          Eine manuelle Auswahl geht sehr schnell (3-5 sec.) Eine Auswahl in Abhängigkeit von 5 Kriterien geht auch sehr schnell, aber nur dann, wenn ich die foreach-Schleife weglasse. Ursprünglich sah es so aus:

          if (isset($_REQUEST['moos'])) {
          foreach ($_REQUEST['moos'] as $l => $k) {
          foreach($array_proben_id as $key => $wert) {

          $query = "SELECT * FROM proben, moosarten \n
          WHERE proben_id = $wert and proben.moos_xx = '$k' \n
          and moosarten.moos_xx = '$k';";

          $result = pg_exec($query);
          $n = pg_numrows($result);

          $array_moos = array();

          for ($i=0;$i<$n;$i++)
          {
          $f = pg_fetch_object($result);

          $array_moos[$i] = $f->proben_id;

          }

          if (isset($_REQUEST['bewuchs'])) {
          foreach ($_REQUEST['bewuchs'] as $a => $bew) {
          foreach($array_moos as $o => $u) {

          $query = "SELECT * FROM proben \n
          WHERE proben.proben_id = $u and proben.bewuchs = \n
          $bew;";

          $result = pg_exec($query);
          $n = pg_numrows($result);

          $array_bewuchs = array();

          for($i=0; $i<$n; $i++)
          {
          $f = pg_fetch_object($result);

          $array_bewuchs[$i] = $f->proben_id;

          }
          ...
          }}}
          }}}
          Und die Abfrage dauert ewig!


          Wenn ich aber nur so abfrage, dann geht es schnell:

          $query = "SELECT * FROM proben, bewuchs, vorkommen \n
          WHERE proben.proben_id = $wert and proben.bewuchs = \n
          bewuchs.bewuchs_id \n
          and proben.vorkommen = vorkommen.vorkommen_id;";

          $result = pg_exec($query);
          $n = pg_numrows($result);

          for ($i=0;$i<$n;$i++)
          {
          $f = pg_fetch_object($result);
          echo "$f->proben_id -";
          if ($_POST[bewuchs] == 1)
          {
          echo "$f->bewuchs_be";
          }
          if ($_POST[vorkommen] == 1)
          {
          echo "$f->vorkommen_be";
          }
          etc..

          Damit meine Abfrage allerdings einen Sinn ergibt, brauche ich wenigstens diese Schleife:

          foreach($array_proben_id as $key => $wert) {}

          Ich habe das Gefühl, dass ich meine Arrays falsch aufbaue, denn außerhalb der übergeordneten Schleife funktionieren sie nichts.

          Es wäre wieder sehr schön, wenn mir Jemand auf die Sprünge helfen könnte.

          Kommentar


          • #6
            ursprünglich:
            $query = "SELECT * FROM proben, moosarten, bewuchs, vorkommen
            WHERE proben_id = $wert
            and proben.bewuchs = bewuchs.bewuchs_id \n
            and proben.vorkommen = vorkommen.vorkommen_id;";

            Ich würde für die im ersten post gestellte Aufgabe den $query String dynamisch erstellen anhand der checkboxen.

            $query="Select ";
            if checkbox(feld1) then $query .=" table1.feld1 as feld1,";
            if checkbox(feld2) then $query .=" table2.feld2 as feld2,";
            usw. 50mal, und das $query zu Ende bauen mit
            $query .= " '0' als feld51'" // nur wegen dem letzten komma !!
            $query .= " FROM proben, moosarten, bewuchs, vorkommen usw.";

            Es entsteht (falls feld1, feld2 angekreuzt sind):
            $query = "SELECT table1.feld1 as feld1, table2.feld2 as feld2, '0' as feld51 FROM proben, moosarten, bewuchs, vorkommen usw..";

            Man kann das noch viel mehr parametrisieren, um nicht 50 if checkbox zu haben...

            Das was du im zweiten post geschrieben hast, ist wirr. Wenn es xfach verschachtelte Abfragen braucht, geht es natürlich lang und ist vermutlich sowieso falsch. Um dafür ein Gefühl zu bekommen, kannst Du ein echo "Hier SELECT Nr xxxx <br>" einbauen bei jedem select.

            HTH
            Zuletzt geändert von globqluqqlo; 04.03.2006, 13:42.

            Kommentar


            • #7
              Danke!
              Auf die Idee einen Query zu splitten wäre ich nie gekommen!

              Ich habe bei mir im Quelltext alles umstrukturiert und komme jetzt bei einer vollständigen Abfrage auf ca. 5 sec. Das ist ein Erfolg! Allerdings bin ich noch nicht gant fertig.

              Kommentar

              Lädt...
              X