【问题标题】:Call to a member function prepare() on a non-object in (Fatal error)在(致命错误)中对非对象调用成员函数 prepare()
【发布时间】:2016-03-26 17:21:52
【问题描述】:

致命错误:在第 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

我在我的代码中找不到什么错误

请大家帮帮我...

【问题讨论】:

  • 在我看来$conn 不是数据库连接。换句话说...建立与数据库的连接失败。那么$conn 的值为 false。

标签: php


【解决方案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'");

【讨论】:

  • 代码必须有效。编辑问题,添加调用数据库类的代码。
【解决方案2】:

您正试图将 DB 连接句柄存储在变量 $conn 中。但这只是一个局部变量,不是类属性$conn。要使用后者,您必须访问它是$this-&gt;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-&gt;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-&gt;conn 确实不是 引用对象属性$conn,而是方法中的局部变量$conn。但是局部变量不是持久的。因此,一旦您离开方法dbConnection() 并尝试通过在login() 中选择相同的名称来重用该变量,标识符$conn 实际上是指两个不同 局部变量。这当然意味着它在 login() 方法中不包含任何值,这会导致您收到错误。

还有其他方法可以解决此问题,例如“将连接对象注入”到您的方法中。但以上是一种干净且通常首选的方法。

【讨论】:

  • 好的,在这种情况下,您的数据库连接可能会失败(无论如何)。您的代码不包含对此类事件的任何错误检测或处理,这就是未检测到它的原因。所以我建议你 1. 检查你的 http 服务器错误日志文件是什么问题(作为一个 php 开发人员,你总是 必须监视该文件),然后你将错误检测和处理添加到你的代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 2019-05-21
相关资源
最近更新 更多