SQL IF Abfrage bei WHERE Klausel?

Rockhound

Lt. Commander
Registriert
Jan. 2003
Beiträge
1.540
Hallo,
ich hoffe ich kann das anständig erklären. Bin da etwas DAU-Mäßig unterwegs bei SQL.
Ich habe eine Abfrage (etwas verkürzt hier)

Code:
SELECT k.id, k.name, k.strasse, k.bland 
FROM kontakte k 
WHERE k.bland = '$bundesland'

Dann hab ich ein Dropdown Menü gemacht mit allen Bundesländern, etwa so:
Code:
VAR[0] Alle anzeigen
VAR[1] Bayern
VAR[2] Baden-Württemberg
VAR[3] ...

Wie schaffe ich es jetzt die WHERE-Klausel bei der Abfrage nach allen, also wenn $bundesland=0 ist, auszuklammern.

Hatte das erst so gedacht:

Code:
SELECT k.id, k.name, k.strasse, k.bland 
FROM kontakte k 
IF ('$bundesland' > 0, WHERE k.bland = '$bundesland')
So funktioniert das ganze natürlich nicht.

Vielen Dank Euch im Voraus.
 
Hi,

wo und in welcher Sprache wird das Statement denn zusammengebaut? Dort einfach prüfen, ob "0" eingetragen ist und dann die komplette IF-Klausel weglassen.

VG,
Mad
 
Ich kenne mich jetzt nicht wirklich viel mit SQL aus, aber wie sieht es mit folgendem aus:
Code:
WHERE Dropdown == 0 AND k.bland = '$bundesland' OR Dropdown != 0 AND k.bland != NULL
 
S.Kara schrieb:
Ich kenne mich jetzt nicht wirklich viel mit SQL aus, aber wie sieht es mit folgendem aus:
Code:
WHERE Dropdown == 0 AND k.bland = '$bundesland' OR Dropdown != 0 AND k.bland != NULL
Das geht leider nicht :/
Madman1209 schrieb:
Hi,

wo und in welcher Sprache wird das Statement denn zusammengebaut? Dort einfach prüfen, ob "0" eingetragen ist und dann die komplette IF-Klausel weglassen.

VG,
Mad
Ich bastel das in PHP zusammen.
Das ganze mySQL-Statement vorher in eine if-Schleife zu packen möchte ich vermeiden.
Ich habe ganz viele verschiedene SQL-Abfragen und müsste ja dann alle verdoppeln :(



Also so möchte ich das NICHT

PHP:
if ($bundesland>=1) {
mysql_db_query("$database","
SELECT k.id, k.name, k.strasse, k.bland 
FROM kontakte k 
WHERE k.bland = '$bundesland'")
else {
mysql_db_query("$database","
SELECT k.id, k.name, k.strasse, k.bland 
FROM kontakte k")
}
 
Zuletzt bearbeitet:
Hi,

du musst ja auch nicht das ganze Statement in eine Verzweigung (es gibt keine IF Schleife) packen sondern nur das Statement dynamisch aufbauen und entsprechend das "WHERE" dazubauen oder weglassen.

Am besten du postest mal Code wie du es aktuell machst.

VG,
Mad
 
hmm stimmt. Ich probier das mal aus. Das würde schon gehen denke ich.
Danke

So sieht das bis jetzt aus

Code:
$res_data = mysql_db_query("$database","SELECT k.id, k.art, k.name, k.plz, k.stadt, k.bland, k.land, k.telefon, k.dekorateur, k.grosshandel, r.name, k.lkontakt, k.rdatum, k.ruhrzeit, k.filter, k.sonstiges, f.name, l.kurz, l.id, SUM(a.dekosetrx) AS sumdekosetrx, SUM(a.dekosette) AS sumdekosette, SUM(a.flyer) AS sumflyer, SUM(a.verkostungrx) AS sumverkostungrx, SUM(a.verkostungte) AS sumverkostungte, SUM(a.posterrx) AS sumposterrx, SUM(a.posterte) AS sumposterte, SUM(a.brief) AS sumbrief, MAX(a.kontakt) AS akontakt
	FROM kontakte k
	LEFT JOIN auftrag a ON k.id = a.kontaktid
	LEFT JOIN reform r ON k.grosshandel = r.id
	LEFT JOIN filter f ON k.filter = f.id
	LEFT JOIN land l ON k.land = l.id
	WHERE k.bland = '$kbund'
	GROUP BY k.id
	ORDER BY $order $sortierung
	LIMIT $limita, $limitb");

Zeile 7 ist der Übeltäter :)
 
Zuletzt bearbeitet:
Hi,

wenn Hilfe brauchst oder es nicht klappt einfach ein Stück Code posten, dann schauen wir zusammen drüber.

VG,
Mad
 
hmm ja wie pack ich jetzt das in die unterteilte Variable.

Das ging doch immer mit
$res_data =
$res_date .=

oder?
 
Hi,

oh oh, ich sehe du verwendest noch "mysql_db_query". Das ist veraltet und fliegt demnächst aus PHP komplett raus! Verwende lieber PDO, also Predefined Statements. Deutlich einfacher, gerade auch mit konditionalen Zusätzen wie WHERE und Co - von der massiv erhöhten Sicherheit mal ganz zu schweigen!

Wenn es unbedingt mit "mysql_db_query" sein soll - wovon ich wirklich abraten möchte - dann baue dir den Übergabeparamter dynamisch auf.

VG,
Mad
 
Das Dropdown Menü ist das Teil von was?

Oder was hindert dich daran den String der Beim Dropdown Menü direkt in deine Where einzufügen?

Also wenn du Bayern einfügst,

$bundesland = $auswahlDropDownMenue

SELECT k.id, k.name, k.strasse, k.bland
FROM kontakte k
WHERE k.bland = '$bundesland'
 
Hi,

weil er auch "alle" auswählen können will und dann die Where komplett raus kann.

VG,
Mad
 
Madman1209 schrieb:
Hi,

oh oh, ich sehe du verwendest noch "mysql_db_query". Das ist veraltet und fliegt demnächst aus PHP komplett raus! Verwende lieber PDO, also Predefined Statements. Deutlich einfacher, gerade auch mit konditionalen Zusätzen wie WHERE und Co - von der massiv erhöhten Sicherheit mal ganz zu schweigen!

Wenn es unbedingt mit "mysql_db_query" sein soll - wovon ich wirklich abraten möchte - dann baue dir den Übergabeparamter dynamisch auf.

VG,
Mad

Oje, das ist ein Script das ich so vorliegen hab und soll es nun erweitern. Als ich das letzte mal PHP programmiert habe, war das auch noch aktuell :)

Also ich lese das mit dem oben genannten code aus und füge das dann so den PHP-Variablen zu:

PHP:
if ($num_data<=$num_data) $x_data = $num_data;
	else $x_data = $num_data;
	for ($i_data=0; $i_data<$x_data; $i_data++){
	
	// Kontakte abrufen
	$d_id			= mysql_result($res_data, $i_data, "k.id");
	$d_name	 		= mysql_result($res_data, $i_data, "k.name");
	$d_plz	 		= mysql_result($res_data, $i_data, "k.plz");}

Wie müsste das denn mit diesem neuen PDO Befehl aussehen?
Weil wenn du meinst das das bald rausfliegt aus PHP... nicht das der Server ein Update macht und nix geht mehr.
Wegen Sicherheit... das ganze befindet sich in eienm .htaccess geschützen Verzeichniss unter einer Subdomain die keiner kennt. Also nix öffentliches.
 
Madman1209 schrieb:
Hi,

weil er auch "alle" auswählen können will und dann die Where komplett raus kann.

VG,
Mad

Und was hindert ihn dann daran eine if Verzweigung zu erstellen?

If($auswahl="alle"){
SELECT k.id, k.name, k.strasse, k.bland
FROM kontakte k
}else{
SELECT k.id, k.name, k.strasse, k.bland
FROM kontakte k
WHERE k.bland = '$bundesland'
}
 
trotzdem eine lösung mit if-condition:
Code:
$query_main_1 = "SELECT k.id, k.art, k.name, k.plz, k.stadt, k.bland, k.land, k.telefon, k.dekorateur, k.grosshandel, r.name, k.lkontakt, k.rdatum, k.ruhrzeit, k.filter, k.sonstiges, f.name, l.kurz, l.id, SUM(a.dekosetrx) AS sumdekosetrx, SUM(a.dekosette) AS sumdekosette, SUM(a.flyer) AS sumflyer, SUM(a.verkostungrx) AS sumverkostungrx, SUM(a.verkostungte) AS sumverkostungte, SUM(a.posterrx) AS sumposterrx, SUM(a.posterte) AS sumposterte, SUM(a.brief) AS sumbrief, MAX(a.kontakt) AS akontakt
    	FROM kontakte k
    	LEFT JOIN auftrag a ON k.id = a.kontaktid
    	LEFT JOIN reform r ON k.grosshandel = r.id
    	LEFT JOIN filter f ON k.filter = f.id
    	LEFT JOIN land l ON k.land = l.id";
$query_group = " GROUP BY k.id";
$query_order = " ORDER BY ".$order." ".$sortierung;
$query_limit = " LIMIT ".$limita.", ".$limitb.");";
if($kbund != 0)
{$query_where_clause = " WHERE k.bland = '".$kbund."'";}
else
{$query_where_clause = "";}

//oder kürzer: $query_where_clause = ($kbund != 0) ? " WHERE k.bland = '".$kbund."'" : "";

$query = $query_main_1.$query_where_clause.$query_order.$query_limit;

$res_data = mysql_db_query($database, $query);

damit kannst du dann - selbe abfragestruktur vorausgesetzt - auch weitere queries zusammenbauen

Code:
$query_n = $query_main_2.$query_where_clause.$query_order.$query_limit;

das ist am ende wahrscheinlich platzsparender als jede query einzeln zusammenzubasteln
 
Madman1209 schrieb:
Hi,



liest du eigentlich die Beiträge?



VG,
Mad

Habe ich nicht komplett, tut mir leid.

Aber wenn ich mir seinen Code anschaue und seine query, kommt es mir so vor als hätte er nicht viel Ahnung.

k.id, k.art, k.name, k.plz, k.stadt, k.bland, k.land, k.telefon, k.dekorateur, k.grosshandel,k.lkontakt, k.rdatum, k.ruhrzeit, k.filter, k.sonstiges

Allein was er alles dort auswählt 15 Spalten plus die er nicht ausgewählt hat, er muss etliche spalten in nur einer Tabelle haben. Auf den ersten Blick scheint es so, als wäre die Datenbank schlecht aufgebaut.

PHP:
if ($num_data<=$num_data) $x_data = $num_data;
	else $x_data = $num_data;

Und wenn ich sowas sehe, wird mir sowieso schlecht. Eckige Klammern nicht setzen empfinde ich jedenfalls extrem fahrlässig. War nicht zuletzt ein fehlerhafter Code bei Apple so verursacht worden!?
 
@floq0r: Vielen Dank dafür. Das hat wahrlich geholfen. Vielleicht kannst Du mir auch noch bei einer anderen Anpassung einen Tipp geben. Und zwar hab ich eine PHP-Zeile die in etwa so aussieht:

PHP:
$query_where_clause = ($kbund != 0) ? " WHERE k.bland = ".$kbund." AND k.name LIKE '".$anfangsbuchstabe%."'" : " WHERE k.name LIKE '".$anfangsbuchstabe%."'";
Du siehst schon, ich habe das Script von Dir erweitert. Nur funktioniert das natürlich nicht. Es liegt irgendwie an dem % (Wildcard) und dem . (Punkt). Das muss anders aussehen, finde aber nicht die Lösung.
 
freut mich zu hören :)

die wildcard muss natürlich in die textzuweisung / den "doublequote-bereich"
Code:
$query_where_clause = ($kbund != 0) ? " WHERE k.bland = ".$kbund." AND k.name LIKE '".$anfangsbuchstabe."%'" : " WHERE k.name LIKE '".$anfangsbuchstabe."%'";
falls das feld k.bland den datentyp int hat dann stimmt das so, falls es den datentyp varchar/nvarchar hat dann musst du den vergleichswert noch in singlequotes stellen
Code:
"...WHERE k.bland = '".$kbund."'..."
 
Zuletzt bearbeitet:
Also Imho wäre ein
Code:
Where k.bland = $bundesland or $bundesland = 0
irgendwie einfacher, oder verguck ich mich da? :D
 
Zurück
Oben