Dienstag, 20 Januar 2026

Diese Woche am beliebtesten

Vertiefendes Material

Witze Portal

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>
Dreamcodes Redaktion
Dreamcodes Redaktion
Qualität als Standard. Verantwortung als Prinzip. Jede Ressource auf Dreamcodes basiert auf geprüften Best Practices und fundierter Praxiserfahrung. Unser Anspruch ist ein belastbares Fundament statt experimenteller Lösungen. Die Integration und Absicherung der Inhalte liegt in Ihrem Ermessen. Wir liefern die fachliche Basis, die Verantwortung für den produktiven Einsatz verbleibt bei Ihnen.
Vorheriges Tutorial
Nächstes Tutorial

Vielleicht einen Blick WERT?