永无止境的循环:致命的错误

时间:2010-05-17 18:08:38

标签: php loops while-loop

我的代码 -

function create_id()
{  
    //global $myusername;  
    $part1 = substr("Piyush", 0, -4);  
    $part2 = rand (99,99999);  
    $part3 = date("s");  
    return $part1.$part2.$part3;  
}

echo create_id();  //this is printing fine.

function isUniqueUserID($userIDToCheck)    
{
    $sqlcheck = "Select * FROM ruser WHERE userId='$userIDToCheck';";    
    $resource = mysql_query($sqlcheck)or die(mysql_error());   
    $count = mysql_fetch_assoc($resource);  
    if( count($count) > 0)  
    {return false;}  

    return true;  
}


$userIDVerifiedUnique = false;  
while(! $userIDVerifiedUnique )  
{  
    $userIDToCheck = create_id();  
    $userIDVerifiedUnique = isUniqueUserID($userIDToCheck );  
}

循环只是从while循环继续运行到函数IsUniqueUser(),反之亦然。 ????

2 个答案:

答案 0 :(得分:2)

如果MySQL查询没有返回任何行(即$userIDToCheck不在表中,则它是唯一的),然后mysql_fetch_assoc将返回FALSE。发生这种情况时,count(FALSE)会返回1(一个)!由于该值大于零,因此函数返回FALSE

简而言之,如果返回一行(字符串不唯一),则isUniqueUserID函数返回FALSE;如果没有返回行(字符串是唯一的),它仍然会返回FALSE


检查数据库表的一个简单的新函数可能类似于以下内容......

function isUniqueUserID($userIDToCheck)
{
    $userIDToCheck = mysql_real_escape_string($userIDToCheck); // Assume not already escaped
    $sqlcheck = "SELECT 1 FROM ruser WHERE userId='$userIDToCheck' LIMIT 1";    
    $resource = mysql_query($sqlcheck) or die(mysql_error());
    return (bool) mysql_num_rows($resource);  
}

答案 1 :(得分:1)

首先,尝试将isUniqueUserID()功能更改为此

function isUniqueUserID($userIDToCheck)
{

$userIDToCheck = mysql_real_escape_string($userIDToCheck); //prevent SQL injection

$sqlcheck = "Select userId FROM ruser WHERE userId='$userIDToCheck';";
$resource = mysql_query($sqlcheck)or die(mysql_error());
$count = mysql_num_rows($resource);

return ($count > 0) ? false : true;

返回关联数组只是为了计算其中的行数是没有意义的。在计算SELECT *时,做SELECT userId是没有意义的,因为这就是你所关心的。

我没有看到isUniqueUserID()返回false的任何其他原因,除非您的ruser表具有所有可能的ID。