在新页面加载期间未设置变量

时间:2012-12-10 10:27:03

标签: php

我在网站上有一个注册表,注册调用一个接受$ _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->错误[' firstname'];如果错误计数器是>,则在寄存器功能中0,它显示正确的消息。所以我知道正在设置数组键,如果我更改else语句以返回字符串,如果数组键不存在它也可以正常工作。因此,由于某种原因,值被设置,然后在页面重新加载后再次丢失。

我还尝试在错误消息类中创建一个函数来返回可以在找到错误时由寄存器函数调用的数组:

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

这也没有做任何事。为了100%确定数组密钥在运行寄存器功能时存在,我尝试了这个:

    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中吗?任何指针都将非常感激。感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

问候