致命错误:在第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
我无法找到代码中的错误
任何人都会帮助我...答案 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()
方法中没有任何值,从而导致您收到错误。
还有其他方法,例如“将连接对象注入”方法。但以上是一种干净且通常优选的方法。