2011-08-01 2 views
0

아주 간단하지만, 나는 아직 진정하고 직선적이며 적절한 해결책을 찾지 못했습니다.데이터베이스에 대해 생성 된 문자열을 확인하고 발견되면 새 문자열을 만드시겠습니까?

저는 1에서 최대 정수까지 두 개의 mt_rand() 함수를 실행 한 다음 결과를 두 개의 dechex() 함수로 래핑하고 단일 문자열로 연결하여 임의의 문자열을 만드는 자체 함수를 얻었습니다.

나는 통계를 작성하지 않았지만,이 두 문자열이 같은 확률은 매우 낮습니다.

그러나 분명히 내가 데이터베이스에 대해 쿼리를 수행하고 항목으로 존재하는지 확인하려는 백업 솔루션이 필요하며, 그렇다면 내 자신의 함수를 다시 호출하여 임의의 문자열, 질의를 다시하고, 존재하지 않는 문자열이 발견 될 때까지 반복하십시오.

나는 수많은 포럼 스레드와 몇 가지 질문을했지만 아직 간결한 대답을 찾지 못했습니다.

도움을 주시면 감사하겠습니다.

+0

그럼 .... 실제 질문은 무엇입니까? – dkamins

+0

어떻게해야하는지 잘 보입니다. 가서 실행하십시오 (데이터베이스에 대해 질의하는 경우 'UNIQUE'키를 설정하십시오). – Wrikken

+0

MySQL 데이터베이스에 값을 쿼리하려면 어떻게해야합니까? 특정 테이블의 어느 위치에서든지 그 값을 찾을 수 있다면, 새로운 임의의 문자열을 생성하고 데이터베이스에서 쿼리 할 때까지 루프를 생성하는 방법은 무엇입니까? 즉, 데이터베이스에 값으로 존재하지 않습니다. – Fireworksable

답변

0

재귀 함수가 필요합니다. 예 :

function makeString() { 

    // Create our random string 
    $string = ""; 
    $characters = array('a', 'b', 'c', 'd'); 

    for ($i = 0; $i < 4; $i++) { 

     $string .= $characters[mt_rand(0, 4)]; 
    } 

    $query = "SELECT COUNT(*) 
    FROM myTable 
    WHERE string = '{$string}'"; 

    $result = mysql_query($query); 
    $row = mysql_fetch_assoc($result); 

    if ($row['COUNT(*)'] > 0) { // if it already exists, do it again 

     $string = makeString(); 
    } 

    return $string; 
} 
+0

재귀 함수의 선택 내부 실행 나쁜 연습입니다. – afuzzyllama

+0

@afuzzyllama 주목. –

0

이 가장 우아한 해결책은 아니지만 작동합니다 : queryForUnique($string) SELECT 문에 대한 래퍼입니다

$result = queryForUnique(); 

$unique_string = your_described_function(); 
$how_many_times = 0; 
while(in_array($unique_string, $result) !== false){ 
    if($how_many_times > 10){ 
     throw new Exception("Failed to find a unique string! Aborting!"); 
    } 

    $unique_string = your_described_function(); 
    $how_many_times++; 
} 

편집

:
가 밖으로 쿼리를 툭 루프에서 SELECT 쿼리를 사용하는 것은 바람직하지 않습니다.


당신의 제어 구조를 검토 할 수 있습니다 :
http://php.net/manual/en/language.control-structures.php

1
$int_affected = 0; 
while(!$int_affected) { 
    /* Set $integer */ 
    mysql_query("INSERT IGNORE INTO table (value) VALUES ({$integer})"); 

    $int_affected = mysql_affected_rows(); 
} 

은 당신이 찾고있는이 뭔가?

관련 문제