0

以下の関数を PHP ページに追加すると、スクリプトの実行がタイムアウトします。どうしたの?

include ('config.php');

function GenerateTransID() {    
    $unique_ref_length = 9;  
    $unique_ref_found = false;  
    $possible_chars = "23456789BCDFGHJKMNPQRSTVWXYZ";  
    while (!$unique_ref_found) {  
        $unique_ref = "";  
        $i = 0;  
        while ($i < $unique_ref_length) {  
            $char = substr($possible_chars, mt_rand(0, strlen($possible_chars)-1), 1);  
            $unique_ref .= $char;  
            $i++;  
        }

        $tmp_id = "TR-" . $unique_ref;
        $unique_ref = $tmp_id;
        $query = "SELECT `transactionID` FROM `payment` WHERE `transactionID`='$unique_ref'";  
        $result = mysql_query($query) or die(mysql_error().' '.$query); 

        if (mysql_num_rows($result)==0) {  
            $unique_ref_found = true;  

        }  

    }  
    return $unique_ref;         
}
4

3 に答える 3

1

mysql_num_rows($result) == 0その関数は、プログラムがタイムアウトする前に発生しない可能性がある場合にのみ戻ります。

その場合にエコーを追加して、実行されるかどうかを確認してください。私があなたなら、代わりに GUID の生成を検討します。

于 2013-03-27T11:31:46.990 に答える
0

SQLクエリの可能性があります。しかし、プロファイリングするまではわかりません。xdebug を確認します。

http://xdebug.org/

于 2013-03-27T11:28:10.357 に答える
0

次のように変更します。

function GenerateTransID() {    
    $unique_ref_length = 9;  
    $unique_ref_found = false;  
    $possible_chars = "23456789BCDFGHJKMNPQRSTVWXYZ";
    while (!$unique_ref_found) {  
        $unique_ref = "";  
        for($i = 0; $i < $unique_ref_length; $i++) {  
            $char = substr($possible_chars, mt_rand(0, strlen($possible_chars)-1), 1);  
            $unique_ref .= $char;  
        }

        $tmp_id = "TR-" . $unique_ref;
        $unique_ref = $tmp_id;
        $query = "SELECT `transactionID` FROM `payment` WHERE `transactionID`='$unique_ref'";  
        $result = mysql_query($query) or die(mysql_error().' '.$query); 

        if(mysql_num_rows($result)==0)
        {
            $unique_ref_found = true;  
        }
    }
    return $unique_ref;
}

いくつかのコードの改善を行いました。それ以外の場合、関数は期待どおりに機能するはずです。このコードに関連しない別の問題があり、おそらく他のコードまたはデータベース接続が原因です。

于 2013-03-27T11:15:13.627 に答える