2023年第一篇文章,祝大家在新的一年里“卯”足干劲,在技术上 “兔”飞猛进!

上一篇文章 基于PHP和MySQL的新闻发布系统 给大家介绍了制作一个新闻发布系统的主要功能的实现,在文章的末尾还提出了一些需要完善的方面。那么这篇文章就给我们的新闻发布系统增加cookie和session来提高用户的登录体验以及增强登录的安全性。

这次我们仿照一个学校的官网去做一个新闻发布系统,通过增加cookie来实现一天(或多天)免登录功能;通过添加session来实现非法用户禁止登录的功能。


cookie当我们在注册登录进入某一网站时,就可以通过cookie实现免登录功能;cookie是网站用户登陆的凭据(浏览器记住密码的功能就是通过与浏览器中保存的cookie进行验证后进行登录的)。

// 设置cookie
setcookie("username","张三");
$user=$_COOKIE['username'];
echo "$user";//输出张三
//设置cookie过期时间
setcookie("username","李四",time()+3600*24);//表示一天后过期
$user=$_COOKIE['username'];
echo "$user";
// 访问时间 访问时间显示格式
setcookie("visitime",date("Y-m-d H:i:s"));
$time=$_COOKIE['visitime'];
echo "$time";//输出当前访问的时间
//记录登录时间
date_default_timezone_set("Asia/Shanghai");
if(!isset($_COOKIE['visitime'])){
setcookie("visitime",date("Y-m-d H:i:s"),time()+3600);
// $time=$_COOKIE['visitime'];
echo "欢迎您首次访问该网站";
}else{
echo "您上次访问网站的时间是".$_COOKIE['visitime'];
}
// 删除cookie存储数据
setcookie("visitime","",time()-1);
代码实现功能
(1)登录页面添加 “实现免登录”功能的按钮
<form action="login_do.php" method="post" id="myform">
请输入用户名:<input type="text" name="username" id="username">
请输入密码:<input type="password" name="userpwd" id="userpwd">
<input type="submit" value="登录">
<span><input type="checkbox" name="free">七天免登录</span>
</form>
(2)判断用户是否选择免登录功能,并实现免登录功能。
include "./conn.php";
$username=$_POST['username'];
$userpwd=md5($_POST['userpwd']);
$free=$_POST['free'];//post传递复选框选中与否的状态
$sel="select * from admin where username='{$username}';";
$rs=$mysqli->query($sel);
$rows=$mysqli->affected_rows;
if($free){
setcookie("username",$username,time()+7*24*3600);
setcookie("userpwd",$userpwd,time()+7*24*3600);
}
if($rows>0){
// 用户名存在 验证用户输入的密码和数据表中存在的用户名对应的密码是否一致
$result=$rs->fetch_assoc();
if($userpwd==$result['userpwd']){
echo "<script>alert('登录成功');location.href='news_select.php'</script>";
}else{
//密码有误不可登录,清除cookie数据
setcookie("username","",time()-1);
setcookie("userpwd","",time()-1);
echo "<script>alert('密码错误,请重新输入或注册');location.href='login.php'</script>";
}
}else{
// 用户名不存在 清除cookie数据
setcookie("username","",time()-1);
setcookie("userpwd","",time()-1);
echo "<script>alert('用户名不存在,请重新输入或者先注册');location.href='login.php';</script>" ;
}
sessionsession用于保存登录用户的信息,可以实现禁止非法用户(未登录用户)登录。

// 启动会话
session_start();
// 注册会话
$_SESSION['username']='张三';
//删除会话
unset($_SESSION['username']);
//判断是否为登录用户,如果不是就弹出警告框,阻止非法用户对信息的查看。
//将该代码写在需要进行登录后才能查看的页面中即可。
session_start();
if(!isset($_SESSION['username'])){
echo "<script>alert('非法用户,请先登录!');location.href='login.php';</script>" ;
exit;
}
代码实现功能
include "./conn.php";
$username=$_POST['username'];
$userpwd=md5($_POST['userpwd']);
$free=$_POST['free'];//设置cookie时不要忘记接收登录页面传来的$free
$sel="select * from admin where username='{$username}';";
$rs=$mysqli->query($sel);
$rows=$mysqli->affected_rows;
if($free){
setcookie("username",$username,time()+7*24*3600);
setcookie("userpwd",$userpwd,time()+7*24*3600);
}
if($rows>0){
// 用户名存在 验证用户输入的密码和数据表中存在的用户名对应的密码是否一致
$result=$rs->fetch_assoc();
if($userpwd==$result['userpwd']){
echo "<script>alert('登录成功');location.href='news_select.php'</script>";
//登录成功就开启session,存储成功登录的用户名
session_start();
$_SESSION['username']=$username;
}else{
setcookie("username","",time()-1);
setcookie("userpwd","",time()-1);
echo "<script>alert('密码错误,请重新输入或注册');location.href='login.php'</script>";
}
}else{
// 用户名不存在
setcookie("username","",time()-1);
setcookie("userpwd","",time()-1);
echo "<script>alert('用户名不存在,请重新输入或者先注册');location.href='login.php';</script>" ;
}
两者区别| cookie | session |
|---|---|
| 存储在本地 | 存储在服务器 |
| 存活时间可设置 | 存活时间较短 |
| 安全性相对较低,但不需要占用服务器的资源 | 安全性相对较高,但会大量占用服务器的资源 |
新增功能——图片上传和读取在这个新闻发布系统中,我们可以通过增加一个图片上传和读取的功能来优化这个系统:实现这个功能的主要思路是:上传图片时将图片的类型以及名称读取并存储到新建的数据表中;显示图片时将所选需要查看的图片的id通过get传递,然后执行SQL语句将图片显示出来。
新建文件夹首先我们需要创建一个用于存放需要上传的图片的文件夹:

新建数据表接着创建一个用于存储上传图片的数据表:

上传图片:
<!-- test_insert.php -->
<form action="test_insert_do.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label><br />
请输入资源标题:<input type="text" name="test"></br>
请输入上传者姓名:<input type="text" name="author"><br>
请输入试题描述:<textarea name="content" id="" cols="30" rows="10"></textarea><br>
请上传文件: <input type="file" name="file" id="file" /> <br />
<input type="submit" name="submit" value="上传" />
</form>
//test_insert_do.php
include './conn.php';
$test = $_POST['test'];
$content = $_POST['content'];
$author = $_POST['author'];
$submit = $_POST['submit'];
$ctime = time();
$mtime = time();
// 当点击submit时,存储上传图片的信息
if (isset($_POST['submit'])) {
if ($_FILES["file"]["error"] > 0) { //如果上传出错
echo "Error: " . $_FILES["file"]["error"] . "<br />";
} else {
$image = $_FILES["file"]["name"]; // 存储在服务器的文件的临时副本的名称
$type = $_FILES["file"]["type"]; //被上传文件的类型
// 判断在该路径中是否有相同名字和类型的图片
if (file_exists("../imgs" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " already exists. ";
} else {
//不存在的话就将图片另存为自己的路径下
move_uploaded_file(
$_FILES["file"]["tmp_name"],
"../imgs/" . $_FILES["file"]["name"]
);
}
}
}
//将图片存入tests数据表
$in = "insert into tests(test,content,author,ctime,mtime,type,photoname)values
('{$test}','{$content}','{$author}',$ctime,$mtime,'{$type}','{$image}');";
$st = $mysqli->query($in);
if ($st) {
echo "<script>alert('发布成功!');location.href='test_select.php';</script>";
} else {
echo "<script>alert('发布失败!');location.href='test_select.php';</script>";
}
对图片实现查、删、改
查看图片
//test_check.php
include "./conn.php";
include "./session.php";
$id = $_GET['id'];
//找到指定图片——将查找的指定id的图片的信息转化成一维数组,根据图片名+存储路径的方式将其显示出来。
$sqlstr2 = "select * from tests where id={$id}";
$word2 = $mysqli->query($sqlstr2);
$thread = $word2->fetch_assoc();
if ($thread) {
header('content_type:' . $thread['type']);
echo "<img src='../imgs/" . $thread['photoname'] . "'/>";
}
其中删除图片和修改图片不再赘述,详细的注释可以参考上一篇文章 基于PHP和MySQL的新闻发布系统 。
删除图片
//test_delete.php
include "./conn.php";
include "./session.php";
$id=$_GET['id'];
$de="delete from tests where id={$id};";
$del=$mysqli->query($de);
if($del){
echo "<script>alert('删除成功!');location.href='./test_select.php';</script>";
}else{
echo "<script>alert('删除失败!');location.href='./test_select.php';</script>";
}
修改图片
//test_update.php
include "./conn.php";
$id = $_GET['id'];
include "./session.php";
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="test_update_do.php?id=<?= $id ?>" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label><br />
请输入资源标题:<input type="text" name="test"></br>
请输入上传者姓名:<input type="text" name="author"><br>
请输入试题描述:<textarea name="content" id="" cols="30" rows="10"></textarea><br>
<!-- 隐藏域获取id -->
<input type="hidden" name="id" value="<?= $id ?>">
请上传文件: <input type="file" name="file" id="file" /> <br />
<input type="submit" name="submit" value="修改" />
</form>
</body>
</html>
//test_update_do.php
require("./conn.php");
$id=$_POST['id'];
$test=$_POST['test'];
$content=$_POST['content'];
$author=$_POST['author'];
$submit=$_POST['submit'];
$mtime=time();
if (isset($_POST['submit'])) {
if ($_FILES["file"]["error"] > 0) { //如果上传出错
echo "Error: " . $_FILES["file"]["error"] . "<br />";
} else {
$image = $_FILES["file"]["name"]; // 存储在服务器的文件的临时副本的名称
$type = $_FILES["file"]["type"]; //被上传文件的类型
// 判断在改路径中是否有相同名字和类型的图片
if (file_exists("../imgs" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " already exists. ";
} else {
//不存在的话就将图片另存为自己的路径下
move_uploaded_file(
$_FILES["file"]["tmp_name"],
"../imgs/" . $_FILES["file"]["name"]
);
}
}
}
$upd="update tests set test='{$test}',content='{$content}',author='{$author}',mtime=$mtime,type='{$type}',photoname='{$image}' where id={$id};";
$st=$mysqli->query($upd);
if($st){
echo "<script>alert('修改成功');location.href='test_select.php';</script>";
}else{
echo "<script>alert('修改失败');location.href='test_select.php';</script>";
}
如果我们需要经常登录一个站点时,可以用cookie来保存信息,这样可以避免每次都需要重新输入用户名和密码进行登录的繁琐;当对于需要安全性高的站点以及更好的控制数据时,我们可以结合两者,使网站按照我们的想法进行运行。

当然在忙碌的学习中,也不要忘记在这美好的时光里多陪伴陪伴家人呀!再次祝大家事事顺心!
如有不足,感谢指正!
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实