HTML Select Multiple - Auswahl in DB eintragen?


01.04.2022, 17:50

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...

osion  01.04.2022, 17:47

Und was ist das Problem und die FragE?

speedwanted55 
Fragesteller
 01.04.2022, 17:49

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 .


speedwanted55 
Fragesteller
 01.04.2022, 18:06

Funktioniert jetzt, außer das der Wert der ausgewählten Klasse nicht mit übergeben wird...

0
TechPech1984  01.04.2022, 18:36
@speedwanted55

dann fehlt wohl die gruppe im POST als wert btw LINKS sind keine POST sondern GET variablen .

0