PHP -生成序列号


PHP - generate serial number

谁能告诉我是否有更好的方法?

  • 我正试图生成一个序列号(从一个帖子上取的函数)本网站)
  • 检查我的数据库,如果这个序列存在,如果它存在,重新生成另一个
  • 插入唯一的序列到Db

    function GenerateSerial() {
    $chars = array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
    $sn = '';
    $max = count($chars)-1;
    for($i=0;$i<20;$i++){
     $sn .= (!($i % 5) && $i ? '-' : '').$chars[rand(0, $max)];
      }
    return $sn;
     }
    
     // Generate SN
    $serial =  GenerateSerial() ;
    
    // Check if it exists, then re-generate
     function checkifSerialexist () {
     $statement = $dbh->prepare("SELECT `id` FROM `table` WHERE `SN` = :existSN");
     $statement->bindParam(':existSN',  $serial, PDO::PARAM_STR); 
     $statement->execute();
     $statement->setFetchMode(PDO::FETCH_ASSOC);
     $result = $statement->fetchAll();
     $serial_count = $statement->rowCount();
     if ($serial_count > 0) {
     $serial =  GenerateSerial() ;
    } 
    
     return $serial ;   
    }
    
    //Now insert unique SN
    $stmt = $dbh->prepare("INSERT INTO `table` (SN) VALUES (:sn)");
    $stmt->bindParam(':sn', $serial, PDO::PARAM_STR);
    ect....
    

您没有调用您的checkifSerialexist()函数,也没有发送串行(和数据库连接…)作为参数。

应该是这样的:

$serial = GenerateSerial() ;
while (checkifSerialexist($dbh, $serial))
{
   $serial = GenerateSerial() ;
}
function checkifSerialexist ($dbh, $serial)
{
  $statement = $dbh->prepare("SELECT `id` FROM `table` WHERE `SN` = :existSN");
  $statement->bindParam(':existSN',  $serial, PDO::PARAM_STR); 
  $statement->execute();
  $statement->setFetchMode(PDO::FETCH_ASSOC);
  $result = $statement->fetchAll();
  return (count($result) > 0);   
}

使用提供的代码很难说,但是我通常的惟一生成逻辑如下:

$serial = genSerial();
while(!serialUnique($serial)) {
  $serial = genSerial();
}
save($serial);

我总是让我的检查函数(例如serialUnique)返回一个布尔值。

检查序列是否存在的函数似乎没有您之前生成的序列。

取决于你的函数在哪里,它可能没有访问变量的权限。将其作为参数传递,并从checkIfSerialExists函数返回true或false。

 function checkifSerialexist ($serial) {
 $statement = $dbh->prepare("SELECT `id` FROM `table` WHERE `SN` = :existSN");
 $statement->bindParam(':existSN',  $serial, PDO::PARAM_STR); 
 $statement->execute();
 $statement->setFetchMode(PDO::FETCH_ASSOC);
 $result = $statement->fetchAll();
 $serial_count = $statement->rowCount();
 if ($serial_count > 0) {
   return true;
 } else {
   return false;
 }   

}

然后从你想要添加到数据库的地方,做一些像

$serial =  GenerateSerial() ;
if(checkifSerialexist($serial)) {
  //Now insert unique SN
  $stmt = $dbh->prepare("INSERT INTO `table` (SN) VALUES (:sn)");
  $stmt->bindParam(':sn', $serial, PDO::PARAM_STR);
  //ect....
}
echo implode('-', str_split(substr(strtoupper(md5(microtime().rand(1000, 9999))), 0, 20), 5));

这只是一种简单的方法,如果需要,您可以应用更安全的方法,您可以使用sha1(), microtime()与其他函数和唯一用户数据相结合,并检查您的数据库中是否存在串行生成…更安全一点,比如:

$user_mail = 'customer@domain.com';
function salt($leng = 22) {
    return substr(sha1(mt_rand()), 0, $leng);  
}
function serial(){
    $hash = md5($user_mail . salt());
    for ($i = 0; $i < 1000; $i++) {
        $hash = md5($hash);
    }
    return implode('-', str_split(substr(strtoupper($hash), 0, 20), 5))
}

此出口:XXXX-XXXX-XXXX-XXXX序列模式