我正在尝试使用PHP页面和MySQL数据库创建一个Secret Santa系统来存储详细信息,这样如果有人忘记了他们的匹配,他们可以重新请求它。
第1步:我根据数据库中列表中的人数创建了一个随机数生成器。
计数功能:
$maxSQL = "SELECT COUNT(id) as total FROM secretsanta";
$maxRS = mysqli_query($conn, $maxSQL);
$maxQuery = mysqli_fetch_array($maxRS);
$maxpersons = $maxQuery['total'];
然后是随机数发生器:
$assigned = rand(1,$maxpersons);
第2步:测试随机数是否与人自己的ID匹配,如果为真则重新生成新数字。
do {
$assigned = rand(1,$maxpersons);
} while ($assigned==$id);
第3步:将配对的ID写入人员数据库记录。
$assignSQL = "UPDATE secretsanta SET assigned = '".$assigned."' WHERE secretsanta.id = ".$id;
if (mysqli_query($conn, $assignSQL)) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . mysqli_error($conn);
}
问题:现在我需要检查是否有其他人没有被分配给那个人,否则有些人可能会错过,而其他人会比其他人更多。
我试图实现一个包含查询的函数来测试每条记录,以查看该数字是否已存在,并希望将其作为条件添加到while或者while语句中?
if (!function_exists('checkRandom')){
function checkRandom($funcid){
$Check_SQL = "SELECT assigned FROM secretsanta ORDER BY id ASC";
$Check_RES = mysqli_query($conn, $Check_SQL);
if (Check_RES) {
while ($CheckArray = mysqli_fetch_array($Check_RES, MYSQLI_ASSOC)) {
$CheckAsgn = $CheckArray['assigned'];
if ($funcid==$CheckAsgn) {return true;}else{return false;}
}
}
}
}
然后将其实现到do while语句中,如下所示:
do {
$assigned = rand(1,$maxpersons);
} while ($assigned==$id||checkRandom($assigned));
到目前为止没有运气......帮助!..请:)
P.S。我知道有些网站已经这样做了,我只是不相信他们会发布我和家人的电子邮件地址'如果我可以自己制作我自己的私人版本。
答案 0 :(得分:1)
使用您的方法,前几个任务将完成没有问题,但想象一下最后一个未分配的条目以及尝试一个随机数只有多少次才能找到具有该ID的人已被分配..
我将为您提供另一种解决问题的方法:对于要为其分配圣诞老人的每个用户,使用WHERE子句创建一个新的SELECT语句,该子句允许您仅选择尚未分配的用户。 看看我的代码,看看这对你有帮助。我只是键入了这个并没有测试它,所以可能会有一些错误。
Select-Object Name,Length,Bagel
上次编辑:重构的整个代码,因此可以多次运行,只分配尚未分配的新用户。
答案 1 :(得分:0)
步骤1取决于为人们设置一组连续的ID。想想如果' 3'离开公司,它雇用6来取代它们...... 1,2,4,5,6($ maxpersons = 5)
"现在我需要检查" - 不,你仍然试图通过猜测然后看你的猜测是否有效来解决问题。使用始终会返回正确结果的算法。下面的方法需要添加一个临时字段'序列'类型为float。
mysqli_query($conn,"UPDATE secretsanta SET sequence=RAND()");
$first=false;
$prev=false;
$all=mysqli_query($conn, "SELECT * FROM secretsanta ORDER BY sequence, id");
while ($r=mysqli_fetch_assoc($all)) {
if (false===$first) {
$first=$r['id'];
} else {
save_pair($prev, $r['id']);
}
$prev=$r['id'];
}
save_pair($prev, $first);
(但有更好的错误检查)