2011-11-18 81 views
1

现在,$ num这里只是数据库搜索中的数据行数。有时候,它会是0. $ procrastinate是一个函数参数。PHP数组返回错误值

if ($num==0) { 
    return "Do not appear to be registered. Please check your email input again."; 
    break 1; 
} else { // there is an entry. check for consistency 
    $procrastinateDB = mysql_result($result,0,'procrastinate'); 
    if ($procrastinate != $procrastinateDB) { 
     return "Answer to your procrastination question is incorrect. Please try again!"; 
     break 2; 
    } 
    else { 
     $username = mysql_result($result,0,'usrname'); 
     $passwd = mysql_result($result,0,'passwd'); 
     return array($username, $passwd, $num); 
     break 2; 
    } 
} 

什么我不理解的是,即使在$ NUM = 0,数组仍与$ usersname = 'd',$ passwd文件=回到 'O',和$ NUM = ''。很明显,它将采用第一个返回的语句,并将这些变量按顺序分配给第一个返回语句中的每个字符。

我该如何解决这个问题?如果没有数据库条目,我不希望$ username,$ passwd,$ num包含任何值。

+2

只是说明:'break'语句在这里没用。 'return'已经退出函数,所以不需要'bre​​ak'。 –

+0

@hakre:你在说什么? –

+0

@火箭:我在开玩笑;) – hakre

回答

3

你的代码一些评论:

  • 你不需要breakreturn后。
  • break在PHP中不适用于if
  • 如果您已经使用return,则不需要执行else

我对代码做了一些更改以使其更易于理解,同时也降低了圈复杂度。也许这有助于你发现你的错误更容易:

function unnamed(/* ... unknown parameters ... */) 
{ 
    /* ... some code ... */ 
    if ($num==0) 
    { 
     return "Do not appear to be registered. Please check your email input again."; 
    } 

    // there is an entry. check for consistency 
    $procrastinateDB = mysql_result($result,0,'procrastinate'); 
    if ($procrastinate != $procrastinateDB) 
    { 
     return "Answer to your procrastination question is incorrect. Please try again!"; 
    } 

    $username = mysql_result($result,0,'usrname'); 
    $passwd = mysql_result($result,0,'passwd'); 
    return array($username, $passwd, $num); 
} 

你的函数返回一个字符串或数组btw。如果不检查返回类型,并假设它是一个数组,你会触发串访问(见它documented on the string manual page):

$string = 'ABC'; 
echo $string[0]; // A 
echo $string[2]; // C 

通常最好有一个函数返回一个类型,而不是多个。然而,这取决于您的设计和编码风格,所以我只能提出建议,例如返回包含状态消息,状态代码(成功/失败)的对象以及 - 如果可用 - 返回的数据数组。但是,这取决于你想要什么。您也可以使用is_array来检查退货类型。

+0

谢谢!干净的代码是好的。你会建议作为返回不同类型的替代方案吗? – shenge86

1

数组仍然返回$ usersname ='D',$ passwd ='o'和$ num =''。

$num为0,则返回字符串:

不要显得注册。请再次检查您的电子邮件输入。

在PHP中,您可以像数组一样访问字符串。所以,我的猜测是,你没有检查,看看你是返回的字符串或数组,并做了这样的事情:

list($username, $passwd, $num) = yourFunction(); 

由于字符串可以accesed像阵列,$usernameD$password会是o,$num将是一个空格,因为这些是前三个字符。

我建议在访问该值之前使用is_array以确保知道自己得到了什么。

$ret = yourFunction(); 
if(is_array($ret)){ 
    list($username, $passwd, $num) = $ret; 
} 
else{ 
    // Something else 
} 
+0

双向回答发生了什么事大声笑 –

+0

感谢您使用is_array检查的提示。现在它完美地工作。 – shenge86

+0

@ shenge86:没问题。要小心使用PHP,变量可以是任何类型的,所以你需要确保你知道每一个是什么。 –