0

问题是这个函数总是返回 0。为什么?

public function valid_token ()
{
    if (!isset($_SESSION['token']) || $this->token != $_SESSION['token'])
    {
        $this->errors[] = "Formulario incorrecto";
    }

return count($this->errors)? 0 : 1;
}
4

3 回答 3

5

编辑:

忽略我之前的回答。愚蠢的虚假价值观。你总是得到0回报的原因仅仅是因为......你的数组中有一个值。正如@Orangepill 在评论中所说,转储值$this->token$_SESSION['token]查看发生了什么。

老的:

count()返回数组中元素的数量。现在你只是在跑步count()。您需要将其与整数值进行比较,即:

count($this->errors)>0 ? 0 : 1;
于 2013-05-10T04:36:45.337 回答
0

Token 是一个 mt_rand 函数,这就是我认为问题出在 return 语句的原因。也因为即使我调用另一个名为 valid_data() 的函数时也会出错,它具有相同的 return 语句。$token = $_SESSION['token'] = md5(uniqid(mt_rand(), true));

于 2013-05-11T21:15:37.177 回答
0

在 valid_token() 中使用 $this->errors 之前,您是否在类中初始化了它?如果没有,您可能正在计算未设置的内容,这将返回 false。确保像这样初始化成员:

受保护的 $error = array();

或者

公共 $error = 数组();

此外,您使用了三元表达式,但没有将条件括在括号中。因此,该语句可能没有正确评估。尝试这个:

 $isValidForm = (count($this->errors) > 0) ? false : true;
 return $isValidForm;

我同意你应该“转储”变量,看看你得到了什么。我会通过将它们的字符串值记录到 Apache error.log 来做到这一点:

error_log("这个令牌:" .print_r($this->token, true));

error_log("会话令牌:" .print_r($_SESSION['token'], true));

error_log("这个错误:" .print_r($this->error, true));

在 GNU / Linux 或 OSX 中,您可以像这样从控制台跟踪日志:

尾 -f /var/log/apache2/error.log

这样您就不必中断程序流来调试它。

最后,这只是一个建议——valid_token() 不是一个好的方法名,它听起来像是一个变量名。validate_token() 或 validateToken() 是更好的名称,因为它们使用动词来表示它们是动作。

于 2013-05-13T03:58:11.467 回答