Wieso bekomme ich diesen Fehler?

2 Antworten

Zunächst ein Hinweis auf mehrere Markupfehler:

1) Deine ersten drei Labels verweisen auf keine existierenden Elemente. Das for-Attribut muss auf eine ID verweisen. Bei deinem ersten label-Element müsstest du daher also für das for-Attribut den Wert id-name eintragen, bei dem Zweiten idmail, usw..

2) Der Wert userpass liegt nicht im erlaubten Wertebereich für das autocomplete-Attribut. Schau hier für Alternativen.

3) Deine schließenden p-Tags haben keine öffnenden Partner. Du solltest dazu Folgendes wissen: Wenn du einen Paragraph startest und ihm ein Blockelement folgt, wird er daraufhin automatisch geschlossen. Das heißt, aus bspw.

<p>
  <div></div>
</p>

wird das:

<p></p>
<div></div>
</p>

Die Entscheidung, Paragraphen für deine Feldblöcke zu verwenden, ist daher ungünstig, da sie mehrere Fehler auf einmal verursacht. Ersetze die Paragraphen besser gegen div-Elemente.

4) Jeglicher Content gehört ausnahmlos in den body-Bereich. Seien es die üblichen Seitenelemente (Tabellen, Buttons, Paragraphen) oder Fehlermeldungen. Da du deinen PHP-Block außerhalb des html-Elements positioniert hast, werden alle deine (via echo/print) ausgegebenen Texte auch außerhalb des body-Bereichs landen.

Verschiebe also den PHP-Block. Unter das fieldset könnte eine passende Stelle sein.

Ein paar weitere Ratschläge:

1) Verwende besser sprechende Bezeichner für Klassennamen (das Negativbeispiel, worauf ich hiermit beziehe, ist deine ID a), denn so weißt du beim Lesen auf Anhieb, wofür das Element dient.

2) Gib eine explizite Zeichenkodierung für dein Dokument vor. So ersparst du dir Ärger, falls im Dokument bspw. mit Sonderzeichen (wie Umlauten) gearbeitet werden soll.

Im head-Bereich wird dafür diese Meta-Angabe gesetzt:

<meta charset="utf-8">

In diesem Beispiel würde die UTF-8-Kodierung vorgegeben werden. Sie unterstützt gängige Sonderzeichen.

Für deine Datenbank würde ich die Kodierung auf utf8mb4 setzen, da sie den vollen UTF-8-Zeichensatz unterstützt. Der Wert utf8 in MySQL tut dies nicht (er ist verwirrenderweise ein Alias für utf8mb3, der je Codepoint maximal 3 Bytes, statt 4 zur Verfügung stellt).

Im Connectionstring müsste die Angabe dann auch noch angepasst werden.

3) Ich würde die Daten, die gespeichert werden sollen, zuvor noch einmal validieren. Deine Validation auf Browserseite reicht keineswegs aus. Wer es darauf anlegt, könnte bei dir auch mehrere leere Einträge speichern lassen.

Doppelte Nutzer scheinen bei dir ebenso erlaubt zu sein. Das würde ich besser versuchen, zu verhindern, indem vor dem Speichern geprüft wird, ob der Nutzer nicht schon existiert.

4) Speichere Passwörter niemals nie in Klartextform. PHP hat hierfür schon eine einfache Funktionalität integriert.

Zuerst erstellst du mittels password_hash einen Hash zum Passwort. Der wird in der Datenbank gespeichert. Wenn das Passwort geprüft werden soll, holst du den Hash aus der Datenbank und übergibst ihn mitsamt Vergleichswert an password_verify.

Hierbei nochmals der Hinweis: Achte darauf, durchweg überall die selbe Zeichenkodierung (also UTF-8) zu verwenden.

Zu deinem Fehler:

(...) check the manual that corresponds to your MariaDB server version for the right syntax to use near '-Mail, Passwort, Datum-Uhrzeit)

Die Fehlermeldung weist eigentlich schon daraufhin, denn sie startet direkt beim Fehlerpunkt. Der Bindestrich in den Namen deiner Spalten ist das Problem. Entweder du benennst die Spalten um (z.B. in EMail und Zeitstempel) oder du gruppierst sie im Query via Akzentzeichen:

INSERT INTO benutzer_konten(`Benutzername`, `E-Mail`, `Passwort`, `Datum-Uhrzeit`) VALUES (:username, :usermail, :userpassword, :datum)

Um es einheitlich zu halten, habe ich dies gleich bei allen Spaltennamen durchgeführt.

Ich bin mir nicht sicher, ob die Benennung deiner Felder in MYSQL Probleme verursacht, also

E-Mail, Datum-Uhrzeit ...

Benenne alle Felder am Besten in Kleinbuchstaben und benutze Unterstriche, anstelle von Bindestrichen, vielleicht löst das dein Problem schon. Außerdem würde ich Prepared Statements verwenden, gerade wenn Passwörter (also sensible Daten) im Spiel sind.

Woher ich das weiß:Studium / Ausbildung – Studium in theoretischer Informatik (Master)

Fahad287 
Fragesteller
 18.08.2021, 14:56

ich habe den code geschickt

0