编程笔记

编程笔记

一个简单的 PHP + MySQL 文章管理系统的实现
2025-01-25

一个简单的 PHP + MySQL 文章管理系统的实现,包含后台管理、简单会员系统、文章发布和审核功能。

数据库设计


首先,创建一个 MySQL 数据库,包含三个表:usersarticles 和 article_status
-- 创建数据库
CREATE DATABASE article_management;

-- 使用数据库
USE article_management;

-- 创建用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role ENUM('member', 'admin') DEFAULT 'member'
);

-- 创建文章表
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    user_id INT NOT NULL,
    status_id INT NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (status_id) REFERENCES article_status(id)
);

-- 创建文章状态表
CREATE TABLE article_status (
    id INT AUTO_INCREMENT PRIMARY KEY,
    status_name VARCHAR(20) NOT NULL
);

-- 插入文章状态数据
INSERT INTO article_status (status_name) VALUES ('待审核'), ('已通过'), ('未通过');

PHP 代码实现

1. 数据库连接文件 config.php

<?php
// 数据库连接配置
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "article_management";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
?>

2. 用户注册文件 register.php

<?php
include 'config.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);

    $sql = "INSERT INTO users (username, password) VALUES ('$username', '$password')";

    if ($conn->query($sql) === TRUE) {
        echo "注册成功";
    } else {
        echo "错误: " . $sql . "<br>" . $conn->error;
    }
}
?>

<!DOCTYPE html>
<html>
<body>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  用户名: <input type="text" name="username"><br>
  密码: <input type="password" name="password"><br>
  <input type="submit" value="注册">
</form>

</body>
</html>

3. 用户登录文件 login.php

<?php
include 'config.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $sql = "SELECT * FROM users WHERE username = '$username'";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        if (password_verify($password, $row['password'])) {
            session_start();
            $_SESSION['user_id'] = $row['id'];
            $_SESSION['role'] = $row['role'];
            header("Location: index.php");
        } else {
            echo "密码错误";
        }
    } else {
        echo "用户不存在";
    }
}
?>

<!DOCTYPE html>
<html>
<body>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  用户名: <input type="text" name="username"><br>
  密码: <input type="password" name="password"><br>
  <input type="submit" value="登录">
</form>

</body>
</html>

4. 文章发布文件 publish.php

<?php
session_start();
include 'config.php';

if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $title = $_POST['title'];
    $content = $_POST['content'];
    $user_id = $_SESSION['user_id'];

    $sql = "INSERT INTO articles (title, content, user_id) VALUES ('$title', '$content', $user_id)";

    if ($conn->query($sql) === TRUE) {
        echo "文章发布成功,等待审核";
    } else {
        echo "错误: " . $sql . "<br>" . $conn->error;
    }
}
?>

<!DOCTYPE html>
<html>
<body>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  标题: <input type="text" name="title"><br>
  内容: <textarea name="content"></textarea><br>
  <input type="submit" value="发布文章">
</form>

</body>
</html>

5. 后台管理文件 admin.php

<?php
session_start();
include 'config.php';

if (!isset($_SESSION['user_id']) || $_SESSION['role'] != 'admin') {
    header("Location: login.php");
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $article_id = $_POST['article_id'];
    $status_id = $_POST['status_id'];

    $sql = "UPDATE articles SET status_id = $status_id WHERE id = $article_id";

    if ($conn->query($sql) === TRUE) {
        echo "文章状态更新成功";
    } else {
        echo "错误: " . $sql . "<br>" . $conn->error;
    }
}

$sql = "SELECT articles.id, articles.title, users.username, article_status.status_name 
        FROM articles 
        JOIN users ON articles.user_id = users.id 
        JOIN article_status ON articles.status_id = article_status.id";
$result = $conn->query($sql);
?>

<!DOCTYPE html>
<html>
<body>

<h2>文章管理</h2>

<table border="1">
  <tr>
    <th>文章标题</th>
    <th>作者</th>
    <th>状态</th>
    <th>操作</th>
  </tr>
  <?php
  if ($result->num_rows > 0) {
      while ($row = $result->fetch_assoc()) {
          echo "<tr>";
          echo "<td>" . $row['title'] . "</td>";
          echo "<td>" . $row['username'] . "</td>";
          echo "<td>" . $row['status_name'] . "</td>";
          echo "<td>";
          echo "<form method='post' action=''>";
          echo "<input type='hidden' name='article_id' value='" . $row['id'] . "'>";
          echo "<select name='status_id'>";
          $status_sql = "SELECT * FROM article_status";
          $status_result = $conn->query($status_sql);
          while ($status_row = $status_result->fetch_assoc()) {
              echo "<option value='" . $status_row['id'] . "' " . ($status_row['id'] == $row['status_id'] ? 'selected' : '') . ">" . $status_row['status_name'] . "</option>";
          }
          echo "</select>";
          echo "<input type='submit' value='更新状态'>";
          echo "</form>";
          echo "</td>";
          echo "</tr>";
      }
  }
  ?>
</table>

</body>
</html>

代码解释和使用说明


  1. 数据库设计
    • users 表用于存储用户信息,包括用户名、密码和用户角色(会员或管理员)。

    • articles 表用于存储文章信息,包括标题、内容、作者 ID 和文章状态 ID。

    • article_status 表用于存储文章的状态,如待审核、已通过、未通过。

  2. PHP 文件功能
    • config.php:负责数据库连接,你需要将 your_username 和 your_password 替换为你的 MySQL 用户名和密码。

    • register.php:用户注册页面,用户可以输入用户名和密码进行注册。

    • login.php:用户登录页面,用户可以输入用户名和密码进行登录。

    • publish.php:文章发布页面,已登录的用户可以发布文章,文章默认状态为待审核。

    • admin.php:后台管理页面,只有管理员可以访问,管理员可以查看所有文章的状态并进行审核。

  3. 使用方法
    • 运行 SQL 代码创建数据库和表。

    • 将 PHP 文件上传到你的 Web 服务器。

    • 访问 register.php 进行用户注册,注册后可以访问 login.php 进行登录。

    • 会员登录后可以访问 publish.php 发布文章。

    • 管理员登录后可以访问 admin.php 进行文章审核。


这个系统只是一个简单的示例,实际应用中可能需要更多的功能和安全性改进,如输入验证、错误处理、权限管理等。