MySQL Abfrage eines Wertes in einer zuvor aus einem Formular ausgewählten Spalte.

godfather_al

Mitglied
Hallo zusammen,

bin noch Recht neu in Sachen MySQL und komme in einem scheinbar einfachen Problem nicht weiter. Habe in einer DB die Tabellen

lehrer (id, name, plz, mathe, deutsch, englisch)
stufen (id, stufe)

In der Tabelle lehrer steht im Feld mathe eine Zahl, z. B. eine 10, wenn der Lehrer Mathe-Unterricht bis zur 10. Klasse erteilen kann.

Nun soll über ein Formular eine PLZ, ein Fach und eine Stufe ausgewählt werden können, so dass eine entsprechende Ausgabe der passenden Lehrer erfolgt, also z. B. Mathe + 9 werden per Formular ausgewählt, dann sollte auch der Lehrer, bei dem unter mathe eine 10 steht, mit ausgegeben werden.

Mein Ansatz war der, den Formularwert (in diesem Fall z.b. Mathe) einfach als Spaltenbezeichnung ins SQL Statement einzuarbeiten, funktioniert so aber (natürlich) nicht:

Code:
 $sql = "SELECT * FROM lehrer WHERE plz = '$_POST[plz]' AND $_POST[subject] >= $_POST[grade]";

Kann mir jemand einen Tip geben wie ich hier zum Ziel komme, möglichst ohne die Tabellen(strukturen) ändern zu müssen?

Vielen Dank vorab.

Viele Grüße
Alex
 
SQL:
SELECT 
	*
FROM 
	lehrer
WHERE
	plz = '{$_POST['plz']}'
	AND mathe >= {$_POST['minMathe']}
Wobei $_post['minMathe'] halt das Feld ist, in dem jetzt die 9 drinne steht.

PS: du solltest die Feldernamen immer mit ' umschliessen. Also aus $_POST[plz] wird $_POST['plz']
 
Hallo yaslaw,

bin jetzt schon einen Schritt weiter, doch es werden nun wieder alle Lehrer mit der PLZ angezeigt, denke die Verknüpfung ist noch nicht da :(

Aus dem Formular kommt ein Wert 'grade' , ein Wert 'plz* und ein Wert 'subject'. Nun sollte das SQL Statement folgendes tun:

In der Tabelle stufen dem Wert grade eine id zuordnen, dann diese id mit den Werten der Spalte mit dem Namen 'subject' aus der Tabelle Lehrer vergleichen und die lehrer ausgeben, bei denen der Wert in der Spalte 'subject' größer gleich dem Wert der id aus der Tabelle 'stufen' ist. Habe davon noch einiges nicht hinbekommen, das Größte Problem scheint mir derzeit zu sein, dass ich einen Wert aus dem Formular $_POST[subject] in der SQL Abfrage als Bezeichner für eine Spalte einbauen kann :(

Hast Du hierzu evtl. noch weitere Hinweise?

vg
Alex
 
'Grösser als ID' öhm. Der Wert einer ID sollte dich nie direkt kümmern. Vor allem Grösser als id X.

Wie hängen die 2 Tabellen zusammen?

$_POST['subject'] ist der Name der Spalte aus der Tabelle lehrer.
$_POST['grade'] entspricht der ID aus der Tabelle stufen.
 
Naja, habe bei der Tabelle grade nur id und grade, sauberer wäre hier sicherlich auch id, grade_name und grade_nr oder so ähnlich.

Die id (oder sagen wir grade_nr) aus der Tabelle grades ist die Zahl, die in der Tabelle lehrer in den Spalten der einzelnen Fächer eingetragen wird.

Beispiel:

Tabelle grades:

id grade
1 1. Klasse
2 2. Klasse
3 3. Klasse

Tabelle Lehrer:

id name plz mathe biologie chemie physik deutsch englisch
1 Toni Muster 50670 2 8 5

vg
Alex
 
Hi yaslaw,

habe über Dein Tutorial debugged und den Fehler gefunden, jetzt funktioniert es genau so wie es soll :) Vielen Dank nochmal, das Tutorial ist echt Gold wert wenn man einen Fehler im SQL sucht.

Viele Grüße
Alex
 
Habe einiges umgestellt, weil das ursprüngliche SQL - Statement aus dem Debugger so aussah:

SELECT * FROM portal_items WHERE plz = 50670 AND Englisch >= 4. Klasse


Dann habe ich den Code so geändert:

$sql = "SELECT * FROM portal_grades WHERE grade = '$_POST[grade]'";

$res = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_assoc($res)){
$klasse = $row["id"];
}
mysql_free_result($res);

$sql = "SELECT * FROM portal_subjects WHERE subject = '$_POST[subject]'";

$res = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_assoc($res)){
$fach = $row["name"];
}
mysql_free_result($res);

echo "Klasse: {$klasse} Fach:{$fach}";



$sql = "SELECT * FROM portal_items WHERE plz = '$_POST[plz]' AND $fach >= $klasse";

Damit sieht das SQL nun so aus:


SELECT * FROM portal_items WHERE plz = 50670 AND englisch >= 4


Und jetzt funktioniert es perfekt. Weiss nicht ob es ein eleganter Weg ist, aber in meinem Stadium freue ich mich erstmal darüber dass es klappt :)
 
Zurück