在Angular2 App中,当我从LoginComponent登录时,会在PHP服务器中成功创建Session变量 .

但是当我的应用程序更改其路径到其他组件(例如:Eg:SchoolsListComponent)然后它从PHP服务器请求某些内容时,我注意到会话变量根本不存在 .

当我从我的SchoolListComponent调用get_schools_list.php时发生以下错误

未定义的索引:第3行的C:\ xampp \ htdocs \ myapp \ admin \ session_secure.php中的id

在PHP Server中,我有以下文件

  • login.php .

  • session_secure.php .

  • get_schools_list.php .

  • angular_cors_fix.php .

  • db_connect.php .

在Angular2中,我有以下组件

  • LoginComponent .

  • SchoolsListComponent .

这是每个文件的代码

  • LoginComponent类:
phpUrl = "http://192.168.43.162/myapp/admin/";
login(username:string, password:string){
   let postdata = {
     username : username,
     password : password
   }
   let headers = new Headers();
   headers.append('Content-Type','application/x-www-form-urlencoded');
   return this.http.post(`${this.phpUrl}loginAdmin.php`,postdata,{
     headers : headers
   }).subscribe(
       (response : Response)=>{
          let data = response.json();
          if(data.success == 1){
             this.router.navigate(["/schools_list"]); //Routing to My Main Component
          }
       }
   );
}
  • SchoolListComponent类:
phpUrl = "http://192.168.43.162/myapp/admin/";
constructor(){ this.getSchools(); }
getSchools(){
   let post_data = {
       some_post_data : "data"
   }
   let headers = new Headers();
   headers.append('Content-Type','application/x-www-form-urlencoded');
   let myObserver = this.http.post(`${this.phpUrl}get_schools_list.php`,post_data,{
     headers : headers
   });

   myObserver.subscribe(
     (data : Response)=>{
       let session = data.json();
       if(session.loggedIn == false){
         this.router.navigate(["/login"]);
       }
     }
   );
   return myObserver;
}
  • login.php
<?php
require "angularfix.php";
require "db_connect.php";
$response = array();
$data = json_decode(file_get_contents("php://input"));
$username = $data->username;
$password = $data->password;
if (!preg_match('/[\'^£$%&*()}{#~?><>,|=+¬-]/', $username)){    
   $query ="SELECT * FROM `admin` WHERE `username` = '$username' AND `password` = '$password'";
   if($result = mysqli_query($database,$query)){
       if($row = mysqli_fetch_array($result)){
           $response['success'] = 1;
           $response['message'] = "Successfully logged in !!";
           $response['admin_id'] = $row['admin_id'];
           session_start();
           $_SESSION['id']=session_id();//Here i initialized session id
           $response['id'] = $_SESSION['id'];
           $response['savepath'] = session_save_path();
           storeIntoSessionAdminId($response['admin_id']);

       }else{
           $response['success'] = 0;
           $response['message'] = "Username or Password Invalid";
           $response['error'] = "Username or Password Invalid";
       }
   }else{
       $response['success'] = 0;
       $response['message'] = "Error in Server";
       $response['error'] = "".mysqli_error($database)."";
   }
}else{
   $response['error'] = "Special characters not allowed";
   $response['success'] = 0;
}
// echoing JSON response
echo json_encode($response);
function storeIntoSessionAdminId($id){
    $_SESSION['admin_id']=$id;
}
?>
  • session_secure.php
<?php
session_start();
$response = array();
if($_SESSION['id'] == session_id()){
    $response['admin_id'] = $_SESSION['admin_id'];
    $response["loggedIn"] = true;
    $response['message'] = "user has session !!!";
    $response['success'] = 1;
}
else{
    $response["loggedIn"] = false;
    $response['message'] = "user dont have any session !!!";
    $response['success'] = 0;
    echo json_encode($response);
    exit();
}
?>
  • get_schools_list.php
<?php
require "angular_cors_fix.php";
require "session_secure.php";
require "db_connect.php";   
$response["schools"] = array();
$query = "SELECT * FROM school";
if($result = mysqli_query($database,$query)){
    if(mysqli_num_rows($result)){
        while ($row = mysqli_fetch_array($result)) {
            $temp                   = array();
            $temp["school_id"]      = $row["school_id"];
            $temp["school_name"]    = $row["school_name"];
            $temp["data_phase"]     = $row["data_phase"];
            $temp["school_address"] = $row["school_address"];
            $temp["city"]           = $row["city"];
            $temp["pincode"]        = $row["pincode"];
            $temp["total_students"] = $row["total_students"];
            $temp["head_name"]      = $row["head_name"];
            array_push($response["schools"],$temp);
        }
        $response['success'] = 1;
        $response['message'] = "Data Available";
    }else{
        $response['success'] = 0;
        $response['message'] = "Data Not Available";
    }
}
$response["success"] = 1;
$response["message"] = "Data Available";
echo json_encode($response);
?>
  • angular_cors_fix.php:
<?php
   header("Content-Type: application/json; charset=UTF-8");
   header('Access-Control-Allow-Origin: *');
   header('Access-Control-Allow-Methods: GET, POST');
?>
  • db_connect.php:
<?php
  date_default_timezone_set('Asia/Kolkata');
  $database = mysqli_connect('localhost', 'root', '', 'myapp')
     or die(mysqli_error($database));   
?>

我的应用流程如下

  • LoginComponent:

  • 登录请求服务器“Login.php”创建会话 .

  • 成功登录时重定向到SchoolListComponent .

  • SchoolListComponent:

  • 请求学校JSON服务器,并检查会话

  • 如果会话不存在,则重定向到LoginComponent .

  • 如果会话存在,则在模板中显示学校列表 .

我粘贴了所有文件因为,我认为问题可能是由于多种原因造成的:

  • CORS问题 .

  • 单页应用程序 .

  • Headers

  • PHP会话 .

  • Angular2 / PHP本身 .

请指导我如何解决这个问题的 Session 谢谢..