Chris: MySQL Querys in Schleifen ?

Hallo zusmmammen,

ich habe mir einen kleinen Kalender geschrieben und hänge im Moment bei dem markieren der Termine fest.

Der Kalender bezieht sich immer auf die nächsten 14 Tage und gleicht die vorhandenen Termine aus der DB ab, ist ein Termin für einen Tag vorhanden so soll die Funktion TRUE zurückgeben.

Meine Funktion klappt "1A" nur bin ich mir nicht sicher ob ich den Query der mir die Termine aus der DB holt in der Schleife lassen kann, 5 Aufrufe pro Seite * 15 Querys = wären gleich 75 Querys pro Ergebnisseite und Aufruf ;-)

Hat da vieleicht jemand von euch eine für den Server bessere Idee wie ich die Abfrage gestallten kann ?

Hier der Code:

function Termine ($user_id) {

for($x=1; $x<15; $x++) {

// Holt alle Termine für die UserID Format: Y-m-d
    $result = $this->db_query({QUERY});

// Aktueller Tag +1 das ganze 15 Mal für die naechsten 14 Tage
    $aktuell=date ("Y-m-d", mktime(0, 0, 0, date("m"), date("d")+$x, date("Y")));
    // Vergleichen der Termine aus der DB mit dem jeweiligen Tag
    for($i=1; $i<15; $i++) {

$row = $this->db_fetcharray($result);
      if($aktuell == $row[day]) {
        $make_kreuz = true;
      }

}

if($make_kreuz == true) {
      $kreuze .= "Termin";
    }elseif($make_kreuz == false) {
      $kreuze .= "kein Termin";
    }

$make_kreuz=false;
  $this->db_free($result);

}

return $kreuze;

}

Danke für jeden Tipp und viele Grüße,

Chris

  1. Hi,

    Meine Funktion klappt "1A" nur bin ich mir nicht sicher ob ich den Query der mir die Termine aus der DB holt in der Schleife lassen kann, 5 Aufrufe pro Seite * 15 Querys = wären gleich 75 Querys pro Ergebnisseite und Aufruf ;-)

    Deine Zweifel sind begründet. Es ist dringend davon abzuraten, in einer Schleife SQL-Statements abzusetzen - genauer gesagt sollte jedes einzelne Statement wohl überlegt sein, je weniger desto besser.

    Hat da vieleicht jemand von euch eine für den Server bessere Idee wie ich die Abfrage gestallten kann ?

    Ich sehe keinen SQL-Code, unterstelle aber, dass Du Dich mit dem BETWEEN-Operator beschäftigen möchtest.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hello,

      und wenn doch Schleifen sinnvoll sind, dann muss man daran denken, das Result-Set wieder freizugeben am Ende der Schleife, sonst bekommt man ein "lost-handle", also allokierten Speicher, den man nicht wieder freigeben kann innerhalb des Scriptes. Dieser blockierte Bereich wächst dann bei jedem Schleifendurchlauf und irgendwann ist Schicht im Schacht.

      Das war übrigens einer der beliegtesten Fehler bei den ersten Windows-Versionen bis hin zu Win 95.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Hi Tom,

        und wenn doch Schleifen sinnvoll sind, dann muss man daran denken, das Result-Set wieder freizugeben am Ende der Schleife ...

        $this->db_free($result); <<- tue ich, oder? ;-)

        Gruß,

        Chris

        1. Hello,

          und wenn doch Schleifen sinnvoll sind, dann muss man daran denken, das Result-Set wieder freizugeben am Ende der Schleife ...

          $this->db_free($result); <<- tue ich, oder? ;-)

          Ja, sieht gut aus. Habe ich übersehen. Ist aber kein Fehler, wenn es im Thread explizit drinsteht. Nur Du bist natürlch entlastet ;-))

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    2. Hi Cheatah,

      Ich sehe keinen SQL-Code, unterstelle aber, dass Du Dich mit dem BETWEEN-Operator beschäftigen möchtest.

      SELECT day FROM kalender WHERE OID =".$user_id." AND TO_DAYS(NOW()) - TO_DAYS(day) < 14

      ich glaube da habe ich eine saubere Lösung gefunden, oder? ;-)

      Mein Problem liegt bei der Ausführung der Schleife bzw. beim "fetchen" des Arrays, wenn ich das Resultat der obigen Abfrage einmal mit mysql_fetch_array bearbeitet habe geht mir die Variable $result verloren und ich kann die weiteren 13 Durchläufe der Schleife nicht mehr die Daten vergleichen.

      Das zwingt mich dazu den Query mit in die Schleife zu nehmen was eigentlich völliger "Autsch" ist da er jedesmal das gleiche Ergebniss liefert ;-)

      Gibt es da vieleicht eine Möglichkeit das Resultat der Abfrage auch nach dem abarbeiten mit mysql_fetch_array() zu erhalten, bzw. eine vergleichbare Funktion die dies von allein tut ?

      Danke für deine Hilfe,

      Chris

      1. Hi,

        ich glaube da habe ich eine saubere Lösung gefunden, oder? ;-)

        ja, sieht gut aus.

        Gibt es da vieleicht eine Möglichkeit das Resultat der Abfrage auch nach dem abarbeiten mit mysql_fetch_array() zu erhalten, bzw. eine vergleichbare Funktion die dies von allein tut ?

        Es gibt die Möglichkeit, den Zeiger wieder auf den Anfang des Resultsets zu legen. Bei einer überschaubaren Menge an Daten würde ich aber erwägen, sie in den lokalen Speicher zu übertragen und anschließend nur noch mit diesem zu arbeiten.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes