【交流】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.pswp.cn/news/209618.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209618.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209618.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LinuxBasicsForHackers筆記 -- 壓縮和歸檔

壓縮分為有損或無損。有損壓縮對于減小文件大小非常有效&#xff0c;但會丟失信息的完整性。換句話說&#xff0c;壓縮后的文件與原始文件并不完全相同。 這種類型的壓縮非常適合圖形、視頻和音頻文件&#xff0c;文件中的微小差異幾乎不會被注意到。 本章重點介紹這種無損壓縮…

解讀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…

vue指令

v-text 更新元素的 textContent。如果要更新部分的 textContent&#xff0c;需要使用 {{ Mustache }} 插值。 <span v-text"msg"></span> <!-- 和下面的一樣 --> <span>{{msg}}</span>v-html 更新元素的 innerHTML。注意&#xff1a;內…

基于高通MSM8953平臺android9.0的GPIO驅動開發

2.1、注冊設備&#xff1a; 2.1.1、添加編譯選項&#xff1a; 1&#xff09;、修改kernel/msm-4.9/drivers/leds下Makefile文件&#xff1a; obj-$(CONFIG_LED_GPIO) led_gpio.o 2&#xff09;、修改kernel/msm-4.9/drivers/leds下Kconfig文件&#xff1a; config LED_GPIO…

Java實現歸并排序算法

歸并排序算法 &#xff08;1&#xff09;基本思想&#xff1a;歸并&#xff08;Merge&#xff09;排序法是將兩個&#xff08;或兩個以上&#xff09;有序表合并成一個新的有序表&#xff0c;即把待排序序列分為若干個子序列&#xff0c;每個子序列是有序的。然后再把有序子序…

蛋白質序列FeatureDict轉化為TensorDict

主要轉化語句為 tensor_dict {k: tf.constant(v) for k, v in np_example.items() if k in features_metadata}。 增加了特征名稱的選擇&#xff0c;不同特征維度&#xff0c;特征數的判斷等。 from typing import Dict, Tuple, Sequence, Union, Mapping, Optional #import …

postgresql_conf中常用配置項

在 PostgreSQL 的 postgresql.conf 配置文件中&#xff0c;有許多常用的配置項&#xff0c;這些配置項可以根據特定需求和性能優化進行調整。以下是一些常用的配置項及其作用&#xff1a; 1. shared_buffers 用于設置 PostgreSQL 實例使用的共享內存緩沖區大小。增加此值可以…

游戲被攻擊該怎么辦?游戲盾該如何使用,游戲盾如何防護攻擊

隨著Internet互聯網絡帶寬的增加和多種DDOS黑客工具的不斷發布&#xff0c;DDOS拒絕服務攻擊的實施越來越容易&#xff0c;DDOS攻擊事件正在成上升趨勢。出于商業競爭、打擊報復和網絡敲詐等多種因素&#xff0c;導致很多商業站點、游戲服務器、聊天網絡等網絡服務商長期以來一…

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…

一個Oracle Application Container的實例

本例基本涵蓋了Oracle Multitenant功能中application container的以下內容&#xff1a; 創建application container/root創建application PDB創建application SEED在application root中安裝application在application root中升級application同步application 整個過程如下 創建…

Epoll服務器(ET工作模式)

目錄 Epoll ET服務器設計思路Connection類TcpServer類 回調函數Accepter函數Recever函數Sender函數Excepter函數 事件處理套接字相關接口封裝運行Epoll服務器 Epoll ET服務器 設計思路 在epoll ET服務器中&#xff0c;我們需要處理如下幾種事件&#xff1a; 讀事件&#xff…