Manchmal möchte man auf einer Webseite bei jedem Aufruf ein anderes Bild anzeigen, etwa auf der Startseite oder in einer Sidebar. Mit PHP lässt sich das lösen, indem du einen Ordner mit Bildern ausliest und per Zufall eines davon ausgibst. Dieses Tutorial zeigt dir verschiedene Wege, wie du das umsetzt, und worauf du bei der Sicherheit achten musst.
graph TD
A["Ordnerpfad festlegen"] --> B["glob() mit Bildendungen aufrufen"]
B --> C{"Bilder gefunden?"}
C -->|Ja| D["array_rand() wählt Index"]
C -->|Nein| E["Hinweis: Keine Bilder"]
D --> F["img-Tag mit htmlspecialchars ausgeben"]
Bilder aus einem Ordner per Zufall anzeigen
Der einfachste Weg führt über die Funktion glob(). Sie liefert alle Dateien zurück, die einem bestimmten Muster entsprechen. Zusammen mit array_rand() ergibt das eine kompakte Lösung.
<?php
$ordner = "bilder";
$bilder = glob(
$ordner . "/*.{jpg,jpeg,png,gif,webp}",
GLOB_BRACE
);
if (empty($bilder)) {
echo "<p>Keine Bilder im Ordner gefunden.</p>";
} else {
$zufallsbild = $bilder[array_rand($bilder)];
echo "<img src=\""
. htmlspecialchars($zufallsbild)
. "\" alt=\"Zufallsbild\">";
}
?>
Die Funktion glob() durchsucht den angegebenen Ordner nach Dateien mit den Endungen jpg, jpeg, png, gif und webp. Das Flag GLOB_BRACE erlaubt die geschweifte Klammer-Syntax für mehrere Muster. Falls keine Bilder gefunden werden, erscheint eine Hinweismeldung. Andernfalls wählt array_rand() einen zufälligen Schlüssel aus dem Array, und das Bild wird per <img>-Tag ausgegeben.
Sicherheitshinweis bei User-Uploads
Wenn der Bilderordner Dateien von Benutzern enthält, reicht die Dateiendung allein nicht als Prüfung. Ein Angreifer könnte eine PHP-Datei mit der Endung .jpg hochladen. Prüfe daher bei Uploads immer den tatsächlichen Dateityp mit getimagesize() oder der finfo-Klasse.
<?php
function istEchtesBild(string $pfad): bool
{
/* getimagesize gibt false zurück,
wenn die Datei kein gültiges Bild ist */
$info = @getimagesize($pfad);
if ($info === false) {
return false;
}
$erlaubteTypen = [
IMAGETYPE_JPEG,
IMAGETYPE_PNG,
IMAGETYPE_GIF,
IMAGETYPE_WEBP,
];
return in_array($info[2], $erlaubteTypen, true);
}
?>
Diese Funktion prüft den Datei-Header und stellt sicher, dass es sich wirklich um ein Bild handelt. Verwende sie zusätzlich zur Endungsprüfung, wenn du Verzeichnisse mit Benutzer-Uploads nutzt.
Ordner vorher prüfen
Wenn der Ordnerpfad aus einer Variable stammt oder von außen beeinflusst werden kann, solltest du vorher prüfen, ob der Ordner überhaupt existiert.
<?php
$ordner = "bilder";
if (!is_dir($ordner)) {
echo "<p>Der Ordner existiert nicht.</p>";
} else {
$bilder = glob(
$ordner . "/*.{jpg,jpeg,png,gif,webp}",
GLOB_BRACE
);
if (empty($bilder)) {
echo "<p>Keine Bilder gefunden.</p>";
} else {
$zufallsbild = $bilder[array_rand($bilder)];
echo "<img src=\""
. htmlspecialchars($zufallsbild)
. "\" alt=\"Zufallsbild\">";
}
}
?>
Die If-Anweisung mit is_dir() stellt sicher, dass der Pfad tatsächlich auf ein Verzeichnis zeigt. Erst danach wird nach Bilddateien gesucht.
Zufallsbild per include() einbinden
In der Praxis speicherst du den Code in einer eigenen Datei und bindest ihn über include() dort ein, wo das Zufallsbild erscheinen soll.
<?php
/* zufall_bild.php */
$ordner = "bilder";
$bilder = glob(
$ordner . "/*.{jpg,jpeg,png,gif,webp}",
GLOB_BRACE
);
if (!empty($bilder)) {
$zufallsbild = $bilder[array_rand($bilder)];
echo "<img src=\""
. htmlspecialchars($zufallsbild)
. "\" alt=\"Zufallsbild\">";
}
?>
In deinem Haupttemplate genügt dann eine einzige Zeile.
<?php include "zufall_bild.php"; ?>
Zufalls-Galerie mit Bildunterschriften
In der Realität haben Bilder fast immer eine Beschriftung. Statt nur den Dateinamen zu verwenden, kannst du ein Array mit Bilddatei und Beschreibung führen und beides zusammen als <figure> ausgeben.
<?php
$galerie = [
['datei' => 'bilder/strand.jpg',
'titel' => 'Sonnenuntergang am Strand'],
['datei' => 'bilder/berge.jpg',
'titel' => 'Wanderung in den Alpen'],
['datei' => 'bilder/stadt.jpg',
'titel' => 'Berliner Skyline bei Nacht'],
];
$bild = $galerie[array_rand($galerie)];
?>
<figure>
<img src="<?php echo htmlspecialchars($bild['datei']); ?>"
alt="<?php echo htmlspecialchars($bild['titel']); ?>">
<figcaption>
<?php echo htmlspecialchars($bild['titel']); ?>
</figcaption>
</figure>
Das <figure>-Element mit <figcaption> ist semantisch korrekt und wird von Suchmaschinen gut erkannt. Der Alt-Text und die Bildunterschrift sorgen gleichzeitig für bessere Barrierefreiheit.
Klassischer Weg mit opendir() und readdir()
Vor glob() wurde häufig opendir() zusammen mit readdir() verwendet, um Verzeichnisse zu durchlaufen. Diese Variante ist ausführlicher, aber immer noch in älteren Projekten anzutreffen.
<?php
$ordner = "bilder";
$erlaubte_endungen = [
"jpg", "jpeg", "png", "gif", "webp"
];
$bilder = [];
if ($handle = opendir($ordner)) {
while (false !== ($datei = readdir($handle))) {
$endung = strtolower(
pathinfo($datei, PATHINFO_EXTENSION)
);
if (in_array($endung, $erlaubte_endungen)) {
$bilder[] = $ordner . "/" . $datei;
}
}
closedir($handle);
}
if (!empty($bilder)) {
echo "<img src=\""
. htmlspecialchars(
$bilder[array_rand($bilder)]
)
. "\" alt=\"Zufallsbild\">";
}
?>
Hier wird jede Datei einzeln geprüft: Mit pathinfo() wird die Dateiendung ermittelt und gegen eine Liste erlaubter Formate geprüft. Das ist sicherer als eine einfache Suche im Dateinamen und erkennt auch Endungen wie .jpeg zuverlässig.
Performance bei großen Verzeichnissen
Solange dein Ordner wenige hundert Bilder enthält, ist glob() völlig ausreichend. Bei Tausenden von Dateien lädt die Funktion allerdings alle Pfade in den Speicher. Für solche Fälle eignet sich ein DirectoryIterator, der die Dateien einzeln durchläuft und dabei weniger Speicher verbraucht.
Verwandte Tutorials
Diese Tutorials passen thematisch zu Zufallsbildern in PHP: