php+redis实战留言板(todolist)与互粉功能
目的:通过留言板(todolist)与互粉功能,掌握php操作redis的方法
相关数据操作命令
1,keys * 查看数据库所有的key
2,type + key: 如 type uid 查看数据key的类型
3,批量删除key, 如redis-cli keys "auth:*" | xargs redis-cli del 这行命令在linux终端执行, 删除 auth: 开头的所有key
4。。。。其他基本常用命令, 参照百度或者redis手册
0,连接redis
<?php $redis = new Redis();
$redis->connect( "127.0.0.1", 6379 );
$redis->auth( "ghostwu" ); ?>
1、注册功能( reg.php )
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>用户注册页面</title>
</head>
<body>
<h3>用户注册</h3>
<form action="do_reg.php" method="post">
<p>
用户名: <input type="text" name="user" />
</p>
<p>
密码:<input type="password" name="pwd" />
</p>
<p>
年龄: <input type="text" name="age" />
</p>
<p>
<input type="submit" value="注册" />
<input type="reset" value="重置" />
</p>
</form>
</body>
</html>
2、处理注册( do_reg.php )
<?php
require "./redis_connect.php"; $user = $_POST['user'];
$pwd = md5( $_POST['pwd'] );
$age = $_POST['age']; $uid = $redis->get( "username:" . $user );
if( empty( $uid ) ) {
$uid = $redis->incr( "userid" );
$redis->hMset( "user:" . $uid, array( "uid" => $uid, "user" => $user, "pwd" => $pwd, "age" => $age ) );
$redis->rpush( "uid", $uid );
$redis->set( "username:" . $user, $uid );
header( "Location:./list.php" );
exit();
}else {
die( "user already exists " );
} ?>
3,登录(login.php)
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>用户登录页面</title>
</head>
<body>
<?php
require "./redis_connect.php";
if( isset( $_POST['login'] ) || $_POST['login'] == '登录' ) {
$user = $_POST['user'];
$pwd = $_POST['pwd'];
$uid = $redis->get( "username:" . $user );
if( !empty( $uid ) ) {
$db_pwd = $redis->hget( "user:" . $uid, "pwd" );
if( md5( $pwd ) == $db_pwd ) {
$auth = md5( time() . $user . rand() );
$redis->set( "auth:" . $auth, $uid );
setcookie( "auth", $auth, time() + 86400 );
header( "Location:./list.php" );
}else {
echo "<script>alert('用户密码错误');</script>";
}
}else {
echo "<script>alert('该用户不存在');</script>";
}
}
?>
<h3>用户登录</h3>
<form action="" method="post">
<p>
用户名: <input type="text" name="user" />
</p>
<p>
密码:<input type="password" name="pwd" />
</p>
<p>
<input type="submit" value="登录" name="login" />
</p>
</form>
</body>
</html>
4,列表页( list.php )
<meta charset="utf-8" />
<?php
require( "./redis_connect.php" );
?>
<a href="./reg.php">注册</a>
<?php
if( !empty( $_COOKIE['auth'] ) ) {
$login_uid = $redis->get( "auth:" . $_COOKIE['auth'] );
$userName = $redis->hget( "user:" . $login_uid, "user" );
?>
欢迎您:<?php echo $userName; ?> | <a href="./logout.php">退出</a>
<?php
}else {
?>
<a href="./login.php">登录</a>
<?php
}
?>
<?php
$total = $redis->lsize( "uid" );
$pageSize = 3;
$p = isset( $_GET['p'] ) ? $_GET['p'] : 1;
$page = ceil( $total / $pageSize );
$uids = $redis->lrange( "uid", ( $p - 1 ) * $pageSize, ( ( $p - 1 ) * $pageSize + $pageSize - 1 ) );
$userList = array();
foreach( $uids as $uid ) {
$userList[] = $redis->hgetall( "user:" . $uid );
}
?> <h3>列表数据</h3>
<table>
<tr>
<th>uid</th>
<th>用户名</th>
<th>年龄</th>
<th>操作</th>
</tr>
<?php
foreach( $userList as $user ) {
?>
<tr>
<td><?php echo $user['uid']; ?></td>
<td><?php echo $user['user']; ?></td>
<td><?php echo $user['age']; ?></td>
<td>
<a href="delete.php?uid=<?php echo $user['uid']; ?>">删除</a>
<a href="edit.php?uid=<?php echo $user['uid']; ?>">修改</a>
<?php
if( !empty( $_COOKIE['auth'] ) && ( $login_uid != $user['uid'] ) ) {
?>
<a href="./do_fans.php?login_id=<?php echo $login_uid; ?>&uid=<?php echo $user['uid']; ?>">关注</a>
<?php
}
?>
</td>
</tr>
<?php
}
?>
<!--分页开始-->
<tr>
<td colspan="4">
<?php
for( $i = 1; $i <= $page; $i++ ) {
?>
<a href="?p=<?php echo $i; ?>"><?php echo $i; ?></a>
<?php
}
?>
</td>
</tr>
</table> <h3>我关注了谁</h3>
<table>
<tr>
<th>uid</th>
<th>用户名</th>
<th>年龄</th>
</tr>
<?php
$myWatchIds = $redis->smembers( "user:" . $login_uid . ":watch" );
foreach( $myWatchIds as $wId ){
$watchList = $redis->hgetall( "user:" . $wId );
?>
<tr>
<td><?php echo $watchList['uid']; ?></td>
<td><?php echo $watchList['user']; ?></td>
<td><?php echo $watchList['age']; ?></td>
</tr>
<?php
}
?>
</table>
<h3>我的fans</h3>
<table>
<tr>
<th>uid</th>
<th>用户名</th>
<th>年龄</th>
</tr>
<?php
$myFlowerIds = $redis->smembers( "user:" . $login_uid . ":flowers" );
foreach( $myFlowerIds as $fId ){
$flowerList = $redis->hgetall( "user:" . $fId );
?>
<tr>
<td><?php echo $flowerList['uid']; ?></td>
<td><?php echo $flowerList['user']; ?></td>
<td><?php echo $flowerList['age']; ?></td>
</tr>
<?php
}
?>
</table>
5,编辑 ( edit.php)
<meta charset="utf-8" />
<?php
require "./redis_connect.php";
$uid = intval( $_GET['uid'] );
if( empty( $uid ) ){
header( "Location:./list.php" );
exit();
}
$userInfo = $redis->hgetall( "user:" . $uid );
?> <form action="do_edit.php" method="post">
<p>
用户名: <input disabled type="text" name="user" value="<?php echo $userInfo['user']; ?>" />
</p>
<p>
年龄:<input type="text" name="age" value="<?php echo $userInfo['age']; ?>" />
</p>
<p>
<input type="submit" value="修改" name="edit" />
</p>
<input type="hidden" value="<?php echo $userInfo['uid']; ?>" name="uid" />
</form>
6,处理更新( do_edit.php )
<?php
require( "./redis_connect.php" );
$uid = intval( $_POST['uid'] );
$age = $_POST['age']; if( empty( $uid ) ) {
header( "Location:./edit.php" );
exit();
}
$res = $redis->hmset( "user:". $uid, array( "age" => $age ) );
if( $res ) {
header( "Location:./list.php" );
}else {
header( "Location:./edit.php" );
}
exit();
?>
7,删除(delete.php)
<?php
require( "./redis_connect.php" );
$uid = intval( $_GET['uid'] );
if( empty( $uid ) ) {
header( "Location:./list.php" );
exit();
}
$userName = $redis->get( "user:" . $uid );
$redis->del( "user:" . $uid );
$redis->del( "username:" . $userName );
$redis->lrem( "uid", $uid );
header( "Location:./list.php" );
?>
8,注销( logout.php )
<?php
require "./redis_connect.php";
if( isset( $_COOKIE['auth'] ) ){
$redis->del( "auth:" . $_COOKIE['auth'] );
setcookie( "auth", "", time() - 86400 );
header( "Location:./list.php" );
exit();
}
?>
9,互粉( do_fans.php )
<?php
require "./redis_connect.php";
$login_id = intval( $_GET['login_id'] );
$uid = intval( $_GET['uid'] );
if( empty( $login_id ) || empty( $uid ) ) {
header( "Location:./list.php" );
exit();
}
//当前用户关注
$redis->sadd( "user:" . $login_id . ":watch", $uid );
//被当前用户关注
$redis->sadd( "user:" . $uid . ":flowers", $login_id );
header( "Location:./list.php" );
exit();
?>
php+redis实战留言板(todolist)与互粉功能的更多相关文章
- Flask实战-留言板-安装虚拟环境、使用包组织代码
Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...
- [js高手之路] vue系列教程 - 实现留言板todolist(3)
通过前面两篇文章的的学习,我们掌握了vue的基本用法. 本文,就利用这些基础知识来实现一个留言板, 老外把他称之为todolist. 第一步.使用bootstrap做好布局 <!DOCTYPE ...
- flask实战-留言板-Web程序开发流程
Web程序开发流程 在实际的开发中,一个Web程序的开发过程要设计多个角色,比如客户(提出需求).项目经理(决定需求的实现方式).开发者(实现需求)等,在这里我们假设自己是一个人全职开发.一般来说一个 ...
- Flask实战-留言板-使用Faker生成虚拟数据
使用Faker生成虚拟数据 创建虚拟数据是编写Web程序时的常见需求.在简单的场景下,我们可以手动创建一些虚拟数据,但更方便的选择是使用第三方库实现.流行的python虚拟数据生成工具有Mimesis ...
- Flask实战-留言板-使用Bootstrap-Flask简化页面编写
使用Bootstrap-Flask简化页面编写 扩展Bootstrap-Flask内置了可以快速渲染Bootstrap样式HTML组件的宏,并提供了内置的Bootstap资源,方便快速开发,使用它可以 ...
- Flask实战-留言板-使用Flask-DebugToolbar调试程序、Flask配置的两种组织形式
使用Flask-DebugToolbar调试程序 扩展Flask-DebugToolbar提供了一系列调试功能,可以用来查看请求的SQL语句.配置选项.资源加载情况等信息.这些信息在开发时会非常有用. ...
- django实战-留言板
对应github链接:https://github.com/pshyms/django/tree/master/liuyanban 第一天 1. 创建一个新项目后,新建一个应用程序 python ma ...
- 写一个简单的HTML留言板
最近有点懒,没码什么字,防止遗忘,从头开始码,写一个简单的HTML留言板.包含两个文件,book.html还有style.css,放在同一目录下. book.html 1 <!DOCTYPE h ...
- JSP简易留言板
写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...
随机推荐
- 调用notify()后,当前线程执行完synchronized块中的所有代码才会释放锁
package com.pinnet.test; public class Demo { public static void main(String[] args) { Demo demo = ne ...
- EF 通过修改模版 更改生成实体名称
直接修改T4 模版中对应关系就可以了,我这里是去掉了表中的“_”
- MySQL 排名统计(常用功能函数)
select actor_id,@curr_cnt:=cnt as cnt , ,@rank) as rank, @prev_cnt:=@curr_cnt as dummy from( select ...
- iOS开发-从16进制颜色中获取UIColor
目前iOS中设置UIColor只能使用其枚举值.RGB等方法,不能直接将常用的16进制颜色值直接转为UIColor对象,所以写了点代码,将16进制颜色值转为UIColor. 代码如下, //头文件#i ...
- 基于cytoscape.js 、 d3.js实现的关系图谱初级版本
前面的文章已经介绍了cytoscape.js . d3.js的安装及简单demo,现在展示从html页面转移到vue项目下的最初版的demo 效果图: 代码如下: <template> & ...
- Python--CSV模块
CSV csv文件格式是一种通用的电子表格和数据库导入导出格式 简介 Python csv模块封装了常用的功能,使用的简单例子如下: 写入 # 写入csv文件 import csv csvfile = ...
- 线程中的同步辅助类Exchanger
Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的. 允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法 ...
- 全网最详细的Windows系统里PLSQL Developer 64bit的下载与安装过程(图文详解)
不多说,直接上干货! ORACLE是数据库,有客户端和服务器: 其,具体下载,可见http://www.oracle.com/technetwork/database/enterprise-editi ...
- Nginx实现tomcat集群进行负载均衡
一.背景 随着业务量和用户数量的激增,单一的tomcat部署应用已经无法满足性能需求,而且对于每次发布项目期间服务不可用的问题也凸显,既然出现了这个问题,那么我们本文就借助nginx来完美的解决这个问 ...
- ibatis in的用法
<dynamic-mapped-statement name="queryLabelservicecodeLogSize" result-class="java.l ...