php+redis实现注册、删除、编辑、分页、登录、关注等功能
本文实例讲述了php+redis实现注册、删除、编辑、分页、登录、关注等功能。分享给大家供大家参考,具体如下:
主要界面

连接redis
redis.php
<?php
//实例化
$redis = new Redis();
//连接服务器
$a=$redis->connect("localhost",6379);
//var_dump($a);
//授权
$redis->auth("107lab");
注册界面
add.php
<form action="reg.php" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="注册">
<input type="reset" value="重填">
</form>
注册实现
reg.php
<?php
require("redis.php");
$username = $_POST['username'];
$password = md5($_POST['password']);
$age = $_POST['age'];
//echo $username.$password.$age;
$uid = $redis->incr("userid");//设置自增id,相当于主键
$redis->hMset("user:".$uid,array("uid"=>$uid,"username"=>$username,"password"=>$password,"age"=>$age));//用hash类型存储用户比较方便
//将用户id存入一个链表中,便于统计数据
$redis->rpush("uid",$uid);
//将用id存入以用户名为键的字符类型中,便于查看用户是否存在。
$redis->set("username:".$username,$uid);
header('location:list.php');
列表页面
list.php
<a href="add.php" rel="external nofollow" >注册</a>
<?php
require("redis.php");
if(!empty($_COOKIE['auth'])){
$id = $redis->get("auth:".$_COOKIE['auth']);
$name = $redis->hget("user:".$id,"username");
?>
欢迎您:<?php echo $name;?> <a href="logout.php" rel="external nofollow" >退出</a>
<?php } else { ?>
<a href="login.php" rel="external nofollow" >登录</a>
<?php } ?>
<?php
require("redis.php");
//用户总数
$count = $redis->lsize("uid");//获取链表的长度
//echo $count;
//页大小
$page_size = 3;
//当前页码
$page_num=(!empty($_GET['page']))?$_GET['page']:1;
//页总数
$page_count = ceil($count/$page_size);
$ids = $redis->lrange("uid",($page_num-1)*$page_size,(($page_num-1)*$page_size+$page_size-1));
//var_dump($ids);
foreach($ids as $v){
$data[]=$redis->hgetall("user:".$v);
}
/*
//以下为最初想到的分页处理,放入一个数组中,根据uid的最大值来当总个数,但是删除个别用户以后,uid不会变小,所以建议用链表,因为他有个lsize函数可以求出链表长度
//根据userid获取所有用户
for($i=1;$i<=($redis->get("userid"));$i++){
$data[]=$redis->hgetall("user:".$i);
}
//过滤空值
$data = array_filter($data);
//var_dump($data);
*/
?>
<table border=1>
<tr>
<th>uid</th>
<th>username</th>
<th>age</th>
<th>操作</th>
</tr>
<?php foreach($data as $v){ ?>
<tr>
<td><?php echo $v['uid']?></td>
<td><?php echo $v['username']?></td>
<td><?php echo $v['age']?></td>
<td>
<a href="del.php?id=<?php echo $v['uid'];?>" rel="external nofollow" >删除</a>
<a href="mod.php?id=<?php echo $v['uid'];?>" rel="external nofollow" >编辑</a>
<?php if(!empty($_COOKIE['auth']) && $id != $v['uid']){ ?>
<a href="addfans.php?id=<?php echo $v['uid'];?>&uid=<?php echo $id;?>" rel="external nofollow" >加关注</a>
<?php } ?>
</td>
</tr>
<?php } ?>
<tr>
<td colspan="4">
<?php if(($page_num-1)>=1){ ?>
<a href="?page=<?php echo ($page_num-1);?>" rel="external nofollow" >上一页</a>
<?php } ?>
<?php if(($page_num+1)<=$page_count){ ?>
<a href="?page=<?php echo ($page_num+1);?>" rel="external nofollow" >下一页</a>
<?php } ?>
<a href="?page=1" rel="external nofollow" >首页</a>
<a href="?page=<?php echo ($page_count);?>" rel="external nofollow" >尾页</a>
当前<?php echo $page_num;?>页
总共<?php echo $page_count;?>页
总共<?php echo $count;?>个用户
</td>
</tr>
</table>
<!--关注功能,建议用集合实现,因为集合元素唯一,并且可以容易求出两个用户粉丝之间交集与差集,进而进行好友推荐功能-->
<table border=1>
<caption>我关注了谁</caption>
<?php
$data = $redis->smembers("user:".$id.":following");
foreach($data as $v){
$row = $redis->hgetall("user:".$v);
?>
<tr>
<td><?php echo $row['uid'];?></td>
<td><?php echo $row['username'];?></td>
<td><?php echo $row['age'];?></td>
</tr>
<?php } ?>
<table>
<table border=1>
<caption>我的粉丝</caption>
<?php
$data = $redis->smembers("user:".$id.":followers");
foreach($data as $v){
$row = $redis->hgetall("user:".$v);
?>
<tr>
<td><?php echo $row['uid'];?></td>
<td><?php echo $row['username'];?></td>
<td><?php echo $row['age'];?></td>
</tr>
<?php } ?>
<table>
退出
logout.php
<?php
setcookie("auth","",time()-1);
header("location:list.php");
登录
login.php
<?php
require("redis.php");
$username = $_POST['username'];
$pass = $_POST['password'];
//根据注册时存储的以用户名为键的字符类型中查找用户id
$id = $redis->get("username:".$username);
if(!empty($id)){
$password = $redis->hget("user:".$id,"password");
if(md5($pass) == $password){
$auth = md5(time().$username.rand());
$redis->set("auth:".$auth,$id);
setcookie("auth",$auth,time()+86400);
header("location:list.php");
}
}
?>
<form action="" method="post">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录"/>
</form>
删除
del.php
<?php
require("redis.php");
$uid = $_GET['id'];
//echo $uid;
$username = $redis->hget("user:".$id,"username");
$a=$redis->del("user:".$uid);
$redis->del("username:".$username);
$redis->lrem("uid",$uid);
//var_dump($a);
header("location:list.php");
编辑界面
mod.php
<?php
require("redis.php");
$uid = $_GET['id'];
$data=$redis->hgetall("user:".$uid);
?>
<form action="doedit.php" method="post">
<input type="hidden" value="<?php echo $data['uid'];?>" name="uid">
用户名:<input type="text" name="username" value="<?php echo $data['username'];?>"><br>
年龄:<input type="text" name="age" value="<?php echo $data['age'];?>"><br>
<input type="submit" value="提交">
<input type="reset" value="重填">
</form>
编辑功能
doedit.php
<?php
require('redis.php');
$uid = $_POST['uid'];
$username = $_POST['username'];
$age = $_POST['age'];
$a=$redis->hmset("user:".$uid,array("username"=>$username,"age"=>$age));
if($a){
header("location:list.php");
}else{
header("location:mod.php?id=".$uid);
}
加关注
addfans.php
<?php
//关注功能,建议用集合实现,因为集合元素唯一,并且可以容易求出两个用户粉丝之间交集与差集,进而进行好友推荐功能
$id = $_GET['id'];
$uid = $_GET['uid'];
require("redis.php");
$redis->sadd("user:".$uid.":following",$id);
$redis->sadd("user:".$id.":followers",$uid);
header("location:list.php");
很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的加群(点击→)677079770
php+redis实现注册、删除、编辑、分页、登录、关注等功能的更多相关文章
- C# 插入、删除Excel分页符
引言 对Excel表格设置分页对我们预览.打印文档时是很方便的,特别是一些包含很多复杂数据的.不规则的表格,为保证打印时每一页的排版美观性或者数据的前后连接的完整性,此时的分页符就发挥了极大的作用.因 ...
- Django电商项目---完成注册页面和用户登录day1
完成基本的创建项目.用户注册.登录.注销功能 创建Django项目,创建df_user的App 创建静态文件夹static(跟manage.py保持在同一级别下) 复制静态文件(css + image ...
- java在线聊天项目 swt可视化窗口Design 登录框注册按钮点击改变窗口大小——出现注册面板 实现打开登录框时屏幕居中
登录框注册按钮点击改变窗口大小——出现注册面板 首先用swt可视化设计登录窗口如下图: 此时窗口高度为578 没点击注册时高度为301(可自己定) 注意:注册用户的Jpanel 的border选择T ...
- DDD实战进阶第一波(十一):开发一般业务的大健康行业直销系统(实现经销商代注册用例与登录令牌分发)
前两篇文章主要实现了经销商代注册的仓储与领域逻辑.经销商登录的仓储与相关逻辑,这篇文章主要讲述经销商代注册的用例与经销商登录的查询功能. 一.经销商代注册用例 在经销商代注册用例中,我们需要传递经销商 ...
- 向redis中添加删除list列表
转: 向redis中添加删除list列表 2018年04月18日 15:44:54 luo_yu_1106 阅读数:4082 一.添加 向redis中添加队列有两种方式 1.lpush l是lef ...
- Redis Cluster 添加/删除 完整折腾步骤
Redis还是挺好玩的,今天测试了集群的添加.删除节点.重分配slot等.更深入的理解redis的游戏规则.步骤繁多,但是详细. 环境解释: 我是在一台Centos 6.9上测试的,各个redis节点 ...
- 基于SpringBoot+Redis的Session共享与单点登录
title: 基于SpringBoot+Redis的Session共享与单点登录 date: 2019-07-23 02:55:52 categories: 架构 author: mrzhou tag ...
- 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot)
title: 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot) date: 2019-07-30 14:06:29 categories: 架构 author: mrzhou ...
- 一文了解:Redis过期键删除策略
Redis过期键删除策略 Redis中所有的键都可以设置过期策略,就像是所有的键都可以上"生死簿",上了生死簿的键到时间后阎王就会叉掉这个键.同一时间大量的键过期,阎王就会忙不过来 ...
随机推荐
- JAVA基础知识注意事项
JAVA核心技术卷一 (第十版) 下面是需要注意的: 只有方法名和参数类型叫做方法的签名, 不同的返回类型值不能作为方法的签名.(4.6.1) 这是域与局部变量的主要不同点. 必须明确地初始化方法中的 ...
- 使用linq实现回调函数
通过输入的Id找到parentId是该Id的列表,然后找到parentId是上面那个Id的列表,以此类推,找到第一目录下所有子目录的的列表. 通过传入第一目录的Id,得到该目录下的所有子目录. 通过回 ...
- 前端技术之:如何在vuex状态管理action异步调用结束后执行UI中的方法
一.问题的起源 最近在做vue.js项目时,遇到了vuex状态管理action与vue.js方法互相通信.互操作的问题.场景如下图所示: 二.第一种解决方法 例如,我们在页面初始化的时候,需要从服务端 ...
- 使用float设置经典的网站前端结构(深入探讨)
.要是DIV的子元素宽度大于它自己的宽度,不管子元素有没有脱离文档流,子元素会在横向向右溢出. 关于高度:1.要是DIV的高度没有设定,其高度受“没有脱离文档流”的子元素影响.以下是DIV宽度为0的情 ...
- 安装requests遇到的坑
通过pip install requests命令安装,报错,提示“SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed”.百思不得其解,后 ...
- 大数据之路week01--自学之集合_1(Collection)
经过我个人的调查,发现,在今后的大数据道路上,集合.线程.网络编程变得尤为重要,为什么? 因为大数据大数据,我们必然要对数据进行处理,而这些数据往往是以集合形式存放,掌握对集合的操作非常重要. 在学习 ...
- 创建python的虚拟环境
为什么需要虚拟环境?如果你现在用Django 1.10.x写了个网站,然后你的领导跟你说,之前有一个旧项目是用Django 0.9开发的,让你来维护,但是Django 1.10不再兼容Django 0 ...
- LoadRunner具体流程
创建负载测试场景场景目标:模拟10个用户同时登陆.搜索航班.购买机票.查看航班路线并退出打开Controller并创建一个新场景1.打开HP LoadRunner2.打开Controller在Load ...
- 暑假CV-QKD的相关论文单词集(第一弹)
CV-QKD 连续变量-量子秘钥分发 Quadrature 正交 Photon 光子 Coherent 连续的,连贯的 Reconciliation 调解 Cryptograph ...
- spark-宽依赖和窄依赖
一.窄依赖(Narrow Dependency,) 即一个RDD,对它的父RDD,只有简单的一对一的依赖关系.也就是说, RDD的每个partition ,仅仅依赖于父RDD中的一个partition ...