【问题标题】:never ending loop : fatal error永无止境的循环:致命错误
【发布时间】:2010-05-17 18:08:37
【问题描述】:

我的代码-

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

【问题讨论】:

  • 当 mysql_fetch_assoc() 没有找到要返回的行时,它返回 false。 count( false ) 将返回 1,因为 false 在技术上是 1 个元素。 isUniqueUserID 函数需要重构,如下面的答案所示。
  • 请接受您的问题的答案,并为好的答案投票(如果不在整个网站上,至少对您自己的问题进行投票)。

标签: php loops while-loop


【解决方案1】:

如果 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);  
}

【讨论】:

  • 这就是我所知道的,那么我必须做出哪些改变?那是我的问题。
  • @Piyush,请参阅我的回答中的功能......虽然我注意到你已经接受了另一个。附言您的 Q 没有询问需要进行哪些更改。
【解决方案2】:

首先,尝试将您的 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。

【讨论】:

  • "select count(*) FROM ruser WHERE userId='$userIDToCheck';";,如果$userIDToCheck来自用户输入,请修复sql注入风险
  • select count(*) 也可以,但我仍然会使用select count(userId) 以防止选择行中的所有内容。我添加了一行以防止 sql 注入
  • count(*) 是惯用的 SQL,除非您的 DBMS 出现严重问题,否则不需要读取整行。它应该是首选形式。
  • @zinglon 抱歉,我没有意识到这一点。谢谢!
猜你喜欢
  • 2016-06-04
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2020-03-14
相关资源
最近更新 更多