2010-12-26 4 views
1

이것은 I posted here 질문에 대한 후속 질문입니다. 나는 사용자에게 고유 ID를 제공하기 위해 다음 코드를 사용하고기능 반복

은 : 생성 된 ID가 이미 사용중인 경우

function NewGuid() { 
    $s = strtoupper(uniqid(rand(),true)); 
    $guidText = substr($s,0,8) . '-' . substr($s,8,4) . '-' . substr($s,12,4). '-' . substr($s,16,4). '-' . substr($s,20); return $guidText; 
} 

$Guid = NewGuid(); 
echo $Guid; 

$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'; 

function base_encode($num, $alphabet) { 
    $base_count = strlen($alphabet); 
    $encoded = ''; 

    while ($num >= $base_count) { 
     $div = $num/$base_count; 
     $mod = ($num-($base_count*intval($div))); 
     $encoded = $alphabet[$mod] . $encoded; 
     $num = intval($div); 
    } 

    if ($num) $encoded = $alphabet[$num] . $encoded; 
    return $encoded;  
} 

function base_decode($num, $alphabet) { 
    $decoded = 0; 
    $multi = 1; 

    while (strlen($num) > 0) { 
     $digit = $num[strlen($num)-1]; 
     $decoded += $multi * strpos($alphabet, $digit); 
     $multi = $multi * strlen($alphabet); 
     $num = substr($num, 0, -1); 
    } 

    return $decoded; 
} 

echo base_encode($Guid, $alphabet); 

그래서, 나는이 코드는 완전히 새로운 때까지 반복 할 수 있도록하려면 id가 생성되어 데이터베이스에 입력됩니다. 또한 프로그래밍에 익숙하지 않으므로 정성을 기울여 주시기 바랍니다.)

의견이 있으십니까? 감사. 내가 전에 유사한 코드를 내장

+0

코드를 올바르게 포맷하십시오. – Oswald

답변

2

아주 쉽습니다.

3 가지 기능이 있습니다.

원 - 메인 생성 guid 기능.
두 개의 하위 생성 guid 함수입니다.
Three - Sub insert guid 기능.

하위 생성 함수 :
실제 세대가 GUID를 반환합니까?

하위 삽입 기능 :
guid를 데이터베이스에 삽입하려고 시도합니다. 실패하면 false/null을 반환합니다. 성공/성공에 관한 데이터.

주요 기능 : 루프에서
:
통화 하위 메뉴는 GUID를 얻을 수 있습니다.
guid가 고유 키이거나 기본 키인 데이터베이스에 삽입하려면 subfunction을 호출하십시오.
오류가 발생하면 루프를 다시 시작하십시오.
성공하면 루프를 종료하고 guid를 반환합니다.

예 :

function GetGuid() 
{ 
    do 
    { 
     $guid = GenerateGuid(); 
    } while (!InsertGuid($guid)); 
    return $guid; 
} 

function GenerateGuid() 
{ 
    // do your stuff here. 
    return $guid; 
} 

function InsertGuid($guid) 
{ 
    $sql = 'INSERT INTO `guid_table` (`guid`) VALUES ('$guid')'; 
    $connection = //do sql connect here; 
    return // do sql execution here which will return false/null on failure; 
} 
+0

네, 그게 내가하고 싶은 것입니다. 질문은 그것을하는 법입니다. 나는 그 책에서 배우고 있습니다. 책은 그다지 도움이되지 않습니다. – AAA

+0

예제가 추가되었습니다. – evan

0

, 나는 일반적으로 널 변수로 시작, 나는 동안 ($ 변수 == NULL) {}는 동안 내부

, 내가 새 코드를 생성 할 데이터베이스에 대해 그것을 확인 아직 존재하지 않는다면 $ variable = $ new_code를 설정하고 (잠시 중단 될 것입니다.) 그에 따라 진행하십시오.

또한, 내가

희망을 발생할 수있는 충돌을 로그인이

+0

이상적으로는 충돌을 원하지 않을 것입니다. 어쨌든 그것 없이는? 그렇다면 코드 수정을 도와 줄 수 있습니까? 저는 초기 학습 단계에 있습니다. – AAA

+0

충돌이 발생하지 않으면 왜 데이터베이스를 점검해야합니까? – joshtronic

1
function randr($j = 8){ 
$string = ""; 
    for($i=0;$i < $j;$i++){ 
     srand((double)microtime()*1234567); 
     $x = mt_rand(0,2); 
     switch($x){ 
      case 0:$string.= chr(mt_rand(97,122));break; 
      case 1:$string.= chr(mt_rand(65,90));break; 
      case 2:$string.= chr(mt_rand(48,57));break; 
     } 
    } 
return $string; 
} 

    do{ 
    $id = randr(); 
    $check = mysql_query("SELECT uniq FROM users WHERE uniq = '$id'"); 
    }while(mysql_num_rows($check) != 0); 

이것에 대해 생각하는 데 도움이됩니다.

0

는 약간 다른 접근 방식

내가 저장 프로 시저 내에서 우리 세대의 논리를 이동하고 오라클처럼 고유 시퀀스를 생성하는 데이터베이스를 요청할 것 일 수있다.

이 방법은 숫자가 고유한지 확인하기 위해 수많은 여행을 피할 수 있습니다.

1

코드 작성 방식과 비슷하게 작성된 시스템을 업그레이드/수정해야합니다. 원래 프로그래머를 정말로 싫어하게되었습니다.

초 동안 무엇을하고 있는지 생각해보십시오. 다른 사용자가 guid가 유효한지 물어볼 때 (그리고 다시 예가 될 때)에 계정을 만들면 실제로 행을 삽입해도 충돌이 발생할 수 있습니다. 그것은 끔찍한 것 이상입니다 ...

그러나 데이터베이스 프로그램을 만든 사람들은 이것을 생각하고 당신에게 고통없는 대안을 제공합니다 : 식별 열. 그들은 3 개 이점을 제공 :

  • 들이 자동으로 데이터베이스는
그들을 생성하는 기본 키
  • 로 만들어하고 고유합니다 (또는 삽입이 실패)

    ID 열을 사용하려면 ID 열을 ID 열로 만들고 삽입 할 때 다음과 같이 작성하십시오.

    insert into users (name, passwordhash, extrastuff) 
    values (@name, @passwordhash, @extrastuff); 
    select @@identity -- or ident_current() for mysql 
    

    그리고 추가 처리를 위해 생성 된 사용자 ID가 반환됩니다. 얼마나 많은 사용자가 동시에이 작업을 시도하든간에이 작업은 동시에 완료됩니다.

  • +0

    먼저, @@ ID가 SQL의 취향에 존재하는지 여부를 알아야합니다. MySQL에는 존재하지 않습니다. 당신의 SQL이 가장 많이 사용되는 SQL 버전에서 작동하지 않을 때, 당신의 것을 올려 놓는 것만으로도 다른 사람들의 대답을 downvote하는 것은 무례한 일입니다. – evan

    +0

    수정 됨. 그리고 나는 누구에게도 downvote하지 않았다. – Blindy

    +0

    그 이유는 모든 대답,하지만 당신은 downvote가? 기본적으로, 당신은 방금 내 대답을 반복했다. – evan