Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对中的非对象调用成员函数prepare()(致命错误)_Php - Fatal编程技术网

Php 对中的非对象调用成员函数prepare()(致命错误)

Php 对中的非对象调用成员函数prepare()(致命错误),php,Php,致命错误:对第28行G:\xampp\htdocs\live\Billing Suryas\model\DBConfig.php中的非对象调用成员函数prepare() 您可以使用以下属性编写一个类: class Database { private $host = "localhost"; private $db_name = "new_suryas1"; private $username = "root"; private $password = ""

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


您可以使用以下属性编写一个类:

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'");

  • 阅读更多关于
  • 阅读更多关于

您正在尝试将DB连接句柄存储在变量
$conn
中。但这只是一个局部变量,而不是class属性
$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()
方法中不包含任何导致您收到错误的值


还有其他方法可以做到这一点,比如在方法中“注入连接对象”。但上述方法是一种干净且通常是首选的方法

在我看来,
$conn
不是db连接。换句话说。。。与数据库建立连接失败。那么,
$conn
的值为false。好的,在这种情况下,可能是您的数据库连接失败了(无论如何)。您的代码不包含对此类事件的任何错误检测或处理,因此未检测到。所以我建议你1。在http服务器错误日志文件中检查问题所在(作为php开发人员,您必须始终监视该文件),然后在代码中添加错误检测和处理。代码必须正常工作。编辑问题添加调用数据库类的代码。
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();
    }
}