gpt4 book ai didi

php - 如何生成凭证代码,检查数据库是否唯一,如果不是则生成新的

转载 作者:行者123 更新时间:2023-11-29 01:37:39 25 4
gpt4 key购买 nike

我的脚本中存在循环问题。我花了很多时间试图修复它,但我仍然不知道如何解决这个问题。我需要你的帮助和建议。

我的目标是创建一个凭证代码生成器脚本,用户可以在其中输入要生成的凭证代码的数量。

然后,脚本将在数据库表中生成所需数量的凭证,并检查每个凭证代码是否唯一 - 如果不是,将生成一个新的凭证代码,脚本将继续执行,直到所有凭证都是唯一的保存。

问题是,如果数据库中已经存在凭证,则需要生成一个新凭证。如果这个新生成的凭证代码已经在数据库中,则需要再次检查它,如果它是唯一的,它将被保存到数据库中,如果不是,则该过程将再次进行。这就是环路问题所在。我希望你明白我的意思。

顺便说一句,优惠券代码是这样的格式:XXXX-XXXX-XXXX(仅限大写字母)

这是我目前的代码:

include 'conn.php';

function WriteCSV($flname,$values) {
$Filename = "./vouchers/$flname.csv";
$fh = fopen($Filename, 'a') or die("can't open file");
$filecontent = $values;
$filecontent .= PHP_EOL;
fwrite($fh,$filecontent);
fclose($fh);
}

function generateCode(){
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$res = "";
for ($i = 0; $i < 4; $i++) {
$res .= $chars[mt_rand(0, strlen($chars)-1)];
}
return $res;
}

function generateVCode(){
$c1 = generateCode();
$c2 = generateCode();
$c3 = generateCode();
$voucher = "$c1-$c2-$c3";

return $voucher;
}

function searchDB($con, $voucher){
$rs = mysqli_query($con,"SELECT count(*) AS cnt FROM vouchers WHERE vouchercode = '$voucher'");
$row = mysqli_fetch_assoc($rs);
$cnt = $row['cnt'];

if($cnt > 0){
return '1';
} else {
return '0';
}
}

function checkVoucher($con, $voucher, $vsource, $expiry, $today, $vnum, $vprice){

$dbres = searchDB($con, $voucher);

if($dbres == '1'){ //voucher found in db
$val = '0';
$voucher = generateVCode(); //generate a new voucher
checkVoucher($con, $voucher, $vsource, $expiry, $today, $vnum, $vprice); //repeat the process
} else { // voucher is unique
mysqli_query($con, "INSERT INTO vouchers (vouchercode, source, price, expires, generated) VALUES ('$voucher', '$vsource', '$vprice', '$expiry', '$today')");
$flname = "$vsource - ".date('d M Y')." ($vnum vouchers)";
WriteCSV($flname,$voucher);

$val = '1';
}

return $val;
}

$vnum = $_POST['vouchernum'];
$vsource = $_POST['source'];
$vprice = $_POST['amt'];
$expdate = $_POST['expdate'];
$expiry = $_POST['voucherexpiry'];
$today = date('Y-m-d');
$expconv = date('Y-m-d',strtotime("$expiry"));
$expfive = date('Y-m-d',strtotime("$expiry +5 years"));

for ($x = 1; $x <= $vnum; $x++) {
$vouchercode = generateVCode();

if($expdate == "no"){
$expiry = $expfive;
} else {
$expiry = $expconv;
}

do {

$result = checkVoucher($con, $vouchercode, $vsource, $expiry, $today, $vnum, $vprice);

} while ($result != '1');

header("location: index.php?s=1");
}

顺便说一句,如果您对如何更轻松地生成优惠券代码有任何建议,请随时分享。

我认为问题出在 do-while 语句或 checkVoucher() 函数上。

非常感谢您的帮助和建议。谢谢。

最佳答案

我会走得更轻松。将表格中的凭证列设置为唯一。生成代码PHP端,做你的insert,在错误回调函数调用生成新代码。

基本上,这将自循环直到插入。然后在您的成功回调中将其添加到您的显示中。所有这些都包含在一个 while 循环中。获得 5 后,打破循环。

至于生成随机字符串且重复几率最小,请查看此线程:PHP random string generator

我会生成完整长度的字符串,然后只添加连字符。

关于php - 如何生成凭证代码,检查数据库是否唯一,如果不是则生成新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35737856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com