目的:通过留言板(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)与互粉功能的更多相关文章

  1. Flask实战-留言板-安装虚拟环境、使用包组织代码

    Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...

  2. [js高手之路] vue系列教程 - 实现留言板todolist(3)

    通过前面两篇文章的的学习,我们掌握了vue的基本用法. 本文,就利用这些基础知识来实现一个留言板, 老外把他称之为todolist. 第一步.使用bootstrap做好布局 <!DOCTYPE ...

  3. flask实战-留言板-Web程序开发流程

    Web程序开发流程 在实际的开发中,一个Web程序的开发过程要设计多个角色,比如客户(提出需求).项目经理(决定需求的实现方式).开发者(实现需求)等,在这里我们假设自己是一个人全职开发.一般来说一个 ...

  4. Flask实战-留言板-使用Faker生成虚拟数据

    使用Faker生成虚拟数据 创建虚拟数据是编写Web程序时的常见需求.在简单的场景下,我们可以手动创建一些虚拟数据,但更方便的选择是使用第三方库实现.流行的python虚拟数据生成工具有Mimesis ...

  5. Flask实战-留言板-使用Bootstrap-Flask简化页面编写

    使用Bootstrap-Flask简化页面编写 扩展Bootstrap-Flask内置了可以快速渲染Bootstrap样式HTML组件的宏,并提供了内置的Bootstap资源,方便快速开发,使用它可以 ...

  6. Flask实战-留言板-使用Flask-DebugToolbar调试程序、Flask配置的两种组织形式

    使用Flask-DebugToolbar调试程序 扩展Flask-DebugToolbar提供了一系列调试功能,可以用来查看请求的SQL语句.配置选项.资源加载情况等信息.这些信息在开发时会非常有用. ...

  7. django实战-留言板

    对应github链接:https://github.com/pshyms/django/tree/master/liuyanban 第一天 1. 创建一个新项目后,新建一个应用程序 python ma ...

  8. 写一个简单的HTML留言板

    最近有点懒,没码什么字,防止遗忘,从头开始码,写一个简单的HTML留言板.包含两个文件,book.html还有style.css,放在同一目录下. book.html 1 <!DOCTYPE h ...

  9. JSP简易留言板

    写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...

随机推荐

  1. D14——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D14 20180919内容纲要: 1.html认识 2.常用标签 3.京东html 4.小结 5.练习(简易淘宝html) 1.html初识(HyperText ...

  2. 并发上下文控制包Context

    Context,是golang用来控制并发流程的库,它能方便的将主控程序的停止信号传递到goroutinue中,从而实现一键中止关联goroutinue的执行,除此之外,它还能将外部变量通过Value ...

  3. 弹出AlertDialog的时候报You need to use a Theme.AppCompat theme (or descendant) with this activity错误

    今天遇到一个bug,用百度地图的时候,我对上面的标注设置了点击监听,设置的相应的反应是弹出一个AlertDialog 记录一解决bug的历程 但是Dialog却没有弹出来,一看AS下面,报了这错,起初 ...

  4. 整理几个 RPC 框架

    gRPChttp://www.grpc.io/https://github.com/grpcMotan支撑微博千亿调用的轻量级RPC框架:Motanhttp://h2ex.com/820WangleW ...

  5. Mysql 锁机制和事务

    InnoDB 锁机制 InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得 ...

  6. 高可用Hadoop平台-集成Hive HAProxy

    1.概述 这篇博客是接着<高可用Hadoop平台>系列讲,本篇博客是为后面用 Hive 来做数据统计做准备的,介绍如何在 Hadoop HA 平台下集成高可用的 Hive 工具,下面我打算 ...

  7. 配置Codis-FE(管理界面)

    codis所有的配置项可以有两种方式进行管理:通过图形界面进行配置,另外一种通过命令配置. 1.通过配置文件生成codis-fe的启动文件a.通过codis的管理工具完成:/usr/local/cod ...

  8. Mysql字符串转换为整型

    使用Convert(字段名, 类型)方法 SELECT CONVERT(filedName, UNSIGNED INTEGER) ;

  9. “网红架构师”解决你的Ceph 运维难题

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Tstack发表于云+社区专栏 本文为长篇连续剧,将分多个篇幅发表,主要介绍了从动手部署环境到后期运营故障处理过程中常见的问题,内容由 ...

  10. Qt编写自定义控件12-进度仪表盘

    前言 进度仪表盘主要应用场景是标识一个任务进度完成的状况等,可以自由的设置范围值和当前值,为了美观还提供了四种指示器(圆形指示器/指针指示器/圆角指针指示器/三角形指示器),各种颜色都可以设置,其中的 ...