Webseite: Kennt sich jemand damit aus?

1 Antwort

Zuerst zu zwei Markupfehlern:

1) Das action-Attribut des Formulars erwartet eine valide URI. Entweder also, du gibst eine an oder für deinen Fall passender, du lässt das Attribut komplett weg. Der Browser wird daraufhin die aktuelle URL als Zieladresse verwenden.

<form method="POST" class="login-email">

2) Deinem img-Element fehlt ein beschreibender Text (alt-Attribut). Bedenke, dass nicht jeder Seitenbesucher Bilder sehen kann.

<img alt="Profilbildvorschau" src="img/default-pb.jpg" id="photo">

Zum Profilbildwechsel:

Dein aktueller Code sorgt bisher ja nur für eine Vorschau des ausgewählten Bildes. Du brauchst aber ein persistente Speicherung, damit das Bild auch über mehrere Requests hinweg an den Account gebunden ist. An sich ist es nicht so anders, als würdest du nur den Nutzernamen speichern und anzeigen.

  1. Du musst das Bild auf den Webserver laden.
  2. Das Bild muss eine Verknüpfung zum Account erhalten.
  3. Für angemeldete Nutzer wird das Bild gesucht und geladen.

Bei Schritt 1 hilft dir das Tutorial von W3Schools: PHP File Upload. Bau auf jeden Fall serverseitige Filter ein, die mehrere Informationen prüfen: Dateiendung, MIME-Type, Dateigröße, ... auch clientseitig kannst du bereits erste (zusätzliche) Validationen vornehmen. So gibt es für das input-Element das accept-Attribut, in dem du konkrete MIME-Typen auflisten kannst, die erlaubt sind.

Beispiel:

<input accept="image/png,image/jpeg" name="..." type="file">

Fasse es nicht mit image/* zusammen, sondern mache dir die Mühe, die Typen einzeln aufzulisten. Denn einen TIFF-Upload (als Beispiel) willst du ganz sicher nicht.

Mit JavaScript kann man die Dateigröße prüfen:

const maxAllowedBytes = // some max size ...

// inside change event handler:
if (maxAllowedBytes < chosenFile.size) {
  // error ...
}

Hierzu als beiläufiger Kommentar: Die passive Form von choose ist is chosen.

Als Speicherort auf dem Webserver wäre ein extra Verzeichnis sinnvoll, welches nur über eingeschränkte Rechte verfügt. Die Bilder sollten unter einem anderen Namen als die Quelldatei gespeichert werden und ein Entfernen aller EXIF-Daten wäre noch ganz nett. Zu Letztgenannten findest du hier verschiedene Lösungsansätze.

Den Pfad zum Bild speicherst du in der Datenbank, in der du sicherlich ebenso schon die anderen Accountdaten ablegst.

Wenn sich ein Nutzer anmeldet, kannst du seine Profildaten aus der Datenbank lesen. Dazu gehört der gespeicherte Bildpfad. Für das HTML Template ist der Rest einfach:

<?php
  // load user data ...

  $profilePicturePath = empty($user->profilePicturePath)
    ? "path/to/default/image"
    : $user->profilePicturePath;
?>
<img alt="Profilbild <?= $user->name ?>" src="<?= $profilePicturePath ?>">

In meinem Beispiel würde ich davon ausgehen, dass es eine Klasse gibt, die einen Nutzer beschreibt. Die Nutzerdaten des aktuellen Nutzers werden demzufolge in ein Objekt dieser Klasse geschrieben ($user).

Wenn kein Profilbild vorliegt, wird das Standardbild genommen.

Innerhalb des HTMLs bevorzuge ich übrigens die Shorttags

<?= ... ?>

gegenüber der Langform:

<?php echo "..." ?>
EinAlexander  03.12.2021, 17:15
Deinem img-Element fehlt ein beschreibender Text ( alt-Attribut).

Korrekt.

<klugscheiss>
Aber "Profilbildvorschau" oder auch "Profilbild von Otto Müller" ist dafür der falsche Text. Das wäre der richtige Text für das title-Attribut. Das alt-Attribut soll einen beschreibenden Charakter haben. Für ein Profilbild wäre das z. B. "Zeichnung eines jungen Mannes mit schwarzem T-Shirt". Da das im Falle eines Profilbildes kaum sinnvoll umsetzbar ist, ist hier die Angabe alt="" die passende. Zumal das Bild keine semantische oder funktionale Bedeutung hat.
</klugscheiss>

1
regex9  03.12.2021, 17:54
@EinAlexander

Stimmt, bei dem Profilbild im Metamenü (oder wo auch immer es bei eingeloggten Nutzern angezeigt wird) wäre es eigentlich ein dekoratives Element.

Bezüglich der Profilbildvorschau wäre es vielleicht eine bessere Alternative, einen Text neben das Bild zu setzen.

Vorschau: <img alt src="...">
0
EinAlexander  03.12.2021, 18:05
@regex9
bei dem Profilbild im Metamenü (oder wo auch immer es bei eingeloggten Nutzern angezeigt wird) wäre es eigentlich ein dekoratives Element.

Wenn ich nochmal darüber nachdenke, stimme ich doch Deiner ersten Lösung zu. Denn ein rein dekoratives Element ist das ja eben nicht? Schließlich dient dieses Profilbild dazu, zu erkennen, mit welchem Usernamen ich eingeloggt bin. Ist ja nicht unrealistisch, mehrere Accounts zu haben.

Daher halte ich

<img alt="Du bist angemeldet als User <?= $user->name ?>" ...>

in diesem Falle für die richtige Lösung. Ebenso wie:

Vorschau: <img alt src="...">
1
Klexxsy 
Fragesteller
 04.12.2021, 11:45

Wenn ich

<form action="index.php (Startseite)">

angebe, da muss auch der PHP-Code von der Registrierung in der index.php-Datei stehen oder?

0
regex9  04.12.2021, 19:04
@Klexxsy

Ja, denn die Formulardaten werden an die URL gesendet, die im Attribut angegeben ist.

1