HTML Select Multiple - Auswahl in DB eintragen?
Hallo,
ich habe folgendes Problem - mal wieder ;)
Ich habe ein select Feld aus dem man mehrere Einträge auswählen kann. Das sind dann alle Benutzer. Dann soll man auch noch eine Klasse aus einem Dropdown auswählen können. Anschließend soll dann die ausgewählte Klasse in die Spalte "user_group" überall dort in der DB eingetragen werden, wo der Benutzername gleich der ausgewählten Benutzer ist. Also mehrere. Im nachfolgenden Code seht ihr wie ich es versucht habe. Was mache ich da falsch?
group_add_members.php: https://pastebin.com/8CSUtKLq
mysql.php: https://pastebin.com/KG2Y0sjv (sucht nach "function groupAddMembers")
Danke schonmal!
Mein Problem ist jetzt, das es nicht funktioniert. In der group_add_members.php ist ja eine eigene Fehlermeldung definiert. Die wird ausgeführt wenn der Vorgang (also aus der mysql.php) nicht ausgeführt werden kann. Genau das passiert. Nun möchte ich gern wissen, wie ich das Problem lösen kann...
Und was ist das Problem und die FragE?
Es funktioniert nicht. Wenn ich es probiere kommt immer von dem if (aus der mysql.php bei der function) ein false zurück und meine Fehlermeldung wird ausgegeben...
2 Antworten
Wenn du dein Formular abschickst, erhältst du nur die Werte, die in den benannten Feldern stehen sowie die aus dem URL-Querystring des action-Attributs.
Das heißt,
$_GET["selected_group"]
ist dann nicht gesetzt und $group_for_add würde den Wert Alle Klassen beibehalten.
Den wohl korrekten Wert verschickst du nur, wenn du auf einen der Links klickst, die du mit dem entsprechenden Parameter ausgestattet hast. In dem Fall würde dir allerdings der Wert für
$_POST["select_user_to_add"]
fehlen, denn bei einem Klick auf einen Link löst du nur einen GET-Request aus.
An der Stelle fällt mir zudem auf, dass du in deinen Querystrings die & doppelst. Ein einziges reicht aber vollkommen:
index.php?page=groupAddMembers&selected_group...
Oder besser (HTML-enkodiert):
index.php?page=groupAddMembers&selected_group...
Die Korrektur hinsichtlich des Versands des Gruppennamens könnte entweder ein zweites select-Feld oder eine Radiolist sein (in jedem Fall mit dem Namen selected_group). Das Aussehen der Elemente ließe sich mit letzgenannen Element wohl am einfachsten beibehalten. Ordne jedem Radiobutton einfach ein Label zu
<label for="teacher">Lehrer</label>
<input id="teacher" name="selected_group" type="radio">
und verstecke den Button via CSS. Das Label kann anschließend mit weiterem CSS nach Bedarf angepasst werden.
Worauf du allerdings auch achten musst: Dein erster Button im Formular hat ebenso bereits den Namen selected_group. Gib ihm einen anderen Namen oder nutze einen anderen Namen für das Gruppenauswahlelement.
Zuletzt noch ein paar Randbemerkungen, die mir während dem Überfliegen deines Codes aufgefallen sind:
1) Das aria-label-Attribut für die Nutzerauswahlliste ist überflüssig und eher verwirrend. Du hast dem Element doch bereits ein label-Element zugeordnet, welches die Feldbeschreibung übernimmt.
2) Diese erste Prüfung
if ($db->isUserLoggedIn()) {
kannst du dir sparen. Jeder Administrator muss doch ebenso ein Nutzer sein. Die zweite Abfrage deckt also die erste Abfrage schon mit ab.
3) Ein Button hat innerhalb eines Links nichts verloren (und das gilt auch andersherum, falls du es je vorhaben solltest). Gib dem a-Element einfach das class-Attribut des Buttons. Das sollte genügen, um ihm das gewollte Aussehen zu verleihen.
4) Ich würde mir überlegen, ob nicht noch eine bessere Datenvalidation angebracht wäre. Du gibst dem Nutzer zwar seine Auswahlmöglichkeiten vor, doch die kann er via Browserinspektor ja leicht noch erweitern / modifizieren. Als Administrator könnte ich mir bspw. eine nicht-existente Gruppe Einhorn ausdenken und sie an die Datenbank zur Speicherung schicken. Je nach deren Aufbau kommen unsinnige Daten hinein oder es lassen sich gezielte Exceptions auslösen, da der Fremdschlüssel keinen passenden Eintrag in der groups-Tabelle findet.
Da du dir eh bei jedem Request die verfügbaren Gruppen zusammensuchen lässt, wäre es kein großer Aufwand, die selektierte Gruppe kurz zu prüfen:
if (in_array($_POST["selected_group"], $groups)) {
// selected group is valid ...
}
5) Laut deinem Quellcode gibt es in der Datenbanktabelle groups mindestens zwei Spalten, aber effektiv verwendest du nur eine (group_name). Demzufolge würde ich für die Anfrage auch nur diese eine Spalte anfragen. Du kannst auf diese Weise ein paar Ressourcen einsparen.
SELECT group_name FROM groups ORDER BY group_id ASC
Dann würde ich mal gucken ob überhaupt beide variablen mit übegeben werden . ich sehe da jedenfalls kein user als POST feld .
dann fehlt wohl die gruppe im POST als wert btw LINKS sind keine POST sondern GET variablen .
ich finde den Fehler nicht... kannst du mir bitte helfen?^^
Funktioniert jetzt, außer das der Wert der ausgewählten Klasse nicht mit übergeben wird...