2010-05-17 61 views
0

我的代码 -永无止境的循环:致命错误

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(),反之亦然滔滔不绝地。 ????

+0

当mysql_fetch_assoc()没有找到行返回,返回false。 count(false)将返回1,因为false在技术上是1个元素。 isUniqueUserID函数需要重构,如下面的答案所示。 – Thomas 2010-05-17 18:19:20

+0

请接受您的问题的答案,并请投下良好的答案(至少对您自己的问题,如果不是在整个网站上)。 – Dinah 2010-05-17 18:21:29

+0

Dupe? http://stackoverflow.com/questions/2851003/unique-random-id – 2010-05-17 18:24:07

回答

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 userId,那么在做SELECT *时没有意义,因为这是您所关心的一切。

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

+0

或''select count(*)FROM ruser WHERE userId ='$ userIDToCheck';“;'并修复sql注入风险if $ userIDToCheck '来自用户输入 – Dinah 2010-05-17 18:16:06

+0

'select count(*)'也可以,但我仍然会执行'select count(userId)'来防止选择行中的所有内容。并且我添加了一行以防止sql注入 – jordanstephens 2010-05-17 18:19:55

+0

'count(*)'是惯用的SQL,并且除非您的DBMS出现严重错误,否则不应该读取整行。它应该是首选的形式。 – zinglon 2010-05-17 18:39:26

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); 
} 
+0

多数民众赞成多数民众赞成在什么我知道然后我有什么变化??这是我的Q. – nectar 2010-05-17 18:32:00

+0

@Piyush,请参阅我的答案中的功能...虽然我注意到你已经接受了另一个。附:你的Q没有问过需要做什么改变。 – salathe 2010-05-17 18:47:29

相关问题