Files
skyview.astronomiemuseum.de/public/login.php
T
2026-03-31 09:44:27 +02:00

139 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
ini_set('display_errors', '1');
error_reporting(E_ALL);
session_start();
$config = require __DIR__ . '/../config/database.php';
$dsn = sprintf(
'mysql:host=%s;dbname=%s;charset=%s',
$config['host'],
$config['dbname'],
$config['charset'] ?? 'utf8mb4'
);
$pdo = new PDO(
$dsn,
$config['user'],
$config['pass'],
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
$errors = [];
if (isset($_SESSION['user_id'])) {
header('Location: index.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$login = trim($_POST['login'] ?? '');
$password = $_POST['password'] ?? '';
if ($login === '') {
$errors[] = 'Bitte Benutzername oder E-Mail eingeben.';
}
if ($password === '') {
$errors[] = 'Bitte das Passwort eingeben.';
}
if (empty($errors)) {
$stmt = $pdo->prepare("
SELECT
`id`,
`username`,
`email`,
`password_hash`,
`display_name`,
`role`,
`is_active`
FROM `app_users`
WHERE `username` = :login OR `email` = :login
LIMIT 1
");
$stmt->execute([
':login' => $login,
]);
$user = $stmt->fetch();
if (!$user) {
$errors[] = 'Die Anmeldedaten sind ungültig.';
} elseif (!password_verify($password, $user['password_hash'])) {
$errors[] = 'Die Anmeldedaten sind ungültig.';
} elseif ((int)$user['is_active'] !== 1) {
$errors[] = 'Dein Konto ist noch nicht freigeschaltet.';
} else {
session_regenerate_id(true);
$_SESSION['user_id'] = (int)$user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['display_name'] = $user['display_name'];
$_SESSION['role'] = $user['role'];
$stmtUpdateLogin = $pdo->prepare("
UPDATE `app_users`
SET `last_login_at` = NOW()
WHERE `id` = :id
");
$stmtUpdateLogin->execute([
':id' => $user['id'],
]);
header('Location: index.php');
exit;
}
}
}
$loggedIn = false;
?>
<?php require __DIR__ . '/header.php'; ?>
<div class="auth-wrap">
<div class="card auth-card">
<h2>Anmelden</h2>
<?php if (!empty($errors)): ?>
<ul class="msg-error">
<?php foreach ($errors as $error): ?>
<li><?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<form method="post" action="" class="form-stack">
<div class="form-group">
<label for="login">Benutzername oder E-Mail</label>
<input
type="text"
id="login"
name="login"
required
value="<?= htmlspecialchars($_POST['login'] ?? '', ENT_QUOTES, 'UTF-8') ?>"
>
</div>
<div class="form-group">
<label for="password">Passwort</label>
<input
type="password"
id="password"
name="password"
required
>
</div>
<button type="submit" class="btn btn-primary btn-full">Anmelden</button>
</form>
<p class="form-footer">Noch kein Konto? <a href="register.php">Jetzt registrieren</a></p>
</div>
</div>
<?php require __DIR__ . '/footer.php'; ?>