从不同类获取函数会导致数据库交互失败

I've got a login session, in my login class I have created a function which fetches the user information for me. For now I have limited this to the user_id for now as I want to save this into the database so I can easily tell which user posted what in my database.

I am trying to access this function from a different class, my Login class.

I've tried two ways to call on this function from what I could find online:

$user_id = Login::usersessioninfo();

and

$login = new Login(); $login->useressioninfo();

However when I call either of these two ways I get the following error:

Fatal error: Call to a member function prepare() on a non-object in E:\xampp\htdocs\iproject\classes\class.Login.php on line 101

I don't understand why the PDO function is now suddenly a non object :/

Any ideas as to what I am doing wrong? The prepared statement is fine I've tested this alone in its own class but I'm having difficultly passing this through to another class.

This is my database:

<?php 

# We are storing the information in this config array that will be required to connect to the database.
$config = array(
    'host'      => 'localhost',
    'username'  => 'root',
    'password'  => '',
    'dbname'    => 'imanage'
);
#connecting to the database by supplying required parameters
$pdo = new PDO('mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'], $config['username'], $config['password']);

#Setting the error mode of our db object, which is very important for debugging.
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

in a class I connect to my database as so:

EDIT: ADDED FULL LOGIN CLASS *

 <?php
 // Authentication
  require_once 'init.php';

 class Login {

private $pdo;   // This variable will only be accessible from inside this class

public function __construct($database)
     {

       $this->pdo = $database; 

} // end constructor method

public function validatelogin() {

    $_SESSION['formAttempt'] = true;
    if (isset($_SESSION['error'])) {
        unset($_SESSION['error']);
    }
    $_SESSION['error'] = array();

    $required = array("username","password");

    //Check required fields

        foreach ($required as $requiredField) {
            if (!isset($_POST[$requiredField]) || $_POST[$requiredField] == "") {
            $_SESSION['error'][] = $requiredField . " is required.";
        }
    }
    //final disposition
        if (count($_SESSION['error']) > 0) {
            die(header("Location: ../index.php"));
            } else {
                unset($_SESSION['formAttempt']);
            }
    }//end validate login

 function logged_in() {
        if($_SESSION['authorized'] == true) {
            return true;
        } else {
            return false;
        }
    }

    function login_required() {
        if($this->logged_in()) {
            return true;
        } else {
            header("location: ../index.php");  
        }
    }

    public function loginuser() {

        $username = (isset($_POST['username'])) ? $_POST['username'] : '';
        $password = (isset($_POST['password'])) ? $_POST['password'] : '';
            $Blowfish_Pre = '$2a£05$';
        $Blowfish_End = '$';
        $hashed_pass = crypt($password, $Blowfish_Pre . $row['salt'] . $Blowfish_End);
        //$salt = "boo";
        //$pw = crypt($password, $salt);


        $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1");
        $stmt->bindParam(":username", $username, PDO::PARAM_STR);
        $stmt->bindParam(":password", $hashed_pass, PDO::PARAM_STR);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        $total = $stmt->rowCount();

                if($total > 0){
                    session_regenerate_id(true);
                    $_SESSION['username'] = $username;
                    $row['name'] = $name;
                    $_SESSION['authorized'] = true;
                    header("location: ../users.php");  
            } else {
            echo "Wrong password or username";
        }

        //old login script.
            //if (!$row)
            //  {
            //      echo "Invaild username or password. Try again"; 
            //  } else {
            //          $_SESSION['authorized'] = true;
            //      $_SESSION['username'] = $username;
            //      header("Location: testloginrequired.php");  
            //  }

    }// end loginuser

    public static function usersessioninfo() {

        $username = $_SESSION['username'];

        $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username");
        $stmt->bindParam(":username", $username, PDO::PARAM_STR);
        $stmt->execute();
                    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
            // i can put this foreach above .. change $row above to $esult and then use for $row for the foreach()
            foreach($result as $row) {
                    $username = $row['username'];
                    $id = $row['id'];
        }

    }

    //public function selectuser() {
        //$username = "test";
        //$password = "password";

    //  $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1");
    //  $stmt->bindValue(":username", $username);
        //$stmt->bindValue(":password", $password);
    //  $stmt->execute();
        //          $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

    //  foreach($result as $row) {
        //          $username = $row['username'];
            //      $email = $row['email'];
                //  echo $username;
                //echo $password;
                    //echo $email;
                // }//end foreach
        //  } // end function


    }// End login class


  $login = new Login($pdo);
  $login->logged_in();
  $login->login_required();

  if (isset($_POST['submitlogin'])) {
  $login->loginuser();
  }

* EDIT PROJECTS CLASS *

classes/class.Project.php

<?php
include ('init.php');

include('class.Login.php');

class Projects extends Login {

private $pdo;   // This variable will only be accessible from inside this class

    public function __construct($database)
         {
           $this->pdo = $database; 

    } // end constructor method

    public function createproject() {
                                        //$login = new Login($pdo)
                                $user_id = $this->usersessioninfo();
                                $project_name = isset($_POST['project_name']) ? $_POST['project_name'] : null;
                                $project_brief = isset($_POST['project_brief']) ? $_POST['project_brief'] : null;
                                $data = array($user_id, $project_name, $project_brief); 
                                $stmta = $this->pdo->prepare("INSERT INTO projects (user_id, project_name, project_brief) VALUES (?, ?, ?)");

    if (isset($_POST['submitproject'])) {   
                   $stmta->execute($data); 
        echo 'Right thats the boring stuff out of the way, lets create some tasks.';
    printf("%d Row inserted.
", $stmta->rowCount());
        header("refresh:5; url=../users.php"); 
        } else {
        echo "Sorry something we couldn't process your project, you're been redirected to the registration page shortly.";
            header("refresh:5; url=../create.php");
                                        }
    } // end function
} // end projects class
$run = new Projects($pdo);
$run->createproject();
//$login = new Login($this->pdo); 


?>

init.php

<?php

 session_start();
 require 'class.Database.php';
   //$errors = array();
?>

createproject.php

    <?php 
        include('classes/class.Login.php');
        include('header.html');
        $run = new Login($pdo);

    ?>

            <div id="maincontentWrapper">

            <div id="maincontent">
                <div id="contentWrapper"></div><!--End registerWrapper -->
                    <article>
                        <p>Right lets create your project! Fill in a few details...</p>
                    </article>
                <div id="loginform">
                    <div id="registerWrapper">
                    <form id="registerForm" name="registerForm" method="POST" action="classes/class.Projects.php">
                    <h1><span class="log-in">Create a new project</span></h1>
                            <p class="required"><span class="log-in">*Required Fields</span></p>
                            <div id="errorDiv"><?php 
                                if (isset($_SESSION['error']) & isset($_SESSION['formAttempt'])) {
                                        unset($_SESSION['formAttempt']);
                                        print "Errors encountered<br/>
";
                                        foreach ($_SESSION['error'] as $error) {
                                        print $error . "<br />
";
                                    } //end foreach
                                    } //end if 
                            ?></div>

                     <p class="float">
                    <label for="password"><i class="icon-lock"></i>Project Name*</label>
                    <input type="text" id="project_name" name="project_name" placeholder="Project Name" class="showpassword"> 
                    <span class="errorFeedback errorSpan" id="nameError">Project name is required</span>
                </p>
                <p class="float">
                    <label for="login"><i class="icon-user"></i>Project brief*</label>
                    <textarea rows="10" class="showpassword" name="project_brief" placeholder="Insert a short brief about your project"></textarea>
                            <span class="errorFeedback errorSpan" id="usernameError">Username is required</span>
                </p>
                <p class="float">
                    <label for="password"><i class="icon-lock"></i>Project Start Date*</label>
                    <input type="text" id="project_start_date" name="project_start_date" placeholder="Project Start Date" class="showpassword"> 
                            <span class="errorFeedback errorSpan" id="passwordError">Password is required</span>
                </p>
                   <p class="float">
                    <label for="password"><i class="icon-lock"></i>Project End Date (Estimate if you can)*</label>
                    <input type="text" id="project_end_date" name="project_end_date" placeholder="Project End Date" class="showpassword"> 
                            <span class="errorFeedback errorSpan" id="password2Error">Passwords dont mat</span>
                </p>
                <p class="clearfix"> 
                    <input type="submit" name="submitproject" value="Register"></form>
                </p>   
                    </div>

                </div>


            </div>
            </div>

            </div>
    <?php 
    include("footer.html");
    ?>

From the information you've posted, I can't see you passing the $pdo object to the "Login" class.

Can you post the entire Login class?

EDIT:

I see you've posted the full "Login" class. Well as far as I can tell, you are not passing the $pdo object to the "Login" class here:

$user_id = Login::usersessioninfo();

If you actually do the following, I believe it will work:

$login = new Login($pdo);
$login->useressioninfo();

In Project.php it should be

$login = new Login($this->pdo);

instead of

$login = new Login($pdo);

Global $pdo is not accessible from within the class method.