我的腳本中存在循環問題。我花了很多時間來修復它,但我仍然不知道如何解決這個問題。我需要你的幫助和建議。如何生成憑證代碼,檢查數據庫是否唯一,如果不是,生成新的憑證
我的目標是創建一個憑證代碼生成器腳本,用戶輸入要生成的憑證代碼的數量。
然後,腳本將在數據庫表中生成所需數量的憑證,並且將檢查每個憑證代碼是否唯一 - 如果不是,將生成新的憑證代碼,腳本將繼續執行,直到所有憑證被保存。
問題是,如果憑證已存在於數據庫中,則需要生成新憑證。如果新生成的憑證代碼已經存在於數據庫中,則需要再次進行檢查,如果它是唯一的,則會將其保存到數據庫中,否則該流程將再次進行。這是循環問題所在。我希望你明白我的意思。
順便說一句,該優惠券代碼的格式如下: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()函數中。
我真的很感激你的幫助和建議。謝謝。
謝謝您的建議和解決方案。我已經更新了腳本,代碼比我之前的代碼更短。除了使用MySQL唯一約束外,我還更新了生成憑證代碼的功能。以下是更新的(工作)腳本:http://hastebin.com/qurakiviya.bash – maikelsabido
正確的URL:http://hastebin.com/jehelidiqa.bash – maikelsabido