问题是这个函数总是返回 0。为什么?
public function valid_token ()
{
if (!isset($_SESSION['token']) || $this->token != $_SESSION['token'])
{
$this->errors[] = "Formulario incorrecto";
}
return count($this->errors)? 0 : 1;
}
忽略我之前的回答。愚蠢的虚假价值观。你总是得到0
回报的原因仅仅是因为......你的数组中有一个值。正如@Orangepill 在评论中所说,转储值$this->token
并$_SESSION['token]
查看发生了什么。
count()
返回数组中元素的数量。现在你只是在跑步count()
。您需要将其与整数值进行比较,即:
count($this->errors)>0 ? 0 : 1;
Token 是一个 mt_rand 函数,这就是我认为问题出在 return 语句的原因。也因为即使我调用另一个名为 valid_data() 的函数时也会出错,它具有相同的 return 语句。$token = $_SESSION['token'] = md5(uniqid(mt_rand(), true));
在 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() 是更好的名称,因为它们使用动词来表示它们是动作。