diff --git a/csvupload.php b/csvupload.php index ea0c001..a17be34 100644 --- a/csvupload.php +++ b/csvupload.php @@ -1,6 +1,7 @@ 5 * 1024 * 1024) { + return [null, 'Die CSV-Datei ist leer oder groesser als 5 MB.']; + } + + $originalName = (string)($file['name'] ?? ''); + $extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION)); + if ($extension !== 'csv') { + return [null, 'Es sind nur CSV-Dateien erlaubt.']; + } + + $tmpName = (string)($file['tmp_name'] ?? ''); + if (!is_uploaded_file($tmpName)) { + return [null, 'Die hochgeladene Datei konnte nicht verifiziert werden.']; + } + + if (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime = $finfo ? finfo_file($finfo, $tmpName) : false; + if ($finfo) { + finfo_close($finfo); + } + + $allowedMimeTypes = [ + 'text/plain', + 'text/csv', + 'text/x-csv', + 'application/csv', + 'application/vnd.ms-excel', + 'application/octet-stream', + ]; + if (is_string($mime) && !in_array($mime, $allowedMimeTypes, true)) { + return [null, 'Der Dateityp wurde nicht als CSV erkannt.']; + } + } + + $uploadDir = csv_upload_dir(); + if (!is_dir($uploadDir)) { + @mkdir($uploadDir, 0700, true); + } + if (!is_dir($uploadDir) || !is_writable($uploadDir)) { + return [null, 'Der Upload-Ordner ist nicht beschreibbar.']; + } + + $targetFile = $uploadDir . '/paypal_' . date('Ymd_His') . '_' . bin2hex(random_bytes(8)) . '.csv'; + if (!move_uploaded_file($tmpName, $targetFile)) { + return [null, 'Die CSV-Datei konnte nicht gespeichert werden.']; + } + + return [$targetFile, null]; +} + // Funktion zum Überprüfen, ob der Mitarbeiter in der Tabelle vorhanden ist function isMitarbeiterExist($conn, $name) { - $sql = "SELECT MitarbeiterID FROM kl_Mitarbeiter WHERE Name = ?"; - $params = array($name); + $sql = "SELECT MitarbeiterID FROM kl_Mitarbeiter WHERE Name = ? or paypalname = ?"; + $params = array($name, $name); $stmt = sqlsrv_query($conn, $sql, $params); if ($stmt === false) { @@ -36,7 +104,12 @@ function isMitarbeiterExist($conn, $name) function isDuplicateEntry($conn, $mitarbeiterID, $betrag, $datum) { // Um nur den gleichen Tag zu vergleichen, konvertieren wir den Datum-String zu einem DateTime-Objekt und verwenden die Funktion CONVERT - $convertedDatum = date_format(date_create($datum), 'Y-m-d'); + $date = date_create($datum); + if ($date === false) { + return false; + } + + $convertedDatum = date_format($date, 'Y-m-d'); #$sql = "SELECT count FROM dbo.kl_Einzahlungen WHERE MitarbeiterID = ? AND Betrag = ? AND CONVERT(VARCHAR, Datum, 23) = ?"; $sql = "SELECT * FROM dbo.kl_Einzahlungen WHERE MitarbeiterID = ? AND Betrag = ? AND CONVERT(VARCHAR, Datum, 23) = ?"; @@ -49,7 +122,7 @@ function isDuplicateEntry($conn, $mitarbeiterID, $betrag, $datum) $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); - return ($row['MitarbeiterID'] > 0); + return $row !== null && (int)$row['MitarbeiterID'] > 0; } // Funktion zum Verarbeiten der CSV-Datei und Rückgabe der Ergebnisse @@ -63,6 +136,11 @@ function processCSV($conn, $file) fgetcsv($handle); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { + if (count($data) < 8) { + $failed_entries[] = array($data[0] ?? '', $data[3] ?? '', $data[7] ?? '', 4); + continue; + } + $name = $data[3]; // Index 3 entspricht dem "Name"-Feld in der CSV $betrag = $data[7]; // Index 7 entspricht dem "Brutto"-Feld in der CSV $betrag = str_replace(",", ".", $betrag); @@ -108,7 +186,7 @@ function processCSV($conn, $file) function getMitarbeiterID($conn, $name) { $sql = "SELECT MitarbeiterID FROM kl_Mitarbeiter WHERE Name = ? or paypalname = ?"; - $params = array($name); + $params = array($name, $name); $stmt = sqlsrv_query($conn, $sql, $params); @@ -127,20 +205,20 @@ function getMitarbeiterID($conn, $name) // Überprüfen, ob das Formular abgeschickt wurde if ($_SERVER["REQUEST_METHOD"] == "POST") { // Überprüfen, ob eine Datei hochgeladen wurde - if (isset($_FILES["csv_file"]) && $_FILES["csv_file"]["error"] == 0) { - $file_name = $_FILES["csv_file"]["name"]; - $file_tmp = $_FILES["csv_file"]["tmp_name"]; + if (isset($_FILES["csv_file"])) { + [$csvFile, $uploadError] = csv_prepare_upload($_FILES["csv_file"]); - // Datei in den Upload-Ordner verschieben - move_uploaded_file($file_tmp, "uploads/" . $file_name); + if ($uploadError !== null) { + echo csv_h($uploadError); + } else { + // CSV-Datei verarbeiten + $result = processCSV($conn, $csvFile); + @unlink($csvFile); - // CSV-Datei verarbeiten - $result = processCSV($conn, "uploads/" . $file_name); + echo "CSV-Datei erfolgreich verarbeitet.\n"; - echo "CSV-Datei erfolgreich verarbeitet.\n"; - - echo "
| Name | @@ -149,19 +227,19 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {Ergebnis | ||
|---|---|---|---|
| $eintrag[0] | -$eintrag[1] | -$eintrag[2] | + foreach ($result['success'] as $eintrag){ + echo "|
| " . csv_h($eintrag[0]) . " | +" . csv_h($eintrag[1]) . " | +" . csv_h($eintrag[2]) . " | Erfolgreich gespeichert |
| $eintrag[0] | -$eintrag[1] | -$eintrag[2] | + } + foreach ($result['failed'] as $eintrag){ + echo "|
| " . csv_h($eintrag[0]) . " | +" . csv_h($eintrag[1]) . " | +" . csv_h($eintrag[2]) . " | "; if($eintrag[3] == 1){ echo "SQL Fehler"; @@ -169,12 +247,15 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { echo "Eintrag schon vorhanden"; }elseif($eintrag[3] == 3){ echo "Benutzer nicht gefunden"; + }elseif($eintrag[3] == 4){ + echo "Ungueltige CSV-Zeile"; } echo " |