这是我的问题:我试图为我的应用程序创建一个随机条形码。我想检查该代码是否已经在列中,然后生成一个新数字。再检查一遍。如果是唯一的,则返回给调用者,否则重新生成。
为了达到这个目的,我使用了一个递归函数。我在数据库中添加了数字1 2 3 4所以每次运行时。它必须显示5、6、7、8、9或10。下面是我的函数:
function generate_barcode(){
$barcode = rand(1,10);
$bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'"));
if($bquery==1){
generate_barcode();
}else{
return $barcode;
}
}
我就像这样测试它:
$a = generate_barcode();
if(isset($a))
{
echo $a;
}
else
{
echo 'Not Set';
}
所以问题是,它有时显示我"Not Set",但我希望它总是产生一个唯一的数字。我没有插入数据,所以所有的数字都被保留是没有问题的。
有人指导我,让我知道什么是错误的代码。我可以使用其他方法来做到这一点,但我需要知道所提供的代码有什么问题。
您还需要返回从递归调用生成的数字,如:
function generate_barcode() {
$barcode = rand(1, 10);
$bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'"));
if ($bquery == 1) {
return generate_barcode(); // changed!
}
else {
return $barcode;
}
}
(在所有数字都被"占用"的情况下,你应该包括某种退出。当前版本将递归地调用自身,直到达到PHP递归限制,然后抛出错误。
返回语句将一个值传递给当前函数调用帧的直接调用者。在递归的情况下,这个直接调用者可以是同一函数的另一个调用。
你可以这样做:
改变:
generate_barcode();
:
return generate_barcode();
这样做:
$hash = md5( microtime().rand(0, 1000) );
添加时间组件意味着几乎是唯一的。除非你有32^32个
如果必须是数字,只需使用pkey并在上面加上10000就可以了。或者这样。
经过仔细分析-没有问题,但是:
$a = generate_barcode();
if(isset($a)) <<< this bit
看到你返回唯一值然后你说它是isset
我的唯一值,$a
总是被设置,因为如果它不是你递归函数直到它是,然后你返回它。
您要做的是:
while(true) {
$barcode = rand(1,10);
$bquery = mysql_num_rows(mysql_query("SELECT * FROM stock_item WHERE barcode='$barcode'"));
if($bquery===0){
break;
}
}
echo $barcode;
然而,这显然只适用于10个条形码,并导致无限循环,这意味着它不是创建大量条形码的正确方法。
我建议使用auto_increment
来生成条形码。
顺便说一句,不推荐使用mysql
扩展。使用mysqli
或PDO
的新代码