谁能告诉我是否有更好的方法?
- 我正试图生成一个序列号(从一个帖子上取的函数)本网站)
- 检查我的数据库,如果这个序列存在,如果它存在,重新生成另一个
-
插入唯一的序列到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序列模式