Notice: session_start(): Ignoring session_start() because a session is already active (started from /home/u908369214/domains/test.top13.de/public_html/index.php on line 7) in /home/u908369214/domains/test.top13.de/public_html/index.php on line 17
HandwerkerPortal
🛠️ Erst-Setup
$db_dir = __DIR__ . '/data';
if (!is_dir($db_dir)) {
@mkdir($db_dir, 0755, true);
}
$db_file = is_dir($db_dir) ? $db_dir . '/app.db' : __DIR__ . '/app.db';
try {
$pdo = new PDO('sqlite:' . $db_file);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("Datenbankfehler: " . $e->getMessage());
}
// 2. TABELLEN-STRUKTUR (Hinzufügen von is_master für Meisterbetriebe)
$tables = [
"CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, password_hash TEXT, role TEXT, active INTEGER DEFAULT 1, created_at DATETIME DEFAULT CURRENT_TIMESTAMP)",
"CREATE TABLE IF NOT EXISTS categories (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, description TEXT, icon TEXT, color TEXT, slug TEXT UNIQUE, position INTEGER DEFAULT 0, active INTEGER DEFAULT 1, created_at DATETIME, updated_at DATETIME)",
"CREATE TABLE IF NOT EXISTS craftsmen (id INTEGER PRIMARY KEY AUTOINCREMENT, category_id INTEGER, name TEXT, description TEXT, address TEXT, zip TEXT, city TEXT, country TEXT, phone TEXT, email TEXT, website TEXT, position INTEGER DEFAULT 0, active INTEGER DEFAULT 1, is_master INTEGER DEFAULT 0, created_at DATETIME, updated_at DATETIME)",
"CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)",
"CREATE TABLE IF NOT EXISTS page_views (id INTEGER PRIMARY KEY AUTOINCREMENT, view_date DATE DEFAULT (date('now')), view_count INTEGER DEFAULT 1, UNIQUE(view_date))",
"CREATE TABLE IF NOT EXISTS craftsman_clicks (id INTEGER PRIMARY KEY AUTOINCREMENT, craftsman_id INTEGER, click_date DATE DEFAULT (date('now')), click_count INTEGER DEFAULT 1, UNIQUE(craftsman_id, click_date))"
];
foreach ($tables as $sql) $pdo->exec($sql);
// Datenbank-Update falls Spalte fehlt
try { $pdo->exec("ALTER TABLE craftsmen ADD COLUMN is_master INTEGER DEFAULT 0"); } catch(Exception $e) {}
// Hilfsfunktionen
function get_setting($key, $default = '') {
global $pdo;
$stmt = $pdo->prepare("SELECT value FROM settings WHERE key = ?");
$stmt->execute([$key]);
$res = $stmt->fetch();
return $res ? $res['value'] : $default;
}
$site_name = get_setting('site_name', 'HandwerkerPortal');
$site_slogan = get_setting('site_slogan', 'Finden Sie den richtigen Experten in Ihrer Region.');
$site_footer_text = get_setting('site_footer', '© ' . date('Y') . ' Handwerker-Verzeichnis');
$site_imprint = get_setting('site_imprint', 'Hier Ihr Impressum eintragen...');
$site_privacy = get_setting('site_privacy', 'Hier Ihre Datenschutzerklärung eintragen...');
function is_logged_in() { return isset($_SESSION['user_id']); }
// 3. POST HANDLING
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['do_setup'])) {
$stmt = $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES (?, ?, 'admin')");
$stmt->execute([$_POST['username'], password_hash($_POST['password'], PASSWORD_DEFAULT)]);
header("Location: ?p=login"); exit;
}
if (isset($_POST['do_login'])) {
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);
$u = $stmt->fetch();
if ($u && password_verify($_POST['password'], $u['password_hash'])) {
$_SESSION['user_id'] = $u['id'];
$_SESSION['username'] = $u['username'];
$_SESSION['role'] = $u['role'];
header("Location: ?p=admin"); exit;
}
}
if (is_logged_in()) {
if (isset($_POST['save_settings'])) {
$settings_to_save = ['site_name', 'site_slogan', 'site_footer', 'site_imprint', 'site_privacy'];
foreach ($settings_to_save as $key) {
if (isset($_POST[$key])) {
$stmt = $pdo->prepare("INSERT INTO settings (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value");
$stmt->execute([$key, $_POST[$key]]);
}
}
header("Location: ?p=admin&view=settings&saved=1"); exit;
}
if (isset($_POST['save_category'])) {
$active = isset($_POST['active']) ? 1 : 0;
if (!empty($_POST['id'])) {
$stmt = $pdo->prepare("UPDATE categories SET name=?, description=?, icon=?, color=?, active=?, updated_at=CURRENT_TIMESTAMP WHERE id=?");
$stmt->execute([$_POST['name'], $_POST['description'], $_POST['icon'], $_POST['color'], $active, $_POST['id']]);
} else {
$stmt = $pdo->prepare("INSERT INTO categories (name, description, icon, color, active, created_at) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)");
$stmt->execute([$_POST['name'], $_POST['description'], $_POST['icon'], $_POST['color'], $active]);
}
header("Location: ?p=admin&view=categories"); exit;
}
if (isset($_POST['save_craftsman'])) {
$active = isset($_POST['active']) ? 1 : 0;
$is_master = isset($_POST['is_master']) ? 1 : 0;
$data = [
$_POST['category_id'], $_POST['name'], $_POST['description'], $_POST['address'],
$_POST['zip'], $_POST['city'], $_POST['country'] ?? 'Deutschland',
$_POST['phone'], $_POST['email'], $_POST['website'], $active, $is_master
];
if (!empty($_POST['id'])) {
$data[] = $_POST['id'];
$stmt = $pdo->prepare("UPDATE craftsmen SET category_id=?, name=?, description=?, address=?, zip=?, city=?, country=?, phone=?, email=?, website=?, active=?, is_master=?, updated_at=CURRENT_TIMESTAMP WHERE id=?");
$stmt->execute($data);
} else {
$stmt = $pdo->prepare("INSERT INTO craftsmen (category_id, name, description, address, zip, city, country, phone, email, website, active, is_master, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)");
$stmt->execute($data);
}
header("Location: ?p=admin&view=craftsmen"); exit;
}
}
}
if (is_logged_in()) {
if (isset($_GET['del_cat'])) { $pdo->prepare("DELETE FROM categories WHERE id = ?")->execute([$_GET['del_cat']]); header("Location: ?p=admin&view=categories"); exit; }
if (isset($_GET['del_cr'])) { $pdo->prepare("DELETE FROM craftsmen WHERE id = ?")->execute([$_GET['del_cr']]); header("Location: ?p=admin&view=craftsmen"); exit; }
}
if (isset($_GET['track_click']) && is_numeric($_GET['track_click'])) {
$id = (int)$_GET['track_click'];
$pdo->prepare("INSERT INTO craftsman_clicks (craftsman_id, click_date, click_count) VALUES (?, date('now'), 1) ON CONFLICT(craftsman_id, click_date) DO UPDATE SET click_count = click_count + 1")->execute([$id]);
$stmt = $pdo->prepare("SELECT website FROM craftsmen WHERE id = ?");
$stmt->execute([$id]);
header("Location: " . ($stmt->fetchColumn() ?: '?p=home')); exit;
}
if (!isset($_SESSION['view_tracked']) && !str_contains(($_SERVER['QUERY_STRING'] ?? ''), 'ajax') && !isset($_GET['track_click'])) {
$pdo->exec("INSERT INTO page_views (view_date, view_count) VALUES (date('now'), 1) ON CONFLICT(view_date) DO UPDATE SET view_count = view_count + 1");
$_SESSION['view_tracked'] = true;
}
$page = $_GET['p'] ?? 'home';
$userCount = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
if ($userCount == 0 && $page != 'setup') { header("Location: ?p=setup"); exit; }
?>
HandwerkerPortal
🛠️ Erst-Setup