php设计一个新春祝福墙
记得十几年前的时候,每到春节,各大网站都会建一个祝福墙,上面挂满网友的新年寄语。这些年随着移动互联网的高速发展,web的新春祝福墙越来越少了。今天,咱们就来考考古,用快速原型法进行设计。
原型设计
采用MySQL数据库。
创建数据库
CREATE DATABASE new_year_wall;创建表
CREATE TABLE greetings (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,message TEXT NOT NULL,date_posted TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);创建前端PHP页面
<!DOCTYPE html>
<html>
<head><title>New Year Greeting Wall</title><style>.greeting {margin: 10px;padding: 10px;border: 1px solid #ccc;background-color: #f9f9f9;}</style>
</head>
<body><h1>New Year Greeting Wall</h1><form action="add_greeting.php" method="post"><label for="name">Name:</label><input type="text" id="name" name="name"><label for="message">Message:</label><textarea id="message" name="message"></textarea><input type="submit" value="Post"></form><?php$conn = mysqli_connect("localhost", "username", "password", "new_year_wall");$result = mysqli_query($conn, "SELECT * FROM greetings ORDER BY date_posted DESC");while ($row = mysqli_fetch_assoc($result)) {echo "<div class='greeting'>";echo "<p><strong>" . $row['name'] . "</strong> posted:</p>";echo "<p>" . $row['message'] . "</p>";echo "<p>Date posted: " . $row['date_posted'] . "</p>";echo "</div>";}?>
</body>
</html>创建后端PHP页面
<?php
$conn = mysqli_connect("localhost", "username", "password", "new_year_wall");
$name = mysqli_real_escape_string($conn, $_POST['name']);
$message = mysqli_real_escape_string($conn, $_POST['message']);
$sql = "INSERT INTO greetings (name, message) VALUES ('$name', '$message')";
mysqli_query($conn, $sql);
header("Location: index.php");
?>好了,一个支持任何人直接提交祝福的祝福墙已经完成了。
但是,有经验的程序员一眼就看出来了,有两个很大的漏洞:一是用户不需要登录就可以直接发送祝福,且没有过滤用户提交的内容;而是没有管理功能,无法实现增删查改。
提高数据安全性
后端逻辑增加用户登录的判断
<?php
session_start();
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {// 用户未登录,跳转到登录页面header('Location: login.php');exit;
}// 用户已登录,处理祝福数据
$blessing = htmlspecialchars(trim($_POST['blessing']));// 连接数据库
$db = mysqli_connect('host', 'username', 'password', 'database');// 插入数据
$query = "INSERT INTO blessings (blessing) VALUES ('$blessing')";
$result = mysqli_query($db, $query);// 检查是否插入成功
if ($result) {echo '祝福发送成功!';
} else {echo '祝福发送失败,请重试。';
}mysqli_close($db);
?>可以看到,上面的代码增加了用户登录状态的判断,同时对$blessing进行了过滤。
设计登录页面
这是一个简单的login.php的代码示例:
<?php
session_start();
$errorMessage = '';if (isset($_POST['submit'])) {$username = $_POST['username'];$password = $_POST['password'];// 验证用户名和密码是否正确if ($username === 'admin' && $password === 'password') {$_SESSION['logged_in'] = true;header('Location: new_year_wishes_wall.php');exit;} else {$errorMessage = '用户名或密码错误!';}
}
?>
<html><head><title>登录</title></head><body><form action="" method="post"><fieldset><legend>登录</legend><?php if (!empty($errorMessage)) { echo $errorMessage . '<br><br>'; } ?>用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" name="submit" value="登录"></fieldset></form></body>
</html>在这个代码示例中,首先使用session_start()启动会话。然后,如果表单被提交,它将检查用户提供的用户名和密码是否与预定义的用户名和密码匹配。如果匹配,则将$ _SESSION ['logged_in']设置为true,并重定向到新年祝福墙页面。如果用户名和密码不匹配,则显示错误消息。
上面的登录只设计了单用户登录,后面可以修改成从MySQL用户表查找用户信息。
支持多用户登录
以下是一个简单的用户登录系统的代码,用户信息存储在MySQL数据库中。注意到,现在存储的是明文密码,如需要增强安全性,可以增加md5()函数。
<?php
// 连接数据库
$conn = mysqli_connect("host", "username", "password", "database");// 判断连接是否成功
if (!$conn) {die("连接数据库失败:" . mysqli_connect_error());
}// 获取用户名和密码
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);// 判断用户名和密码是否为空
if (!empty($username) && !empty($password)) {// 构造查询语句$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";$result = mysqli_query($conn, $sql);// 判断查询结果是否存在if (mysqli_num_rows($result) > 0) {// 设置登录状态$_SESSION['logged_in'] = true;$_SESSION['username'] = $username;// 跳转到祝福墙页面header('Location: wall.php');exit;} else {// 登录失败,显示错误信息echo "用户名或密码错误,请重试。";}
} else {// 用户名和密码为空,显示错误信息echo "请输入用户名和密码。";
}// 关闭数据库连接
mysqli_close($conn);
?>
前端部分未作修改。
管理功能的实现
祝福管理
下面是一种实现管理功能的方法,实现对祝福的增删查改:
数据库设计:首先需要为祝福数据创建一张数据表,表中包含祝福内容、发送者、发送时间等字段。
增加祝福:使用 insert 语句将新的祝福插入数据库中。
删除祝福:使用 delete 语句删除指定的祝福。
查询祝福:使用 select 语句查询祝福,可以根据需要设置查询条件。
修改祝福:使用 update 语句修改指定的祝福。
需要注意的是,为了保证数据的安全性,对于对数据库的操作,需要使用 prepared statements 避免 SQL 注入攻击。
以下是简单的代码示例:
增加祝福:
$conn = mysqli_connect("localhost", "username", "password", "database");
$blessing = "祝大家新春快乐!";$stmt = mysqli_prepare($conn, "INSERT INTO blessings (blessing) VALUES (?)");
mysqli_stmt_bind_param($stmt, "s", $blessing);
mysqli_stmt_execute($stmt);mysqli_stmt_close($stmt);
mysqli_close($conn);删除祝福:
$conn = mysqli_connect("localhost", "username", "password", "database");
$id = 1;$stmt = mysqli_prepare($conn, "DELETE FROM blessings WHERE id = ?");
mysqli_stmt_bind_param($stmt, "i", $id);
mysqli_stmt_execute($stmt);mysqli_stmt_close($stmt);
mysqli_close($conn);查询祝福:
$conn = mysqli_connect("localhost", "username", "password", "database");$stmt = mysqli_prepare($conn, "SELECT id, blessing FROM blessings");
mysqli_stmt_execute($stmt);mysqli_stmt_bind_result($stmt, $id, $blessing);
while (mysqli_stmt_fetch($stmt)) {printf("%d, %s\n", $id, $blessing);
}mysqli_stmt_close($stmt);
mysqli_close($conn);修改祝福:
$conn = mysqli_connect("localhost", "username", "password", "database");
$id = 1;
$blessing = "祝大家新春快乐!";$stmt = mysqli_prepare($conn, "UPDATE blessings SET blessing = ? WHERE id = ?");
mysqli_stmt_bind_param($stmt, "si", $blessing, $id);
mysqli_stmt_execute($stmt);mysqli_stmt_close($stmt);
mysqli_close($conn);以下是基于HTML, CSS 和 JavaScript 的简单的祝福管理界面的前端代码:
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>祝福管理界面</title><style>/* 样式定义 */table {width: 100%;border-collapse: collapse;}th, td {border: 1px solid #dddddd;padding: 8px;text-align: left;}th {background-color: #dddddd;}.btn {background-color: #dddddd;border: none;padding: 8px 16px;text-align: center;cursor: pointer;}.add-btn {background-color: green;color: white;}.edit-btn {background-color: blue;color: white;}.delete-btn {background-color: red;color: white;}</style></head><body><table><tr><th>ID</th><th>祝福内容</th><th>操作</th></tr><!-- 表格数据加载 --><tr><td>1</td><td>新春快乐!</td><td><button class="btn edit-btn">编辑</button><button class="btn delete-btn">删除</button></td></tr><!-- 新增祝福按钮 --><tr><td colspan="3"><button class="btn add-btn">新增祝福</button></td></tr></table></body>
</html>
用户管理
下面是一份用 PHP 实现的用户管理的代码:
<?php// 连接数据库
$conn = mysqli_connect('localhost', 'username', 'password', 'database');// 查询所有用户
$query = "SELECT * FROM users";
$result = mysqli_query($conn, $query);// 输出所有用户
while ($row = mysqli_fetch_assoc($result)) {echo $row['id'] . ' ' . $row['username'] . ' ' . $row['email'] . '<br>';
}// 添加新用户
if (isset($_POST['submit'])) {$username = $_POST['username'];$email = $_POST['email'];$query = "INSERT INTO users (username, email) VALUES ('$username', '$email')";mysqli_query($conn, $query);
}// 修改用户信息
if (isset($_POST['update'])) {$id = $_POST['id'];$username = $_POST['username'];$email = $_POST['email'];$query = "UPDATE users SET username='$username', email='$email' WHERE id=$id";mysqli_query($conn, $query);
}// 删除用户
if (isset($_GET['delete'])) {$id = $_GET['delete'];$query = "DELETE FROM users WHERE id=$id";mysqli_query($conn, $query);
}// 关闭数据库连接
mysqli_close($conn);?>这段代码实现了从数据库中查询所有用户、添加新用户、修改用户信息和删除用户的功能。使用者可以根据实际情况对代码进行修改,以达到最终的需求。
以下是一个用户管理界面的示例代码:
HTML代码:
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>用户管理</title></head><body><h1>用户管理</h1><table><thead><tr><th>用户名</th><th>密码</th><th>操作</th></tr></thead><tbody id="user-list"></tbody></table><button id="add-user-btn">添加用户</button><div id="add-user-modal" style="display:none;"><h2>添加用户</h2><form id="add-user-form"><label>用户名:<input type="text" name="username" required></label><label>密码:<input type="password" name="password" required></label><button type="submit">提交</button><button id="close-add-user-modal">取消</button></form></div><div id="edit-user-modal" style="display:none;"><h2>编辑用户</h2><form id="edit-user-form"><input type="hidden" name="id"><label>用户名:<input type="text" name="username" required></label><label>密码:<input type="password" name="password" required></label><button type="submit">提交</button><button id="close-edit-user-modal">取消</button></form></div><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script>$(function() {function loadUsers() {$.ajax({url: 'api/get_users.php',type: 'GET',dataType: 'json',success: function (data) {var html = '';data.forEach(function (user) {html +="<tr>" +"<td>" + user.id + "</td>" +"<td>" + user.username + "</td>" +"<td>" + user.email + "</td>" +"<td>" +"<button class='edit-user-btn' data-id='" + user.id + "'>Edit</button>" +"<button class='delete-user-btn' data-id='" + user.id + "'>Delete</button>" +"</td>" +"</tr>";});$('#users-table tbody').html(html);}});
}
</script></body>
</html>
相关文章:
php设计一个新春祝福墙
记得十几年前的时候,每到春节,各大网站都会建一个祝福墙,上面挂满网友的新年寄语。这些年随着移动互联网的高速发展,web的新春祝福墙越来越少了。今天,咱们就来考考古,用快速原型法进行设计。原型设计采用M…...
KubeSphere 社区双周报 | OpenFunction 集成 WasmEdge | 2023.02.03-02.16
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.02.03-2023.…...
数字IC/FPGA 秋招知识点不全面整理
1. 引言 这篇文章的由来 秋招的时候,刚开始复习一些知识点的时候没有什么思路,只是盲目的看相关的书籍和资料,结果是留在脑子中的知识很有限,而且不够系统,在我需要它的时候,并不能很快的回忆起来。 于是就想着把一些典型的知识整理成一个文档,在进行刷题的时候可以比…...
你知道java8是如何排序Map嘛?
在Java中,有多种方法可以对Map进行排序,但是我们将重点介绍Java 8 Stream,这是实现目标的一种非常优雅的方法。 学习一下HashMap的merge()函数 在学习Map排序之前,有必要讲一下HashMap的merge()函数,该函数应用场景就…...
【李忍考研传】一、李忍
“老师,我来回答!” “非常好,我记得你是叫……呃……是李念同学吗?” “不,老师,我叫李忍。” “好,你来回答一下这个问题。” “这题用海明码校验的知识,能检错一位纠错一位&a…...
测牛学堂:软件测试python深入之类和对象的属性和方法总结
类对象和实例对象 类对象就是我们定义的类。 在代码执行的时候,解释器会自动创建类对象。 类对象的作用: 1 使用类对象创建实例对象 2 存储类的一些特性,就是类里面定义的属性 创建对象的过程也称为实例化的对象。所以,类创建的对…...
css实例--新闻页面
实现效果 实现代码 html代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…...
SpringCloudGateway 动态转发后端服务
API网关的核心功能是统一流量入口,实现路由转发,SpringCloudGateway是API网关开发的技术之一,此外比较流行的还有Kong和ApiSix,这2个都是基于OpenResty技术栈。 简单的路由转发可以通过SpringCloudGateway的配置文件实现…...
使用canvas写一个flappy bird小游戏
简介 canvas 是HTML5 提供的一种新标签,它可以支持 JavaScript 在上面绘画,控制每一个像素,它经常被用来制作小游戏,接下来我将用它来模仿制作一款叫flappy bird的小游戏。flappy bird(中文名:笨鸟先飞&am…...
KVM-2、虚拟化基础
1. 虚拟化概念 什么是虚拟化 **虚拟化是使用所谓虚拟机管理程序从一台物理机上创建若干个虚拟机的过程。**虚拟机的行为和运转方式与物理机一样,但它们会使用物理机的计算资源,如 CPU 、内存和存储。虚拟机管理程序会根据需要将这些计算资源分配给每个虚拟机。 虚拟化有哪…...
设计模式之观察者模式与访问者模式详解和应用
目录1.访问者模式详解1.1 访问者模式的定义1.1.1 访问者模式在生活中的体现1.1.2 访问者模式的适用场景1.2 访问者模式的通用实现1.3 访问者模式的使用案例之KPI考核1.3.1 类图设计1.3.2 代码实现1.4 访问者模式扩展---分派1.4.1 java中静态分派示例代码1.4.2 java中动态分派1.…...
spring注解方式整合Dubbo源码解析
系列文章目录 前言 本节我们的Dubbo源码版本基于2.6.x 在前一章我们的整合案例中,我们有几个比较关键的步骤: 在启动类上标注了EnableDubbo注解在provider类上面标注了Service注解来提供dubbo服务在消费的时候通过Reference注解引入dubbo服务在配置文件…...
大数值金额大写转换(C语言)
关于大数值金额大写转换,在财务管理的应用方面没什么意义。一般来说,千亿级,万亿级的数值就够了。因为在国家级层面是以亿为单位的,也就表达为千万亿,万万亿。在企业层面数值金额转换设置到千亿、万亿就行了。大的集团…...
迷宫问题图解 : 基于骨架提取、四邻域
目录 1. 迷宫的连通域 2. How to remove branch ? 3. 基于4邻域的 remove 分支 3.1 找到分支的端点 3.2 4邻域的 remove 分支 3.3 循环移除分支 3.4 code 4. 迷宫路线 4.1 预处理 4.2 提取骨架 4.3 分支的端点 4.4 去除分支的端点 4.5 循环去除分支 4…...
设计模式 - 如何在库和主程序之间互相调用数据和函数
背景:在项目开发过程中,难免碰到这种情况,当我们想要通过我们开发的库,调用主程序中的一些变量或者函数的时候,就会导致一些问题,因为在项目构建过程中,库都是不依赖于主程序编译的,…...
Redis面试题:1~2亿条数据需要缓存,请问如何设计这个存储案例
目录 前言 一、哈希取余分区 优点 缺点 二、一致性哈希算法分区 背景 步骤 ① 算法构建一致性哈希环 ② 服务器IP节点映射 ③ key落到服务器的落键规则 优点 ① 容错性 ② 扩展性 缺点 三、哈希槽分区 前言 单机单台100%不可能,肯定是分布式存储&am…...
程序员必备的软技能-《如何阅读一本书》
阅读很重要,我们真的会阅读吗? 这本书的初版是 1940年,时隔 80年,其内容仍然不过时。第一次读这本书时,给我最大的影响就是主题阅读,每次学习一个新理论、技术,都入手多本关于这项理论、技术的书…...
Java数据结构-栈、队列常用类(Stack、ArrayDeque、LinkedLList)
数据结构的三要素包括:逻辑结构、存储结构、数据的运算。逻辑结构描述的是数据之间的逻辑关系,分为线性结构(线性表(数组、链表)、栈、队列)和非线性结构(图、树、集合)。物理结构也…...
拯救了大批爬虫程序员,因为一个简单的神器
相信大家应该都写过爬虫,简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫,就需要在程序里面加上请求头和参数信息。类似这种:我们一般的步骤是,先到浏览器的网络请求中找到我们需要的请求,然后将请求头和参数信息…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
