SQL Select From WHERE Frage

XertoX

Cadet 1st Year
Registriert
Nov. 2007
Beiträge
12
Hi@all
Ich habe ne relativ simple Frage, zu der ich einfach keine Lösung finde.

1. In einer Tabelle habe ich eine Spalte z.B. Farbe.
2. Meine Zeilen haben verschiedene Inhalte in dieser Spalte(z.B. rot, blau, silber etc.)
3. Ich übergebe eine Variable (&var)
4. Um halt zu "filtern" kann ich ja sagen SELECT * FROM meineTabelle WHERE Farbe = $var

Das ist ja alles soweit gut und Funktioniert. Ich suche aber jetzt eine Möglichkeit wenn $var nichts übergeben wurde (also in einem Formular oder was weiß ich keine Farbe ausgewählt wurde) also die Farbe egal ist, mir dann der kompletter Inhalt wiedergegeben wird, also unabhängig von der Farbe.

Ich hoffe ihr versteht was ich mein, ich finde es schlecht zu erklären.
Vlt mal so als praktisches Beispiel eine Suchmaske für ein Auoportal oder so.
Also man kann Farbe, Preis, Modell etc auswählen. Alle Kriterien kann ich mit WHERE ja benutzen. Nur was ist wenn eine der Kriteren egal ist. Wie in diesem Fall die Farbe? Dann ist ja der ganze "Filter" dahin. Oder seh ich das falsch
Ich würde das so machen mit SELECT * FROM meineTabelle WHERE Farbe=$farbvar AND Modell = $modelvar und so weiter.
Oder geht man an so komplexe Sachen anders heran?

Schon mal vielen Dank für die Hilfe/ neue Denkansätze
Gruß XertoX
 
Ich nehme mal an, du fragst per PHP ab?!

Prüf doch vorher einfach im PHP-Code, ob die Variable leer ist und verändere entsprechend die Query...

Vielleicht so in der Art:

PHP:
$query = 'SELECT * FROM meine Tabelle '.(empty($var) ? '' : 'WHERE Farbe = '.$var).' ';
 
Die Suche nach Platzhalter ist % d.h. WHERE Farbe = '%' oder auch WHERE Farbe = "bl%" (blau, blond, ...). Das ist jedoch KEIN guter Style. Deutlich besser wäre die SQL Abfrage in Abhängigkeit von den Anforderungen anzupassen und die Clause Farbe = EineFarbe komplett zu entfernen.
 
Schon mal an ne If abfrage gedacht? Die gibts genau für solche fälle ;)

sprich wenn(farbe gegeben){
anweisung}else{
anweisung}

und dann erst die abfrage machen
 
Mal so quick n dirty:
PHP:
<?php

$sql = 'SELECT * FROM autos';
$where_columns = array();

if( isset( $_POST['farbe'] ) ) $where_columns[] = "farbe = '".$_POST['farbe']."'";
if( isset( $_POST['preis'] ) ) $where_columns[] = "preis = '".$_POST['preis']."'";
if( isset( $_POST['modell'] ) ) $where_columns[] = "modell = '".$_POST['modell']."'";

if( !empty( $where_columns ) )
  $sql .= ' WHERE '.implode( ' AND ', $where_columns );
Das sucht nur nach Feldern, welche gesetzt wurden. Ggf. eher mit empty() arbeiten anstatt isset(). Bei Auflistungen kannst du auch <col> IN (x1,x2,x3,...,xn) nutzen, wodurch du dir lästige <col> = x1 OR <col> = x2 OR <col> = x3 OR ... OR <col> = xn sparst (oft genug gesehen).
 
Ui viele dank für die Antworten.
Ja die Abfrage wird mit php gemacht.
Die Sache mit dem Platzhalter hatte ich auch schonmal gesehen, aber halt nur in Verbindung mit Teil des gewünschten Ergebnisses. Also wie im Beispiel %b für blau, braun etc. das dieser vlt auch alleine geht kam mir nicht in den Sinn.
An eine If Bedingung hatte ich auch schonmal gedacht, aber es kam mir zu Umständlich vor, denn wenn ich jetzt sagen wir 20 Variablen habe muss ich ja für jede Eventualität eine Bedingung erstellen und das kam mir nicht richtig vor.

Der Ansatz von Yuri scheint Interessant zu sein. Muss ich mich noch genauer Beschäftigen.
Ich bin auch gerade erst angefangen mit SQL

Vielen dank, ich werde mich nachher mal ransetzen und noch etwas lesen und probieren und mich sicherlich nochmal melden.... bis denn
 
Übernimm den Ansatz von Yuuri aber nicht blind. Diese Variante lädt zu SQL Injection Angriffen ein. Niemals darf man ungeprüft $_POST oder $_GET in einen Query bauen. Klar, in ner lokalen Testversion geht das, aber man sollte sich sowas gar nicht erst angewöhnen.
 
@ XertoX
Ja richtig. Für jede Variable eine IF Abfrage. Du benötigst jedoch noch eine allgemeine Abfrage (am besten nen Bool, den du setzt, wenn einer der IF Abfragen positiv ausfällt) damit du weißt, dass du zum ersten mal eine WHERE Bedingung erstellst und deshalb das WHERE hinzufügen musst. Das darf nur stehen, wenn du wirklich was zu filtern hast.
 
andy, lies mal den code von Yuuri genauer. Is alles mit drin, echt ne schöne Lösung (bis auf die Injection-Verwundbarkeit)
 
@yuuri
ja, schöne lösung, ich würde es noch dahingehend optimieren ;)
ist etwas dynamischer bei z.b. 20 parametern.

hier noch das thema sql injection zum nachlesen http://de.wikipedia.org/wiki/SQL-Injection

PHP:
<?php
$sql = 'SELECT * FROM autos';
$where_columns = array();
foreach(array('farbe', 'preis', 'modell') as $column) { 
	if(isset($_POST[$column]) && !empty($_POST[$column])) {
		$where_columns[] = "$column= '".mysql_real_escape_string($_POST[$column])."'";
	}
}
 if(count($where_columns)>0) {
	$sql .= ' WHERE '.implode( ' AND ', $where_columns );
}

ps: blind-coded, flüchtigkeitsfehler nicht ausgeschlossen.
 
Hm, auch ne interessante Variante. Ich würd aber der Übersichtlichkeit halber den Spalten-Array nicht direkt im foreach definieren sondern davor. Kann sonst, bei 20 Spalten, echt kein Aas mehr lesen. Außerdem würd ich das $column im String der Sichtbarkeit wegen eher konkatenieren, statt es direkt einzufügen. Macht sich im Syntax-Highlighter meist besser.
Dem Parser ist es eh relativ egal, ob er jetzt ne Konkatenation mehr oder weniger durchführt und wo er seine Arrays füllt. Kommt ja nicht wirklich auf jeden gesparten Taktzyklus an. Wenn doch, dann gäb es sicher andere Ansätze als PHP...
 
klar, bei mehr als 5 elementen im array definiere ich es schon immer außerhalb der foreach, bei wenigen elementen spar ich mir das.

die schleife frisst zwar mehr performance (speicherlast & laufzeit), dafür leicher zu warten und übersichtlicher.

copy & paste programmierung ist naja, in meinen augen längst überholt.

was meinst du mit konkatenieren? dem kann ich gerade nicht so ganz folgen, steh wohl auf der leitung.

edit:
ah ok, jetzt hab ichs. klar,
PHP:
$where_columns[] = $colum." = '".mysql_real_escape_string($bla)."'"

klar, die laufzeit spielt dabei keine Rolle. wäre dies von bedeutung, wäre php eh die falsche wahl :) fürs highlighting ists besser, stimmt, mach der gewohnheit und persönliche vorliebe. in solchen fällen ist mir das highlighting egal, da ich mich um solche blöcke nicht groß kümmer, nach x jahren erfahrung hehe aber für anfänger ists sicherlich hilfreich.
 
Zuletzt bearbeitet:
"blabla ".$variable." blubb" <- das is ne Konkatenation. Muss man nicht wissen, glaub ich.
Auszug aus der Manpage von "cat"
cat - concatenate files and print on the standard output
 
Zurück
Oben