【问题标题】:Loop through to check if data is exist [duplicate]循环检查数据是否存在[重复]
【发布时间】:2023-03-09 23:45:01
【问题描述】:

我正在尝试创建一个令牌作为用户唯一推荐,因此我使用 md5 来生成它。但是,我听说有重复的可能性。然后,我尝试在每次通过以下方式生成令牌时,在将令牌插入数据库之前检查令牌。

  1. 从表中选择 token_column,其中 token_column != generated_token。
  2. 如果 generated_token 存在,则生成新的并再次检查表。
  3. 如果 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


【解决方案1】:

MD5 旧且不安全:https://security.stackexchange.com/questions/19906/is-md5-considered-insecure

请考虑转移到更安全的东西,比如 SHA 甚至更好的 password_hashhttp://php.net/manual/en/function.password-hash.php

【讨论】:

  • 是的,我知道,但我没有使用 md5 来散列密码。我只想为用户推荐生成一个随机密钥。就像他们邀请他们的朋友注册网站时一样,所以我将使用该推荐作为令牌。
  • 这不是问题,应该作为改进建议发布在 cmets 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2018-03-05
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多