基于PHP和MySQL的新闻发布系统——【功能优化】

news2024/11/14 2:22:42

前言

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>" ;
}

session

session用于保存登录用户的信息,可以实现禁止非法用户(未登录用户)登录。
在这里插入图片描述

// 启动会话
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>" ;
}

两者区别

cookiesession
存储在本地存储在服务器
存活时间可设置存活时间较短
安全性相对较低,但不需要占用服务器的资源安全性相对较高,但会大量占用服务器的资源

新增功能——图片上传和读取

在这个新闻发布系统中,我们可以通过增加一个图片上传和读取的功能来优化这个系统:实现这个功能的主要思路是:上传图片时将图片的类型以及名称读取并存储到新建的数据表中;显示图片时将所选需要查看的图片的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来保存信息,这样可以避免每次都需要重新输入用户名和密码进行登录的繁琐;当对于需要安全性高的站点以及更好的控制数据时,我们可以结合两者,使网站按照我们的想法进行运行。
在这里插入图片描述

当然在忙碌的学习中,也不要忘记在这美好的时光里多陪伴陪伴家人呀!再次祝大家事事顺心!

如有不足,感谢指正!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3【style-scoped、style-module、类和内联样式、props、练习】

文章目录style-scopedstyle-module类和内联样式props练习style-scoped 可以直接通过style标签来编写样式&#xff0c; 如果直接通过style标签写样式&#xff0c;此时编写的样式是全局样式会影响到所有的组件 可以为style标签添加一个scoped属性&#xff0c;这样样式将成为局部…

为什么会有右值引用?(移动构造、移动赋值)

目录 1、左值引用的缺陷 2、移动构造&#xff1a;解决临时对象的深拷贝 3、拓展&#xff1a;移动赋值 1、左值引用的缺陷 左值引用作为函数参数传递&#xff0c;减少了参数拷贝&#xff1b;但是作为函数返回值&#xff0c;并不适用于所有场景&#xff0c;比如要返回一个临…

Linux——innode

目录 回顾缓冲区 标准错误流的理解 文件系统 Inode VS 文件名 创建/删除/查看文件系统做了什么 软硬链接 动静态库 习题 回顾缓冲区 关掉1&#xff0c;log.txt中没文件是因为&#xff0c;字符串在缓冲区当中&#xff0c;缓冲区还没刷新&#xff0c;我们把fd给关了…

堆的实现及应用

下面用C语言介绍堆的实现以及应用 文章目录1. 堆的简介2. 堆的实现HeapInitHeapDestroyHeapPushHeapPop3. 堆的应用堆排序TopK问题1. 堆的简介 堆是一颗完全二叉树。这里所说的堆是一种非连续的数据结构&#xff0c;与操作系统内存分布的堆是两回事&#xff0c;它们没有任何联…

金融帝国实验室(Capitalism Lab)官方中文汉化包下载(v4.03)

<FCT汉化小组>Vol.001号作品 ————————————— ◎作品名称&#xff1a;金融帝国实验室&#xff08;CapLab&#xff09;官方汉化包 ◎汉化作者&#xff1a;FCT汉化小组&#xff08;Enlight Software认证&#xff09; ◎发布版本&#xff1a;CapLab Simplifi…

POJ 1845 Sumdiv题解(C++ 整数惟一分解定理+分治法求等比数列之和+快速幂)

文章目录整数惟一分解定理分治法求等比数列和完整代码传送门&#xff1a; POJ 1845 SumDiv 整数惟一分解定理 任何一个大于1的整数n都可以分解成若干个质因数&#xff08;素因数&#xff09;的连乘积&#xff0c;如果不计各个素因数的顺序&#xff0c;那么这种分解是唯一的&a…

王者荣耀入门技能树

前言 最近在学习技能树&#xff0c;我也试着写一写技能树&#xff0c;放松一下。 这里附上一张可爱的兔兔应景。仔细看&#xff0c;后边题目会提到&#xff0c;哈哈。 职业 以下哪个不属于王者荣耀中的职业&#xff1a; 射手法师辅助亚瑟 技能 以下哪个技能可以加快打野…

春节假期后,如何快速让员工恢复上班的元气和状态?

每当假期过后&#xff0c;总有一些员工无法快速恢复工作状态&#xff0c;团队的氛围也很难一下子热起来。而春节假期既是长假&#xff0c;又是过节氛围最浓厚的假期&#xff0c;节后返工的涣散问题自然更明显一些。但对于服装店铺来说&#xff0c;年后开工正处于旺季&#xff0…

【Vue】我的尚品汇项目笔记---20230109~20230120

014之前可参考官方笔记 https://blog.csdn.net/weixin_43424325/article/details/121684101 015-axios二次封装 api/index.js 设定 //当前模块&#xff0c;API进行统一管理&#xff0c;即对请求接口统一管理 import requests from "/api/request";//首页三级分类…

通达信插件获取并存储通达信商品指数的实时数据

一、引子 通达信商品指数一共有23个&#xff0c;如下图所示&#xff1a; 如果想获取历史数据&#xff0c;只需要通过通达信的数据下载和导出功能即可&#xff0c;现在我们需要获取这23个指数的实时数据&#xff0c;通过导出功能就没有办法了。 在最初的阶段&#xff0c;考虑的…

微服务自动化管理【IDEA使用Docker插件进行一键部署】

本章目标 IDEA使用Docker插件实现springboot项目的一键部署 要开两个虚拟机 server registry server上进行操作 Docker开启远程api端口(注意这种配置方式只适用于开发和学习&#xff0c;在公共网络中不要这样配置&#xff0c;容易引发安全问题) 默认情况下dokcer是不支持远程…

linux基本功系列之find命令实战

文章目录前言&#x1f680;&#x1f680;&#x1f680;一. find命令介绍二. find常用参数及语法格式三. 示范案例3.1 查找符合文件名规则的文件3.2 根据文件类型类查找文件3.3 按照更改时间或访问时间等查找文件3.4 查找并执行相应的命令3.5 按照文件大小来查找3.6 按照文件所有…

启动hive报错no hbase in

启动hive报错no hbase in 将hdfs和yarn都启动成功之后&#xff0c;启动hive&#xff0c;如下所示&#xff1a;[atguiguhadoop102 conf]$ cd /opt/module/hive/ [atguiguhadoop102 hive]$ bin/hive报错信息如下which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/us…

C++ · 类和对象 · 02 | 类的6个默认成员函数

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

【操作系统】—— 如何安装双系统与多系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

博客系统项目的自动化测试

作者&#xff1a;~小明学编程 文章专栏&#xff1a;测试开发 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 博客界面 测试用例 界面测试 功能测试 性能测试 兼容性测试 易用性测试 安全性测试 ​编辑自动化测试 登录界面的测试 界面文字模块 测…

ubuntu使用教程与常用命令

ubuntu使用教程 一、 Ubuntu简介 Ubuntu&#xff08;乌班图&#xff09;是一个基于Debian的以桌面应用为主的Linux操作系统&#xff0c;据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词&#xff0c;意思是“人性”、“我的存在是因为大家的存在”&#xff0c;是非洲传…

Python爬虫之Scrapy框架系列(5)——项目实战【某瓣Top250电影所有信息的txt文本存储】

上篇文章已经成功解析提取到豆瓣Top250电影想要的所有数据。下一步就是将其交给管道进行存储。 目录&#xff1a;1. 编写items.py文件&#xff08;定义结构化数据字段&#xff09;2. 爬虫文件里将数据一一对应字段名&#xff1a;3. 将数据返回给管道&#xff1a;4. 编写pipelin…

MCAL系列介绍04-ICU

本文框架1. 前言2. 基本概念3. ICU采集过程3.1 获取周期占空比3.2 获取边沿数量3.3 获取时间戳4. Autosar系列文章快速链接1. 前言 ICU驱动器是使用Input Capture Uint模块&#xff08;ICU&#xff09;解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断以及唤醒中断的模…

树莓派配置Python虚拟环境、安装PyQt5、安装PySide2

要从头设置好一台可用于开发的树莓派&#xff0c;可以参考树莓派 4B 无屏幕&#xff0c;连接WiFi、SSH、VNC&#xff0c;系统换源、pip换源&#xff0c;安装中文输入法 Python虚拟环境 树莓派&#xff08;或者说arm平台&#xff09;使用Python虚拟环境的正确方式是使用pipenv…