# Abfrage auf Auswahlfeld



## Florian (17. Dez 2004)

Hallo!

Ich hätte mal eine Frage zu PHP, vielleicht könnt Ihr mir weiterhelfen?
Ich habe ein Auswahlfeld mit mehreren Auswahlmöglichkeiten, über das eine Select- Anweisung gesteuert werden soll. Ich möchte also die Datenbankabfrage über die Auswahlfelder erweitern.
Mein Code sieht so aus:
<select name="entschwef[]" size="5" multiple>
.
.
.
Weiter unten kommt dann folgendes:
if($v_entschwef !=""){
foreach($v_entschwef as $id_entschwef){

if($id_entschwef=="101"){$VSql.=" and MV.ID_VV_REE_ENTSCHW_IST=101";}
if($id_entschwef=="102"){$VSql.=" and MV.ID_VV_REE_ENTSCHW_IST=102";}
if($id_entschwef=="103"){$VSql.=" and MV.ID_VV_REE_ENTSCHW_IST=103";}
if($id_entschwef=="151"){$VSql.=" and MV.ID_VV_REE_ENTSCHW_IST=151";}
if($id_entschwef=="152"){$VSql.=" and MV.ID_VV_REE_ENTSCHW_IST=152";}
if($id_entschwef=="153"){$VSql.=" and MV.ID_VV_REE_ENTSCHW_IST=153";}
} 
}
So, habe ich nun nur eines angewählt, stimmt die Abfrage, bei mehreren kommt entweder kein Ergebnis oder ein fehlerhaftes (nur höchste ID angewählt).
Die Ausgabe des Arrays liefert aber das richtige Ergebnis (echo.....).
dort werden alle gewählten auch angezeigt.
Vielen dank im Voraus.
Gruß Florian


----------



## Manfred (17. Dez 2004)

Wenn du mehrere wählst müsste ja die SQL Anweisung ca. so aussehen

SELECT * FROM X WHERE MV.ID_VV_REE_ENTSCHW_IST=101 OR MV.ID_VV_REE_ENTSCHW_IST=102

Sprich mit OR Verknüpfen und nicht mit AND


----------



## Florian (17. Dez 2004)

Manfred hat gesagt.:
			
		

> Wenn du mehrere wählst müsste ja die SQL Anweisung ca. so aussehen
> 
> SELECT * FROM X WHERE MV.ID_VV_REE_ENTSCHW_IST=101 OR MV.ID_VV_REE_ENTSCHW_IST=102
> 
> Sprich mit OR Verknüpfen und nicht mit AND



Klatsch!  
Manchmal sieht man den Wald vor lauter Bäumen nicht!
Natürlich.
Aber wie handhabe ich das jetzt? Es kann ja eine ID gewählt sein oder 7 oder....
Bei 1 müsste es and heißen, danach or. Richtig?
Danke und Gruß
Florian


----------



## Manfred (17. Dez 2004)

Du könnstest es so machen


```
$SQL="SELECT * FROM XY WHERE ID="99999";
```

ID="9999" sollte etwas sein, das nie zutreffen kann



```
if... $SQL.=" OR Bedingung1";
if... $SQL.=" OR Bedingung2";
.
.
.
```


----------



## Guest (17. Dez 2004)

Hallo!
Hmm, wenn ich Dich richtig verstanden habe, soll ich meine SQL- Anweisung um 'where ID=999999' erweitern und dann das Formular auswerten. 
Danach hieße es denn: 'or ID=StringAusFormular'.
Standardmäßig, wenn also kein Feld aktiviert wurde, würde die Abfrage ja nicht um die ID erweitert werden, also würden alle rausgesucht werden. 
Ich möchte aber das Auswahlfeld nur als optional zusätzlichen Filter einsetzen. Wenn die Suche also eingeschränkt werden soll auf wenige ID's.
Und das wäre meiner Meinung nach mit Deiner Lösung nicht möglich, richtig?
Danke im Voraus.
Gruß
Florian


----------



## Manfred (17. Dez 2004)

> Standardmäßig, wenn also kein Feld aktiviert wurde, würde die Abfrage ja nicht um die ID erweitert werden, also würden alle rausgesucht werden.



Eben nicht, ich hab geschrieben das die Bedingung ID="99999" (kann auch anders lauten) NIE zutreffen sollte, also keinen einzigen Satz liefern würde!

Die "Stammabfrage" würde also lauten 

"SELECT * FROM XY where <Bedingung die nie erfüllt wird>"

dann durch Abfragen erweitern mit

if... $sql.=" OR asdfafsdfas";
if ...$sql.=" OR asdfsafsdf";



Die nie erfüllte Bedingung braucht man ja nur, damit das nachkommende OR funktioniert! Denn SELECT * FROM XY where OR..." geht ja Syntaktisch nicht


----------



## Flons (17. Dez 2004)

Hallo!
Das war mir schon klar, das dann nie ein Ergebnis kommen würde, wenn ID=99999 oder so. Aber ich wollte versuchen, daß standardmäßig alle rausgesucht werden, und nur wenn im Auswahlfeld eine Auswahl getroffen wird, die Abfrage erweitert wird. 
So in etwa:

Select 
bla
from
blubb

Wenn jetzt im Auswahlfeld was gewählt wurde, dann:
Select 
bla
from
blubb
where ID=xy or WasWeißIch(bei mehr als 1)

Ich hoffe, ich konnte mich ein wenig verständlicher ausdrücken.
Gruß
Florian


----------



## Manfred (17. Dez 2004)

Na dann!

$SQL ="SELECT * FROM XY";   such alles raus

Wenn etwas anderes ausgewählt ist dann

if($id_entschwef != "")
{
$SQL ="SELECT * FROM XY WHERE <etwas was nie zutrifft>";

if $id_entschwef=="151" dann $SQL.=" OR asdkljöfsdlköajfd";
if $id_entschwef=="152" dann $SQL.=" OR asdfafdsfasd";
usw
usw
}

das müsste passen. Dann wird alles rausgeholt wenn nichts extra gewählt wurde. Wurde etwas extra gewählt, dann wird $SQL überschrieben und passend erweitert


----------



## Flons (17. Dez 2004)

Hallo!
Danke nochmal für Deine schnelle Antwort, aber ich habe irgendwie immernoch einen Fehler in meinem Script:
Ich habe etwas folgendes:
if($v_entschwef !="")
{
//Abfrage, die nichts zurückgibt
select
bla
from
blubb
where id=0
if($v_entschwef=="152")
{
$VSql.=" or id=152";
}
}
So sollte es doch eigentlich passen, oder nicht?
problem:
Jetzt kommt kein Ergebnis mehr. 
Treffe ich keine Auswahl= alles ok
Auswahl auf "152" Ergebnismenge=NULL, was nicht sein kann!
Danke im Voraus noch mal.
Und schöne Weihnachtstage.
Gruß Florian


----------



## Manfred (17. Dez 2004)

```
$VSql="Abfrage die alles ausgibt";

if($v_entschwef !="") 
{ 
//Abfrage, die nichts zurückgibt 
$VSql="select bla from blubb where id=0"; 
if($v_entschwef=="152") 
{ 
$VSql.=" or id=152"; 
} 
}
```


So müsste das passen, du hattest vorher die Abfrage in keinem String gespeichert, also kannst du sie schwer mit $VSql. erweitern!? Oder hast du das nur hier so geschrieben?

Falls nix geht, poste mal den original codeabschnitt!

Was mich noch interessieren würde. Wie kann ein Auswahlfeld mehrere ausgewählte Dinge haben?? Noch dazu wo das ganze in nur einer Variable steht $id_entschwef  ??
Oder kann diese Variable mehrere Werte halten?? Kenn mich da net so gut aus


----------



## Flons (17. Dez 2004)

Bei dem Auswahlfeld handelt es sich um ein multiple- Feld, also ein feld mit Mehrfachauswahl.
Mein Code(gekürzt):
 <select name="entschwef[]" size="5" multiple>
                <option value="101">101: pipapo</option>
                <option value="102">102: weißnich</option>
                <option value="103">103: nochWatt</option>
</select>

$VSql="Select 
xyz
from Tabelle
where
bedingung1
,bedingung1
.
.
.


Unten dann:
 if($v_entschwef !="")
 {
  $VSql.=" and id=000";
  if($v_entschwef=="152"){$VSql.=" or ID=152"; } //Hier habe ich es mit und ohne geschweifte Klammern probiert.
}

Ergebnis ist, wenn ich nichts auswähle(die If-Anweisung also false ist), läuft es alles richtig.
Wenn ich eins auswähle, lommt kein Ergebnis (also als wenn !="").
Es wird also nicht richtig geprüft,was in $v_entschwef steht. So zumindest meine Vermutung.
Aber syntaktisch müsste das doch richtig sein?!
Danke und Gruß
Florian


----------



## Manfred (17. Dez 2004)

Also "oben" setzt du die Abfrage zusammen, die alle Sätze ausgibt!


```
$sql="SELECT xy FROM Tabelle where a=aa AND b=bb ..."
```


dann weiter unten setzt du wie ich sah einfach eine Bedingung dazu die nie erfüllt wird


```
if(variable!="")
{
    $sql.=" and <nie erfüllt";
    
    if(a="501"){$sql.=" OR a = 501}
}
```

Das müsste soweit passen!
Dass heisst aber auch, dass in deiner "Version" die Bedingungen von der ursprünglichen Anweisung mitgenommen werden, aber für das nachfolgene OR nicht mehr gelten! Ist das ok?

z.B.

SELECT name FROM Autos WHERE farbe="gelb" AND ps="150" OR baujahr="1999"

gibt dir ja entweder gelbe autos mit 150ps zurück ODER alle autos mit baujahr 1999. Die farbe und ps gelten nach dem OR nicht mehr!

*Lass dir mal die zusammengestelle SQL Anweisung ausgeben, vielleicht siehst du dann den Fehler!*
Oder poste den original Code


----------

