有人可以告诉我是否有更好的方法吗?
将唯一序列插入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....
答案 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序列模式