我的脚本中遇到了循环问题。我花了很多时间尝试修复它,但我仍然不知道如何解决问题。我需要你的帮助和建议。
我的目标是创建一个优惠券代码生成器脚本,用户在其中输入要生成的优惠券代码的数量。
然后,脚本将在数据库表中生成所需数量的凭证,并将检查每个凭证代码是否唯一 - 如果不是,将生成一个新的凭证代码,脚本将继续,直到保存所有凭证。
问题是,如果数据库中已经存在凭证,则需要生成一个新的凭证。如果此新生成的凭证代码已在数据库中,则需要再次检查,如果它是唯一的,则会将其保存到数据库中,如果没有,该过程将再次继续。这就是循环问题所在。我希望你明白我的意思。
顺便说一下,优惠券代码采用以下格式: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端的代码,做你的插入,在错误回调函数调用中生成一个新的代码。
基本上,这将自我循环,直到插入。 然后在您的成功回调中将其添加到您的显示器中。 所有这些都包含在一个 while 循环中。 一旦你得到你的5,打破循环。
至于生成重复机会最小的随机字符串,请检查此线程:PHP 随机字符串生成器
我会生成完整的字符串,然后添加您的连字符。
使用这种方法生成随机的唯一数据,随着越来越多的代码的生成,所需的处理量成比例地增加。
相反,我要做的是:
- 按顺序生成一大堆值(假设几千个)值,并将它们存储在 redis/SQL 数据库中
- 使用随机数为数据库中的该记录编制索引,并在使用该记录后从表中删除该记录
这大大减少了所需的处理,还为您提供了一个预先确定的凭证代码池,可用于您的应用程序中的其他目的
Mysql unique
约束可能是您正在寻找的解决方案 for.it 可确保值始终唯一。它就像主键。但与主键不同的是,表可以有多个唯一值。这是w3school解释这一点的链接www.w3schools.com/sql/sql_unique.asp
最好的部分是,在添加重复条目时,它会对Duplicate Entry
错误进行类型化。 因此,您可以使用它 将数据添加到CSV 。 仅当没有错误时才添加它。
但请确保唯一值不为空。