1

我在网站上有一个注册表单,注册调用了一个函数,该函数接受 $_POST 值作为参数。在进行常规检查时,如果发现错误,它会使用错误消息类中的一个函数来设置错误,并增加 errorcounter 变量。此函数接受两个参数:字段和错误消息(存储在数组中)。

    $errmsg->setError("firstname", "You must enter your name");

setError() 设置错误:

    function setError($field, $errMsg){
        $this->errors[$field] = $errMsg;
    }

注册功能检查错误计数器是否已增加,如果没有,则注册帐户,如果是,则重定向回注册页面。

注册页面使用 errmsg 类中的一个函数来显示任何错误:

    $errmsg->showError("firstname");
    // Argument being the field name.

此函数应显示已设置的任何错误消息:

    function showError($field) {
        if (isset($this->errors[$field])) {
            return $this->errors[$field];
        } else {
            return "";
        }
    }

因此,您可以查看数组是否定义了索引,它应该显示值,如果没有,则不显示任何内容。

我遇到的问题是即使出现错误也没有显示任何内容。

我试过回显 $errmsg->errors['firstname']; 如果错误计数器> 0,则在寄存器功能中,并显示正确的消息。所以我知道正在设置数组键,如果我更改 else 语句以在数组键不存在时返回一个字符串,它也可以正常工作。因此,由于某种原因,正在设置该值,然后在页面重新加载后再次丢失。

我还尝试在错误消息类中创建一个函数来返回发现错误时可以由 register 函数调用的数组:

    function getErrorArray(){
        return $this->errors;
    }

这也无济于事。为了 100% 确定在运行 register 函数时数组键存在,我尝试了这个:

    if ($errors > 0) {
        if(isset($errmsg->errors['firstname'])) {
            header("Location: ".$session->referrer);
        } else {
            header("Location: http://www.google.com");
        }

正如预期的那样,如果出现错误(我正在处理的错误是一个空字符串),它会重定向回来并应该显示消息,并且当字段包含重定向到 Google 的值时。

我也尝试过使用:

    if(array_key_exists($field,$this->errors))

代替:

    if(isset($errmsg->errors['firstname']))

我真的不明白为什么这不起作用,这是范围问题吗?我是否应该将其存储在 $_SESSION 中?任何指针将不胜感激。谢谢。

4

3 回答 3

2

是的,您应该将其存储在$_SESSION. PHP 变量只存在于当前请求的范围内。一旦请求完成,变量就会丢失。重定向会创建一个新请求。

您还可以在同一请求期间显示错误(当用户将数据发布到您的服务器时)。

于 2012-12-10T10:29:48.917 回答
2

如果要在 2 个请求之间保存数据,则必须使用$_SESSION或某些数据库系统。

function setError($field, $mess) {
   $_SESSION['errors'][$field] = $mess;
}

您的代码很好,但您需要重构会话数组。

于 2012-12-10T10:33:59.317 回答
1

PHP 是无状态的。因此,如果您刷新页面,变量将被重置。这就是我们将重要信息存储在 SESSION 数组中的原因。$_SESSION 将是最好的方法。

问候

于 2012-12-10T10:34:41.297 回答