【问题标题】:SQL & PHP Unique NumberSQL 和 PHP 唯一编号
【发布时间】:2016-09-06 10:24:06
【问题描述】:

我将使用带有 NFC 的 GET 方法来提取一些数据,我想用大量唯一数字填充数据库,我不介意它们中有关键字,例如

TOM05543
TOM04423
KEL04432
KAL43242

这样做并事先用这些唯一 ID 填充我的数据库的最佳方法是什么?

【问题讨论】:

  • 自动递增值不适合您吗?
  • @apokryfos 我希望这些数字是唯一的并且不容易被猜到,确保它们的安全并不是首要任务,因为它不会保存敏感数据。我只是希望它不是 1,2,3,4,5,6 等...同时保持它们简短并添加关键字以填充更多的唯一 ID
  • 你有没有尝试过 SO 用户的某些东西或想要代码。
  • 他们必须遵守任何特定的模式吗?取序列号的 md5 散列的前 X 个字符 + 一个盐可能适合,但它最终会成为一个随机 (-ish) 字母和数字字符串,而不是任何可读性强的字符串。
  • @RohanKumar 我对 PHP 还很陌生,我玩过很多东西,我只是想学习最佳实践,而不是养成错误的坏习惯;)

标签: php mysql sql uid


【解决方案1】:

创建一个 PHP 函数,它可以生成一个随机的 apha 数字代码并检查代码是否存在于 DB 表中。如果存在,则递归调用函数,直到生成唯一代码。并在 DB 表中插入唯一生成的记录。

<?php
//DB connection
$con=mysqli_connect("localhost","my_user","my_password","my_db");

//Function to generate unique alpha numeric code
function generateRandomNumer($con,$len=8){
    $randomString = substr(MD5(time()),$len);

    //Check newly generated Code exist in DB table or not.
    $query = "select * from table_name where col_name='".$randomString."'";
    $result=mysqli_query($con,$query);
    $resultCount=mysqli_num_rows($result);

    if($resultCount>0){
        //IF code is already exist then function will call it self until unique code has been generated and inserted in Db.
        generateRandomNumer($con);
    }else{
        //Unique generated code will be inserted in DB.
        mysqli_query($con,"INSERT INTO Persons (col_name) VALUES ('".$randomString."')");
    }
}

//Loop to insert number of unique code in DB.
//NUM_OF_RECORD_YOU_WANT_TO_INSERT define constant which contain number of unique codes you wants to insert in DB. 
for($i=0;$i<NUM_OF_RECORD_YOU_WANT_TO_INSERT;$i++){
    generateRandomNumer($con);
}
?>

【讨论】:

  • 太棒了!谢谢拉胡尔。
  • 很好的答案,但需要引用选择的随机字符串。这将引发语法错误。
  • @Fred-ii- 是的,谢谢.. 已更正。
  • 这很危险......没有后备可以防止脚本陷入无限循环。
【解决方案2】:

您可以使用http://guid.us/GUID/PHP 提供的解决方案:

function getGUID(){
    if (function_exists('com_create_guid')){
        return com_create_guid();
    }else{
        mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);// "-"
        $uuid = chr(123)// "{"
            .substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12)
            .chr(125);// "}"
        return $uuid;
    }
}

有关 GUID 的更多信息,请访问https://en.wikipedia.org/wiki/Globally_unique_identifier

我确实意识到 GUID 在技术上并不是唯一的,但是一个好的随机数生成器生成 2 个相同的 GUID 的机会大约是 2^122 分之一,这意味着如果你每 1 毫秒生成一个 GUID,你会遇到第一个在大约 10^26 年内复制。

这样做的好处是不需要检查数据库是否已经存在密钥,因为我们假设它不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多