PHP - 生成序列号

时间:2014-03-12 15:32:10

标签: php

有人可以告诉我是否有更好的方法吗?

  • 我正在尝试生成序列号(从帖子中获取的功能) 这个网站)
  • 检查我的数据库中是否存在此序列号,如果存在,则重新生成另一个
  • 将唯一序列插入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....
    

5 个答案:

答案 0 :(得分:1)

您没有调用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);   
}

答案 1 :(得分:1)

用提供的代码很难说,但我通常的独特生成逻辑如下:

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

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

答案 2 :(得分:1)

看起来您的函数检查序列是否存在没有您之前生成的序列。

根据您的功能所在,它可能无法访问该变量。将其作为参数传递,并从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....

}

答案 3 :(得分:1)

echo implode('-', str_split(substr(strtoupper(md5(microtime().rand(1000, 9999))), 0, 20), 5));

答案 4 :(得分:0)

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

$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序列模式

相关问题