【发布时间】:2023-03-09 23:45:01
【问题描述】:
我正在尝试创建一个令牌作为用户唯一推荐,因此我使用 md5 来生成它。但是,我听说有重复的可能性。然后,我尝试在每次通过以下方式生成令牌时,在将令牌插入数据库之前检查令牌。
- 从表中选择 token_column,其中 token_column != generated_token。
- 如果 generated_token 存在,则生成新的并再次检查表。
- 如果 generated_token 不存在,则将其插入数据库。
控制器
private function generateToken(){
$token = strtoupper(md5(rand()));
$sql = 'SELECT id, token FROM UserReferral WHERE token != '.$token;
$is_exist = $this->Database_model->readOneQuery($sql);
if(!empty($is_exist)){
// Insert data into database
} else {
$token = strtoupper(md5(rand()));
// check database again to see if the token is already exist
}
}
型号
function readOneQuery($sql){
$r = $this->db->query($sql)->row_array();
return !empty($r) ? $r : false;
}
如果我这样做,检查似乎没有结束。有没有更好的方法可以用来做数据检查?
【问题讨论】:
-
这个问题缺少你的代码方法。 How to Ask / minimal reproducible example
-
老实说,当我的问题与指定的职位完全不同时,我仍然不明白为什么我的问题被标记为重复。我在问如何确保每次生成新令牌时数据库中没有重复数据。不是插入数据库时如何使用双引号。
-
作为重复链接的问题的答案可能最终无法解决您的问题,但是,md5 是一个字符串,因此必须用引号括起来。由于此处不涉及客户数据,因此在这种情况下,无需准备好的语句即可安全地执行此操作。
-
使用
INSERT ... VALUES子句或WHERE子句没有区别。字符串是字符串,并且在 SQL 中出现的任何地方都被引用。 -
"SELECT id, token FROM UserReferral WHERE token != '$token'";如果这还不能解决您的问题,请让我投票支持重新开放。在这种情况下,编辑添加引号的问题并更详细地描述观察到的行为,添加错误日志等。写一个包含@Quasimodo'sclone的评论来通知我。或者更好的是,您可以使用代码的更正版本打开一个新问题。
标签: php database codeigniter md5