2013-07-22 3 views
1

저는 PHP를 배우고 while을 사용하고 표현을 올바르게 계속하려고합니다.while()을 사용하여 PHP에서 계속

나는 6 자리 PIN을 만드는 스크립트를 가지고 있으며, 그것이 고유한지 확인하고자합니다. 그렇지 않으면 다른 PIN을 생성하려고합니다.

while(1) { 
    $pin = rand(111111,999999); 
    $sel = mysql_query("SELECT * FROM formusers WHERE pin = '$pin'"); 
    if(mysql_num_rows($sel) != 0) { continue; } 

    mysql_query("INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')"); 
    if(mysql_affected_rows()!=-1) { 
     echo "Pin:" . $pin; 
     exit; 
    } else { 
     echo "Existing email, try again<br />"; 
    } 
    break; 
} 

루프의 구문이 올바른가요? 작동하는 것처럼 보이지만 rand() 함수가 동일한 PIN을 두 번 생성하는 인스턴스에서 디버깅 할 수있는 방법은 없습니다.

또한 고유 PIN이 부족한 경우 여기에서 어떤 일이 발생합니까? 아마도 무한정 반복 될 것입니까? 이것을 막을 수있는 방법이 있습니까? 그것은 당신에게 같은 값마다 시간을 제공하므로

+2

이 비밀번호 재설정 이메일 핀입니까? 또는 사용자의 고유 ID입니까? 고유 ID 인 경우 임의 번호로 지정하지 마십시오. 당신은 당신이 예상했던 것보다 빨리 충돌로 끝날 것입니다 ('생일 패러독스'를보세요). ID에 증가하는 INT를 사용하십시오. 암호 재설정이라면 추측하기가 너무 쉽습니다. –

+0

그의 논리는 나에게 잘 보인다. 예, 그는 조건없이 깨고 있지만, 그는 상태로 계속됩니다. 그렇습니다, 조금 뒤얽힌 것입니다, 그러나 이것이 조금 더 명확하게 할 수있을지라도 논리는 정확 해 보입니다. – mti2935

+0

이 질문에 대한 해결책은 임의의 고유 값에 대한 훌륭한 설명입니다. [Solution Here] (http://stackoverflow.com/questions/7579570/loop-until-passcode-is-unique) – Peter

답변

2

그래, 코드는 작동하지만, 명시된 바와 같이 무한 루프에 관한 것입니다. 다음과 같이이 문제를 해결할 수 있습니다.

var $i = 0; 

while($i < 10) { 
    $i++; 

    $pin = rand(111111,999999); 
    $sel = mysql_query("SELECT * FROM formusers WHERE pin = '$pin'"); 
    if(mysql_num_rows($sel) != 0) { continue; } 

    mysql_query("INSERT INTO formusers(email,password,pin) VALUES('".$_POST['srEmail']."','".$_POST['srPass']."','".$pin."')"); 
    if(mysql_affected_rows()!=-1) { 
     echo "Pin:" . $pin; 
     exit; 
    } else { 
     echo "Existing email, try again<br />"; 
    } 
    break; 
} 

이렇게하면 10 회를 초과하지 않을 것입니다. 그러나 큰 문제는 샘플링 크기조차도 앞으로는 작동하지 않을 것이라는 것입니다. 이것은 약간의 수수께끼를 제시합니다. 한 가지 가능한 접근법은 루프를 시작한 다음 몇 번 반복하여 루프를 시작하기 전에 몇 개의 고유 숫자가 존재하는지 확인하는 것이지만 그 방법은 n 과 같은 것입니다 (어쩌면 나는 큰 O에서 진짜 좋지 않을 것입니다. 그냥 나쁜 일임을 알고 있습니다).

0

당신은 임의의 씨앗 수, 당신은 그것을 실행

srand (55); //Or some other value. 

while 루프 구문은 나에게 좋아 보인다.

2

PHP 배열 키의 고유 한 특성을 활용할 수 있습니다.

function getPins($qty){ 
    $pins = array(); 
    while (count($pins) < $qty){ 
     $pins[rand(111111,999999)] = ""; 
    } 
    return array_keys($pins); 
} 

이렇게하면 주어진 실행에 대해 $ qty 개의 고유 핀 수를 얻게됩니다. 함수의 각 실행에 고유 한 접두어를 추가하여 여러 실행이 충돌을 일으키지 않도록 할 수 있습니다.