简体   繁体   中英

Login Function [PHP][PDO]

I've been having trouble trying to get my login function to work. Whenever I try to login it always gives me this Syntax error:

Fatal error: Call to a member function prepare() on a non-object in C:\\xampp\\htdocs\\cereal_mod\\includes\\Cereal.php on line 53

I'm not sure if the Database connection is part of the problem but i'm not totally sure what's the big ideal of it not operating correctly.

Here is Database.php

<?php

namespace Cereal;

ini_set('error_reporting', E_ALL);

class Database Extends \PDO 

    {
        public function __construct($dbHost,$dbName,$dbUser,$dbPass)
        {
            parent::__construct($dbHost,$dbName,$dbUser,$dbPass);

            try
            {
                $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch (PDOException $e)
            {
                die($e->getMessage());
            }
        }

        #get the number of rows in a result
        public function num_rows($query)
        {
            # create a prepared statement
            $stmt = parent::prepare($query);

            if($stmt)
            {
                # execute query
                $stmt->execute();

                return $stmt->rowCount();
            }
            else
            {
                return self::get_error();
            }
        }

        #display error
        public function get_error()
        {
            $this->connection->errorInfo();
        }

        # closes the database connection when object is destroyed.
        public function __destruct()
        {
            $this->connection = null;
        }


}

?>

Here is the login.php

<?php


ini_set('error_reporting', E_ALL);

include "includes/Cereal.php";
$manager = new Cereal;

session_start();
if(isset($_POST['username'], $_POST['password'], $_POST['submit'])){
$login = $manager->login($_POST['username'], $_POST['password']);
}


?>

<form action="" method="POST">
<div id="login">
<input type="username" name="username" />
<input type="password" name="password" />
<input type="submit" name="submit" />
    </form>
</div>

and lastly Cereal.php

<?php

#namespace Cereal;

ini_set('error_reporting', E_ALL);

class Cereal {

    private $configObj;
    private $databaseObj;

    public $playerData;

    public function __construct(){
        $this->loadConfig();

        if($this->configObj){
            try {
                $dbHost = $this->configObj['Database']['Host'];
                $dbName = $this->configObj['Database']['Database'];
                $dbUser = $this->configObj['Database']['User'];
                $dbPass = $this->configObj['Database']['Pass'];

                $this->databaseObj = new Database('mysql:host=' . $dbHost . ';dbname=' . $dbName, $dbUser, $dbPass);
            } catch(\PDOException $ex){
                $this->__return($ex->getMessage, true);
            }

        }
    }

    private function loadConfig(){
        $configPath = getcwd() . '/includes/config/Configuration.json';
        $configData = file_get_contents($configPath);
        $configObj = json_decode($configData, true);
        if(!$configObj){
            $this->configObj = $configObj;
        } else {

        }

    }

    public function __return($message, $die = false){
        $successCheck = $die ? 'false' : 'true';
        $messageArr = Array('success' => $successCheck, 'message' => $message);
        echo json_encode($messageArr);
        if($die) die();
    }

    public function login($username, $password){
        try {
            $login = $this->databaseObj->prepare("SELECT * FROM users WHERE username=:username AND password=:password");
            $login->bindParam(':username', $username);
            $login->bindParam(':password', md5($password));
            $login->execute();

            $row = $login->fetch(PDO::FETCH_ASSOC);

            if($row) {

                $_SESSION['auth']     = 1;
                $_SESSION['username'] = $username;

                die(json_encode(array("error"=>false, "message"=>"")));
            } else {
                die(json_encode(array("error"=>true, "message"=>"Incorrect credentials")));
            }
    } catch(PDOException $e) {
            error_log('PDOException: ' . $e->getMessage());
            die(json_encode(array("error"=>true, "message"=>"Database error, this has been logged.")));
        }
    }
}
?>

If someone could point out what i'm doing wrong I would really appreciate that because I haven't played with PDO in a while and i'm not sure if I am doing this correctly.

Try following:

 if(!$configObj){
            $this->configObj = $configObj;
        } else {

        }

should it not be if($configObj) ?

In Database.php you need to change

public function __construct($dbHost,$dbName,$dbUser,$dbPass)
{
    parent::__construct($dbHost,$dbName,$dbUser,$dbPass);
}

to

public function __construct($dsn, $dbUser, $dbPass)
{
    parent::__construct($dsn, $dbUser, $dbPass);
}

You also have to add use Cereal\\Database; in top of Cereal.php

and use PDO; in top of Database.php

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM