繁体   English   中英

调用递归函数的最合适方法是什么?

[英]What's the most appropriate way to re-call a recursive function?

有人告诉我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语句中重新打开并关闭吗?

您应该做的是在第一次调用authCode()之前打开连接,并将其作为参数传递。 这样,您可以对所有呼叫使用单个连接。

您可以在函数中传递数据库连接:

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
}

绝对不需要递归运行此函数。 使用简单的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位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM