Zitieren
Kleines Script - Bilderprüfung
Hier ein kleines Script zum Wochenende.
Ich wünsche es Hilft euch bei Eurer Arbeit.

!!!!!!!! Benutzen wie immer auf eigene Gefahr !!!!!!




📘 Anleitung – BildPrüfer verwenden

🔐 1. Script hochladen (geschützt)
Lade die PHP-Datei auf deinen Webserver hoch
Lege sie in ein passwortgeschütztes Verzeichnis (z. B. per .htaccess)
Rufe das Script im Browser auf (z. B. https://deine-domain.de/bildpruefer/)

👉 Vorteil: Deine CSV- und Bilddaten sind geschützt

📂 2. Bilder vorbereiten
Entpacke das Bild-ZIP des Herstellers
Lege die Bilder in einen Ordner auf dem Server ab
(z. B. /bildpruefer/hersteller1/)

👉 Wichtig:

Die Bilder müssen physisch vorhanden sein
Unterordner sind erlaubt (werden automatisch durchsucht)
📄 3. CSV-Datei vorbereiten

Deine CSV muss folgendes Format haben:

Spalte 1 = Artikelnummer
Spalte 2+ = Bildnamen
Beispiel:
A001;bild1.jpg;bild2.jpg;bild3.jpg
A002;bild4.jpg
A003;bild5.jpg;bild6.jpg

👉 Wichtig:

Unterschiedliche Anzahl an Bildern pro Artikel ist erlaubt ✔
Leere Spalten sind egal ✔
Nur der Dateiname (inkl. Endung), kein Pfad

▶️ 4. Prüfung starten
CSV-Datei auswählen
Bildordner auswählen
Auf „Prüfung starten“ klicken

📊 5. Ergebnis verstehen

Nach der Prüfung siehst du:

Gesamt → Anzahl CSV-Zeilen
Vorhanden → Bilder existieren
Fehlend → Bilder fehlen im Ordner

⚠️ 6. Fehlende Bilder analysieren
Tabelle zeigt:
Artikelnummer
Fehlender Bildname

👉 Extra:

Klick auf einen Wert = automatisch kopieren
Suchfeld = schnell filtern

📥 7. CSV Export
Button „CSV exportieren“
Download enthält nur fehlende Bilder


🎯 Zweck des Scripts (dein Anwendungsfall)

Du nutzt das Script, um:

✔ Hersteller-CSV (z.B.s: Textilienhersteller) zu prüfen
✔ Entpackte Bildarchive zu vergleichen
✔ Sicherzustellen, dass alle Bildnamen existieren
✔ Fehler vor dem Import zu erkennen

🚫 Was verhindert wird
Fehlende Bilder im Gambio-Shop

✅ Ergebnis
Du importierst nur:

korrekte Artikel
gültige Bildnamen
vollständige Bilddaten


Code: Alles auswählen

<?php
/**********************************************************************
 * BildPrüfer
 * Version 1.0
 * Juratex - by Peter Süßbier, 5711 Gyula
 **********************************************************************/

session_start();

/**********************************************************************
 * Einstellungen
 **********************************************************************/

$bildBasisOrdner = __DIR__ . "/";

/**********************************************************************
 * CSV Export
 **********************************************************************/

if (isset($_GET["export"])) {

    if (!isset($_SESSION["missing"])) {
        exit("Keine Daten vorhanden.");
    }

    header("Content-Type: text/csv; charset=UTF-8");
    header("Content-Disposition: attachment; filename=fehlende_bilder_" . date("Ymd_His") . ".csv");

    // UTF-8 BOM für Excel
    echo "\xEF\xBB\xBF";

    $out = fopen("php://output", "w");

    fputcsv(
        $out,
        ["Artikelnummer", "Bilddatei"],
        ";"
    );

    foreach ($_SESSION["missing"] as $row) {

        fputcsv(
            $out,
            [
                $row["artikel"],
                $row["bild"]
            ],
            ";"
        );
    }

    fclose($out);
    exit;
}

/**********************************************************************
 * Trennzeichen erkennen (, ;)
 **********************************************************************/

function detectDelimiter($file)
{
    $handle = fopen($file, "r");

    if (!$handle) {
        return ";";
    }

    $line = fgets($handle);

    fclose($handle);

    $delimiter = ";";
    $count = 0;

    foreach ([";", ",", "\t"] as $d) {

        $c = substr_count($line, $d);

        if ($c > $count) {

            $count = $c;
            $delimiter = $d;

        }

    }

    return $delimiter;
}

/**********************************************************************
 * CSV lesen (Erkennt wieviel Spalten die CSV hat)
 **********************************************************************/
function readCsv($file)
{
    $rows = [];

    if (!file_exists($file)) {
        return $rows;
    }

    $delimiter = detectDelimiter($file);

    if (($handle = fopen($file, "r")) === false) {
        return $rows;
    }

    while (($data = fgetcsv($handle, 0, $delimiter)) !== false) {

        // Mindestens Artikelnummer muss vorhanden sein
        if (!isset($data[0])) {
            continue;
        }

        $artikel = trim($data[0]);

        if ($artikel === "") {
            continue;
        }

        $bilder = [];

        // Alle weiteren Spalten prüfen (egal wie viele)
        for ($i = 1; $i < count($data); $i++) {

            // Falls Spalte nicht existiert → überspringen
            if (!isset($data[$i])) {
                continue;
            }

            $bild = trim($data[$i]);

            // Leere Zellen ignorieren
            if ($bild === "") {
                continue;
            }

            $bilder[] = $bild;
        }

        // Auch Artikel ohne Bilder optional überspringen
        if (!empty($bilder)) {

            $rows[] = [
                "artikel" => $artikel,
                "bilder"  => $bilder
            ];

        }
    }

    fclose($handle);

    return $rows;
}

/**********************************************************************
 * Unterordner im Bilderverzeichnis suchen
 **********************************************************************/

$ordner = [];

if (is_dir($bildBasisOrdner)) {

    foreach (scandir($bildBasisOrdner) as $eintrag) {

        if ($eintrag == "." || $eintrag == "..") {
            continue;
        }

        if (is_dir($bildBasisOrdner . "/" . $eintrag)) {
            $ordner[] = $eintrag;
        }

    }

    sort($ordner);
}

?>
<!DOCTYPE html>

<html lang="de">

<head>

<meta charset="UTF-8">

<title>BildPrüfer</title>

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

<style>

body{
    background:#ececec;
}

.card{
    margin-top:40px;
}

</style>

</head>

<body>

<div class="container">

<div class="row justify-content-center">

<div class="col-lg-8">

<div class="card shadow">

<div class="card-header">

<h3>BildPrüfer</h3>

</div>

<div class="card-body">

<form method="post"
      enctype="multipart/form-data">

<div class="mb-3">

<label class="form-label">

CSV-Datei

</label>

<input
type="file"
name="csv"
accept=".csv"
class="form-control"
required>

</div>

<div class="mb-3">

<label class="form-label">

Bildordner

</label>

<select
name="bildordner"
class="form-select">

<?php foreach($ordner as $o): ?>

<option value="<?= htmlspecialchars($o) ?>">

<?= htmlspecialchars($o) ?>

</option>

<?php endforeach; ?>

</select>

</div>

<button
class="btn btn-primary">

Prüfung starten

</button>

</form>

<hr>

<?php

/**********************************************************************
 * CSV prüfen
 **********************************************************************/

$missing = [];
$stats = null;

if ($_SERVER["REQUEST_METHOD"] === "POST") {

    if (!isset($_FILES["csv"]) || $_FILES["csv"]["error"] != UPLOAD_ERR_OK) {

        echo '<div class="alert alert-danger">
                Fehler beim Hochladen der CSV-Datei.
              </div>';

    } else {

        // Temporäre CSV-Datei
        $csvDatei = $_FILES["csv"]["tmp_name"];

        // CSV einlesen
        $daten = readCsv($csvDatei);

        // Gewählten Bildordner bestimmen
        $bildOrdner = $bildBasisOrdner . "/" . basename($_POST["bildordner"]);

        // Alle vorhandenen Bilder einmal einlesen
        $bilder = [];

        if (is_dir($bildOrdner)) {

            $iterator = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator(
                    $bildOrdner,
                    FilesystemIterator::SKIP_DOTS
                )
            );

            foreach ($iterator as $datei) {

                if ($datei->isFile()) {

                    $bilder[
                        strtolower($datei->getFilename())
                    ] = true;

                }

            }

        }

        // CSV prüfen

     foreach ($daten as $row) {

    foreach ($row["bilder"] as $bild) {

        $bildname = strtolower(trim($bild));

        if (!isset($bilder[$bildname])) {

            $missing[] = [
                "artikel" => $row["artikel"],
                "bild" => $bild
            ];

        }

    }

}  

        // Statistik

        $stats = [

            "gesamt" => count($daten),

            "fehlend" => count($missing),

            "vorhanden" => count($daten) - count($missing)

        ];

        // Export vorbereiten

        $_SESSION["missing"] = $missing;

    }

}

/**********************************************************************
 * Ausgabe Statistik
 **********************************************************************/

if ($stats !== null) {
?>

<div class="row">

<div class="col-md-4">

<div class="alert alert-primary">

<strong>Gesamt</strong><br>

<?= number_format($stats["gesamt"],0,",",".") ?>

</div>

</div>

<div class="col-md-4">

<div class="alert alert-success">

<strong>Vorhanden</strong><br>

<?= number_format($stats["vorhanden"],0,",",".") ?>

</div>

</div>

<div class="col-md-4">

<div class="alert alert-danger">

<strong>Fehlend</strong><br>

<?= number_format($stats["fehlend"],0,",",".") ?>

</div>

</div>

</div>

<div class="mb-3">

<a
href="?export=1"
class="btn btn-success">

CSV exportieren

</a>

</div>

<?php

}

?>

<?php
/**********************************************************************
 * Ausgabe der fehlenden Bilder
 **********************************************************************/
?>

<?php if ($stats !== null): ?>

<hr>

<div class="d-flex justify-content-between align-items-center mb-3">

    <h4>Fehlende Bilder</h4>

    <input
        type="text"
        id="suche"
        class="form-control"
        placeholder="Suchen..."
        style="width:300px;">

</div>

<?php if (count($missing) == 0): ?>

<div class="alert alert-success">

    <strong>Fertig!</strong><br>

    Alle Bilder aus der CSV wurden gefunden.

</div>

<?php else: ?>

<div class="table-responsive">

<table
class="table table-striped table-hover table-bordered"
id="ergebnis">

<thead class="table-dark">

<tr>

<th>Artikelnummer</th>
<th>Bilddatei</th>

</tr>

</thead>

<tbody>

<?php foreach($missing as $row): ?>

<tr>

<td class="copy-cell"
    data-copy="<?= htmlspecialchars($row["artikel"]) ?>"
    title="Klicken zum Kopieren">
    <?= htmlspecialchars($row["artikel"]) ?>
</td>

<td class="copy-cell"
    data-copy="<?= htmlspecialchars($row["bild"]) ?>"
    title="Klicken zum Kopieren">
    <?= htmlspecialchars($row["bild"]) ?>
</td>

</tr>

<?php endforeach; ?>

</tbody>

</table>

</div>

<div class="alert alert-warning">

Es fehlen

<strong><?= number_format(count($missing),0,",",".") ?></strong>

Bilddateien.

</div>

<?php endif; ?>

<?php endif; ?>

</div>

<div class="card-footer text-center">

BildPrüfer Version 1.0 von Peter Süßbier

</div>

</div>

</div>

</div>

</div>

<script>

const suche = document.getElementById("suche");

if(suche){

suche.addEventListener("keyup",function(){

let filter=this.value.toLowerCase();

let zeilen=document.querySelectorAll("#ergebnis tbody tr");

zeilen.forEach(function(z){

let text=z.innerText.toLowerCase();

if(text.indexOf(filter)>-1){

z.style.display="";

}
else{

z.style.display="none";

}

});

});

}

</script>
<script>

document.querySelectorAll(".copy-cell").forEach(function(cell){

    cell.style.cursor = "pointer";

    cell.addEventListener("click", function(){

        let text = this.getAttribute("data-copy");

        navigator.clipboard.writeText(text).then(() => {

            let original = this.innerHTML;

            this.innerHTML = "✔ Kopiert!";
            
            setTimeout(() => {
                this.innerHTML = original;
            }, 1000);

        }).catch(() => {
            alert("Kopieren fehlgeschlagen");
        });

    });

});

</script>
</body>

</html>
Zitieren