在非对象上调用成员函数prepare()(致命错误)

时间:2016-03-26 08:48:37

标签: php

  

致命错误:在第28行的G:\ xampp \ htdocs \ live \ Billing Suryas \ model \ DBConfig.php中的非对象上调用成员函数prepare()

<?php
    class Database
    {   
        private $host = "localhost";
        private $db_name = "new_suryas1";
        private $username = "root";
        private $password = "";
        public $conn;
        public function dbConnection()
        {
            $this->conn = NULL;    
            try
            {
                $conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
            }
            catch(PDOException $exception)
            {
                echo "Connection error: " . $exception->getMessage();
            }

            return $conn;
        }
        public function login($usname,$uspswd)
        {
            try
            {
                $stmt =$conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'");
                $stmt->execute(array(':uname'=>$usname, ':paswrd'=>$uspswd));
                $userRow=$stmt->fetch(PDO::FETCH_ASSOC);
                if($stmt->rowCount() == 1)
                {
                    if(password_verify($uspswd, $userRow['password']))
                    {
                        $_SESSION['user_session'] = $userRow['user_id'];
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            catch(PDOException $exception)
            {
                echo $exception->getMessage();
            }
        }

    }
    ?>

这是我的 DBConfig.php

我无法找到代码中的错误

任何人都会帮助我...

2 个答案:

答案 0 :(得分:1)

您编写了一个具有以下属性的类:

class Database
{   
    private $host = "localhost";
    private $db_name = "new_suryas1";
    private $username = "root";
    private $password = "";
    public $conn;

在类方法中,变量作用域与函数相同:外部变量不可访问。

要访问类方法中的类属性,必须使用$this

$this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

(...)

$stmt = $this->conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'");

答案 1 :(得分:0)

您正尝试将数据库连接句柄存储在变量$conn中。但这只是一个局部变量,类属性$conn。要使用更晚的版本,您必须访问$this->conn

所以你的连接方法应该是

public function dbConnection()
{
    try {
        $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
        $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch(PDOException $exception) {
        echo "Connection error: " . $exception->getMessage();
    }
}

鉴于您现在可以在其他功能中使用$this->conn

public function login($usname, $uspswd)
{
    try {
        $stmt = $this->conn->prepare("select * from users where user_name=:uname and password=:paswrd and permission='0' and delet='0'");
        $stmt->execute(array(':uname'=>$usname, ':paswrd'=>$uspswd));
        $userRow = $stmt->fetch(PDO::FETCH_ASSOC);
        if($stmt->rowCount() == 1) {
            if(password_verify($uspswd, $userRow['password'])) {
                $_SESSION['user_session'] = $userRow['user_id'];
                return true;
            } else {
                return false;
            }
        }
    } catch(PDOException $exception) {
        echo $exception->getMessage();
    }
}

换句话说:使用$conn代替$this->conn 是指对象属性$conn,而是使用局部变量$conn方法。但局部变量持久。因此,一旦您离开方法dbConnection()并尝试通过在login()中选择相同的名称来重用该变量,标识符$conn实际上会引用两个不同的局部变量。这当然意味着它在login()方法中没有任何值,从而导致您收到错误。

还有其他方法,例如“将连接对象注入”方法。但以上是一种干净且通常优选的方法。

相关问题