2010-05-17 60 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

相關問題