Kurzbewerbung
$max) $s = mb_substr($s, 0, $max); return $s; } function norm_phone(string $s): string { $s = preg_replace('/[^\d+()\s-]/', '', $s ?? ''); return norm_str($s, 40); } function norm_email(string $s): string { $s = filter_var(trim($s), FILTER_SANITIZE_EMAIL); if (!filter_var($s, FILTER_VALIDATE_EMAIL)) return ''; return $s; } function join_array(array $a, int $maxLen = 400): string { $a = array_map(fn($v) => norm_str((string)$v, 60), $a); $s = implode(', ', array_filter($a, fn($v) => $v !== '')); return norm_str($s, $maxLen); } function norm_date(?string $s): ?string { if (!$s) return null; $s = trim($s); // Erlaubt: JJJJ-MM-TT if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $s)) { $ts = strtotime($s); } // Erlaubt: TT.MM.JJJJ elseif (preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $s)) { [$d,$m,$y] = explode('.', $s); $ts = strtotime("$y-$m-$d"); } else { return null; } if ($ts === false) return null; // Plausibilitätscheck (1900 bis heute) $min = strtotime('1900-01-01'); $max = strtotime('today'); if ($ts < $min || $ts > $max) return null; return date('Y-m-d', $ts); // DB-Format } // ==== POST-Daten einlesen & validieren ==== if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); exit('Method not allowed'); } // Pflichtfelder $vorname = norm_str(in_post('vorname')); $nachname = norm_str(in_post('nachname')); $email = norm_email(in_post('email')); $phone = norm_phone(in_post('phone')); $position = norm_str(in_post('position')); $geburtstag = norm_date(in_post('geburtstag')); // null oder 'YYYY-MM-DD' if (!$vorname || !$nachname || !$email || !$phone || !$position) { http_response_code(400); exit('Bitte alle Pflichtfelder ausfüllen (Vorname, Nachname, E-Mail, Telefon, Stelle).'); } // Optionale Kontaktangaben $plz = norm_str(in_post('plz'), 10); $ort = norm_str(in_post('ort'), 80); $strasse = norm_str(in_post('strasse'), 120); // Whitelists (verhindert beliebigen Input) $allowedPositions = ['MFA (Teilzeit)', 'MFA (Vollzeit)', 'Ausbildung MFA', 'Initiativbewerbung']; if (!in_array($position, $allowedPositions, true)) { http_response_code(400); exit('Ungültige Stellenwahl.'); } $allowedVerf = ['sofort', '1-2 Monate', '3 Monate', '3-6 Monate', '>6 Monate']; $verf = in_post('verfuegbarkeit', ''); if (!in_array($verf, $allowedVerf, true)) $verf = 'keine Angabe'; // Mehrfachauswahl-Felder $erfahrung = []; if (isset($_POST['erfahrung']) && is_array($_POST['erfahrung'])) $erfahrung = $_POST['erfahrung']; $erfahrungJoined = join_array($erfahrung); $wichtig = []; if (isset($_POST['wichtig']) && is_array($_POST['wichtig'])) $wichtig = $_POST['wichtig']; $wichtigJoined = join_array($wichtig); $kurzmsg = norm_str(in_post('nachricht'), 400); // Beschreibung (kommt gesammelt in anfragen.nachricht) $beschreibung = implode("", array_filter([ "Bewerbung – {$position}", "Stelle: {$position}", "Erfahrung: " . ($erfahrungJoined ?: 'keine Angabe'), "Wichtig ist mir: " . ($wichtigJoined ?: 'keine Angabe'), "Verfügbarkeit: {$verf}", $kurzmsg ? "Nachricht: {$kurzmsg}" : null ])); // Anforderungsart $anforderungart = 19; // Hash für Dublettenprüfung (optional) $hashBasis = $vorname . $nachname . $email; $hash = md5($hashBasis) . date("YmdHs"); // ==== DB-Operationen (PDO + Transaktion) ==== try { $pdo->beginTransaction(); // 1) USER finden oder anlegen if ($geburtstag) { $stmt = $pdo->prepare(" SELECT userid FROM user WHERE vorname = :vorname AND nachname = :nachname AND mail = :email AND geburtstag = :geb LIMIT 1 "); $stmt->execute([':vorname'=>$vorname, ':nachname'=>$nachname, ':email'=>$email, ':geb'=>$geburtstag]); } else { $stmt = $pdo->prepare(" SELECT userid FROM user WHERE vorname = :vorname AND nachname = :nachname AND mail = :email LIMIT 1 "); $stmt->execute([':vorname'=>$vorname, ':nachname'=>$nachname, ':email'=>$email]); } $uid = $stmt->fetchColumn(); if (!$uid) { // neu anlegen $ins = $pdo->prepare(" INSERT INTO user (vorname, nachname, geburtstag, mail, tele, ort, plz, strasse) VALUES (:vorname, :nachname, :geburtstag, :mail, :tele, :ort, :plz, :strasse) "); $ins->execute([ ':vorname'=>$vorname, ':nachname'=>$nachname, ':geburtstag'=>$geburtstag, ':mail'=>$email, ':tele'=>$phone, ':ort'=>$ort, ':plz'=>$plz, ':strasse'=>$strasse ]); $uid = (int)$pdo->lastInsertId(); } else { // updaten (Geburtsdatum nur setzen/überschreiben, wenn vorhanden) $upd = $pdo->prepare(" UPDATE user SET tele = :tele, ort = :ort, plz = :plz, strasse = :strasse ".($geburtstag ? ", geburtstag = :geburtstag " : "")." WHERE userid = :uid "); $params = [ ':tele'=>$phone, ':ort'=>$ort, ':plz'=>$plz, ':strasse'=>$strasse, ':uid'=>$uid ]; if ($geburtstag) $params[':geburtstag'] = $geburtstag; $upd->execute($params); } // 2) Dublettenprüfung (7 Tage, gleicher Typ + nahezu gleiche Nachricht) $dup = $pdo->prepare(" SELECT anfrageid FROM anfragen WHERE personid = :uid AND anforderungart = :art AND nachricht = :txt AND create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) LIMIT 1 "); $dup->execute([':uid'=>$uid, ':art'=>$anforderungart, ':txt'=>$beschreibung]); if ($dup->fetchColumn()) { $pdo->commit(); echo "
Bereits vorhanden
Eine sehr ähnliche Bewerbung liegt aus den letzten 7 Tagen bereits vor. Wir melden uns zeitnah bei Ihnen.
"; header("refresh:12;formulare.php"); exit; } // 3) Bewerbung speichern (ordnungsid ggf. an euer System anpassen) $insA = $pdo->prepare(" INSERT INTO anfragen (personid, anforderungart, nachricht, create_time, hash, ordnungsid) VALUES (:uid, :art, :txt, NOW(), :hash, :ord) "); $insA->execute([ ':uid'=>$uid, ':art'=>$anforderungart, ':txt'=>$beschreibung, ':hash'=>$hash, ':ord'=>5 // z. B. 5 = „Bewerbung“; bei euch anpassen, falls nötig ]); $anfrageid = (int)$pdo->lastInsertId(); $pdo->commit(); // Optional: Bestätigungsmail via eurer Vorlage SendMailMessageVorlage($pdo, "4", $anfrageid , "48"); echo "
Vielen Dank!
Deine Bewerbung wurde gespeichert. Wir melden uns zeitnah bei Dir.
"; header("refresh:12;formulare.php"); } catch (Throwable $e) { if (isset($pdo) && $pdo->inTransaction()) { $pdo->rollBack(); } error_log('[Bewerbung] '.$e->getMessage().' | Code: '.$e->getCode()); // in Webserver-Log if (defined('DEBUG_BWERB') && DEBUG_BWERB) { http_response_code(500); echo "
DB-Fehler: ".$e->getMessage()."\nCode: ".$e->getCode().""; } else { http_response_code(500); echo "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut."; } } } }else{ ?>