【交流】PHP生成唯一邀请码

目录

前言:

1.随机生成,核对user表是否已存在

代码:

解析:

缺点:

2.建表建库,每次从表中随机抽取一条,用完时扩充

表结构

表视图

代码

解析

 缺点

结论:


前言:


目前使用了两种生成唯一邀请码的方法,都觉的不是很完美,有什么好的方法大姐可以交流一下,以下是我的代码逻辑:

1.随机生成,核对user表是否已存在


  • 代码:
function generateInvitationCode($i = 1)
{ $start = 10000;$end = 99999;// 如果循环了n次,仍然重复,则扩充范围// 以避免10000-99999的数字全部都被占用了,在成无限循环$multiple = bcdiv($i, 50);if($multiple >= 1) {$start = $start . str_repeat(0, $multiple); // 拼接$multiple个0$end = $end . str_repeat(9, $multiple); // 拼接$multiple个9}// 生成随机数$invitationCode = rand($start, $end); // 检查邀请码是否已经存在于数据库中while (checkInvitationCodeExists($invitationCode)) {// 如果邀请码已经存在,则重新生成$invitationCode = generateInvitationCode($i + 1);}return $invitationCode;
}
/*** 检查不否已存邀请码
*/
function checkInvitationCodeExists($invitationCode)
{$user = new User();$existingCode = $user->where('invitation_code', $invitationCode)->find();if ($existingCode){return true;}return false;
}
  • 解析:
  1. generateInvitationCode() 函数用于生成邀请码。它接受一个可选参数 $i,表示循环次数。如果未提供参数,则默认为 1。

  2. 在 generateInvitationCode() 函数中,我们首先定义了邀请码的范围,即从 10000 到 99999。

  3. 如果循环次数 $i 大于 50,则我们需要扩充邀请码的范围。我们使用 bcdiv() 函数计算 $i 除以 50 的商,并将结果存储在 $multiple 变量中。然后,我们使用 str_repeat() 函数将 $multiple 个 0 和 9 分别拼接到 $start 和 $end 变量中。

  4. 接下来,我们使用 rand() 函数在 $start 和 $end 之间生成一个随机数,并将其存储在 $invitationCode 变量中。

  5. 然后,我们使用 checkInvitationCodeExists() 函数检查邀请码是否已经存在于数据库中。如果邀请码已经存在,则我们递归调用 generateInvitationCode() 函数,并将 $i 参数加 1。

  6. 最后,我们返回生成的邀请码。

  7. checkInvitationCodeExists() 函数用于检查邀请码是否已经存在于数据库中。它接受一个参数 $invitationCode,表示要检查的邀请码。

  8. 在 checkInvitationCodeExists() 函数中,我们首先创建一个新的 User 对象。然后,我们使用 where() 方法查询数据库中是否存在与 $invitationCode 相匹配的邀请码。如果存在,则返回 true,否则返回 false

  • 缺点:

可能会造成多次的user表查询过于频繁

2.建表建库,每次从表中随机抽取一条,用完时扩充


  • 表结构
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for fa_activation_key
-- ----------------------------
DROP TABLE IF EXISTS `fa_activation_key`;
CREATE TABLE `fa_activation_key`  (`id` bigint(20) NOT NULL AUTO_INCREMENT,`status` int(2) NOT NULL DEFAULT 0 COMMENT '0未使用1已使用',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `idx`(`id`) USING BTREE,INDEX `statusx`(`status`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 110000 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
  • 表视图

  • 代码
/*** 查找一个随机邀请码*/
function findKey(){return Db::name('activation_key')->where('status',0)->orderRaw('rand()')->limit(1)->value('id');
}/*** 生成邀请码*/
function activationkey(){$key = findKey();if(empty($key)){// 如果邀请码用完了,进行库扩建$res = createActivationKey();if($res){// 扩建以后再随机获取一个$key = findKey();}}// 把邀请码改为已使用状态Db::name('activation_key')->where('id',$key)->update(['status'=>1]);return $key;
}/*** 建立邀请码库*/
function createActivationKey(){// 已使用完的邀请码库最大值,从这个值开始往上扩建$start = Db::name('activation_key')->order('id desc')->value('id');if(empty($start)){// 邀请码库为空从10000开始建库$start = 10000;}else{// 邀请码用完从最大值+1开始建库$start = bcadd($start,1);}// 每次扩充99999个邀请码$end = bcadd($start,99999);$arr = [];for ($i=$start; $i<=$end; $i++){$arr[] = ['id' => $i];}// 先把作废的删除掉Db::name('activation_key')->where('status', 1)->delete();// 批量插入邀请码Db::name('activation_key')->data($arr)->limit(100)->insertAll($arr);return true;
}
  • 解析
  1. findKey() 函数用于查找一个随机邀请码。它使用 Db::name('activation_key') 查询数据库中状态为 0 的邀请码,并按随机顺序排序,使用 limit(1) 限制只返回一个邀请码。最后,使用 value('id') 获取邀请码的 ID。

  2. activationkey() 函数用于生成邀请码。它首先调用 findKey() 函数查找一个随机邀请码。如果 findKey() 返回的邀请码为空,则表示邀请码库已经用完,需要扩建邀请码库。然后调用 createActivationKey() 函数进行扩建。如果扩建成功,再次调用 findKey() 函数查找一个随机邀请码。最后,将邀请码的状态更新为 1,表示已经使用过。

  3. createActivationKey() 函数用于建立邀请码库。它首先获取当前已使用过的邀请码库的最大值,如果没有找到,则从 10000 开始建立邀请码库。然后,每次扩充 99999 个邀请码。接下来,创建一个包含所有邀请码的数组,并先删除状态为 1 的邀请码。最后,批量插入邀请码。

  •  缺点

需要单独的建表建库,每次都需要调用mysql获取,比直接随机生成效率低,但相比第一种在后期会节约一定的时间,减少查询次数

结论:

        方法1,2各有优缺,但都不是很好的解决办法,目前没有想到其他的效率高的办法,有好思路的朋友欢迎指点交流一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解读Stable Video Diffusion:详细解读视频生成任务中的数据清理技术

Diffusion Models视频生成-博客汇总 前言:Stable Video Diffusion已经开源一周多了,技术报告《Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets》对数据清洗的部分描述非常详细,虽然没有开源源代码,但是博主正在尝试复现其中的操作。这篇…

医学影像PACS信息化数字平台源码

PACS系统对医院影像科意义重大&#xff0c;将业务量巨大的影像检验流程依托于信息化技术&#xff0c;对于进行信息化建设的医院而言&#xff0c;是十分必要的。 PACS系统源码&#xff0c;集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三…

包装类, 泛型---java

目录 一. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 二. 泛型 2.1什么是泛型 2.2泛型的引入 2.3 泛型类语法 2.4 泛型类的使用 2.5 裸类型(Raw Type)(了解) 2.6 泛型是如何编译的 2.7 泛型的上界 2.8 泛型方法 一. 包装类 在 Java 中&#xff0c;由于基本…

uniapp实战 —— 竖排多级分类展示

效果预览 完整范例代码 页面 src\pages\category\category.vue <script setup lang"ts"> import { getCategoryTopAPI } from /apis/category import type { CategoryTopItem } from /types/category import { onLoad } from dcloudio/uni-app import { compu…

Nacos 配置加密功能也太鸡肋了吧,有种更好的方式

大家好&#xff0c;我是风筝&#xff0c;微信搜「古时的风筝」&#xff0c;更多干货 当项目中用了 Nacos 做配置中心&#xff0c;是不是所有的配置都放到里面呢&#xff0c;大部分时候为了省事和统一&#xff0c;系统所有的配置都直接放在里面了&#xff0c;有时候&#xff0c…

什么是自动化测试框架?常用的自动化测试框架有哪些?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

Redis相关知识

yum安装redis 使用以下命令&#xff1a;直接将redis安装到Linux服务器&#xff08;Xshell&#xff09;中 yum -y install redis 启动redis 使用以下命令&#xff0c;以后台运行方式启动redis redis-server /etc/redis.conf & 操作redis 使用以下命令启动redis客户端 redis-…

RFID在新能源工厂大放异彩

RFID在新能源工厂大放异彩 我国在十四五规划中提出了建设绿色低碳发展的目标&#xff0c;新能源产业成为了国家发展的重点领域之一&#xff0c;开始大力支持各种新能源厂商发展。各个厂商之间不仅比产品、比技术。也比生产想要降本增效&#xff0c;为了实现这一目标&#xff0…

MBD Introduction

介绍 MATLAB是MathWorks公司的商业数学软件&#xff0c;应用于科学计算、可视化以及交互式程序设计等高科技计算环境。Simulink是MATLAB中的一种可视化仿真工具。 Simulink是一个模块图环境&#xff0c;用于多域仿真以及基于模型的设计。它支持系统设计、仿真、自动代码生成以…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

算法Day26 数位统计

数位统计 Description 给你一个整数n&#xff0c;统计并返回各位数字都不同的数字x的个数&#xff0c;其中0 ≤ x < 10^n。 Input 输入整数n 0≤n≤13 Output 输出整数个数 Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] ar…

Epoll服务器(ET工作模式)

目录 Epoll ET服务器设计思路Connection类TcpServer类 回调函数Accepter函数Recever函数Sender函数Excepter函数 事件处理套接字相关接口封装运行Epoll服务器 Epoll ET服务器 设计思路 在epoll ET服务器中&#xff0c;我们需要处理如下几种事件&#xff1a; 读事件&#xff…

基于javeweb实现的图书借阅管理系统

一、系统架构 前端&#xff1a;jsp | js | css | jquery 后端&#xff1a;servlet | jdbc 环境&#xff1a;jdk1.7 | mysql | tocmat 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 图书管理 04. 读者管理 05. 图书分类管理 06. 图书借阅信息 07. 图书归还信…

NLP项目实战01--电影评论分类

介绍&#xff1a; 欢迎来到本篇文章&#xff01;在这里&#xff0c;我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言&#xff0c;我们将关注情感分析任务&#xff0c;即通过分析电影评论的情感来判断评论是正面的、负面的。 展示&#xff1a; 训练展示如下…

图像叠加中文字体

目录 1) 前言2) freetype下载3) Demo3.1) 下载3.2) 编译3.3) 运行3.4) 结果3.5) 更详细的使用见目录中说明 4) 积少成多 1) 前言 最近在做图片、视频叠加文字&#xff0c;要求支持中文&#xff0c;基本原理是将图片或视频解码后叠加文字&#xff0c;之后做图片或视频编码即可。…

ASP.NET Core概述-微软已经收购了mono,为什么还搞.NET Core呢

一、.NET Core概述 1、相关历程 .NET在设计之初也是考虑像Java一样跨平台&#xff0c;.NET Framework是在Windows下运行的&#xff0c;大部分类是可以兼容移植到Linux下&#xff0c;但是没有人做这个工作。 2001年米格尔为Gnome寻找桌面开发技术&#xff0c;在研究了微软的.…

数据库版本管理框架-Flyway(从入门到精通)

一、flyway简介 Flyway是一个简单开源数据库版本控制器&#xff08;约定大于配置&#xff09;&#xff0c;主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL&#xff08;PL/SQL、T-SQL&#xff09;方式和Java方式&#xff0c;支持命令行客户端等&am…

TCP对数据的拆分

应用程序的数据一般都比较大&#xff0c;因此TCP会按照网络包的大小对数据进行拆分。 当发送缓冲区中的数据超过MSS的长度&#xff0c;数据会被以MSS长度为单位进行拆分&#xff0c;拆分出来的数据块被放进单独的网路包中。 根据发送缓冲区中的数据拆分情况&#xff0c;当判断…

JWT介绍及演示

JWT 介绍 cookie(放在浏览器) cookie 是一个非常具体的东西&#xff0c;指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把cookie以kv形式保存到某个目录下的文本…

JavaScript 金额元转化为万

function dealNum(price){if (price 0) {return 0元}const BASE 10000const decimal 0const SIZES ["", "万", "亿", "万亿"];let i undefined;let str "";if (price) {if ((price > 0 && price < BASE…