当前位置:首页 > PHP

用php实现留言板

2026-02-13 22:00:47PHP

数据库设计

创建名为messages的数据库表,包含以下字段:

  • id:自增主键
  • name:留言者姓名(VARCHAR)
  • email:留言者邮箱(VARCHAR)
  • content:留言内容(TEXT)
  • created_at:留言时间(TIMESTAMP)

SQL创建语句示例:

CREATE TABLE messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL,
    content TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

连接数据库

创建config.php文件存放数据库连接信息:

<?php
$host = 'localhost';
$dbname = 'message_board';
$username = 'root';
$password = '';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}
?>

提交留言功能

创建submit.php处理表单提交:

<?php
require 'config.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = htmlspecialchars($_POST['name']);
    $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
    $content = htmlspecialchars($_POST['content']);

    if ($email === false) {
        die('Invalid email format');
    }

    $stmt = $pdo->prepare("INSERT INTO messages (name, email, content) VALUES (?, ?, ?)");
    $stmt->execute([$name, $email, $content]);

    header('Location: index.php');
    exit;
}
?>

显示留言功能

创建index.php显示所有留言:

<?php
require 'config.php';

$stmt = $pdo->query("SELECT * FROM messages ORDER BY created_at DESC");
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<!DOCTYPE html>
<html>
<head>
    <title>留言板</title>
    <style>
        .message { border: 1px solid #ddd; padding: 10px; margin-bottom: 10px; }
    </style>
</head>
<body>
    <h1>留言板</h1>

    <form method="post" action="submit.php">
        姓名: <input type="text" name="name" required><br>
        邮箱: <input type="email" name="email" required><br>
        留言: <textarea name="content" required></textarea><br>
        <button type="submit">提交</button>
    </form>

    <hr>

    <?php foreach ($messages as $message): ?>
        <div class="message">
            <h3><?= htmlspecialchars($message['name']) ?></h3>
            <small><?= $message['email'] ?> - <?= $message['created_at'] ?></small>
            <p><?= nl2br(htmlspecialchars($message['content'])) ?></p>
        </div>
    <?php endforeach; ?>
</body>
</html>

安全增强措施

实现CSRF防护:

session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('Invalid CSRF token');
    }
    // 继续处理表单
}

// 在显示表单时生成token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

添加XSS防护:

// 对所有输出使用htmlspecialchars
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

// 对URL参数使用filter_var
$id = filter_var($_GET['id'], FILTER_VALIDATE_INT);

分页功能实现

修改留言查询语句实现分页:

$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 5;
$offset = ($page - 1) * $perPage;

$stmt = $pdo->prepare("SELECT * FROM messages ORDER BY created_at DESC LIMIT :offset, :perPage");
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute();

添加分页导航:

用php实现留言板

$total = $pdo->query("SELECT COUNT(*) FROM messages")->fetchColumn();
$pages = ceil($total / $perPage);

for ($i = 1; $i <= $pages; $i++) {
    echo "<a href='?page=$i'>$i</a> ";
}

标签: 留言板php
分享给朋友:

相关文章

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php实现重定向

php实现重定向

使用header函数进行重定向 在PHP中,header()函数是实现重定向的常用方法。通过发送HTTP头信息Location,浏览器会自动跳转到指定URL。需确保在调用header()前没有输出任何…