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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 基于PHP和MySQL的新闻发布系统——【功能优化】

前言


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


fe4db1285c774872b6f9f7eddc2e5d6b.png


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


效果展示

image.gif

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


948624b65fb44353a34e6da34133fee7.png

3a75c880d5f04b55ac03205c1907af5d.png

cookie


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


948624b65fb44353a34e6da34133fee7.png

// 设置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用于保存登录用户的信息,可以实现禁止非法用户(未登录用户)登录。


3a75c880d5f04b55ac03205c1907af5d.png

// 启动会话
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语句将图片显示出来。


新建文件夹

首先我们需要创建一个用于存放需要上传的图片的文件夹:


55a209276eff4fc9b43bf2f5c80f502c.png


新建数据表


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

78511cb4ff3d439d85973026c5496db3.png

代码完善


上传图片:

b1719115ea8a4bac88aa9d28aa72c474.png

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


对图片实现查、删、改

a806368d3934461e9b2fa3fced266420.png

查看图片


//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来保存信息,这样可以避免每次都需要重新输入用户名和密码进行登录的繁琐;当对于需要安全性高的站点以及更好的控制数据时,我们可以结合两者,使网站按照我们的想法进行运行。


7ffabee2f0424d22a7d5de11b97c9327.png


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

如有不足,感谢指正!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
42 18
|
4天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
16 7
|
3天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
22 5
|
21小时前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
21 9
|
12天前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
19 0
|
SQL PHP 数据库
php注册登录系统(一)-极简
序 登录注册系统是日常上网最普通的操作,我设了一个分类一步步完善注册登录系统,若有哪里错误请慧教 所用语言:php 数据库 :mysql   本次实现功能: 1.用户注册 2.用户登录   主要文件:     完整代码 1 sql 在已有的数据库里创建user表,id,...
1453 0
|
25天前
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
33 0
|
16天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
19天前
|
安全 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
——深入探索LAMP栈下的高效数据交互与处理技巧 ####
|
17天前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
22 4