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

标签 php mysql loops for-loop do-while

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

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

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

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

顺便说一句,优惠券代码的格式如下: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 random string generator

我将生成全长字符串,然后添加连字符。

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

相关文章:

PHP Strtotime -1个月 -2个月

MYSQL:连接到 localhost 和 host.docker.internal

在 where 子句中添加列的查询的 MySQL 性能

PHP:遍历多维数组

JAVA - 遍历音频文件文件夹,将另一个音频文件连接到每个音频文件

php - Laravel - 多重身份验证的未经身份验证的重定向问题

php - 使用命令行从书中运行 php 脚本

php - 从 MySQL 数据库中按 id 显示项目

php - MeekroDB - 如何安全地传递 ORDER BY 字段名称和参数?

r - 每 "X"秒保存一次循环的输出