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

Php 永无止境的循环:致命错误,php,loops,while-loop,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 i

我的代码-

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()
,反之亦然。
首先,尝试将
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*
没有任何意义,只要做
selectuserid
,因为这就是你所关心的


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

首先,尝试将
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*
没有任何意义,只要做
selectuserid
,因为这就是你所关心的


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

如果没有从MySQL查询返回行(即
$userIDToCheck
不在表中,它是唯一的),那么
MySQL\u fetch\u 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);  
}

如果MySQL查询没有返回任何行(即
$userIDToCheck
不在表中,它是唯一的),那么
MySQL\u fetch\u 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);  
}

或者从ruser中选择count(*),其中userId='$userIDToCheck';”
如果
$userIDToCheck
来自用户输入,请修复sql注入风险
选择计数(*)
也可以工作,但我仍然会执行
选择计数(userId)
以防止选择行中的所有内容。我还添加了一行代码来防止sql注入
count(*)
是惯用的sql,除非您的DBMS出现严重错误,否则永远不需要读取整行。它应该是首选形式。@zinglon很抱歉我不知道。谢谢或者从ruser中选择count(*),其中userId='$userIDToCheck';”如果
$userIDToCheck
来自用户输入,请修复sql注入风险
选择计数(*)
也可以工作,但我仍然会执行
选择计数(userId)
以防止选择行中的所有内容。我还添加了一行代码来防止sql注入
count(*)
是惯用的sql,除非您的DBMS出现严重错误,否则永远不需要读取整行。它应该是首选形式。@zinglon很抱歉我不知道。谢谢当mysql_fetch_assoc()没有找到要返回的行时,它返回false。count(false)将返回1,因为从技术上讲false是1个元素。iUniqueUserId函数需要按照下面的答案进行重构。请接受您的问题的答案,并请投票选出好的答案(如果不是在网站上,至少是您自己的问题)。重复?当mysql_fetch_assoc()没有找到要返回的行时,它返回false。count(false)将返回1,因为从技术上讲false是1个元素。iUniqueUserId函数需要按照下面的答案进行重构。请接受您的问题的答案,并请投票选出好的答案(如果不是在网站上,至少是您自己的问题)。重复?这就是我所知道的,然后我必须做出什么改变??这是我的问题。@Piyus,请看我答案中的函数。。。虽然我注意到你已经接受了另一个。另外,你的Q没有问需要做什么改变。这就是我知道的,然后我必须做什么改变??那是我的Q。@Piyush,请看我答案中的函数。。。虽然我注意到你已经接受了另一个。另外,你的Q没有问需要做什么改变。