目的:通过留言板(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. Mysql 经典案例总结(学习之前需要有Mysql基础)01

    Sql 经典案例 gb 4.2 ** 1 检索记录 (1) 主要介绍 Sql的基本SELECT查询语句 使用 SELECT * from 表 查询数据 查询该表的每一列数据 * 代表所有的意思 也可以 ...

  2. Python 读取文件中unicode编码转成中文显示问题

    Python读取文件中的字符串已经是unicode编码,如:\u53eb\u6211,需要转换成中文时有两种方式 1.使用eval: eval("u"+"\'" ...

  3. centoos 安装hadoop集群

    环境准备 两台centoos系统服务器 H30(192.168.3.238) H31(192.168.3.237) H30为master,H31为slave,slave后续还可以再加机器: 先通过xs ...

  4. Liferay7 BPM门户开发之2: BPMN 2.0 规范入门 (Activiti BPMN extensions)

    Liferay最大的问题是BPM弱,如果做企业开发,BPM必不可少,所以直入主题,做个BPMN2入门. 本文参考地址:http://activiti.org/userguide/index.html# ...

  5. 阿里云RDS数据库备份文件恢复到本地数据库

    参考这里:https://help.aliyun.com/knowledge_detail/41817.html 第4.2步要多注释掉一些(应该根据实际报错来注释): [mysqld] innodb_ ...

  6. 在MVC3中修改KindEditor实现上传图片到指定文件夹

    KindEditor编辑器默认上传的图片文件夹,是根据系统时间自动生成的,图片是自动上传到这些文件夹里面,无法选择.如果要上传图片到指定文件夹,像相册一样管理图片,则需要扩展KindEditor编辑器 ...

  7. ThreadLocal是否会引发内存泄露的分析 good

    这篇文章,主要解决一下疑惑: 1. ThreadLocal.ThreadLocalMap中提到的弱引用,弱引用究竟会不会被回收? 2. 弱引用什么情况下回收? 3. JAVA的ThreadLocal和 ...

  8. JavaScript初探三

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. centos 修改时区

    # date 2014年 07月 22日 星期二 :: EDT # cat /etc/sysconfig/clock -------------------------- ZONE="Ame ...

  10. linux上搭建ftp、vsftp, 解决访问ftp超时连接, 解决用户指定访问其根目录,解决ftp主动连接、被动连接的问题

    linux上搭建ftp 重要 解决如何搭建ftp         解决用户指定访问其根目录         解决访问ftp超时连接         解决ftp主动连接.被动连接的问题 1.安装ftp ...