이메일 등록 후 사용자가 핀을 생성하는 데 사용할 수있는 스크립트를 만들고 싶습니다. 핀은 6 자리 길이로 독특해야합니다. 두 명의 사용자가 동일한 핀을 사용할 수 없습니다.통계 brainteaser : 임의의 고유 한 6 자리 PIN을 만들고 확률 충돌을 최소화하기 위해 배포하는 방법
나는 다음 코드를 가지고 있지만, 무한 루프에서 멈추지 않고 계속 진행할 수는 없습니다. 더 많은 핀이 사용되면 while() 함수가 반복 될 확률이 높아집니다. 어느 누구도 이것에 대한보다 우아한 해결책을 알고 있습니까?
사용자는 핀을 사용하여 웹 사이트에서 무료 서비스를 이용할 수 있습니다. 사용자가 다른 핀을 추측해도 서비스 실패는 없지만 사용자 경험에 지장을줍니다.
가능한 경우 핀을 추측 할 확률이 통계적으로 무시할 수 있도록 PIN을 배포하고 싶습니다.
<?php
if($_POST['srSubmit'] && $_POST['srEmail'] && $_POST['srPass']) {
$conn = mysqli_connect('localhost','root','','db_test');
while(1) {
$pin = rand(111111,999999);
$sel = mysqli_query($conn,"SELECT * FROM formusers WHERE pin = '$pin'");
if(mysqli_num_rows($sel) != 0) { continue; }
mysqli_query($conn,"INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')");
if(mysqli_affected_rows($conn)!=-1) {
echo "Pin:" . $pin;
exit;
} else {
echo "Existing email, try again<br />";
}
break;
}
}
?>
<form method="POST" action="">
<input type="email" name="srEmail" value="" placeholder="Email" /><br />
<input type="password" name="srPass" value="" placeholder="Password" /><br />
<input type="submit" name="srSubmit" value="Register" />
</form>
미안하지만 임의의 고유 한 6 자리 숫자를 만드는 방법에 대해 얼마나 많은 수정 된 질문을 올리시겠습니까? – Anigel
업데이트 된 코드이며, while() 함수를 사용하는 방법이 아니라 PIN을 배포 할 확률 및 확률입니다. – alias51
인위적으로 제한적인 가능한 답변 세트가 아닌 패스워드를 사용하는 것만으로도 db의 핀에 고유 한 키를 직접 검사 할 수 있으므로 빠른 쿼리 여야합니다. 난수 생성과 고유 한 제약에 의존하는 한 엔트리 수가 증가함에 따라 항상 충돌이 더 많습니다. – Anigel