PHP对象'用户'尽管会议仍在继续,但刷新后会消失

时间:2015-03-09 01:23:34

标签: php

PHP的新功能,在各种OOP教程之后遇到了一些我不知道如何解决的问题。 Home.php

    <?php
        //echo '<img src="'.'uploads/photo.jpg'.'"alt="aaaaaa" style="width:256px;height:128px">';
        include_once "classes.php";
        $_SESSION['UserProfilePicture']=$user->getUserProfilePicture();//Dodging errors
        echo '<img src="'.$_SESSION['UserProfilePicture'].'"id="HOMEPROFILE" alt="No Profile Found" style="width:128px;height:128px"><br>';
    ?>

UserLogin.php

<?php
    include_once "classes.php";
    if(!isset($_SESSION)){
        session_start(); //This is necessary above every file that uses session variables!
    }
    if(isset($_POST['UserMailLogin']) && isset($_POST['UserPasswordLogin'])){//Grab by name
        $user = new user(); //Adds an object
        $user->setUserMail($_POST['UserMailLogin']);
        $user->setUserPassword(sha1($_POST['UserPasswordLogin']));
        if($user->validlogin()==true){
            $_SESSION['UserName']=$user->getUserName();//Use -> when left is object, :: otherwise, => to assign key-value pairs in assoc array
            $_SESSION['UserMail']=$user->getUserMail();
            $_SESSION['UserId']=$user->getUserId();
            $_SESSION['Age']=$user->getUserAge();
            $_SESSION['UserLocation']=$user->getUserLocation();
            $_SESSION['UserProfilePicture']=$user->getUserProfilePicture();
        }
    }
?>

我创建了一个启动会话的简单登录系统。当在名为users的类中创建一个新的$ user对象时,我设置/获取了为该对象提供其正确值的函数。同时,还设置了$ _SESSION超全局变量。这需要他们到主页。在Home.php上,我想访问$ user-&gt; getUserProfilePicture(),它可以正常工作,但是在刷新时它似乎无法找到对象$ user。我尝试使用$ _SESSION来解决这个问题,但这只会延迟问题,以后我想显示其他人的个人资料图片,如果我退出并重新登录并刷新它仍然有同样的问题。请帮我找一个保持对象$ user的方法。提前谢谢。

编辑: 对不起家伙我试图删除不必要的东西,但我确实有(!isset($ _ SESSION))session_start();在每一页的开头

2 个答案:

答案 0 :(得分:0)

我相信要工作,你需要在每个页面上重新创建$ user。一旦您远离创建它的登录页面,该对象将被销毁。

如果您将用户ID存储在数据库中,请尝试仅使用用户ID创建用户对象,这样您就不必在会话中保留密码以重新创建它。

另一个选项是在会话中存储所需的用户值,并仅使用它们而不是依赖于$ user对象。

还要确保使用会话在每个页面上调用session_start()。

答案 1 :(得分:0)

我建议您在开始时学习程序编程,因为最初OOP没有意义。为什么需要开销来运行一个小脚本?你没有!

同时使用require_once();代替任何包含,以避免任何和所有相关的头痛。

对于会话,理想的做法是将有限的数据存储在集中的会话中,这样您就不必考虑它。

require_once会话文件中的某些内容,用于检查用户是否有会话,如果有,则执行操作。然后,您可以依赖所有地方的数据。

要回答您的问题,此行会阻止您的会话填充,除非有提交内容:

   if(isset($_POST['UserMailLogin']) && isset($_POST['UserPasswordLogin'])){//Grab by name

您想要的工作原型: 如果您可以将会话数据限制为准系统并使用每个脚本根据id加载用户数据,否则您将为高额会话开销付出代价。

<?php
    session_start();
    // do all your require_once here.

    $aPost = $_POST;
    $aPost[ 'username' ] = 'coolcat';
    $aPost[ 'password' ] = 'dontchangeme';

    if( !empty( $aPost[ 'username' ] ) && ( !empty( $aPost[ 'password' ] ) ) )
    {
        // Authenticate user object here and see if they can be 'logged in'
        // Stubbing out section.
        $oUser = new stdClass;
        $oUser->username = 'coolcat';
        $oUser->email = 'cool@cat.com';
        $oUser->id = 99;
        $oUser->age = 13;
        $oUser->location = 'NYC';
        $oUser->photo = 'coolcat.jpg';
        $_SESSION[ 'userid' ] = $oUser->id;
    }

    // If we have a 'logged in' user show them stuff.
    if( !empty( $_SESSION[ 'userid' ] ) )
    {
        echo 'You\'re logged in!';
    }
    var_dump( $_SESSION );
?>