andreas: Wie mache ich diese Abfrage besser?

Hallo!

Ich habe ein Formular mit 2 Selectfeldern, diese Felder(Objektart/-lage) werden in der SQL Abfrage zum Filtern der Datensätze verwendet. Soweit kein Problem nur soll man jeweils die Möglichkeit haben, _alle_ Datensätze auszuwählen.
ich mache das ztur Zeit durch einen Wert "alle" in den Selecst-Feldern:

If ($Objektlage!="alle"){
 If ($Objektart!="alle"){
    $query = "SELECT * FROM s_objekte WHERE Objektlage='$Objektlage' AND Objektart='$Objektart'";}
    else {
         $query = "SELECT * FROM s_objekte WHERE Objektlage='$Objektlage'";}
} else {
    If ($Objektart!="alle"){
    $query = "SELECT * FROM s_objekte WHERE Objektart='$Objektart'";}
     else {
       $query = "SELECT * FROM s_objekte";}
}

Es gibt doch bestimmt eine bessere Möglichkeit, dass man diese komplizierte Verschachtelung nicht braucht, oder? Denn an anderer Stelle sind das noch mehr Felder und das wird dann sehr unübersichtlich.

Wie könnt man das machen?

Grüsse
  Andreas

  1. Huhu Andreas

    vielleicht hilft dir eine Konstruktion wie diese hier.

    $condition=array();
            $query = "SELECT * FROM s_objekte ";
     If ($Objektlage!="alle"){
      $condition[]=" Objektlage='$Objektlage' "
     }
     If ($Objektart!="alle"){
      $condition[]=" Objektart='$Objektart' "
     }
     if(count($condition)>0) $query.="WHERE ".join(' AND ',$condition);

    Viele Grüße

    lulu

    1. Hallo Ihr beiden!

      Vielen Dank! Habs noch nicht probiert aber sieht sehr logisch aus. Auf solche Ideen komme ich natürlich nicht ;-)
      Aber ich wollte eigentlich woanders drauf hinaus(wobei mir das vollkommen reicht, nur Interesse Halber) und zwar gibt es keine Möglichkeit, so vom Prinzip in den Select Feldern "alle" einen Wert "*" zuzuweisen(klar kann man das, aber...:) und dass dann in der Abfrage diese auch tatsächlich alle abfragen, so ähnlich wie SELECT * FROM! Also nur so vom Prinzip her.
      Aber das geht wohl nicht, oder?

      Jedenfalls danke für Eure Hilfe! Sehr viel einfacher als vorher!

      Grüsse
        Andreas

  2. Hi Andreas,

    Es gibt doch bestimmt eine bessere Möglichkeit, dass man diese
    komplizierte Verschachtelung nicht braucht, oder?

    Letzten Endes mußt Du ein Programm (in PHP) schreiben, das ein Programm
    (in SQL) schreibt (welches zwar nur eine einzige Zeile hat, welche es
    aber "in sich hat"). lulu hat Dir den Ansatz dafür gezeigt.

    Ich selbst mache das bei ganz ähnlichen Statements (einer Suchmaschine)
    so, daß ich jede zusätzliche WHERE-Klausel von einer Funktion berechnen
    lasse, welche ein Flag abfragt, welches die Information enthält, ob be-
    reits mindestens eine WHERE-Klausel vorliegt, und für den Fall, daß sie
    selbst eine erzeugt, dieses Flag selbst setzt. (Denn davon hängt bei mir
    ab, ob die zusätzliche Klausel mit WHERE oder mit AND eingeleitet werden
    muß.)
    Eine Ebene höher konkateniere ich dann sämtliche Funktionsergebnisse.

    Zwei Tips noch:

    • Sehr hilfreich für die Entwicklung Deines Programms ist ein globales
        Debug-Flag, welches die Ausgabe sämtlicher generierter SQL-Statements
        in das erzeugte Ausgabedokument hinein steuert (ggf. als HTML-Kommentare).
        Achtung: Vorher muß der HTTP-Header schon erzeugt sein ...
    • Nicht das Semikolon am Ende des SQL-Statements vergessen.

    Denn an anderer Stelle sind das noch mehr Felder und das wird dann
    sehr unübersichtlich.

    Richtig - exponentiell viele Verzweigungen, um es deutlich zu formulieren.

    Viele Grüße
          Michael

    1. Moin

      Achtung: Vorher muß der HTTP-Header schon erzeugt sein ...

      Och Michael, nun verwirr ihn doch nicht so. In PHP muss man keine Header erzeugen, es sei denn man will es :)

      --
      Henryk Plötz
      Grüße aus Berlin

      1. Hi Henryk,

        In PHP muss man keine Header erzeugen, es sei denn man will es :)

        Ich nix PHP ... aber Deine Aussage scheint zu implizieren, daß PHP
        versucht, "intelligent" zu sein ... die anderen Produkte, die das
        versuchen, sind mir überwiegend nicht sonderlich sympathisch ... :-\

        Viele Grüße
              Michael

        1. Moin

          Ich nix PHP ... aber Deine Aussage scheint zu implizieren, daß PHP
          versucht, "intelligent" zu sein ... die anderen Produkte, die das
          versuchen, sind mir überwiegend nicht sonderlich sympathisch ... :-\

          50% ACK

          PHP versucht nicht immer intelligent zu sein und genau bei dieser Stelle gehört recht wenig intelligenz dazu. PHP ist als Sprache für den Webserver konzipiert und sendet daher auf jeden Fall einen Content-Type-Header. Man kann den Header natürlich überschreiben wenn man will, aber er ist da, damit man zum Beispiel die Fehlermeldungen sieht und solche Fehlerarten wie du sie beschrieben hast, gar nicht erst auftreten können. Es gibt auch keinen vernünftigen Grund _keinen_ Content-Type-Header im Zusammenhang mit dem Webserver senden zu wollen (ausser man will testen wie sich der Server bei Status 500 verhält :) und wenn man PHP als Sprache ausserhalb des Webservers einsetzt, kann man ja -q dranhängen um den Header zu unterdrücken.

          Es ist eben nicht solche "Un-"Intelligenz wie etwa bei Microsoft Office Produkten, sondern eher der Typ von Bequemlichkeit den LaTeX bietet: Es nimmt einem von vorneherein einige Schritte ab, die man sowieso machen müsste, tut aber immer nur das was man ihm sagt.

          --
          Henryk Plötz
          Grüße aus Berlin

          1. Hi Henryk,

            genau bei dieser Stelle gehört recht wenig intelligenz dazu.

            Gut möglich.

            Perl würde mir viel besser gefallen, wenn "-w" und "use strict;" und
            "use CGI::Carp qw (fatalsToBrowser)" etc. alles die Defaultwerte wären,
            die man explizit abschalten müßte, statt sie explizit einschalten zu
            müssen. In dieser Hinsicht folgt Perl m. E. zu sehr der Doktrin von C
            ("Default: der Programmierer wird schon wissen, was er meinte").

            Ein bißchen Intelligenz (mit Übersteuerungsmöglichkeit!) kann manchmal
            ziemlich toll sein.

            Viele Grüße
                  Michael