打造交流利器:PHP留言板功能详解与实践

在这里插入图片描述

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,2023年6月csdn上海赛道top4。多年电商行业从业经验,对系统架构,数据分析处理等大规模应用场景有丰富经验。
🏆本文已收录于PHP专栏:PHP进阶实战教程。
🏆另有专栏PHP入门基础教程,希望各位大佬多多支持❤️。

文章目录

  • 一、简介
  • 二、系统设计
    • 2.1 数据库设计
    • 2.2 HTML页面设计
      • 2.2.1 留言列表页面(index.html)
      • 2.2.2 添加留言页面(add.html)
    • 2.3 PHP代码编写
      • 2.3.1 新增留言(add.php)
      • 2.3.2 编辑留言(edit.php)
      • 2.3.3 删除留言(delete.php)
      • 2.3.4 查询留言(select_messages.php):
  • 三、总结


一、简介

留言板是一个常见的Web应用程序,它允许用户在网站上发布留言,并可以对已发布的留言进行查看、编辑和删除操作。本文将使用PHP语言实现一个基本的留言板功能。

在这里插入图片描述

二、系统设计

首先,我们需要设计数据库表来存储留言信息,然后编写HTML页面展示留言列表以及提交留言的表单,最后使用PHP处理前端提交的请求,并与数据库进行交互。

2.1 数据库设计

我们将使用MySQL数据库来存储留言信息。假设我们需要存储的留言信息包括:id、姓名、邮箱、主题、内容和创建时间。

首先,创建一个名为guestbook的数据库,然后在该数据库中创建名为messages的数据表,表结构如下:

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `subject` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `created_at` datetime NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2.2 HTML页面设计

我们需要编写两个HTML页面,一个用于展示留言列表,另一个用于提交新的留言。

2.2.1 留言列表页面(index.html)

<!DOCTYPE html>
<html>
<head>
    <title>留言板</title>
</head>
<body>
    <h1>留言板</h1>
    <a href="add.php">新增留言</a>
    <table>
        <tr>
            <th>姓名</th>
            <th>邮箱</th>
            <th>主题</th>
            <th>内容</th>
            <th>创建时间</th>
            <th>操作</th>
        </tr>
        <?php
        // 使用PHP动态生成留言列表
        $db = new mysqli('localhost', 'username', 'password', 'guestbook');
        if ($db->connect_errno) {
            die('连接数据库失败:' . $db->connect_error);
        }
        $sql = "SELECT * FROM messages ORDER BY created_at DESC";
        $result = $db->query($sql);
        while ($row = $result->fetch_assoc()) {
            echo "<tr>";
            echo "<td>" . $row['name'] . "</td>";
            echo "<td>" . $row['email'] . "</td>";
            echo "<td>" . $row['subject'] . "</td>";
            echo "<td>" . $row['content'] . "</td>";
            echo "<td>" . $row['created_at'] . "</td>";
            echo "<td><a href='edit.php?id=" . $row['id'] . "'>编辑</a> | <a href='delete.php?id=" . $row['id'] . "'>删除</a></td>";
            echo "</tr>";
        }
        $db->close();
        ?>
    </table>
</body>
</html>

2.2.2 添加留言页面(add.html)

<!DOCTYPE html>
<html>
<head>
    <title>添加留言</title>
</head>
<body>
    <h1>添加留言</h1>
    <form action="add.php" method="post">
        <label for="name">姓名:</label>
        <input type="text" id="name" name="name" required><br>
        <label for="email">邮箱:</label>
        <input type="email" id="email" name="email" required><br>
        <label for="subject">主题:</label>
        <input type="text" id="subject" name="subject" required><br>
        <label for="content">内容:</label><br>
        <textarea id="content" name="content" rows="5" required></textarea><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

2.3 PHP代码编写

我们需要编写三个PHP文件,分别用于处理新增留言、编辑留言和删除留言的请求。

2.3.1 新增留言(add.php)

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $db = new mysqli('localhost', 'username', 'password', 'guestbook');
    if ($db->connect_errno) {
        die('连接数据库失败:' . $db->connect_error);
    }
    $name = $_POST['name'];
    $email = $_POST['email'];
    $subject = $_POST['subject'];
    $content = $_POST['content'];

    $stmt = $db->prepare("INSERT INTO messages (name, email, subject, content) VALUES (?, ?, ?, ?)");
    $stmt->bind_param("ssss", $name, $email, $subject, $content);
    if ($stmt->execute()) {
        header('Location: index.html');
    } else {
        echo '添加留言失败:' . $stmt->error;
    }
    $stmt->close();
    $db->close();
}
?>

2.3.2 编辑留言(edit.php)

<?php
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['id'])) {
    $id = $_GET['id'];
    $db = new mysqli('localhost', 'username', 'password', 'guestbook');
    if ($db->connect_errno) {
        die('连接数据库失败:' . $db->connect_error);
    }
    $stmt = $db->prepare("SELECT * FROM messages WHERE id = ?");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($row = $result->fetch_assoc()) {
        $name = $row['name'];
        $email = $row['email'];
        $subject = $row['subject'];
        $content = $row['content'];
    } else {
        die('留言不存在');
    }
    $stmt->close();
    $db->close();
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['id']) && isset($_POST['name']) && isset($_POST['email']) && isset($_POST['subject']) && isset($_POST['content'])) {
        $id = $_POST['id'];
        $name = $_POST['name'];
        $email = $_POST['email'];
        $subject = $_POST['subject'];
        $content = $_POST['content'];

        $db = new mysqli('localhost', 'username', 'password', 'guestbook');
        if ($db->connect_errno) {
            die('连接数据库失败:' . $db->connect_error);
        }
        $stmt = $db->prepare("UPDATE messages SET name = ?, email = ?, subject = ?, content = ? WHERE id = ?");
        $stmt->bind_param("ssssi", $name, $email, $subject, $content, $id);
        if ($stmt->execute()) {
            header('Location: index.html');
        } else {
            echo '编辑留言失败:' . $stmt->error;
        }
        $stmt->close();
        $db->close();
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>编辑留言</title>
</head>
<body>
    <h1>编辑留言</h1>
    <form action="edit.php" method="post">
        <input type="hidden" name="id" value="<?php echo $id; ?>">
        <label for="name">姓名:</label>
        <input type="text" id="name" name="name" value="<?php echo $name; ?>" required><br>
        <label for="email">邮箱:</label>
        <input type="email" id="email" name="email" value="<?php echo $email; ?>" required><br>
        <label for="subject">主题:</label>
        <input type="text" id="subject" name="subject" value="<?php echo $subject; ?>" required><br>
        <label for="content">内容:</label><br>
        <textarea id="content" name="content" rows="5" required><?php echo $content; ?></textarea><br>
        <input type="submit" value="保存">
    </form>
</body>
</html>

2.3.3 删除留言(delete.php)

删除留言

<?php
$id = $_GET['id'];

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "DELETE FROM messages WHERE id=$id";

if ($conn->query($sql) === TRUE) {
    echo "Message deleted successfully";
} else {
    echo "Error deleting message: " . $conn->error;
}

$conn->close();
?>

2.3.4 查询留言(select_messages.php):

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM messages ORDER BY created_at DESC";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"]. ", Name: " . $row["name"]. ", Email: " . $row["email"]. ", Subject: " . $row["subject"]. ", Content: " . $row["content"]. "<br>";
    }
} else {
    echo "No messages found";
}

$conn->close();
?>

三、总结

今天我们通过PHP完整实现了一个留言板功能,实际过程中,可能还有更加复杂的设计。不过核心就是这样一些东西。希望能对您有所帮助,我们下次见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/53635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统学习,Linux基础命令大全

目录 第一章、Linux简介和安装1.1&#xff09;Linux简介和分类1.2&#xff09;安装VMware虚拟机&#xff0c;在虚拟机中安装CentOS 7 第二章、虚拟机中Linux的IP地址配置详解2.1&#xff09;什么是IP地址&#xff0c;如何查看2.2&#xff09;虚拟机NAT模式中Linux的IP地址设置有…

MyBatis缓存-提高检索效率的利器--二级缓存

文章目录 缓存-提高检索效率的利器缓存-官方文档二级缓存基本介绍二级缓存原理图 二级缓存快速入门快速入门注意事项和使用陷阱理解二级缓存策略的参数 四大策略如何禁用二级缓存mybatis 刷新二级缓存的设置 缓存-提高检索效率的利器 缓存-官方文档 文档地址: https://mybati…

Java面试准备篇:全面了解面试流程与常见问题

文章目录 1.1 Java面试概述1.2 面试流程和注意事项1.3 自我介绍及项目介绍1.4 常见面试问题 在现代职场中&#xff0c;面试是求职过程中至关重要的一环&#xff0c;特别是对于Java开发者而言。为了帮助广大Java开发者更好地应对面试&#xff0c;本文将提供一份全面的Java面试准…

【Golang 接口自动化02】使用标准库net/http发送Post请求

目录 写在前面 发送Post请求 示例代码 源码分析 Post请求参数解析 响应数据解析 验证 发送Json/XMl Json请求示例代码 xml请求示例代码 总结 资料获取方法 写在前面 上一篇我们介绍了使用 net/http 发送get请求&#xff0c;因为考虑到篇幅问题&#xff0c;把Post单…

JVM类加载器的作用和层次结构

类加载器的作用 1)通过一个类的全限定名来获取定义此类的二进制字节流。 2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3)在内存中生成一个代表这个类的java.lang.Class对象,这个对象存放在方法区中。这个对象将作为程序访问方法区中的这些数据的外部接…

数学建模学习(5):数学建模各类题型及解题方案

一、数学建模常见的题型 总体来说&#xff0c;数学建模赛题类型主要分为&#xff1a;评价类、预测类和优化类三种&#xff0c;其中优化类是最常见的赛题类 型&#xff0c;几乎每年的地区赛或国赛美赛等均有出题&#xff0c;必须要掌握并且熟悉。 二、评价类赛题 综合评价是数学…

【线程安全的讨论(一)】CPU多核缓存架构和JMM

CPU多核缓存架构 一、CPU多核缓存架构可见性问题乱序执行&#xff08;指令重排&#xff09; 二、JMM——Java内存模型 一、CPU多核缓存架构 计算机的基本组成图 CPU 缓存为了提高程序运行的性能&#xff0c;现代 CPU 在很多方面会对程序进行优化。CPU 的处理速度很快&#xf…

DAY4,Qt(事件处理机制的使用,Qt中实现服务器的原理)

1.Qt中实现服务器的原理&#xff1b; ---chatser.h---头文件 #ifndef CHATSER_H #define CHATSER_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //套接字类 #include <QMessageBox> //消息对话类 #include <Q…

【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

文章目录 前言数组声明以及初始化函数参数 切片声明以及初始化函数参数 总结 前言 在 Go 语言中&#xff0c;数组和切片看起来很像&#xff0c;但其实它们又有很多的不同之处&#xff0c;这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用…

Sentinel 容灾中心的使用

Sentinel 容灾中心的使用 往期文章 Nacos环境搭建Nacos注册中心的使用Nacos配置中心的使用 熔断/限流结果 Jar 生产者 spring-cloud-alibaba&#xff1a;2021.0.4.0 spring-boot&#xff1a;2.6.8 spring-cloud-loadbalancer&#xff1a;3.1.3 sentinel&#xff1a;2021.0…

Jquery笔记

DOM对象通过jquery获取 所有的代码都是基于引入jquery.js文件 var mydiv $(#div);//直接获取到DOM对象元素id var mydiv$(.div)&#xff1b;//通过class获取DOM对象&#xff0c;如果有同名class只会获取第一个 var mysapn$(span);//通过元素的标签名获取DOM对象 var divarr$(…

Closure Table-树形多级关系数据库设计(MySql)

一般树形多级关系数据库设计&#xff0c;比较普遍的就是四种方法&#xff1a;&#xff08;具体见 SQL Anti-patterns这本书&#xff09; Adjacency List&#xff1a;每一条记录存parent_id Path Enumerations&#xff1a;每一条记录存整个tree path经过的node枚举&#xff08…

30个前端开发中常用的JavaScript函数

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 前言 在前端开发中通常会用到校验函数…

VSCode搭建GCC环境

1. 下载 https://www.mingw-w64.org/downloads/ https://github.com/niXman/mingw-builds-binaries/releases 2.安装 x86_64-12.2.0-release-win32-seh-rt_v10-rev1.7z解压到D盘 我的电脑–属性–系统属性–环境变量–系统变量–path D:\MinGW-w64\x86_64-12.2.0-release…

一种嵌入式LCD显示多国语言方法

简介 介绍一种嵌入式LCD显示多国语言方法&#xff0c;由于很多产品嵌入式资源有限&#xff0c;显示的字符也不多&#xff0c;所以可以自己制作一些字库&#xff0c;而不用字库芯片。 下面展示一种从字库取出字符的方法。 代码示例 #include <stdio.h> #include <s…

27 用linprog、fmincon求 解线性规划问题(matlab程序)

1.简述 ① linprog函数&#xff1a; 求解线性规划问题&#xff0c;求目标函数的最小值&#xff0c; [x,y] linprog(c,A,b,Aeq,beq,lb,ub) 求最大值时&#xff0c;c加上负号&#xff1a;-c ② intlinprog函数&#xff1a; 求解混合整数线性规划问题&#xff0c; [x,y] intl…

hadoop部署配置

端口名称 Hadoop2.x Hadoop3.x NameNode内部通信端口 8020 / 9000 8020 / 9000/9820 NameNode HTTP UI 50070 9870 MapReduce查看执行任务端口 8088 8088 历史服务器通信端口 19888 19888 端口名称Hadoop2.xHadoop3.xNameNode内部通信端口8020 / 90008020 / 9000/9820NameNode…

安科瑞智慧空开微型断路器在银行的应用-安科瑞黄安南

应用场景 智能微型断路器与智能网关组合应用于末端回路 功能 1.计量功能&#xff1a;实时上报电压、电流、功率、电能、漏电、温度、频率等电参量&#xff1b; 2.报警功能&#xff1a;过压报警、欠压报警、过流报警、过载报警、漏电报警、超温报警、三相电缺相报警&#xff…

【面试】某公司记录一次面试题

文章目录 框架类1. Spring boot与 spring 架相比&#xff0c;好在哪里?2. Spring boot以及 Spring MVC 常用注解(如requestingMapping&#xff0c;responseBody 等)3. 常用的java 设计模式&#xff0c;spring 中用到哪些设计模式4. SpringIOC是什么&#xff0c;如何理解5. AOP…

ES开启身份认证

文章目录 X-Pack简介之前的安全方案ES开启认证ES服务升级https协议开启集群节点之间的证书认证 X-Pack简介 X-Pack是Elastic Stack扩展功能&#xff0c;提供安全性&#xff0c;警报&#xff0c;监视&#xff0c;报告&#xff0c;机器学习和许多其他功能。 X-Pack的发展演变&am…