Erstellen Sie Ihre eigene Witze-Plattform – sofort einsatzbereit und komplett in einer Datei!
Highlights:
- Alles-in-einem Script: PHP, MySQL und Installation in einer Datei
- Automatische DB-Erstellung: Einfach hochladen, Script erledigt den Rest
- Interaktive Features: Witze liken, kommentieren und durchsuchen
- Kategorien & Filter: Ordnung und Übersicht für Ihre Nutzer
- AJAX-Funktionalität: Schnelle Interaktionen ohne Seitenreload
- Modernes Design: Sauberes, responsives Layout – perfekt für Agenturen und Hobby-Websites
- Einfach zu installieren: Keine komplizierten Konfigurationen nötig
Perfekt für:
- Webseitenbetreiber, die ein sofort funktionierendes Witze-Portal möchten
- Entwickler und Agenturen, die schnell ein interaktives Portal bereitstellen wollen
- Hobbyprojekte oder Testumgebungen
Systemanforderungen:
- PHP 7+
- MySQL oder MariaDB
- Webserver mit Schreibrechten auf das Script-Verzeichnis
<?php
// ---------------------------
// CONFIG
// ---------------------------
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = '';
$dbName = 'witzesammlung';
// ---------------------------
// CONNECT & CREATE DB IF NOT EXISTS
// ---------------------------
$mysqli = new mysqli($dbHost, $dbUser, $dbPass);
if ($mysqli->connect_error) die('DB Connection Fehler: '.$mysqli->connect_error);
$mysqli->query("CREATE DATABASE IF NOT EXISTS $dbName CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci");
$mysqli->select_db($dbName);
// ---------------------------
// CREATE TABLES IF NOT EXISTS
// ---------------------------
$mysqli->query("
CREATE TABLE IF NOT EXISTS jokes (
id INT AUTO_INCREMENT PRIMARY KEY,
text TEXT NOT NULL,
category VARCHAR(50) DEFAULT 'Allgemein',
likes INT DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
");
$mysqli->query("
CREATE TABLE IF NOT EXISTS comments (
id INT AUTO_INCREMENT PRIMARY KEY,
joke_id INT NOT NULL,
username VARCHAR(50) NOT NULL,
comment TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (joke_id) REFERENCES jokes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
");
// ---------------------------
// FILL TABLE WITH SAMPLE DATA IF EMPTY
// ---------------------------
$res = $mysqli->query("SELECT COUNT(*) as cnt FROM jokes");
$count = $res->fetch_assoc()['cnt'];
if ($count == 0) {
$sampleJokes = [
['Warum können Geister so schlecht lügen? Weil man durch sie hindurchsieht!', 'Allgemein'],
['Treffen sich zwei Jäger. Beide tot.', 'Wortspiele'],
['Warum ging der Pilz auf die Party? Weil er ein Champignon war.', 'Allgemein'],
['Was macht ein Pirat am Computer? Er drückt die Enter-Taste.', 'Allgemein'],
['Warum können Seeräuber kein Alphabet lernen? Weil sie immer auf dem C stecken bleiben.', 'Wortspiele'],
['Ich habe gestern einen Witz über einen Zauberer gehört… Aber der war verschwunden.', 'Allgemein'],
['Warum dürfen Geister keine Lügen erzählen? Weil man durch sie hindurchsieht.', 'Allgemein']
];
$stmt = $mysqli->prepare("INSERT INTO jokes (text, category) VALUES (?, ?)");
foreach($sampleJokes as $j){
$stmt->bind_param("ss", $j[0], $j[1]);
$stmt->execute();
}
$stmt->close();
}
// ---------------------------
// AJAX: Like
// ---------------------------
if(isset($_POST['action']) && $_POST['action']=='like'){
$id = intval($_POST['id']);
$mysqli->query("UPDATE jokes SET likes=likes+1 WHERE id=$id");
$res = $mysqli->query("SELECT likes FROM jokes WHERE id=$id");
echo $res->fetch_assoc()['likes'];
exit;
}
// AJAX: Kommentar
if(isset($_POST['action']) && $_POST['action']=='comment'){
$id = intval($_POST['id']);
$user = $mysqli->real_escape_string($_POST['username']);
$comment = $mysqli->real_escape_string($_POST['comment']);
$mysqli->query("INSERT INTO comments (joke_id, username, comment) VALUES($id,'$user','$comment')");
echo json_encode([
'username'=>$user,
'comment'=>$comment,
'created_at'=>date('Y-m-d H:i')
]);
exit;
}
// ---------------------------
// Kategorie Filter
// ---------------------------
$categoryFilter = $_GET['category'] ?? '';
$where = $categoryFilter ? "WHERE category='".$mysqli->real_escape_string($categoryFilter)."'" : '';
$jokes = $mysqli->query("SELECT * FROM jokes $where ORDER BY id DESC");
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dreamcodes Witze Portal</title>
<style>
body{font-family:Arial,sans-serif;margin:0;background:#f4f4f4;color:#333;}
header{background:#4caf50;color:#fff;text-align:center;padding:1rem;}
.container{max-width:800px;margin:2rem auto;padding:1rem;background:#fff;border-radius:8px;box-shadow:0 4px 8px rgba(0,0,0,0.1);}
.joke{border-bottom:1px solid #ddd;padding:1rem 0;}
.joke:last-child{border:none;}
button.like{background:#4caf50;color:#fff;border:none;padding:5px 10px;border-radius:4px;cursor:pointer;margin-left:1rem;}
.comment-box{margin-top:0.5rem;}
.comment-box input, .comment-box textarea{width:100%;padding:5px;margin:2px 0;border-radius:4px;border:1px solid #ccc;}
.comment-box button{background:#2196f3;color:#fff;border:none;padding:5px 10px;border-radius:4px;cursor:pointer;margin-top:5px;}
.comments{margin-top:10px;padding-left:10px;font-size:0.9rem;}
.comment{border-top:1px solid #eee;padding:5px 0;}
.category{margin-bottom:1rem;}
.category a{margin-right:10px;text-decoration:none;color:#2196f3;}
.category a.active{font-weight:bold;}
footer{text-align:center;padding:1rem;margin-top:2rem;color:#777;font-size:0.9rem;}
</style>
</head>
<body>
<header><h1>Dreamcodes Witze Portal</h1></header>
<div class="container">
<div class="category">
<a href="?" class="<?= $categoryFilter==''?'active':'' ?>">Alle</a>
<?php
$cats = $mysqli->query("SELECT DISTINCT category FROM jokes");
while($c=$cats->fetch_assoc()){
echo '<a href="?category='.urlencode($c['category']).'"'.($categoryFilter==$c['category']?' class="active"':'').'>'.$c['category'].'</a>';
}
?>
</div>
<?php while($row=$jokes->fetch_assoc()): ?>
<div class="joke" data-id="<?= $row['id'] ?>">
<p><?= htmlspecialchars($row['text']) ?></p>
<button class="like">Gefällt mir (<span class="likes"><?= $row['likes'] ?></span>)</button>
<div class="comment-box">
<input type="text" placeholder="Name" class="username">
<textarea placeholder="Kommentar" class="comment-text"></textarea>
<button class="add-comment">Kommentar hinzufügen</button>
</div>
<div class="comments">
<?php
$cmts = $mysqli->query("SELECT * FROM comments WHERE joke_id=".$row['id']." ORDER BY id ASC");
while($c=$cmts->fetch_assoc()){
echo '<div class="comment"><strong>'.htmlspecialchars($c['username']).'</strong>: '.htmlspecialchars($c['comment']).'</div>';
}
?>
</div>
</div>
<?php endwhile; ?>
</div>
<footer class="max-w-6xl mx-auto text-center text-slate-400 py-6">
© <?=date('Y')?> <a href="https://dreamcodes.de" target="_blank" class="text-blue-500 hover:underline">Dreamcodes</a>
</footer>
<script>
document.querySelectorAll('.like').forEach(btn=>{
btn.addEventListener('click',()=>{
let joke = btn.closest('.joke');
let id = joke.getAttribute('data-id');
fetch('',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'action=like&id='+id})
.then(res=>res.text())
.then(like=>{joke.querySelector('.likes').textContent=like;});
});
});
document.querySelectorAll('.add-comment').forEach(btn=>{
btn.addEventListener('click',()=>{
let joke = btn.closest('.joke');
let id = joke.getAttribute('data-id');
let user = joke.querySelector('.username').value;
let comment = joke.querySelector('.comment-text').value;
if(!user || !comment) return alert('Name und Kommentar eingeben');
fetch('',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'action=comment&id='+id+'&username='+encodeURIComponent(user)+'&comment='+encodeURIComponent(comment)})
.then(res=>res.json())
.then(c=>{
let div = document.createElement('div');
div.classList.add('comment');
div.innerHTML='<strong>'+c.username+'</strong>: '+c.comment;
joke.querySelector('.comments').appendChild(div);
joke.querySelector('.username').value='';
joke.querySelector('.comment-text').value='';
});
});
});
</script>
</body>
</html>