【问题标题】:Starting a session inside a class在班级内开始一个会话
【发布时间】:2019-02-27 16:17:29
【问题描述】:

似乎在类方法中启动会话似乎不起作用。

最简单的方法是在脚本的开头启动会话,但如果在不使用的情况下运行,它是否不需要额外的服务器资源来维护?

仅在用户登录时启动和运行它似乎更直观。如何在类方法中执行它?

这是一长串代码,所以我没有先包含它,以免打扰您。您应该只考虑使用第 3 个 if 语句和 userSession() 方法。

class Users extends Controller
{
   public function login(){
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        //Sanitize input data
        $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
        $data = [
            'email' => trim($_POST['email']),
            'password' => trim($_POST['password']),
            'email_err' => '',
            'password_err' => ''
            ];

        if ($this->userModel->findUserByEmail($data['email'])) {
            //user found, Login
        if ($userRow = $this->userModel->login($data['email'], $data['password'])){
            $this->userSession($userRow);
            $this->view("pages/index");
        } elseif (!$this->userModel->login($data['email'], $data['password'])){
                $data['password_err'] = 'hujovas passwordas';
                $this->view("users/login", $data);
                }
        } else {
            //mail not found
            $data['email_err'] = 'email not found';
            $this->view('users/login', $data);
        }
    } else {
        //Sitas default
        $data = ['email' => '', 'password' => '', 'email_err' => '', 'password_err' => ''];
        $this->view("users/login", $data);
        }
}


public function userSession($userRow){

    session_start();
    $_SESSION['id'] = $userRow->ID;
    $_SESSION['email'] = $userRow->email;
    $_SESSION['firstname'] = $userRow->firstname;
    $_SESSION['lastname'] = $userRow->lastname;
    redirect('pages/index');
}

}//class

【问题讨论】:

  • 你这么有名的这门课在哪里?
  • doesn't seem to work是什么意思
  • 我调用 session_start();在登录类的方法中,该方法似乎没有以任何方式注册。公共函数 userSession($userRow()){ session_start(); } 不起作用。
  • 不幸的是,这还不足以提供帮助。据我所知,你把它放在了错误的行上——我猜不出你的代码来帮助找到问题
  • 是什么让您认为某事不起作用? session_start 在哪里被调用应该无关紧要如果它被调用

标签: php class session


【解决方案1】:

没有什么可以阻止您在类中启动会话或阻止它以这种方式工作,但问题是必须在将任何输出发送到浏览器之前运行 session_start()

当您在一个类中启动会话时,无法知道该类是否将被实例化,并且在其他东西之前调用的相关方法已将某些东西传递给浏览器。

如果你这样做了

<?php
    $my_session = new session_class;

    .. code, code ,code
?>
<DOCTYPE html>
!<-- other html -->

那么它可能会起作用

如果你这样做了

<DOCTYPE html>
<html>
<head>
    !<-- other html -->
<?php
$my_session = new session_class;

那么会话肯定不行。

因此,当您尝试在 HTML/PHP 逻辑流程中的某个任意点调用的某个任意类中启动会话时,很可能某处已经向浏览器发送了某些内容。基本上你会失去控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2016-11-25
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多