2011-08-03 8 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

はい、申し訳ありません。私は答えを編集しました。 –

関連する問題