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 即可。遇到复杂的爬虫,就需要在程序里面加上请求头和参数信息。类似这种:我们一般的步骤是,先到浏览器的网络请求中找到我们需要的请求,然后将请求头和参数信息…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
Linux【5】-----编译和烧写Linux系统镜像(RK3568)
参考:讯为 1、文件系统 不同的文件系统组成了:debian、ubuntu、buildroot、qt等系统 每个文件系统的uboot和kernel是一样的 2、源码目录介绍 目录 3、正式编译 编译脚本build.sh 帮助内容如下: Available options: uboot …...
