这是我的问题我正在尝试为我的应用程序创建一个随机条形码,我想检查该代码是否已经在列中而不是生成一个新数字,如果它的唯一返回给调用方其他,则再次检查它再次生成。我正在为此目的使用递归函数。我在我的数据库中添加了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';
}
所以问题是它有时会向我显示“未设置”,但我希望它始终生成一个唯一的数字。我没有插入数据所以不是所有数字都被保留的问题。
有人只是引导我,让我知道代码有什么问题。我可以使用其他方法来做到这一点,但我需要知道提供的代码有什么问题。感谢
答案 0 :(得分:8)
您还需要从递归调用中返回生成的数字,例如
spark.yarn.historyServer.address
(对于所有数字都被采取的情况,你应该包括某种退出&#39;。这个当前版本将递归调用自身,直到达到PHP递归限制,然后将抛出错误。)< / p>
答案 1 :(得分:3)
return语句将值传递回当前函数调用帧的直接调用方。在递归的情况下,这个直接调用者可以是对同一函数的另一个调用。
您可以通过执行以下操作来解决此问题:
更改:
generate_barcode();
到:
return generate_barcode();
答案 2 :(得分:0)
你为什么不喜欢这个
$hash = md5( microtime().rand(0, 1000) );
添加时间组件意味着pretty much
将是唯一的。除非你有32 ^ 32个。
它必须只是数字吗?如果是这样的话,只需使用pkey并添加10000就可以了。或者这样。
更新经过仔细分析后,它没有任何问题,但是:
$a = generate_barcode();
if(isset($a)) <<< this bit
看到你返回唯一值然后你说它是isset
我的唯一值,并且$a
将始终被设置,因为如果它不是你递归函数直到它,然后你返回它。因此总是设置......
答案 3 :(得分:0)
您要做的是:
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
获取新代码。