Wie mache ich diese Abfrage besser?
andreas
- php
0 lulu0 andreas
0 Michael Schröpl
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
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
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
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:
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
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
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
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
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