【问题标题】:Random coupon code, make sure they're all unique随机优惠券代码,确保它们都是唯一的
【发布时间】:2012-12-10 21:59:14
【问题描述】:

我的代码:

echo "<table width='200px' cellpadding='5' cellspacing='0'><tbody>";

$total = 500;
for ($j = 0; $j < $total;$j++) {
    echo "<tr>";
    echo "<td>" . ($j+1) . "</td>";
    echo "<td>" . get_coupon_code() . "</td>";
    echo "</tr>";
}

function get_coupon_code() {
    $characters = 'ABCDEFGHJKLMNPQRSTUZWXYZ';
    $random_string_length = 8;
    $string = '';
    for ($i = 0; $i < $random_string_length; $i++) {
        $string .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $string;
}

echo "</tbody></table>";

如何确保生成的每个代码都是唯一的?

【问题讨论】:

  • 通过检查之前生成的代码。
  • 将优惠券存储在数据库中(例如)并在 do..while 循环中继续生成它们,只要您点击保存在数据库中的代码。
  • 搞笑,PeeHaa。 vojtek,我宁愿不在数据库中存储任何东西,而宁愿检查数组或其他东西。
  • @dcolumbus 1. 我从来没有说过任何关于数据库的事情。 2. 真的不觉得好笑。 3. 您生成的代码有些随机,如果您不比较它们,您还能如何期望它们 100% 确定唯一?
  • PeeHaa,如果您可以在上面看到,您会注意到数据库注释指向“vojtek”……而且并非完全没有听说过需要唯一字符串。我的问题是询问如何确保每个代码都是唯一的......这意味着比较它们。

标签: php arrays string methods


【解决方案1】:

确保不重复代码的唯一正确方法是将它们保存到数据库、文件中,或者将它们保存在内存中(如果持续时间很短)。

您可能还想查看 PHP 的 uniqid() 函数:

print_r( uniqid() );

// Sample output:
//
// 50c65cefe58b1

但这可能不符合您的解决方案,因为 (a) 它仍然不能保证是完全唯一的,并且 (b) 它在代码中引入了数字(不仅仅是字母)。

文档:http://php.net/manual/en/function.uniqid.php

【讨论】:

  • 是的,我只需要字母和特定的。
  • 当心,uniqid确定性的。虽然您可以将其用于优惠券代码,但绝不应在需要担心安全性的地方使用它。
【解决方案2】:

使用静态数组变量来存储您的优惠券代码,并在返回代码之前确保它在数组中不可用。或者更简单,将代码存储在会话中处理的数组中。

function get_coupon_code() {
$arr = $_SESSION['codes'];
    $characters = 'ABCDEFGHJKLMNPQRSTUZWXYZ';
    $random_string_length = 8;
    $string = '';
    for ($i = 0; $i < $random_string_length; $i++) {
        $string .= $characters[rand(0, strlen($characters) - 1)];
    }
if (is_array($arr) && in_array($string, $arr))
{
return get_coupon_code();
}
else{
$_SESSION['codes'][] = $string;
    return $string;
}
}

已编辑添加返回到 get_coupon_code() 的内部调用

【讨论】:

  • 你能写一点示例代码吗?特别是比较。
  • 我在考虑使用in_array,但不知道您对此有何感受?
  • 不知道这对您是否重要,但是将它们保存在静态数组中的解决方案将无法在服务器重新启动后继续存在。即任何时候 PHP 服务重启,数组都会重新初始化为一个空数组。
  • 实际上,优惠券代码会因访客而异,并且会随着每次会话而丢失。如果你想用优惠券做任何有意义或聪明的事情,除了给人们一个随机的 8 个字符串之外,这不是这样做的方法。
  • 啊,那是有道理的,如果他只想运行一次并打印出来以备不时之需。
猜你喜欢
  • 2011-06-01
  • 2020-08-30
  • 2012-09-30
  • 2013-04-22
  • 2014-11-26
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多