2011-08-03 2 views
0

나는 authCode(); 가장 효율적인 방법으로 다시 호출되지 않습니다. "DB 연결을 많이 쌓을 것이므로 리소스를 비싸게 빨리 열고 닫을 수 있습니다." 이없는 경우 (연결이 여전히 열려 다시 전화를 의미재귀 함수를 다시 호출하는 가장 적합한 방법은 무엇입니까?

function authCode() { 

$num1 = mt_rand(1, 2147483647); 
$num2 = mt_rand(1, 2147483647); 
$authcode = dechex($num1).dechex($num2);; 

include("../db/71cfde725dc86.php"); 

$conn = mysql_connect($db_host, $db_uname, $db_pword) or die("Couldn't connect because ".mysql_error()); mysql_select_db($db_name); 
$query = "SELECT COUNT(*) FROM records WHERE valcode='$authcode'"; 
$result = mysql_query($query) or die("SELECT query failed due to ".mysql_error()); 

$count = mysql_fetch_assoc($result); 
$row = $count['COUNT(*)']; 

if($row > 0) 
{ 
    $authcode = authCode(); 
} 
else 
{ 
$query2 = "INSERT INTO records (valcode) VALUES ('$authcode')"; 
$result2 = mysql_query($query2) or die("INSERT query failed due to ".mysql_error()); 
} 

mysql_close($conn); 

return $authcode; 
} 

authCode(); 

내가 $authcode = authCode();에 집중하고있어 데이터베이스 연결이 끝날 때까지 폐쇄되지 않는다는 사실, 다음은

내 코드입니다 그래서 나는 들었다)?

$row이 할당 된 후 연결을 닫은 다음 else 문을 다시 열고 닫아야합니까?

답변

1

절대적으로 반복적으로이 기능을 실행할 필요가 없습니다. 간단한 while 루프를 사용하면 적은 오버 헤드로 훨씬 쉽게 작업을 수행 할 수 있습니다. 의사 코드 :

function authCode() { 
    ... connect to database ... 
    while (true) { 
     ... generate random code ... 
     if (code is in database) { 
      continue; 
     } else { 
      insert code into data base 
      break; 
     } 
    } 
    return $code 
} 

재귀가없고 하나의 데이터베이스 핸들이 있습니다.

이 외에도 왜 그런 비열한 코드 생성기가 필요합니까? 충돌 가능성이 높은 가변 길이 코드가 생성됩니다. sha1을 적절히 소금을 넣은 소스 문자열과 함께 사용하는 것만으로는되지 않습니다. 이것은 여러분의 버전보다 충돌 가능성이 훨씬 적습니다. 당신의 코드는 32 비트의 이론적 인 키 공간을 가지고 있고 md5는 128 비트이고 sha2는 160 비트입니다.

+0

고맙습니다. md5 해시를 사용하도록 전환하겠습니다. 단지 그들을 사용하는 방법에 대해 배웠습니다 :). – Fireworksable

3

먼저해야 할 일은 authCode()의 첫 번째 호출 전에 연결을 열고 매개 변수로 전달하는 것입니다. 이렇게하면 모든 통화에 단일 연결을 사용합니다.

1

당신은 함수에서 데이터베이스 연결을 전달할 수 :

function authCode($conn) { 
    if ($db_link == null) { 
     $has_instantiated_connection = true; 
     // set the connection 
    } 
    else 
     $has_instantiated_connection = false; 

    // stuff 

    // recall 
    authCode($conn) 

    if ($has_instantiated_connection) 
     // close the connection 
} 
+0

실례지만 내 '$ db_link'는'$ conn'입니까? – Fireworksable

+0

예, 죄송합니다. 나는 대답을 편집했다. –

관련 문제